summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNathan Harold <nharold@google.com>2016-02-10 18:38:44 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2016-02-10 18:38:44 +0000
commit1e8f01cc80946b394d17ab4ef189f1ef7d9891ca (patch)
treeae70060a5dc3aa8b0da015046fef7b4d10a7c673
parent6885fe4311ee263e6b1301973f4f57cf8b19c07c (diff)
parent8fc5e96e8a5187117df3a05cefff9141e29fb302 (diff)
downloadplatform_packages_apps_Test_connectivity-1e8f01cc80946b394d17ab4ef189f1ef7d9891ca.tar.gz
platform_packages_apps_Test_connectivity-1e8f01cc80946b394d17ab4ef189f1ef7d9891ca.tar.bz2
platform_packages_apps_Test_connectivity-1e8f01cc80946b394d17ab4ef189f1ef7d9891ca.zip
Merge "Remove sl4a from packages/apps/Test/connectivity" into nyc-dev
-rw-r--r--sl4a/Android.mk22
-rw-r--r--sl4a/Common/Android.mk35
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/BaseApplication.java49
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/Constants.java101
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/Exec.java70
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/FeaturedInterpreters.java120
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/FutureActivityTaskExecutor.java56
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/IntentBuilders.java157
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/Process.java205
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/Version.java39
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/activity/FutureActivity.java151
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/event/Event.java57
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/event/EventObserver.java22
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/event/EventServer.java124
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/ActivityResultFacade.java327
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/AndroidFacade.java1037
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/ApplicationManagerFacade.java124
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/BatteryManagerFacade.java213
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/CameraFacade.java219
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/CommonIntentsFacade.java111
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/ConnectivityManagerFacade.java721
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/ContactsFacade.java303
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/DisplayFacade.java102
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/EventFacade.java437
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/FacadeManager.java94
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/FacadeManagerFactory.java58
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/LocationFacade.java179
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/PreferencesFacade.java112
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/SensorManagerFacade.java496
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/SettingsFacade.java276
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/SpeechRecognitionFacade.java83
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/TextToSpeechFacade.java71
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/ToneGeneratorFacade.java108
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/WakeLockFacade.java119
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothA2dpFacade.java151
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothAvrcpFacade.java116
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothBroadcastHelper.java60
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothConnectionFacade.java410
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothDiscoveryHelper.java96
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothFacade.java378
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothHidFacade.java195
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothHspFacade.java134
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothLeAdvertiseFacade.java605
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothLeScanFacade.java924
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothMapFacade.java117
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothPairingHelper.java74
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothRfcommFacade.java463
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/GattClientFacade.java956
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/GattServerFacade.java535
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/media/AudioManagerFacade.java85
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/media/MediaButtonCallback.java76
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/media/MediaPlayerFacade.java311
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/media/MediaRecorderFacade.java283
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/media/MediaScannerFacade.java83
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/media/MediaSessionFacade.java186
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/CarrierConfigFacade.java113
-rwxr-xr-xsl4a/Common/src/com/googlecode/android_scripting/facade/telephony/ImsManagerFacade.java175
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/InCallServiceImpl.java1416
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/SmsFacade.java990
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/SubscriptionManagerFacade.java120
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/TelecomCallFacade.java293
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/TelecomManagerFacade.java382
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/TelephonyConstants.java460
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/TelephonyEvents.java362
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/TelephonyManagerFacade.java1183
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/TelephonyStateListeners.java286
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/TelephonyUtils.java371
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/ui/AlertDialogTask.java295
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/ui/DatePickerDialogTask.java94
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/ui/DialogTask.java74
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/ui/FullScreenTask.java330
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/ui/ProgressDialogTask.java54
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/ui/SeekBarDialogTask.java161
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/ui/TimePickerDialogTask.java91
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/ui/UiFacade.java708
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/ui/ViewInflater.java1023
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/wifi/HttpFacade.java216
-rwxr-xr-xsl4a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiManagerFacade.java887
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiNanManagerFacade.java403
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiP2pManagerFacade.java506
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiRttManagerFacade.java210
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiScannerFacade.java649
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/future/FutureActivityTask.java104
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/interpreter/InProcessInterpreter.java29
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/interpreter/Interpreter.java184
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/interpreter/InterpreterConfiguration.java316
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/interpreter/html/HtmlActivityTask.java385
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/interpreter/shell/ShellInterpreter.java68
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonBuilder.java1188
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonDeserializable.java24
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonRpcResult.java58
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonRpcServer.java127
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonSerializable.java24
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/RpcReceiver.java31
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/RpcReceiverManager.java103
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/RpcReceiverManagerFactory.java25
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/language/BeanShellLanguage.java74
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/language/HtmlLanguage.java76
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/language/JavaScriptLanguage.java37
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/language/Language.java186
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/language/LuaLanguage.java35
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/language/PerlLanguage.java45
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/language/PhpLanguage.java52
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/language/PythonLanguage.java55
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/language/RubyLanguage.java35
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/language/ShellLanguage.java25
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/language/SleepLanguage.java41
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/language/SquirrelLanguage.java58
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/language/SupportedLanguages.java93
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/language/TclLanguage.java60
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/rpc/Converter.java29
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/rpc/MethodDescriptor.java593
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/rpc/ParameterDescriptor.java42
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/rpc/Rpc.java43
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcDefault.java39
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcDeprecated.java37
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcError.java26
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcMinSdk.java32
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcName.java36
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcOptional.java38
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcParameter.java45
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcStartEvent.java36
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcStopEvent.java36
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/trigger/ScriptTrigger.java58
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/trigger/Trigger.java48
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/trigger/TriggerRepository.java204
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/util/VisibleForTesting.java27
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/webcam/JpegProvider.java21
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/webcam/MjpegServer.java69
-rw-r--r--sl4a/Common/src/com/googlecode/android_scripting/webcam/WebCamFacade.java385
-rw-r--r--sl4a/Common/src/org/apache/commons/codec/BinaryDecoder.java42
-rw-r--r--sl4a/Common/src/org/apache/commons/codec/BinaryEncoder.java42
-rw-r--r--sl4a/Common/src/org/apache/commons/codec/CharEncoding.java126
-rw-r--r--sl4a/Common/src/org/apache/commons/codec/Decoder.java55
-rw-r--r--sl4a/Common/src/org/apache/commons/codec/DecoderException.java88
-rw-r--r--sl4a/Common/src/org/apache/commons/codec/Encoder.java46
-rw-r--r--sl4a/Common/src/org/apache/commons/codec/EncoderException.java90
-rw-r--r--sl4a/Common/src/org/apache/commons/codec/binary/Base64Codec.java1055
-rw-r--r--sl4a/Common/src/org/apache/commons/codec/binary/StringUtils.java279
-rwxr-xr-xsl4a/Docs/generate_api_reference_md.pl163
-rw-r--r--sl4a/InterpreterForAndroid/Android.mk28
-rw-r--r--sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/AsyncTaskListener.java27
-rw-r--r--sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/InterpreterInstaller.java323
-rw-r--r--sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/InterpreterUninstaller.java139
-rw-r--r--sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/UrlDownloaderTask.java180
-rw-r--r--sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/ZipExtractorTask.java270
-rw-r--r--sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/activity/Main.java217
-rw-r--r--sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/interpreter/InterpreterProvider.java165
-rw-r--r--sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/interpreter/Sl4aHostedInterpreter.java120
-rw-r--r--sl4a/README61
-rw-r--r--sl4a/ScriptingLayer/Android.mk31
-rw-r--r--sl4a/ScriptingLayer/src/com/googlecode/android_scripting/AndroidProxy.java94
-rw-r--r--sl4a/ScriptingLayer/src/com/googlecode/android_scripting/ScriptLauncher.java74
-rw-r--r--sl4a/ScriptingLayer/src/com/googlecode/android_scripting/ScriptProcess.java42
-rw-r--r--sl4a/ScriptingLayer/src/com/googlecode/android_scripting/ScriptStorageAdapter.java135
-rw-r--r--sl4a/ScriptingLayer/src/com/googlecode/android_scripting/facade/FacadeConfiguration.java220
-rw-r--r--sl4a/ScriptingLayer/src/com/googlecode/android_scripting/interpreter/InterpreterProcess.java122
-rw-r--r--sl4a/ScriptingLayer/src/com/googlecode/android_scripting/trigger/EventGenerationControllingObserver.java105
-rw-r--r--sl4a/ScriptingLayerForAndroid/Android.mk59
-rw-r--r--sl4a/ScriptingLayerForAndroid/AndroidManifest.xml220
-rw-r--r--sl4a/ScriptingLayerForAndroid/jni/Android.mk37
-rw-r--r--sl4a/ScriptingLayerForAndroid/jni/com_googlecode_android_scripting_Exec.cpp202
-rw-r--r--sl4a/ScriptingLayerForAndroid/jni/com_googlecode_android_scripting_Exec.h37
-rw-r--r--sl4a/ScriptingLayerForAndroid/libs/locale_platform.jarbin11244 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/proguard.flags5
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/anim/fade_out_delayed.xml27
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/anim/fade_stay_hidden.xml26
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/anim/keyboard_fade_in.xml25
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/anim/keyboard_fade_out.xml25
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/anim/slide_left_in.xml24
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/anim/slide_left_out.xml24
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/anim/slide_right_in.xml24
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/anim/slide_right_out.xml24
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/atari_small.pngbin1006 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/atari_small_notice.txt11
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/background.pngbin3767 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/bsh_icon.pngbin2233 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/file_bg.pngbin1124 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/folder.pngbin2662 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/html_icon.pngbin4901 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/ic_dialog_time.pngbin1650 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/ic_menu_close_clear_cancel.pngbin2499 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/ic_menu_refresh.pngbin2450 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/ic_menu_search.pngbin5059 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/js_icon.pngbin2806 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/keyboard_icon.pngbin3326 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/live_folder.pngbin3268 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/lua_icon.pngbin2227 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/nut_icon.pngbin385 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/pl_icon.pngbin4266 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/py_icon.pngbin33166 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/rb_icon.pngbin8086 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/script_logo_48.pngbin3396 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/sh_icon.pngbin2929 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_32.pngbin1847 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48.pngbin3396 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_10.pngbin3547 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_2.pngbin3400 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_3.pngbin3443 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_4.pngbin3306 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_5.pngbin3431 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_6.pngbin3424 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_7.pngbin3304 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_8.pngbin3455 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_9.pngbin3474 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_notification_logo.xml13
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/sl_icon.pngbin2021 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/stat_sys_warning.pngbin651 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/terminal.pngbin1885 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_down_btn.xml42
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_down_disabled.pngbin956 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_down_disabled_focused.pngbin938 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_down_normal.pngbin884 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_down_pressed.pngbin1482 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_down_selected.pngbin1459 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_input.xml42
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_input_disabled.pngbin484 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_input_normal.pngbin567 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_input_pressed.pngbin593 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_input_selected.pngbin578 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_up_btn.xml42
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_up_disabled.pngbin1278 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_up_disabled_focused.pngbin1258 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_up_normal.pngbin1173 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_up_pressed.pngbin1864 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_up_selected.pngbin1847 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/layout/act_colors.xml46
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/layout/act_console.xml93
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/layout/act_help.xml67
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/layout/act_help_topic.xml33
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/layout/api_browser.xml15
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/layout/api_prompt.xml19
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/layout/api_prompt_item.xml15
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/layout/bluetooth_device_list.xml15
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/layout/dia_resize.xml54
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/layout/duration_picker.xml80
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/layout/findreplace.xml28
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/layout/interpreter_manager.xml15
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/layout/item_terminal.xml37
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/layout/list_item.xml20
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/layout/logcat_viewer.xml15
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/layout/notification.xml33
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/layout/number_picker.xml41
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/layout/number_picker_edit.xml27
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/layout/script_editor.xml22
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/layout/script_manager.xml15
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/layout/script_monitor.xml16
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/layout/script_monitor_list_item.xml40
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/layout/title.xml48
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/layout/trigger_manager.xml16
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/menu/terminal.xml43
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/raw/bell.oggbin5090 -> 0 bytes
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/values/arrays.xml138
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/values/strings.xml213
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/xml/paths.xml3
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/xml/preferences.xml139
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/xml/searchable_apis.xml28
-rw-r--r--sl4a/ScriptingLayerForAndroid/res/xml/searchable_scripts.xml30
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/ActivityFlinger.java149
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/ScriptListAdapter.java85
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/Sl4aApplication.java29
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ApiBrowser.java344
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ApiPrompt.java135
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/BluetoothDeviceList.java129
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/CustomizeWindow.java47
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/InterpreterManager.java261
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/InterpreterPicker.java152
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/LogcatViewer.java191
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/Preferences.java31
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptEditor.java621
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptManager.java579
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptPicker.java115
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptProcessMonitor.java248
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptingLayerService.java346
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptingLayerServiceLauncher.java48
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptsLiveFolder.java57
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ServiceUtils.java79
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/TriggerManager.java210
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/TriggerService.java170
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/dialog/DurationPickerDialog.java59
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/locale/LocaleReceiver.java47
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/provider/ApiProvider.java128
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/provider/ScriptProvider.java166
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/provider/TelephonyTestProvider.java114
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/service/FacadeService.java55
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/service/MessageHandler.java116
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/widget/DurationPicker.java227
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/widget/NumberPicker.java412
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/widget/NumberPickerButton.java84
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/de/mud/terminal/Precomposer.java1052
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/de/mud/terminal/VDUBuffer.java931
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/de/mud/terminal/VDUDisplay.java40
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/de/mud/terminal/VDUInput.java90
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/de/mud/terminal/vt320.java3236
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/org/apache/harmony/niochar/charset/additional/IBM437.java423
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/org/connectbot/ConsoleActivity.java985
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/org/connectbot/HelpActivity.java88
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/org/connectbot/HelpTopicActivity.java49
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/org/connectbot/TerminalView.java271
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/org/connectbot/service/FontSizeChangedListener.java31
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/org/connectbot/service/PromptHelper.java159
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/org/connectbot/service/Relay.java160
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/org/connectbot/service/TerminalBridge.java889
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/org/connectbot/service/TerminalKeyListener.java510
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/org/connectbot/service/TerminalManager.java306
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/org/connectbot/transport/AbsTransport.java119
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/org/connectbot/transport/ProcessTransport.java108
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/Colors.java78
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/ColorsActivity.java286
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/EastAsianWidth.java58
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/EncodingPreference.java37
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/HelpTopicView.java63
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/PreferenceConstants.java74
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/SelectionArea.java201
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/UberColorPickerDialog.java982
-rw-r--r--sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/VolumePreference.java72
-rw-r--r--sl4a/Utils/Android.mk27
-rw-r--r--sl4a/Utils/src/com/googlecode/android_scripting/ConvertUtils.java62
-rw-r--r--sl4a/Utils/src/com/googlecode/android_scripting/FileUtils.java172
-rw-r--r--sl4a/Utils/src/com/googlecode/android_scripting/ForegroundService.java108
-rw-r--r--sl4a/Utils/src/com/googlecode/android_scripting/IoUtils.java59
-rw-r--r--sl4a/Utils/src/com/googlecode/android_scripting/Log.java182
-rw-r--r--sl4a/Utils/src/com/googlecode/android_scripting/MainThread.java67
-rw-r--r--sl4a/Utils/src/com/googlecode/android_scripting/NotificationIdFactory.java37
-rw-r--r--sl4a/Utils/src/com/googlecode/android_scripting/SimpleServer.java368
-rw-r--r--sl4a/Utils/src/com/googlecode/android_scripting/SingleThreadExecutor.java35
-rw-r--r--sl4a/Utils/src/com/googlecode/android_scripting/exception/Sl4aException.java34
-rw-r--r--sl4a/Utils/src/com/googlecode/android_scripting/future/FutureResult.java65
-rw-r--r--sl4a/Utils/src/com/googlecode/android_scripting/interpreter/ExternalClassLoader.java49
-rw-r--r--sl4a/Utils/src/com/googlecode/android_scripting/interpreter/InterpreterConstants.java61
-rw-r--r--sl4a/Utils/src/com/googlecode/android_scripting/interpreter/InterpreterDescriptor.java131
-rw-r--r--sl4a/Utils/src/com/googlecode/android_scripting/interpreter/InterpreterPropertyNames.java61
-rw-r--r--sl4a/Utils/src/com/googlecode/android_scripting/interpreter/InterpreterUtils.java36
-rw-r--r--sl4a/Utils/src/com/trilead/ssh2/StreamGobbler.java245
334 files changed, 0 insertions, 55053 deletions
diff --git a/sl4a/Android.mk b/sl4a/Android.mk
deleted file mode 100644
index d6432d8..0000000
--- a/sl4a/Android.mk
+++ /dev/null
@@ -1,22 +0,0 @@
-#
-## Copyright (C) 2016 Google, Inc.
-#
-## Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# # You may obtain a copy of the License at:
-#
-## http://www.apache.org/licenses/LICENSE-2.0
-#
-## Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# # limitations under the License.
-#
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-include $(call all-makefiles-under,$(LOCAL_PATH))
-
diff --git a/sl4a/Common/Android.mk b/sl4a/Common/Android.mk
deleted file mode 100644
index fc92181..0000000
--- a/sl4a/Common/Android.mk
+++ /dev/null
@@ -1,35 +0,0 @@
-#
-# Copyright (C) 2016 Google, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at:
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-
-LOCAL_MODULE := sl4a.Common
-LOCAL_MODULE_OWNER := google
-
-LOCAL_STATIC_JAVA_LIBRARIES := guava android-common sl4a.Utils
-LOCAL_JAVA_LIBRARIES := telephony-common
-LOCAL_JAVA_LIBRARIES += ims-common
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src/com/googlecode/android_scripting)
-LOCAL_SRC_FILES += $(call all-java-files-under, src/org/apache/commons/codec)
-
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-include $(CLEAR_VARS)
-include $(BUILD_MULTI_PREBUILT)
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/BaseApplication.java b/sl4a/Common/src/com/googlecode/android_scripting/BaseApplication.java
deleted file mode 100644
index f0b6905..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/BaseApplication.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-import android.app.Application;
-
-import com.googlecode.android_scripting.interpreter.InterpreterConfiguration;
-import com.googlecode.android_scripting.trigger.TriggerRepository;
-
-public class BaseApplication extends Application {
-
- private final FutureActivityTaskExecutor mTaskExecutor = new FutureActivityTaskExecutor(this);
- private TriggerRepository mTriggerRepository;
-
- protected InterpreterConfiguration mConfiguration;
-
- public FutureActivityTaskExecutor getTaskExecutor() {
- return mTaskExecutor;
- }
-
- @Override
- public void onCreate() {
- mConfiguration = new InterpreterConfiguration(this);
- mConfiguration.startDiscovering();
- mTriggerRepository = new TriggerRepository(this);
- }
-
- public InterpreterConfiguration getInterpreterConfiguration() {
- return mConfiguration;
- }
-
- public TriggerRepository getTriggerRepository() {
- return mTriggerRepository;
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/Constants.java b/sl4a/Common/src/com/googlecode/android_scripting/Constants.java
deleted file mode 100644
index 4b18bba..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/Constants.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-import android.content.ComponentName;
-
-public interface Constants {
-
- public static final String ACTION_LAUNCH_FOREGROUND_SCRIPT =
- "com.googlecode.android_scripting.action.LAUNCH_FOREGROUND_SCRIPT";
- public static final String ACTION_LAUNCH_BACKGROUND_SCRIPT =
- "com.googlecode.android_scripting.action.LAUNCH_BACKGROUND_SCRIPT";
- public static final String ACTION_LAUNCH_SCRIPT_FOR_RESULT =
- "com.googlecode.android_scripting.action.ACTION_LAUNCH_SCRIPT_FOR_RESULT";
- public static final String ACTION_LAUNCH_INTERPRETER =
- "com.googlecode.android_scripting.action.LAUNCH_INTERPRETER";
- public static final String ACTION_EDIT_SCRIPT =
- "com.googlecode.android_scripting.action.EDIT_SCRIPT";
- public static final String ACTION_SAVE_SCRIPT =
- "com.googlecode.android_scripting.action.SAVE_SCRIPT";
- public static final String ACTION_SAVE_AND_RUN_SCRIPT =
- "com.googlecode.android_scripting.action.SAVE_AND_RUN_SCRIPT";
- public static final String ACTION_KILL_PROCESS =
- "com.googlecode.android_scripting.action.KILL_PROCESS";
- public static final String ACTION_KILL_ALL = "com.googlecode.android_scripting.action.KILL_ALL";
- public static final String ACTION_SHOW_RUNNING_SCRIPTS =
- "com.googlecode.android_scripting.action.SHOW_RUNNING_SCRIPTS";
- public static final String ACTION_CANCEL_NOTIFICATION =
- "com.googlecode.android_scripting.action.CANCEL_NOTIFICAITON";
- public static final String ACTION_ACTIVITY_RESULT =
- "com.googlecode.android_scripting.action.ACTIVITY_RESULT";
- public static final String ACTION_LAUNCH_SERVER =
- "com.googlecode.android_scripting.action.LAUNCH_SERVER";
-
- public static final String EXTRA_RESULT = "SCRIPT_RESULT";
- public static final String EXTRA_SCRIPT_PATH =
- "com.googlecode.android_scripting.extra.SCRIPT_PATH";
- public static final String EXTRA_SCRIPT_CONTENT =
- "com.googlecode.android_scripting.extra.SCRIPT_CONTENT";
- public static final String EXTRA_INTERPRETER_NAME =
- "com.googlecode.android_scripting.extra.INTERPRETER_NAME";
-
- public static final String EXTRA_USE_EXTERNAL_IP =
- "com.googlecode.android_scripting.extra.USE_PUBLIC_IP";
- public static final String EXTRA_USE_SERVICE_PORT =
- "com.googlecode.android_scripting.extra.USE_SERVICE_PORT";
- public static final String EXTRA_SCRIPT_TEXT =
- "com.googlecode.android_scripting.extra.SCRIPT_TEXT";
- public static final String EXTRA_RPC_HELP_TEXT =
- "com.googlecode.android_scripting.extra.RPC_HELP_TEXT";
- public static final String EXTRA_API_PROMPT_RPC_NAME =
- "com.googlecode.android_scripting.extra.API_PROMPT_RPC_NAME";
- public static final String EXTRA_API_PROMPT_VALUES =
- "com.googlecode.android_scripting.extra.API_PROMPT_VALUES";
- public static final String EXTRA_PROXY_PORT = "com.googlecode.android_scripting.extra.PROXY_PORT";
- public static final String EXTRA_PROCESS_ID =
- "com.googlecode.android_scripting.extra.SCRIPT_PROCESS_ID";
- public static final String EXTRA_IS_NEW_SCRIPT =
- "com.googlecode.android_scripting.extra.IS_NEW_SCRIPT";
- public static final String EXTRA_TRIGGER_ID =
- "com.googlecode.android_scripting.extra.EXTRA_TRIGGER_ID";
- public static final String EXTRA_LAUNCH_IN_BACKGROUND =
- "com.googlecode.android_scripting.extra.EXTRA_LAUNCH_IN_BACKGROUND";
- public static final String EXTRA_TASK_ID = "com.googlecode.android_scripting.extra.EXTRA_TASK_ID";
-
- // BluetoothDeviceManager
- public static final String EXTRA_DEVICE_ADDRESS =
- "com.googlecode.android_scripting.extra.device_address";
-
- public static final ComponentName SL4A_SERVICE_COMPONENT_NAME = new ComponentName(
- "com.googlecode.android_scripting",
- "com.googlecode.android_scripting.activity.ScriptingLayerService");
- public static final ComponentName SL4A_SERVICE_LAUNCHER_COMPONENT_NAME = new ComponentName(
- "com.googlecode.android_scripting",
- "com.googlecode.android_scripting.activity.ScriptingLayerServiceLauncher");
- public static final ComponentName BLUETOOTH_DEVICE_LIST_COMPONENT_NAME = new ComponentName(
- "com.googlecode.android_scripting",
- "com.googlecode.android_scripting.activity.BluetoothDeviceList");
- public static final ComponentName TRIGGER_SERVICE_COMPONENT_NAME = new ComponentName(
- "com.googlecode.android_scripting",
- "com.googlecode.android_scripting.activity.TriggerService");
-
- // Preference Keys
-
- public static final String FORCE_BROWSER = "helpForceBrowser";
- public final static String HIDE_NOTIFY = "hideServiceNotifications";
-} \ No newline at end of file
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/Exec.java b/sl4a/Common/src/com/googlecode/android_scripting/Exec.java
deleted file mode 100644
index 778b5a3..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/Exec.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-import java.io.FileDescriptor;
-
-/**
- * Tools for executing commands.
- */
-public class Exec {
- /**
- * @param cmd
- * The command to execute
- * @param arg0
- * The first argument to the command, may be null
- * @param arg1
- * the second argument to the command, may be null
- * @return the file descriptor of the started process.
- *
- */
- public static FileDescriptor createSubprocess(String command, String[] arguments,
- String[] environmentVariables, String workingDirectory) {
- return createSubprocess(command, arguments, environmentVariables, workingDirectory, null);
- }
-
- /**
- * @param cmd
- * The command to execute
- * @param arguments
- * Array of arguments, may be null
- * @param environmentVariables
- * Array of environment variables, may be null
- * @param processId
- * A one-element array to which the process ID of the started process will be written.
- * @return the file descriptor of the opened process's psuedo-terminal.
- *
- */
- public static native FileDescriptor createSubprocess(String command, String[] arguments,
- String[] environmentVariables, String workingDirectory, int[] processId);
-
- public static native void setPtyWindowSize(FileDescriptor fd, int row, int col, int xpixel,
- int ypixel);
-
- /**
- * Causes the calling thread to wait for the process associated with the receiver to finish
- * executing.
- *
- * @return The exit value of the Process being waited on
- *
- */
- public static native int waitFor(int processId);
-
- static {
- System.loadLibrary("com_googlecode_android_scripting_Exec");
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/FeaturedInterpreters.java b/sl4a/Common/src/com/googlecode/android_scripting/FeaturedInterpreters.java
deleted file mode 100644
index 005560b..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/FeaturedInterpreters.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-import android.content.Context;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class FeaturedInterpreters {
- private static final Map<String, FeaturedInterpreter> mNameMap =
- new HashMap<String, FeaturedInterpreter>();
- private static final Map<String, FeaturedInterpreter> mExtensionMap =
- new HashMap<String, FeaturedInterpreter>();
-
- static {
- try {
- FeaturedInterpreter interpreters[] =
- {
- new FeaturedInterpreter("BeanShell 2.0b4", ".bsh",
- "http://android-scripting.googlecode.com/files/beanshell_for_android_r2.apk"),
- new FeaturedInterpreter("JRuby", ".rb",
- "https://github.com/downloads/ruboto/sl4a_jruby_interpreter/JRubyForAndroid_r2dev.apk"),
- new FeaturedInterpreter("Lua 5.1.4", ".lua",
- "http://android-scripting.googlecode.com/files/lua_for_android_r1.apk"),
- new FeaturedInterpreter("Perl 5.10.1", ".pl",
- "http://android-scripting.googlecode.com/files/perl_for_android_r1.apk"),
- new FeaturedInterpreter("Python 2.6.2", ".py",
- "http://python-for-android.googlecode.com/files/PythonForAndroid_r5.apk"),
- new FeaturedInterpreter("Rhino 1.7R2", ".js",
- "http://android-scripting.googlecode.com/files/rhino_for_android_r2.apk"),
- new FeaturedInterpreter("PHP 5.3.3", ".php",
- "http://php-for-android.googlecode.com/files/phpforandroid_r1.apk") };
- for (FeaturedInterpreter interpreter : interpreters) {
- mNameMap.put(interpreter.mmName, interpreter);
- mExtensionMap.put(interpreter.mmExtension, interpreter);
- }
- } catch (MalformedURLException e) {
- Log.e(e);
- }
- }
-
- public static List<String> getList() {
- ArrayList<String> list = new ArrayList<String>(mNameMap.keySet());
- Collections.sort(list);
- return list;
- }
-
- public static URL getUrlForName(String name) {
- if (!mNameMap.containsKey(name)) {
- return null;
- }
- return mNameMap.get(name).mmUrl;
- }
-
- public static String getInterpreterNameForScript(String fileName) {
- String extension = getExtension(fileName);
- if (extension == null || !mExtensionMap.containsKey(extension)) {
- return null;
- }
- return mExtensionMap.get(extension).mmName;
- }
-
- public static boolean isSupported(String fileName) {
- String extension = getExtension(fileName);
- return (extension != null) && (mExtensionMap.containsKey(extension));
- }
-
- public static int getInterpreterIcon(Context context, String key) {
- String packageName = context.getPackageName();
- String name = "_icon";
- if (key.contains(".")) {
- name = key.substring(key.lastIndexOf('.') + 1) + name;
- } else {
- name = key + name;
- }
- return context.getResources().getIdentifier(name, "drawable", packageName);
- }
-
- private static String getExtension(String fileName) {
- int dotIndex = fileName.lastIndexOf('.');
- if (dotIndex == -1) {
- return null;
- }
- return fileName.substring(dotIndex);
- }
-
- private static class FeaturedInterpreter {
- private final String mmName;
- private final String mmExtension;
- private final URL mmUrl;
-
- private FeaturedInterpreter(String name, String extension, String url)
- throws MalformedURLException {
- mmName = name;
- mmExtension = extension;
- mmUrl = new URL(url);
- }
- }
-
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/FutureActivityTaskExecutor.java b/sl4a/Common/src/com/googlecode/android_scripting/FutureActivityTaskExecutor.java
deleted file mode 100644
index 374d122..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/FutureActivityTaskExecutor.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-import android.content.Context;
-import android.content.Intent;
-
-import com.googlecode.android_scripting.activity.FutureActivity;
-import com.googlecode.android_scripting.future.FutureActivityTask;
-
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicInteger;
-
-public class FutureActivityTaskExecutor {
-
- private final Context mContext;
- private final Map<Integer, FutureActivityTask<?>> mTaskMap =
- new ConcurrentHashMap<Integer, FutureActivityTask<?>>();
- private final AtomicInteger mIdGenerator = new AtomicInteger(0);
-
- public FutureActivityTaskExecutor(Context context) {
- mContext = context;
- }
-
- public void execute(FutureActivityTask<?> task) {
- int id = mIdGenerator.incrementAndGet();
- mTaskMap.put(id, task);
- launchHelper(id);
- }
-
- public FutureActivityTask<?> getTask(int id) {
- return mTaskMap.remove(id);
- }
-
- private void launchHelper(int id) {
- Intent helper = new Intent(mContext, FutureActivity.class);
- helper.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
- helper.putExtra(Constants.EXTRA_TASK_ID, id);
- mContext.startActivity(helper);
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/IntentBuilders.java b/sl4a/Common/src/com/googlecode/android_scripting/IntentBuilders.java
deleted file mode 100644
index 9941c4e..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/IntentBuilders.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-import android.app.PendingIntent;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Parcelable;
-
-import com.googlecode.android_scripting.interpreter.Interpreter;
-
-import java.io.File;
-
-public class IntentBuilders {
- /** An arbitrary value that is used to identify pending intents for executing scripts. */
- private static final int EXECUTE_SCRIPT_REQUEST_CODE = 0x12f412a;
-
- private IntentBuilders() {
- // Utility class.
- }
-
- public static Intent buildTriggerServiceIntent() {
- Intent intent = new Intent();
- intent.setComponent(Constants.TRIGGER_SERVICE_COMPONENT_NAME);
- return intent;
- }
-
- /**
- * Builds an intent that will launch a script in the background.
- *
- * @param script
- * the script to launch
- * @return the intent that will launch the script
- */
- public static Intent buildStartInBackgroundIntent(File script) {
- final ComponentName componentName = Constants.SL4A_SERVICE_LAUNCHER_COMPONENT_NAME;
- Intent intent = new Intent();
- intent.setComponent(componentName);
- intent.setAction(Constants.ACTION_LAUNCH_BACKGROUND_SCRIPT);
- intent.putExtra(Constants.EXTRA_SCRIPT_PATH, script.getAbsolutePath());
- return intent;
- }
-
- /**
- * Builds an intent that launches a script in a terminal.
- *
- * @param script
- * the script to launch
- * @return the intent that will launch the script
- */
- public static Intent buildStartInTerminalIntent(File script) {
- final ComponentName componentName = Constants.SL4A_SERVICE_LAUNCHER_COMPONENT_NAME;
- Intent intent = new Intent();
- intent.setComponent(componentName);
- intent.setAction(Constants.ACTION_LAUNCH_FOREGROUND_SCRIPT);
- intent.putExtra(Constants.EXTRA_SCRIPT_PATH, script.getAbsolutePath());
- return intent;
- }
-
- /**
- * Builds an intent that launches an interpreter.
- *
- * @param interpreterName
- * the interpreter to launch
- * @return the intent that will launch the interpreter
- */
- public static Intent buildStartInterpreterIntent(String interpreterName) {
- final ComponentName componentName = Constants.SL4A_SERVICE_LAUNCHER_COMPONENT_NAME;
- Intent intent = new Intent();
- intent.setComponent(componentName);
- intent.setAction(Constants.ACTION_LAUNCH_INTERPRETER);
- intent.putExtra(Constants.EXTRA_INTERPRETER_NAME, interpreterName);
- return intent;
- }
-
- /**
- * Builds an intent that creates a shortcut to launch the provided interpreter.
- *
- * @param interpreter
- * the interpreter to link to
- * @param iconResource
- * the icon resource to associate with the shortcut
- * @return the intent that will create the shortcut
- */
- public static Intent buildInterpreterShortcutIntent(Interpreter interpreter,
- Parcelable iconResource) {
- Intent intent = new Intent();
- intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT,
- buildStartInterpreterIntent(interpreter.getName()));
- intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, interpreter.getNiceName());
- intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);
- return intent;
- }
-
- /**
- * Builds an intent that creates a shortcut to launch the provided script in the background.
- *
- * @param script
- * the script to link to
- * @param iconResource
- * the icon resource to associate with the shortcut
- * @return the intent that will create the shortcut
- */
- public static Intent buildBackgroundShortcutIntent(File script, Parcelable iconResource) {
- Intent intent = new Intent();
- intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, buildStartInBackgroundIntent(script));
- intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, script.getName());
- intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);
- return intent;
- }
-
- /**
- * Builds an intent that creates a shortcut to launch the provided script in a terminal.
- *
- * @param script
- * the script to link to
- * @param iconResource
- * the icon resource to associate with the shortcut
- * @return the intent that will create the shortcut
- */
- public static Intent buildTerminalShortcutIntent(File script, Parcelable iconResource) {
- Intent intent = new Intent();
- intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, buildStartInTerminalIntent(script));
- intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, script.getName());
- intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);
- return intent;
- }
-
- /**
- * Creates a pending intent that can be used to start the trigger service.
- *
- * @param context
- * the context under whose authority to launch the intent
- *
- * @return {@link PendingIntent} object for running the trigger service
- */
- public static PendingIntent buildTriggerServicePendingIntent(Context context) {
- final Intent intent = buildTriggerServiceIntent();
- return PendingIntent.getService(context, EXECUTE_SCRIPT_REQUEST_CODE, intent,
- PendingIntent.FLAG_UPDATE_CURRENT);
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/Process.java b/sl4a/Common/src/com/googlecode/android_scripting/Process.java
deleted file mode 100644
index 25a80be..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/Process.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-import com.googlecode.android_scripting.interpreter.InterpreterConstants;
-import com.trilead.ssh2.StreamGobbler;
-
-import java.io.File;
-import java.io.FileDescriptor;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.concurrent.atomic.AtomicInteger;
-
-public class Process {
-
- private static final int DEFAULT_BUFFER_SIZE = 8192;
-
- private final List<String> mArguments;
- private final Map<String, String> mEnvironment;
-
- private static final int PID_INIT_VALUE = -1;
-
- private File mBinary;
- private String mName;
- private long mStartTime;
- private long mEndTime;
-
- protected final AtomicInteger mPid;
- protected FileDescriptor mFd;
- protected OutputStream mOut;
- protected InputStream mIn;
- protected File mLog;
-
- public Process() {
- mArguments = new ArrayList<String>();
- mEnvironment = new HashMap<String, String>();
- mPid = new AtomicInteger(PID_INIT_VALUE);
- }
-
- public void addArgument(String argument) {
- mArguments.add(argument);
- }
-
- public void addAllArguments(List<String> arguments) {
- mArguments.addAll(arguments);
- }
-
- public void putAllEnvironmentVariables(Map<String, String> environment) {
- mEnvironment.putAll(environment);
- }
-
- public void putEnvironmentVariable(String key, String value) {
- mEnvironment.put(key, value);
- }
-
- public void setBinary(File binary) {
- if (!binary.exists()) {
- throw new RuntimeException("Binary " + binary + " does not exist!");
- }
- mBinary = binary;
- }
-
- public Integer getPid() {
- return mPid.get();
- }
-
- public FileDescriptor getFd() {
- return mFd;
- }
-
- public OutputStream getOut() {
- return mOut;
- }
-
- public OutputStream getErr() {
- return getOut();
- }
-
- public File getLogFile() {
- return mLog;
- }
-
- public InputStream getIn() {
- return mIn;
- }
-
- public void start(final Runnable shutdownHook) {
- if (isAlive()) {
- throw new RuntimeException("Attempted to start process that is already running.");
- }
-
- String binaryPath = mBinary.getAbsolutePath();
- Log.v("Executing " + binaryPath + " with arguments " + mArguments + " and with environment "
- + mEnvironment.toString());
-
- int[] pid = new int[1];
- String[] argumentsArray = mArguments.toArray(new String[mArguments.size()]);
- mLog = new File(String.format("%s/%s.log", InterpreterConstants.SDCARD_SL4A_ROOT, getName()));
-
- mFd =
- Exec.createSubprocess(binaryPath, argumentsArray, getEnvironmentArray(),
- getWorkingDirectory(), pid);
- mPid.set(pid[0]);
- mOut = new FileOutputStream(mFd);
- mIn = new StreamGobbler(new FileInputStream(mFd), mLog, DEFAULT_BUFFER_SIZE);
- mStartTime = System.currentTimeMillis();
-
- new Thread(new Runnable() {
- public void run() {
- int result = Exec.waitFor(mPid.get());
- mEndTime = System.currentTimeMillis();
- int pid = mPid.getAndSet(PID_INIT_VALUE);
- Log.v("Process " + pid + " exited with result code " + result + ".");
- try {
- mIn.close();
- } catch (IOException e) {
- Log.e(e);
- }
- try {
- mOut.close();
- } catch (IOException e) {
- Log.e(e);
- }
- if (shutdownHook != null) {
- shutdownHook.run();
- }
- }
- }).start();
- }
-
- private String[] getEnvironmentArray() {
- List<String> environmentVariables = new ArrayList<String>();
- for (Entry<String, String> entry : mEnvironment.entrySet()) {
- environmentVariables.add(entry.getKey() + "=" + entry.getValue());
- }
- String[] environment = environmentVariables.toArray(new String[environmentVariables.size()]);
- return environment;
- }
-
- public void kill() {
- if (isAlive()) {
- android.os.Process.killProcess(mPid.get());
- Log.v("Killed process " + mPid);
- }
- }
-
- public boolean isAlive() {
- return (mFd != null && mFd.valid()) && mPid.get() != PID_INIT_VALUE;
- }
-
- public String getUptime() {
- long ms;
- if (!isAlive()) {
- ms = mEndTime - mStartTime;
- } else {
- ms = System.currentTimeMillis() - mStartTime;
- }
- StringBuilder buffer = new StringBuilder();
- int days = (int) (ms / (1000 * 60 * 60 * 24));
- int hours = (int) (ms % (1000 * 60 * 60 * 24)) / 3600000;
- int minutes = (int) (ms % 3600000) / 60000;
- int seconds = (int) (ms % 60000) / 1000;
- if (days != 0) {
- buffer.append(String.format("%02d:%02d:", days, hours));
- } else if (hours != 0) {
- buffer.append(String.format("%02d:", hours));
- }
- buffer.append(String.format("%02d:%02d", minutes, seconds));
- return buffer.toString();
- }
-
- public String getName() {
- return mName;
- }
-
- public void setName(String name) {
- mName = name;
- }
-
- public String getWorkingDirectory() {
- return null;
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/Version.java b/sl4a/Common/src/com/googlecode/android_scripting/Version.java
deleted file mode 100644
index 4ef9fff..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/Version.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-import android.content.Context;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-
-public class Version {
-
- private Version() {
- // Utility class.
- }
-
- public static String getVersion(Context context) {
- try {
- PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
- return info.versionName;
- } catch (PackageManager.NameNotFoundException e) {
- Log.e("Package name not found", e);
- }
- return "?";
- }
-
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/activity/FutureActivity.java b/sl4a/Common/src/com/googlecode/android_scripting/activity/FutureActivity.java
deleted file mode 100644
index 20e1bf9..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/activity/FutureActivity.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.activity;
-
-import android.app.Activity;
-import android.app.Service;
-import android.content.Intent;
-import android.content.pm.ResolveInfo;
-import android.os.Bundle;
-import android.view.ContextMenu;
-import android.view.ContextMenu.ContextMenuInfo;
-import android.view.KeyEvent;
-import android.view.Menu;
-import android.view.View;
-
-import com.googlecode.android_scripting.BaseApplication;
-import com.googlecode.android_scripting.Constants;
-import com.googlecode.android_scripting.FutureActivityTaskExecutor;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.future.FutureActivityTask;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-
-/**
- * This {@link Activity} is launched by {@link RpcReceiver}s in order to perform operations that a
- * {@link Service} is unable to do. For example: start another activity for result, show dialogs,
- * etc.
- *
- * @author Damon Kohler (damonkohler@gmail.com)
- */
-public class FutureActivity extends Activity {
- private FutureActivityTask<?> mTask;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- Log.v("FutureActivity created.");
- int id = getIntent().getIntExtra(Constants.EXTRA_TASK_ID, 0);
- if (id == 0) {
- throw new RuntimeException("FutureActivityTask ID is not specified.");
- }
- FutureActivityTaskExecutor taskQueue = ((BaseApplication) getApplication()).getTaskExecutor();
- mTask = taskQueue.getTask(id);
- if (mTask == null) { // TODO: (Robbie) This is now less of a kludge. Would still like to know
- // what is happening.
- Log.w("FutureActivity has no task!");
- try {
- Intent intent = new Intent(Intent.ACTION_MAIN); // Should default to main of current app.
- intent.addCategory(Intent.CATEGORY_LAUNCHER);
- String packageName = getPackageName();
- for (ResolveInfo resolve : getPackageManager().queryIntentActivities(intent, 0)) {
- if (resolve.activityInfo.packageName.equals(packageName)) {
- intent.setClassName(packageName, resolve.activityInfo.name);
- break;
- }
- }
- startActivity(intent);
- } catch (Exception e) {
- Log.e("Can't find main activity.");
- }
- } else {
- mTask.setActivity(this);
- mTask.onCreate();
- }
- }
-
- @Override
- protected void onStart() {
- super.onStart();
- if (mTask != null) {
- mTask.onStart();
- }
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- if (mTask != null) {
- mTask.onResume();
- }
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- if (mTask != null) {
- mTask.onPause();
- }
- }
-
- @Override
- protected void onStop() {
- super.onStop();
- if (mTask != null) {
- mTask.onStop();
- }
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- if (mTask != null) {
- mTask.onDestroy();
- }
- }
-
- @Override
- public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
- if (mTask != null) {
- mTask.onCreateContextMenu(menu, v, menuInfo);
- }
- }
-
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- super.onPrepareOptionsMenu(menu);
- if (mTask == null) {
- return false;
- } else {
- return mTask.onPrepareOptionsMenu(menu);
- }
- }
-
- @Override
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (mTask != null) {
- mTask.onActivityResult(requestCode, resultCode, data);
- }
- }
-
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (mTask != null) {
- return mTask.onKeyDown(keyCode, event);
- }
- return false;
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/event/Event.java b/sl4a/Common/src/com/googlecode/android_scripting/event/Event.java
deleted file mode 100644
index 3c0baf4..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/event/Event.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.event;
-
-import com.google.common.base.Preconditions;
-
-public class Event {
-
- private String mName;
- private Object mData;
- private double mCreationTime;
-
- public Event(String name, Object data) {
- Preconditions.checkNotNull(name);
- setName(name);
- setData(data);
- mCreationTime = System.currentTimeMillis();
- }
-
- public void setName(String name) {
- mName = name;
- }
-
- public String getName() {
- return mName;
- }
-
- public void setData(Object data) {
- mData = data;
- }
-
- public Object getData() {
- return mData;
- }
-
- public double getCreationTime() {
- return mCreationTime;
- }
-
- public boolean nameEquals(String name) {
- return mName.equals(name);
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/event/EventObserver.java b/sl4a/Common/src/com/googlecode/android_scripting/event/EventObserver.java
deleted file mode 100644
index 6f4066e..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/event/EventObserver.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.event;
-
-
-public interface EventObserver {
- public void onEventReceived(Event event);
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/event/EventServer.java b/sl4a/Common/src/com/googlecode/android_scripting/event/EventServer.java
deleted file mode 100644
index 325c740..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/event/EventServer.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.event;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.SimpleServer;
-import com.googlecode.android_scripting.jsonrpc.JsonBuilder;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.net.InetSocketAddress;
-import java.net.Socket;
-import java.util.Vector;
-import java.util.concurrent.CountDownLatch;
-
-import org.json.JSONException;
-
-/**
- * An Event Forwarding server that forwards events from the rpc queue in realtime to listener
- * clients.
- *
- */
-public class EventServer extends SimpleServer implements EventObserver {
- private static final Vector<Listener> mListeners = new Vector<Listener>();
- private InetSocketAddress address = null;
-
- public EventServer() {
- this(0);
- }
-
- public EventServer(int port) {
- address = startAllInterfaces(port);
- }
-
- public InetSocketAddress getAddress() {
- return address;
- }
-
- @Override
- public void shutdown() {
- onEventReceived(new Event("sl4a", "{\"shutdown\": \"event-server\"}"));
- for (Listener listener : mListeners) {
- mListeners.remove(listener);
- listener.lock.countDown();
- }
- super.shutdown();
- }
-
- @Override
- protected void handleConnection(Socket socket) throws IOException {
- Log.d("handle event connection.");
- Listener l = new Listener(socket);
- Log.v("Adding EventServer listener " + socket.getPort());
- mListeners.add(l);
- // we are running in the socket accept thread
- // wait until the event dispatcher gets us the events
- // or we die, what ever happens first
- try {
- l.lock.await();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- try {
- l.sock.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- Log.v("Ending EventServer listener " + socket.getPort());
- }
-
- @Override
- public void onEventReceived(Event event) {
- Object result = null;
- try {
- result = JsonBuilder.build(event);
- } catch (JSONException e) {
- return;
- }
-
- Log.v("EventServer dispatching " + result);
-
- for (Listener listener : mListeners) {
- if (!listener.out.checkError()) {
- listener.out.write(result + "\n");
- listener.out.flush();
- } else {
- // let the socket accept thread we're done
- mListeners.remove(listener);
- listener.lock.countDown();
- }
- }
- }
-
- private class Listener {
- private Socket sock;
- private PrintWriter out;
- private CountDownLatch lock = new CountDownLatch(1);
-
- public Listener(Socket l) throws IOException {
- sock = l;
- out = new PrintWriter(l.getOutputStream(), true);
- }
- }
-
- @Override
- protected void handleRPCConnection(Socket sock, Integer UID, BufferedReader reader, PrintWriter writer)
- throws Exception {
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/ActivityResultFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/ActivityResultFacade.java
deleted file mode 100644
index a90fba4..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/ActivityResultFacade.java
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade;
-
-import android.app.Activity;
-import android.content.Intent;
-
-import com.googlecode.android_scripting.Constants;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-import java.io.Serializable;
-
-/**
- * Allows you to return results to a startActivityForResult call.
- *
- * @author Alexey Reznichenko (alexey.reznichenko@gmail.com)
- */
-public class ActivityResultFacade extends RpcReceiver {
-
- private static final String sRpcDescription =
- "Sets the result of a script execution. Whenever the script APK is called via "
- + "startActivityForResult(), the resulting intent will contain " + Constants.EXTRA_RESULT
- + " extra with the given value.";
- private static final String sCodeDescription =
- "The result code to propagate back to the originating activity, often RESULT_CANCELED (0) "
- + "or RESULT_OK (-1)";
-
- private Activity mActivity = null;
- private Intent mResult = null;
- private int mResultCode;
-
- public ActivityResultFacade(FacadeManager manager) {
- super(manager);
- }
-
- @Rpc(description = sRpcDescription)
- public synchronized void setResultBoolean(
- @RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
- @RpcParameter(name = "resultValue") Boolean resultValue) {
- mResult = new Intent();
- mResult.putExtra(Constants.EXTRA_RESULT, resultValue.booleanValue());
- mResultCode = resultCode;
- if (mActivity != null) {
- setResult();
- }
- }
-
- @Rpc(description = sRpcDescription)
- public synchronized void setResultByte(
- @RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
- @RpcParameter(name = "resultValue") Byte resultValue) {
- mResult = new Intent();
- mResult.putExtra(Constants.EXTRA_RESULT, resultValue.byteValue());
- mResultCode = resultCode;
- if (mActivity != null) {
- setResult();
- }
- }
-
- @Rpc(description = sRpcDescription)
- public synchronized void setResultShort(
- @RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
- @RpcParameter(name = "resultValue") Short resultValue) {
- mResult = new Intent();
- mResult.putExtra(Constants.EXTRA_RESULT, resultValue.shortValue());
- mResultCode = resultCode;
- if (mActivity != null) {
- setResult();
- }
- }
-
- @Rpc(description = sRpcDescription)
- public synchronized void setResultChar(
- @RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
- @RpcParameter(name = "resultValue") Character resultValue) {
- mResult = new Intent();
- mResult.putExtra(Constants.EXTRA_RESULT, resultValue.charValue());
- mResultCode = resultCode;
- if (mActivity != null) {
- setResult();
- }
- }
-
- @Rpc(description = sRpcDescription)
- public synchronized void setResultInteger(
- @RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
- @RpcParameter(name = "resultValue") Integer resultValue) {
- mResult = new Intent();
- mResult.putExtra(Constants.EXTRA_RESULT, resultValue.intValue());
- mResultCode = resultCode;
- if (mActivity != null) {
- setResult();
- }
- }
-
- @Rpc(description = sRpcDescription)
- public synchronized void setResultLong(
- @RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
- @RpcParameter(name = "resultValue") Long resultValue) {
- mResult = new Intent();
- mResult.putExtra(Constants.EXTRA_RESULT, resultValue.longValue());
- mResultCode = resultCode;
- if (mActivity != null) {
- setResult();
- }
- }
-
- @Rpc(description = sRpcDescription)
- public synchronized void setResultFloat(
- @RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
- @RpcParameter(name = "resultValue") Float resultValue) {
- mResult = new Intent();
- mResult.putExtra(Constants.EXTRA_RESULT, resultValue.floatValue());
- mResultCode = resultCode;
- if (mActivity != null) {
- setResult();
- }
- }
-
- @Rpc(description = sRpcDescription)
- public synchronized void setResultDouble(
- @RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
- @RpcParameter(name = "resultValue") Double resultValue) {
- mResult = new Intent();
- mResult.putExtra(Constants.EXTRA_RESULT, resultValue.doubleValue());
- mResultCode = resultCode;
- if (mActivity != null) {
- setResult();
- }
- }
-
- @Rpc(description = sRpcDescription)
- public synchronized void setResultString(
- @RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
- @RpcParameter(name = "resultValue") String resultValue) {
- mResult = new Intent();
- mResult.putExtra(Constants.EXTRA_RESULT, resultValue);
- mResultCode = resultCode;
- if (mActivity != null) {
- setResult();
- }
- }
-
- @Rpc(description = sRpcDescription)
- public synchronized void setResultBooleanArray(
- @RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
- @RpcParameter(name = "resultValue") Boolean[] resultValue) {
- mResult = new Intent();
- boolean[] array = new boolean[resultValue.length];
- for (int i = 0; i < resultValue.length; i++) {
- array[i] = resultValue[i];
- }
- mResult.putExtra(Constants.EXTRA_RESULT, array);
- mResultCode = resultCode;
- if (mActivity != null) {
- setResult();
- }
- }
-
- @Rpc(description = sRpcDescription)
- public synchronized void setResultByteArray(
- @RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
- @RpcParameter(name = "resultValue") Byte[] resultValue) {
- mResult = new Intent();
- byte[] array = new byte[resultValue.length];
- for (int i = 0; i < resultValue.length; i++) {
- array[i] = resultValue[i];
- }
- mResult.putExtra(Constants.EXTRA_RESULT, array);
- mResultCode = resultCode;
- if (mActivity != null) {
- setResult();
- }
- }
-
- @Rpc(description = sRpcDescription)
- public synchronized void setResultShortArray(
- @RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
- @RpcParameter(name = "resultValue") Short[] resultValue) {
- mResult = new Intent();
- short[] array = new short[resultValue.length];
- for (int i = 0; i < resultValue.length; i++) {
- array[i] = resultValue[i];
- }
- mResult.putExtra(Constants.EXTRA_RESULT, array);
- mResultCode = resultCode;
- if (mActivity != null) {
- setResult();
- }
- }
-
- @Rpc(description = sRpcDescription)
- public synchronized void setResultCharArray(
- @RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
- @RpcParameter(name = "resultValue") Character[] resultValue) {
- mResult = new Intent();
- char[] array = new char[resultValue.length];
- for (int i = 0; i < resultValue.length; i++) {
- array[i] = resultValue[i];
- }
- mResult.putExtra(Constants.EXTRA_RESULT, array);
- mResultCode = resultCode;
- if (mActivity != null) {
- setResult();
- }
- }
-
- @Rpc(description = sRpcDescription)
- public synchronized void setResultIntegerArray(
- @RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
- @RpcParameter(name = "resultValue") Integer[] resultValue) {
- mResult = new Intent();
- int[] array = new int[resultValue.length];
- for (int i = 0; i < resultValue.length; i++) {
- array[i] = resultValue[i];
- }
- mResult.putExtra(Constants.EXTRA_RESULT, array);
- mResultCode = resultCode;
- if (mActivity != null) {
- setResult();
- }
- }
-
- @Rpc(description = sRpcDescription)
- public synchronized void setResultLongArray(
- @RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
- @RpcParameter(name = "resultValue") Long[] resultValue) {
- mResult = new Intent();
- long[] array = new long[resultValue.length];
- for (int i = 0; i < resultValue.length; i++) {
- array[i] = resultValue[i];
- }
- mResult.putExtra(Constants.EXTRA_RESULT, array);
- mResultCode = resultCode;
- if (mActivity != null) {
- setResult();
- }
- }
-
- @Rpc(description = sRpcDescription)
- public synchronized void setResultFloatArray(
- @RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
- @RpcParameter(name = "resultValue") Float[] resultValue) {
- mResult = new Intent();
- float[] array = new float[resultValue.length];
- for (int i = 0; i < resultValue.length; i++) {
- array[i] = resultValue[i];
- }
- mResult.putExtra(Constants.EXTRA_RESULT, array);
- mResultCode = resultCode;
- if (mActivity != null) {
- setResult();
- }
- }
-
- @Rpc(description = sRpcDescription)
- public synchronized void setResultDoubleArray(
- @RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
- @RpcParameter(name = "resultValue") Double[] resultValue) {
- mResult = new Intent();
- double[] array = new double[resultValue.length];
- for (int i = 0; i < resultValue.length; i++) {
- array[i] = resultValue[i];
- }
- mResult.putExtra(Constants.EXTRA_RESULT, array);
- mResultCode = resultCode;
- if (mActivity != null) {
- setResult();
- }
- }
-
- @Rpc(description = sRpcDescription)
- public synchronized void setResultStringArray(
- @RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
- @RpcParameter(name = "resultValue") String[] resultValue) {
- mResult = new Intent();
- mResult.putExtra(Constants.EXTRA_RESULT, resultValue);
- mResultCode = resultCode;
- if (mActivity != null) {
- setResult();
- }
- }
-
- @Rpc(description = sRpcDescription)
- public synchronized void setResultSerializable(
- @RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
- @RpcParameter(name = "resultValue") Serializable resultValue) {
- mResult = new Intent();
- mResult.putExtra(Constants.EXTRA_RESULT, resultValue);
- mResultCode = resultCode;
- if (mActivity != null) {
- setResult();
- }
- }
-
- public synchronized void setActivity(Activity activity) {
- mActivity = activity;
- if (mResult != null) {
- setResult();
- }
- }
-
- private void setResult() {
- mActivity.setResult(mResultCode, mResult);
- mActivity.finish();
- }
-
- @Override
- public void shutdown() {
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/AndroidFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/AndroidFacade.java
deleted file mode 100644
index 1de3055..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/AndroidFacade.java
+++ /dev/null
@@ -1,1037 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Notification;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
-import android.app.Service;
-import android.content.ClipData;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.net.Uri;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.StatFs;
-import android.os.Vibrator;
-import android.content.ClipboardManager;
-import android.text.InputType;
-import android.text.method.PasswordTransformationMethod;
-import android.widget.EditText;
-import android.widget.Toast;
-
-import com.googlecode.android_scripting.BaseApplication;
-import com.googlecode.android_scripting.FileUtils;
-import com.googlecode.android_scripting.FutureActivityTaskExecutor;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.NotificationIdFactory;
-import com.googlecode.android_scripting.future.FutureActivityTask;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcDefault;
-import com.googlecode.android_scripting.rpc.RpcDeprecated;
-import com.googlecode.android_scripting.rpc.RpcOptional;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TimeZone;
-import java.util.concurrent.TimeUnit;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-/**
- * Some general purpose Android routines.<br>
- * <h2>Intents</h2> Intents are returned as a map, in the following form:<br>
- * <ul>
- * <li><b>action</b> - action.
- * <li><b>data</b> - url
- * <li><b>type</b> - mime type
- * <li><b>packagename</b> - name of package. If used, requires classname to be useful (optional)
- * <li><b>classname</b> - name of class. If used, requires packagename to be useful (optional)
- * <li><b>categories</b> - list of categories
- * <li><b>extras</b> - map of extras
- * <li><b>flags</b> - integer flags.
- * </ul>
- * <br>
- * An intent can be built using the {@see #makeIntent} call, but can also be constructed exterally.
- *
- */
-public class AndroidFacade extends RpcReceiver {
- /**
- * An instance of this interface is passed to the facade. From this object, the resource IDs can
- * be obtained.
- */
-
- public interface Resources {
- int getLogo48();
- }
-
- private final Service mService;
- private final Handler mHandler;
- private final Intent mIntent;
- private final FutureActivityTaskExecutor mTaskQueue;
-
- private final Vibrator mVibrator;
- private final NotificationManager mNotificationManager;
-
- private final Resources mResources;
- private ClipboardManager mClipboard = null;
-
- @Override
- public void shutdown() {
- }
-
- public AndroidFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mIntent = manager.getIntent();
- BaseApplication application = ((BaseApplication) mService.getApplication());
- mTaskQueue = application.getTaskExecutor();
- mHandler = new Handler(mService.getMainLooper());
- mVibrator = (Vibrator) mService.getSystemService(Context.VIBRATOR_SERVICE);
- mNotificationManager =
- (NotificationManager) mService.getSystemService(Context.NOTIFICATION_SERVICE);
- mResources = manager.getAndroidFacadeResources();
- }
-
- ClipboardManager getClipboardManager() {
- Object clipboard = null;
- if (mClipboard == null) {
- try {
- clipboard = mService.getSystemService(Context.CLIPBOARD_SERVICE);
- } catch (Exception e) {
- Looper.prepare(); // Clipboard manager won't work without this on higher SDK levels...
- clipboard = mService.getSystemService(Context.CLIPBOARD_SERVICE);
- }
- mClipboard = (ClipboardManager) clipboard;
- if (mClipboard == null) {
- Log.w("Clipboard managed not accessible.");
- }
- }
- return mClipboard;
- }
-
- public Intent startActivityForResult(final Intent intent) {
- FutureActivityTask<Intent> task = new FutureActivityTask<Intent>() {
- @Override
- public void onCreate() {
- super.onCreate();
- try {
- startActivityForResult(intent, 0);
- } catch (Exception e) {
- intent.putExtra("EXCEPTION", e.getMessage());
- setResult(intent);
- }
- }
-
- @Override
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
- setResult(data);
- }
- };
- mTaskQueue.execute(task);
-
- try {
- return task.getResult();
- } catch (Exception e) {
- throw new RuntimeException(e);
- } finally {
- task.finish();
- }
- }
-
- public int startActivityForResultCodeWithTimeout(final Intent intent,
- final int request, final int timeout) {
- FutureActivityTask<Integer> task = new FutureActivityTask<Integer>() {
- @Override
- public void onCreate() {
- super.onCreate();
- try {
- startActivityForResult(intent, request);
- } catch (Exception e) {
- intent.putExtra("EXCEPTION", e.getMessage());
- }
- }
-
- @Override
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (request == requestCode){
- setResult(resultCode);
- }
- }
- };
- mTaskQueue.execute(task);
-
- try {
- return task.getResult(timeout, TimeUnit.SECONDS);
- } catch (Exception e) {
- throw new RuntimeException(e);
- } finally {
- task.finish();
- }
- }
-
- // TODO(damonkohler): Pull this out into proper argument deserialization and support
- // complex/nested types being passed in.
- public static void putExtrasFromJsonObject(JSONObject extras,
- Intent intent) throws JSONException {
- JSONArray names = extras.names();
- for (int i = 0; i < names.length(); i++) {
- String name = names.getString(i);
- Object data = extras.get(name);
- if (data == null) {
- continue;
- }
- if (data instanceof Integer) {
- intent.putExtra(name, (Integer) data);
- }
- if (data instanceof Float) {
- intent.putExtra(name, (Float) data);
- }
- if (data instanceof Double) {
- intent.putExtra(name, (Double) data);
- }
- if (data instanceof Long) {
- intent.putExtra(name, (Long) data);
- }
- if (data instanceof String) {
- intent.putExtra(name, (String) data);
- }
- if (data instanceof Boolean) {
- intent.putExtra(name, (Boolean) data);
- }
- // Nested JSONObject
- if (data instanceof JSONObject) {
- Bundle nestedBundle = new Bundle();
- intent.putExtra(name, nestedBundle);
- putNestedJSONObject((JSONObject) data, nestedBundle);
- }
- // Nested JSONArray. Doesn't support mixed types in single array
- if (data instanceof JSONArray) {
- // Empty array. No way to tell what type of data to pass on, so skipping
- if (((JSONArray) data).length() == 0) {
- Log.e("Empty array not supported in JSONObject, skipping");
- continue;
- }
- // Integer
- if (((JSONArray) data).get(0) instanceof Integer) {
- Integer[] integerArrayData = new Integer[((JSONArray) data).length()];
- for (int j = 0; j < ((JSONArray) data).length(); ++j) {
- integerArrayData[j] = ((JSONArray) data).getInt(j);
- }
- intent.putExtra(name, integerArrayData);
- }
- // Double
- if (((JSONArray) data).get(0) instanceof Double) {
- Double[] doubleArrayData = new Double[((JSONArray) data).length()];
- for (int j = 0; j < ((JSONArray) data).length(); ++j) {
- doubleArrayData[j] = ((JSONArray) data).getDouble(j);
- }
- intent.putExtra(name, doubleArrayData);
- }
- // Long
- if (((JSONArray) data).get(0) instanceof Long) {
- Long[] longArrayData = new Long[((JSONArray) data).length()];
- for (int j = 0; j < ((JSONArray) data).length(); ++j) {
- longArrayData[j] = ((JSONArray) data).getLong(j);
- }
- intent.putExtra(name, longArrayData);
- }
- // String
- if (((JSONArray) data).get(0) instanceof String) {
- String[] stringArrayData = new String[((JSONArray) data).length()];
- for (int j = 0; j < ((JSONArray) data).length(); ++j) {
- stringArrayData[j] = ((JSONArray) data).getString(j);
- }
- intent.putExtra(name, stringArrayData);
- }
- // Boolean
- if (((JSONArray) data).get(0) instanceof Boolean) {
- Boolean[] booleanArrayData = new Boolean[((JSONArray) data).length()];
- for (int j = 0; j < ((JSONArray) data).length(); ++j) {
- booleanArrayData[j] = ((JSONArray) data).getBoolean(j);
- }
- intent.putExtra(name, booleanArrayData);
- }
- }
- }
- }
-
- // Contributed by Emmanuel T
- // Nested Array handling contributed by Sergey Zelenev
- private static void putNestedJSONObject(JSONObject jsonObject, Bundle bundle)
- throws JSONException {
- JSONArray names = jsonObject.names();
- for (int i = 0; i < names.length(); i++) {
- String name = names.getString(i);
- Object data = jsonObject.get(name);
- if (data == null) {
- continue;
- }
- if (data instanceof Integer) {
- bundle.putInt(name, ((Integer) data).intValue());
- }
- if (data instanceof Float) {
- bundle.putFloat(name, ((Float) data).floatValue());
- }
- if (data instanceof Double) {
- bundle.putDouble(name, ((Double) data).doubleValue());
- }
- if (data instanceof Long) {
- bundle.putLong(name, ((Long) data).longValue());
- }
- if (data instanceof String) {
- bundle.putString(name, (String) data);
- }
- if (data instanceof Boolean) {
- bundle.putBoolean(name, ((Boolean) data).booleanValue());
- }
- // Nested JSONObject
- if (data instanceof JSONObject) {
- Bundle nestedBundle = new Bundle();
- bundle.putBundle(name, nestedBundle);
- putNestedJSONObject((JSONObject) data, nestedBundle);
- }
- // Nested JSONArray. Doesn't support mixed types in single array
- if (data instanceof JSONArray) {
- // Empty array. No way to tell what type of data to pass on, so skipping
- if (((JSONArray) data).length() == 0) {
- Log.e("Empty array not supported in nested JSONObject, skipping");
- continue;
- }
- // Integer
- if (((JSONArray) data).get(0) instanceof Integer) {
- int[] integerArrayData = new int[((JSONArray) data).length()];
- for (int j = 0; j < ((JSONArray) data).length(); ++j) {
- integerArrayData[j] = ((JSONArray) data).getInt(j);
- }
- bundle.putIntArray(name, integerArrayData);
- }
- // Double
- if (((JSONArray) data).get(0) instanceof Double) {
- double[] doubleArrayData = new double[((JSONArray) data).length()];
- for (int j = 0; j < ((JSONArray) data).length(); ++j) {
- doubleArrayData[j] = ((JSONArray) data).getDouble(j);
- }
- bundle.putDoubleArray(name, doubleArrayData);
- }
- // Long
- if (((JSONArray) data).get(0) instanceof Long) {
- long[] longArrayData = new long[((JSONArray) data).length()];
- for (int j = 0; j < ((JSONArray) data).length(); ++j) {
- longArrayData[j] = ((JSONArray) data).getLong(j);
- }
- bundle.putLongArray(name, longArrayData);
- }
- // String
- if (((JSONArray) data).get(0) instanceof String) {
- String[] stringArrayData = new String[((JSONArray) data).length()];
- for (int j = 0; j < ((JSONArray) data).length(); ++j) {
- stringArrayData[j] = ((JSONArray) data).getString(j);
- }
- bundle.putStringArray(name, stringArrayData);
- }
- // Boolean
- if (((JSONArray) data).get(0) instanceof Boolean) {
- boolean[] booleanArrayData = new boolean[((JSONArray) data).length()];
- for (int j = 0; j < ((JSONArray) data).length(); ++j) {
- booleanArrayData[j] = ((JSONArray) data).getBoolean(j);
- }
- bundle.putBooleanArray(name, booleanArrayData);
- }
- }
- }
- }
-
- void startActivity(final Intent intent) {
- try {
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- mService.startActivity(intent);
- } catch (Exception e) {
- Log.e("Failed to launch intent.", e);
- }
- }
-
- private Intent buildIntent(String action, String uri, String type, JSONObject extras,
- String packagename, String classname, JSONArray categories) throws JSONException {
- Intent intent = new Intent();
- if (action != null) {
- intent.setAction(action);
- }
- intent.setDataAndType(uri != null ? Uri.parse(uri) : null, type);
- if (packagename != null && classname != null) {
- intent.setComponent(new ComponentName(packagename, classname));
- }
- if (extras != null) {
- putExtrasFromJsonObject(extras, intent);
- }
- if (categories != null) {
- for (int i = 0; i < categories.length(); i++) {
- intent.addCategory(categories.getString(i));
- }
- }
- return intent;
- }
-
- // TODO(damonkohler): It's unnecessary to add the complication of choosing between startActivity
- // and startActivityForResult. It's probably better to just always use the ForResult version.
- // However, this makes the call always blocking. We'd need to add an extra boolean parameter to
- // indicate if we should wait for a result.
- @Rpc(description = "Starts an activity and returns the result.",
- returns = "A Map representation of the result Intent.")
- public Intent startActivityForResult(
- @RpcParameter(name = "action")
- String action,
- @RpcParameter(name = "uri")
- @RpcOptional String uri,
- @RpcParameter(name = "type", description = "MIME type/subtype of the URI")
- @RpcOptional String type,
- @RpcParameter(name = "extras", description = "a Map of extras to add to the Intent")
- @RpcOptional JSONObject extras,
- @RpcParameter(name = "packagename",
- description = "name of package. If used, requires classname to be useful")
- @RpcOptional String packagename,
- @RpcParameter(name = "classname",
- description = "name of class. If used, requires packagename to be useful")
- @RpcOptional String classname
- ) throws JSONException {
- final Intent intent = buildIntent(action, uri, type, extras, packagename, classname, null);
- return startActivityForResult(intent);
- }
-
- @Rpc(description = "Starts an activity and returns the result.",
- returns = "A Map representation of the result Intent.")
- public Intent startActivityForResultIntent(
- @RpcParameter(name = "intent",
- description = "Intent in the format as returned from makeIntent")
- Intent intent) {
- return startActivityForResult(intent);
- }
-
- private void doStartActivity(final Intent intent, Boolean wait) throws Exception {
- if (wait == null || wait == false) {
- startActivity(intent);
- } else {
- FutureActivityTask<Intent> task = new FutureActivityTask<Intent>() {
- private boolean mSecondResume = false;
-
- @Override
- public void onCreate() {
- super.onCreate();
- startActivity(intent);
- }
-
- @Override
- public void onResume() {
- if (mSecondResume) {
- finish();
- }
- mSecondResume = true;
- }
-
- @Override
- public void onDestroy() {
- setResult(null);
- }
-
- };
- mTaskQueue.execute(task);
-
- try {
- task.getResult();
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
- }
-
- /**
- * Creates a new AndroidFacade that simplifies the interface to various Android APIs.
- *
- * @param service
- * is the {@link Context} the APIs will run under
- */
-
- @Rpc(description = "Put a text string in the clipboard.")
- public void setTextClip(@RpcParameter(name = "text")
- String text,
- @RpcParameter(name = "label")
- @RpcOptional @RpcDefault(value = "copiedText")
- String label) {
- getClipboardManager().setPrimaryClip(ClipData.newPlainText(label, text));
- }
-
- @Rpc(description = "Get the device serial number.")
- public String getBuildSerial() {
- return Build.SERIAL;
- }
-
- @Rpc(description = "Get the name of system bootloader version number.")
- public String getBuildBootloader() {
- return android.os.Build.BOOTLOADER;
- }
-
- @Rpc(description = "Get the name of the industrial design.")
- public String getBuildIndustrialDesignName() {
- return Build.DEVICE;
- }
-
- @Rpc(description = "Get the build ID string meant for displaying to the user")
- public String getBuildDisplay() {
- return Build.DISPLAY;
- }
-
- @Rpc(description = "Get the string that uniquely identifies this build.")
- public String getBuildFingerprint() {
- return Build.FINGERPRINT;
- }
-
- @Rpc(description = "Get the name of the hardware (from the kernel command "
- + "line or /proc)..")
- public String getBuildHardware() {
- return Build.HARDWARE;
- }
-
- @Rpc(description = "Get the device host.")
- public String getBuildHost() {
- return Build.HOST;
- }
-
- @Rpc(description = "Get Either a changelist number, or a label like."
- + " \"M4-rc20\".")
- public String getBuildID() {
- return android.os.Build.ID;
- }
-
- @Rpc(description = "Returns true if we are running a debug build such"
- + " as \"user-debug\" or \"eng\".")
- public boolean getBuildIsDebuggable() {
- return Build.IS_DEBUGGABLE;
- }
-
- @Rpc(description = "Get the name of the overall product.")
- public String getBuildProduct() {
- return android.os.Build.PRODUCT;
- }
-
- @Rpc(description = "Get an ordered list of 32 bit ABIs supported by this "
- + "device. The most preferred ABI is the first element in the list")
- public String[] getBuildSupported32BitAbis() {
- return Build.SUPPORTED_32_BIT_ABIS;
- }
-
- @Rpc(description = "Get an ordered list of 64 bit ABIs supported by this "
- + "device. The most preferred ABI is the first element in the list")
- public String[] getBuildSupported64BitAbis() {
- return Build.SUPPORTED_64_BIT_ABIS;
- }
-
- @Rpc(description = "Get an ordered list of ABIs supported by this "
- + "device. The most preferred ABI is the first element in the list")
- public String[] getBuildSupportedBitAbis() {
- return Build.SUPPORTED_ABIS;
- }
-
- @Rpc(description = "Get comma-separated tags describing the build,"
- + " like \"unsigned,debug\".")
- public String getBuildTags() {
- return Build.TAGS;
- }
-
- @Rpc(description = "Get The type of build, like \"user\" or \"eng\".")
- public String getBuildType() {
- return Build.TYPE;
- }
- @Rpc(description = "Returns the board name.")
- public String getBuildBoard() {
- return Build.BOARD;
- }
-
- @Rpc(description = "Returns the brand name.")
- public String getBuildBrand() {
- return Build.BRAND;
- }
-
- @Rpc(description = "Returns the manufacturer name.")
- public String getBuildManufacturer() {
- return Build.MANUFACTURER;
- }
-
- @Rpc(description = "Returns the model name.")
- public String getBuildModel() {
- return Build.MODEL;
- }
-
- @Rpc(description = "Returns the build number.")
- public String getBuildNumber() {
- return Build.FINGERPRINT;
- }
-
- @Rpc(description = "Returns the SDK version.")
- public Integer getBuildSdkVersion() {
- return Build.VERSION.SDK_INT;
- }
-
- @Rpc(description = "Returns the current device time.")
- public Long getBuildTime() {
- return Build.TIME;
- }
-
- @Rpc(description = "Read all text strings copied by setTextClip from the clipboard.")
- public List<String> getTextClip() {
- ClipboardManager cm = getClipboardManager();
- ArrayList<String> texts = new ArrayList<String>();
- if(!cm.hasPrimaryClip()) {
- return texts;
- }
- ClipData cd = cm.getPrimaryClip();
- for(int i=0; i<cd.getItemCount(); i++) {
- texts.add(cd.getItemAt(i).coerceToText(mService).toString());
- }
- return texts;
- }
-
- /**
- * packagename and classname, if provided, are used in a 'setComponent' call.
- */
- @Rpc(description = "Starts an activity.")
- public void startActivity(
- @RpcParameter(name = "action")
- String action,
- @RpcParameter(name = "uri")
- @RpcOptional String uri,
- @RpcParameter(name = "type", description = "MIME type/subtype of the URI")
- @RpcOptional String type,
- @RpcParameter(name = "extras", description = "a Map of extras to add to the Intent")
- @RpcOptional JSONObject extras,
- @RpcParameter(name = "wait", description = "block until the user exits the started activity")
- @RpcOptional Boolean wait,
- @RpcParameter(name = "packagename",
- description = "name of package. If used, requires classname to be useful")
- @RpcOptional String packagename,
- @RpcParameter(name = "classname",
- description = "name of class. If used, requires packagename to be useful")
- @RpcOptional String classname
- ) throws Exception {
- final Intent intent = buildIntent(action, uri, type, extras, packagename, classname, null);
- doStartActivity(intent, wait);
- }
-
- @Rpc(description = "Send a broadcast.")
- public void sendBroadcast(
- @RpcParameter(name = "action")
- String action,
- @RpcParameter(name = "uri")
- @RpcOptional String uri,
- @RpcParameter(name = "type", description = "MIME type/subtype of the URI")
- @RpcOptional String type,
- @RpcParameter(name = "extras", description = "a Map of extras to add to the Intent")
- @RpcOptional JSONObject extras,
- @RpcParameter(name = "packagename",
- description = "name of package. If used, requires classname to be useful")
- @RpcOptional String packagename,
- @RpcParameter(name = "classname",
- description = "name of class. If used, requires packagename to be useful")
- @RpcOptional String classname
- ) throws JSONException {
- final Intent intent = buildIntent(action, uri, type, extras, packagename, classname, null);
- try {
- mService.sendBroadcast(intent);
- } catch (Exception e) {
- Log.e("Failed to broadcast intent.", e);
- }
- }
-
- @Rpc(description = "Starts a service.")
- public void startService(
- @RpcParameter(name = "uri")
- @RpcOptional String uri,
- @RpcParameter(name = "extras", description = "a Map of extras to add to the Intent")
- @RpcOptional JSONObject extras,
- @RpcParameter(name = "packagename",
- description = "name of package. If used, requires classname to be useful")
- @RpcOptional String packagename,
- @RpcParameter(name = "classname",
- description = "name of class. If used, requires packagename to be useful")
- @RpcOptional String classname
- ) throws Exception {
- final Intent intent = buildIntent(null /* action */, uri, null /* type */, extras, packagename,
- classname, null /* categories */);
- mService.startService(intent);
- }
-
- @Rpc(description = "Create an Intent.", returns = "An object representing an Intent")
- public Intent makeIntent(
- @RpcParameter(name = "action")
- String action,
- @RpcParameter(name = "uri")
- @RpcOptional String uri,
- @RpcParameter(name = "type", description = "MIME type/subtype of the URI")
- @RpcOptional String type,
- @RpcParameter(name = "extras", description = "a Map of extras to add to the Intent")
- @RpcOptional JSONObject extras,
- @RpcParameter(name = "categories", description = "a List of categories to add to the Intent")
- @RpcOptional JSONArray categories,
- @RpcParameter(name = "packagename",
- description = "name of package. If used, requires classname to be useful")
- @RpcOptional String packagename,
- @RpcParameter(name = "classname",
- description = "name of class. If used, requires packagename to be useful")
- @RpcOptional String classname,
- @RpcParameter(name = "flags", description = "Intent flags")
- @RpcOptional Integer flags
- ) throws JSONException {
- Intent intent = buildIntent(action, uri, type, extras, packagename, classname, categories);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- if (flags != null) {
- intent.setFlags(flags);
- }
- return intent;
- }
-
- @Rpc(description = "Start Activity using Intent")
- public void startActivityIntent(
- @RpcParameter(name = "intent",
- description = "Intent in the format as returned from makeIntent")
- Intent intent,
- @RpcParameter(name = "wait",
- description = "block until the user exits the started activity")
- @RpcOptional Boolean wait
- ) throws Exception {
- doStartActivity(intent, wait);
- }
-
- @Rpc(description = "Send Broadcast Intent")
- public void sendBroadcastIntent(
- @RpcParameter(name = "intent",
- description = "Intent in the format as returned from makeIntent")
- Intent intent
- ) throws Exception {
- mService.sendBroadcast(intent);
- }
-
- @Rpc(description = "Start Service using Intent")
- public void startServiceIntent(
- @RpcParameter(name = "intent",
- description = "Intent in the format as returned from makeIntent")
- Intent intent
- ) throws Exception {
- mService.startService(intent);
- }
-
- @Rpc(description = "Vibrates the phone or a specified duration in milliseconds.")
- public void vibrate(
- @RpcParameter(name = "duration", description = "duration in milliseconds")
- @RpcDefault("300")
- Integer duration) {
- mVibrator.vibrate(duration);
- }
-
- @Rpc(description = "Displays a short-duration Toast notification.")
- public void makeToast(@RpcParameter(name = "message") final String message) {
- mHandler.post(new Runnable() {
- public void run() {
- Toast.makeText(mService, message, Toast.LENGTH_SHORT).show();
- }
- });
- }
-
- private String getInputFromAlertDialog(final String title, final String message,
- final boolean password) {
- final FutureActivityTask<String> task = new FutureActivityTask<String>() {
- @Override
- public void onCreate() {
- super.onCreate();
- final EditText input = new EditText(getActivity());
- if (password) {
- input.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
- input.setTransformationMethod(new PasswordTransformationMethod());
- }
- AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());
- alert.setTitle(title);
- alert.setMessage(message);
- alert.setView(input);
- alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int whichButton) {
- dialog.dismiss();
- setResult(input.getText().toString());
- finish();
- }
- });
- alert.setOnCancelListener(new DialogInterface.OnCancelListener() {
- @Override
- public void onCancel(DialogInterface dialog) {
- dialog.dismiss();
- setResult(null);
- finish();
- }
- });
- alert.show();
- }
- };
- mTaskQueue.execute(task);
-
- try {
- return task.getResult();
- } catch (Exception e) {
- Log.e("Failed to display dialog.", e);
- throw new RuntimeException(e);
- }
- }
-
- @Rpc(description = "Queries the user for a text input.")
- @RpcDeprecated(value = "dialogGetInput", release = "r3")
- public String getInput(
- @RpcParameter(name = "title", description = "title of the input box")
- @RpcDefault("SL4A Input")
- final String title,
- @RpcParameter(name = "message", description = "message to display above the input box")
- @RpcDefault("Please enter value:")
- final String message) {
- return getInputFromAlertDialog(title, message, false);
- }
-
- @Rpc(description = "Queries the user for a password.")
- @RpcDeprecated(value = "dialogGetPassword", release = "r3")
- public String getPassword(
- @RpcParameter(name = "title", description = "title of the input box")
- @RpcDefault("SL4A Password Input")
- final String title,
- @RpcParameter(name = "message", description = "message to display above the input box")
- @RpcDefault("Please enter password:")
- final String message) {
- return getInputFromAlertDialog(title, message, true);
- }
-
- @Rpc(description = "Displays a notification that will be canceled when the user clicks on it.")
- public void notify(@RpcParameter(name = "title", description = "title") String title,
- @RpcParameter(name = "message") String message) {
- // This contentIntent is a noop.
- PendingIntent contentIntent = PendingIntent.getService(mService, 0, new Intent(), 0);
- Notification.Builder builder = new Notification.Builder(mService);
- builder.setSmallIcon(mResources.getLogo48())
- .setTicker(message)
- .setWhen(System.currentTimeMillis())
- .setContentTitle(title)
- .setContentText(message)
- .setContentIntent(contentIntent);
- Notification notification = builder.build();
- notification.flags = Notification.FLAG_AUTO_CANCEL;
- // Get a unique notification id from the application.
- final int notificationId = NotificationIdFactory.create();
- mNotificationManager.notify(notificationId, notification);
- }
-
- @Rpc(description = "Returns the intent that launched the script.")
- public Object getIntent() {
- return mIntent;
- }
-
- @Rpc(description = "Launches an activity that sends an e-mail message to a given recipient.")
- public void sendEmail(
- @RpcParameter(name = "to", description = "A comma separated list of recipients.")
- final String to,
- @RpcParameter(name = "subject") final String subject,
- @RpcParameter(name = "body") final String body,
- @RpcParameter(name = "attachmentUri")
- @RpcOptional final String attachmentUri) {
- final Intent intent = new Intent(android.content.Intent.ACTION_SEND);
- intent.setType("plain/text");
- intent.putExtra(android.content.Intent.EXTRA_EMAIL, to.split(","));
- intent.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);
- intent.putExtra(android.content.Intent.EXTRA_TEXT, body);
- if (attachmentUri != null) {
- intent.putExtra(android.content.Intent.EXTRA_STREAM, Uri.parse(attachmentUri));
- }
- startActivity(intent);
- }
-
- @Rpc(description = "Returns package version code.")
- public int getPackageVersionCode(@RpcParameter(name = "packageName") final String packageName) {
- int result = -1;
- PackageInfo pInfo = null;
- try {
- pInfo =
- mService.getPackageManager().getPackageInfo(packageName, PackageManager.GET_META_DATA);
- } catch (NameNotFoundException e) {
- pInfo = null;
- }
- if (pInfo != null) {
- result = pInfo.versionCode;
- }
- return result;
- }
-
- @Rpc(description = "Returns package version name.")
- public String getPackageVersion(@RpcParameter(name = "packageName") final String packageName) {
- PackageInfo packageInfo = null;
- try {
- packageInfo =
- mService.getPackageManager().getPackageInfo(packageName, PackageManager.GET_META_DATA);
- } catch (NameNotFoundException e) {
- return null;
- }
- if (packageInfo != null) {
- return packageInfo.versionName;
- }
- return null;
- }
-
- @Rpc(description = "Checks if SL4A's version is >= the specified version.")
- public boolean requiredVersion(
- @RpcParameter(name = "requiredVersion") final Integer version) {
- boolean result = false;
- int packageVersion = getPackageVersionCode(
- "com.googlecode.android_scripting");
- if (version > -1) {
- result = (packageVersion >= version);
- }
- return result;
- }
-
- @Rpc(description = "Writes message to logcat at verbose level")
- public void logV(
- @RpcParameter(name = "message")
- String message) {
- android.util.Log.v("SL4A: ", message);
- }
-
- @Rpc(description = "Writes message to logcat at info level")
- public void logI(
- @RpcParameter(name = "message")
- String message) {
- android.util.Log.i("SL4A: ", message);
- }
-
- @Rpc(description = "Writes message to logcat at debug level")
- public void logD(
- @RpcParameter(name = "message")
- String message) {
- android.util.Log.d("SL4A: ", message);
- }
-
- @Rpc(description = "Writes message to logcat at warning level")
- public void logW(
- @RpcParameter(name = "message")
- String message) {
- android.util.Log.w("SL4A: ", message);
- }
-
- @Rpc(description = "Writes message to logcat at error level")
- public void logE(
- @RpcParameter(name = "message")
- String message) {
- android.util.Log.e("SL4A: ", message);
- }
-
- @Rpc(description = "Writes message to logcat at wtf level")
- public void logWTF(
- @RpcParameter(name = "message")
- String message) {
- android.util.Log.wtf("SL4A: ", message);
- }
-
- /**
- *
- * Map returned:
- *
- * <pre>
- * TZ = Timezone
- * id = Timezone ID
- * display = Timezone display name
- * offset = Offset from UTC (in ms)
- * SDK = SDK Version
- * download = default download path
- * appcache = Location of application cache
- * sdcard = Space on sdcard
- * availblocks = Available blocks
- * blockcount = Total Blocks
- * blocksize = size of block.
- * </pre>
- */
- @Rpc(description = "A map of various useful environment details")
- public Map<String, Object> environment() {
- Map<String, Object> result = new HashMap<String, Object>();
- Map<String, Object> zone = new HashMap<String, Object>();
- Map<String, Object> space = new HashMap<String, Object>();
- TimeZone tz = TimeZone.getDefault();
- zone.put("id", tz.getID());
- zone.put("display", tz.getDisplayName());
- zone.put("offset", tz.getOffset((new Date()).getTime()));
- result.put("TZ", zone);
- result.put("SDK", android.os.Build.VERSION.SDK_INT);
- result.put("download", FileUtils.getExternalDownload().getAbsolutePath());
- result.put("appcache", mService.getCacheDir().getAbsolutePath());
- try {
- StatFs fs = new StatFs("/sdcard");
- space.put("availblocks", fs.getAvailableBlocksLong());
- space.put("blocksize", fs.getBlockSizeLong());
- space.put("blockcount", fs.getBlockCountLong());
- } catch (Exception e) {
- space.put("exception", e.toString());
- }
- result.put("sdcard", space);
- return result;
- }
-
- @Rpc(description = "Get list of constants (static final fields) for a class")
- public Bundle getConstants(
- @RpcParameter(name = "classname", description = "Class to get constants from")
- String classname)
- throws Exception {
- Bundle result = new Bundle();
- int flags = Modifier.FINAL | Modifier.PUBLIC | Modifier.STATIC;
- Class<?> clazz = Class.forName(classname);
- for (Field field : clazz.getFields()) {
- if ((field.getModifiers() & flags) == flags) {
- Class<?> type = field.getType();
- String name = field.getName();
- if (type == int.class) {
- result.putInt(name, field.getInt(null));
- } else if (type == long.class) {
- result.putLong(name, field.getLong(null));
- } else if (type == double.class) {
- result.putDouble(name, field.getDouble(null));
- } else if (type == char.class) {
- result.putChar(name, field.getChar(null));
- } else if (type instanceof Object) {
- result.putString(name, field.get(null).toString());
- }
- }
- }
- return result;
- }
-
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/ApplicationManagerFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/ApplicationManagerFacade.java
deleted file mode 100644
index 69ed5ad..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/ApplicationManagerFacade.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade;
-
-import android.app.ActivityManager;
-import android.app.ActivityManager.RunningAppProcessInfo;
-import android.app.Service;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Facade for managing Applications.
- *
- */
-public class ApplicationManagerFacade extends RpcReceiver {
-
- private final Service mService;
- private final AndroidFacade mAndroidFacade;
- private final ActivityManager mActivityManager;
- private final PackageManager mPackageManager;
-
- public ApplicationManagerFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mAndroidFacade = manager.getReceiver(AndroidFacade.class);
- mActivityManager = (ActivityManager) mService.getSystemService(Context.ACTIVITY_SERVICE);
- mPackageManager = mService.getPackageManager();
- }
-
- @Rpc(description = "Returns a list of all launchable application class names.")
- public Map<String, String> getLaunchableApplications() {
- Intent intent = new Intent(Intent.ACTION_MAIN);
- intent.addCategory(Intent.CATEGORY_LAUNCHER);
- List<ResolveInfo> resolveInfos = mPackageManager.queryIntentActivities(intent, 0);
- Map<String, String> applications = new HashMap<String, String>();
- for (ResolveInfo info : resolveInfos) {
- applications.put(info.loadLabel(mPackageManager).toString(), info.activityInfo.name);
- }
- return applications;
- }
-
- @Rpc(description = "Start activity with the given class name.")
- public void launch(@RpcParameter(name = "className") String className) {
- Intent intent = new Intent(Intent.ACTION_MAIN);
- String packageName = className.substring(0, className.lastIndexOf("."));
- intent.setClassName(packageName, className);
- mAndroidFacade.startActivity(intent);
- }
-
- @Rpc(description = "Launch the specified app.")
- public void appLaunch(@RpcParameter(name = "name") String name) {
- Intent LaunchIntent = mPackageManager.getLaunchIntentForPackage(name);
- mService.startActivity(LaunchIntent);
- }
-
- @Rpc(description = "Kill the specified app.")
- public Boolean appKill(@RpcParameter(name = "name") String name) {
- for (RunningAppProcessInfo info : mActivityManager.getRunningAppProcesses()) {
- if (info.processName.contains(name)) {
- Log.d("Killing " + info.processName);
- android.os.Process.killProcess(info.pid);
- android.os.Process.sendSignal(info.pid, android.os.Process.SIGNAL_KILL);
- mActivityManager.killBackgroundProcesses(info.processName);
- return true;
- }
- }
- return false;
- }
-
- @Rpc(description = "Returns a list of packages running activities or services.", returns = "List of packages running activities.")
- public List<String> getRunningPackages() {
- Set<String> runningPackages = new HashSet<String>();
- List<ActivityManager.RunningAppProcessInfo> appProcesses =
- mActivityManager.getRunningAppProcesses();
- for (ActivityManager.RunningAppProcessInfo info : appProcesses) {
- runningPackages.addAll(Arrays.asList(info.pkgList));
- }
- List<ActivityManager.RunningServiceInfo> serviceProcesses =
- mActivityManager.getRunningServices(Integer.MAX_VALUE);
- for (ActivityManager.RunningServiceInfo info : serviceProcesses) {
- runningPackages.add(info.service.getPackageName());
- }
- return new ArrayList<String>(runningPackages);
- }
-
- @Rpc(description = "Force stops a package.")
- public void forceStopPackage(
- @RpcParameter(name = "packageName", description = "name of package") String packageName) {
- mActivityManager.restartPackage(packageName);
- }
-
- @Override
- public void shutdown() {
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/BatteryManagerFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/BatteryManagerFacade.java
deleted file mode 100644
index 5d0b34e..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/BatteryManagerFacade.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade;
-
-import android.app.Service;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.BatteryManager;
-import android.os.Bundle;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcStartEvent;
-import com.googlecode.android_scripting.rpc.RpcStopEvent;
-
-import java.lang.reflect.Field;
-
-/**
- * Exposes Batterymanager API. Note that in order to use any of the batteryGet* functions, you need
- * to batteryStartMonitoring, and then wait for a "battery" event. Sleeping for a second will
- * usually work just as well.
- *
- * @author Alexey Reznichenko (alexey.reznichenko@gmail.com)
- * @author Robbie Matthews (rjmatthews62@gmail.com)
- */
-public class BatteryManagerFacade extends RpcReceiver {
-
- private final Service mService;
- private final EventFacade mEventFacade;
- private final int mSdkVersion;
-
- private BatteryStateListener mReceiver;
-
- private volatile Bundle mBatteryData = null;
- private volatile Integer mBatteryStatus = null;
- private volatile Integer mBatteryHealth = null;
- private volatile Integer mPlugType = null;
-
- private volatile Boolean mBatteryPresent = null;
- private volatile Integer mBatteryLevel = null;
- private volatile Integer mBatteryMaxLevel = null;
- private volatile Integer mBatteryVoltage = null;
- private volatile Integer mBatteryTemperature = null;
- private volatile String mBatteryTechnology = null;
-
- public BatteryManagerFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mSdkVersion = manager.getSdkLevel();
- mEventFacade = manager.getReceiver(EventFacade.class);
- mReceiver = null;
- mBatteryData = null;
- }
-
- private class BatteryStateListener extends BroadcastReceiver {
-
- private final EventFacade mmEventFacade;
-
- private BatteryStateListener(EventFacade facade) {
- mmEventFacade = facade;
- }
-
- @Override
- public void onReceive(Context context, Intent intent) {
- mBatteryStatus = intent.getIntExtra("status", 1);
- mBatteryHealth = intent.getIntExtra("health", 1);
- mPlugType = intent.getIntExtra("plugged", -1);
- if (mSdkVersion >= 5) {
- mBatteryPresent =
- intent.getBooleanExtra(getBatteryManagerFieldValue("EXTRA_PRESENT"), false);
- mBatteryLevel = intent.getIntExtra(getBatteryManagerFieldValue("EXTRA_LEVEL"), -1);
- mBatteryMaxLevel = intent.getIntExtra(getBatteryManagerFieldValue("EXTRA_SCALE"), 0);
- mBatteryVoltage = intent.getIntExtra(getBatteryManagerFieldValue("EXTRA_VOLTAGE"), -1);
- mBatteryTemperature =
- intent.getIntExtra(getBatteryManagerFieldValue("EXTRA_TEMPERATURE"), -1);
- mBatteryTechnology = intent.getStringExtra(getBatteryManagerFieldValue("EXTRA_TECHNOLOGY"));
- }
- Bundle data = new Bundle();
- data.putInt("status", mBatteryStatus);
- data.putInt("health", mBatteryHealth);
- data.putInt("plugged", mPlugType);
- if (mSdkVersion >= 5) {
- data.putBoolean("battery_present", mBatteryPresent);
- if (mBatteryMaxLevel == null || mBatteryMaxLevel == 100 || mBatteryMaxLevel == 0) {
- data.putInt("level", mBatteryLevel);
- } else {
- data.putInt("level", (int) (mBatteryLevel * 100.0 / mBatteryMaxLevel));
- }
- data.putInt("voltage", mBatteryVoltage);
- data.putInt("temperature", mBatteryTemperature);
- data.putString("technology", mBatteryTechnology);
- }
- mBatteryData = data;
- mmEventFacade.postEvent("battery", mBatteryData.clone());
- }
- }
-
- private String getBatteryManagerFieldValue(String name) {
- try {
- Field f = BatteryManager.class.getField(name);
- return f.get(null).toString();
- } catch (Exception e) {
- Log.e(e);
- }
- return null;
- }
-
- @Rpc(description = "Returns the most recently recorded battery data.")
- public Bundle readBatteryData() {
- return mBatteryData;
- }
-
- /**
- * throws "battery" events
- */
- @Rpc(description = "Starts tracking battery state.")
- @RpcStartEvent("battery")
- public void batteryStartMonitoring() {
- if (mReceiver == null) {
- IntentFilter filter = new IntentFilter();
- filter.addAction(Intent.ACTION_BATTERY_CHANGED);
- mReceiver = new BatteryStateListener(mEventFacade);
- mService.registerReceiver(mReceiver, filter);
- }
- }
-
- @Rpc(description = "Stops tracking battery state.")
- @RpcStopEvent("battery")
- public void batteryStopMonitoring() {
- if (mReceiver != null) {
- mService.unregisterReceiver(mReceiver);
- mReceiver = null;
- }
- mBatteryData = null;
- }
-
- @Override
- public void shutdown() {
- batteryStopMonitoring();
- }
-
- @Rpc(description = "Returns the most recently received battery status data:" + "\n1 - unknown;"
- + "\n2 - charging;" + "\n3 - discharging;" + "\n4 - not charging;" + "\n5 - full;")
- public Integer batteryGetStatus() {
- return mBatteryStatus;
- }
-
- @Rpc(description = "Returns the most recently received battery health data:" + "\n1 - unknown;"
- + "\n2 - good;" + "\n3 - overheat;" + "\n4 - dead;" + "\n5 - over voltage;"
- + "\n6 - unspecified failure;")
- public Integer batteryGetHealth() {
- return mBatteryHealth;
- }
-
- /** Power source is an AC charger. */
- public static final int BATTERY_PLUGGED_AC = 1;
- /** Power source is a USB port. */
- public static final int BATTERY_PLUGGED_USB = 2;
-
- @Rpc(description = "Returns the most recently received plug type data:" + "\n-1 - unknown"
- + "\n0 - unplugged;" + "\n1 - power source is an AC charger"
- + "\n2 - power source is a USB port")
- public Integer batteryGetPlugType() {
- return mPlugType;
- }
-
- @Rpc(description = "Returns the most recently received battery presence data.")
- public Boolean batteryCheckPresent() {
- return mBatteryPresent;
- }
-
- @Rpc(description = "Returns the most recently received battery level (percentage).")
- public Integer batteryGetLevel() {
- if (mBatteryMaxLevel == null || mBatteryMaxLevel == 100 || mBatteryMaxLevel == 0) {
- return mBatteryLevel;
- } else {
- return (int) (mBatteryLevel * 100.0 / mBatteryMaxLevel);
- }
- }
-
- @Rpc(description = "Returns the most recently received battery voltage.")
- public Integer batteryGetVoltage() {
- return mBatteryVoltage;
- }
-
- @Rpc(description = "Returns the most recently received battery temperature.")
- public Integer batteryGetTemperature() {
- return mBatteryTemperature;
- }
-
- @Rpc(description = "Returns the most recently received battery technology data.")
- public String batteryGetTechnology() {
- return mBatteryTechnology;
- }
-
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/CameraFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/CameraFacade.java
deleted file mode 100644
index ff353f9..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/CameraFacade.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade;
-
-import android.app.Service;
-import android.content.Intent;
-import android.hardware.Camera;
-import android.hardware.Camera.AutoFocusCallback;
-import android.hardware.Camera.Parameters;
-import android.hardware.Camera.PictureCallback;
-import android.net.Uri;
-import android.os.Bundle;
-import android.provider.MediaStore;
-import android.view.SurfaceHolder;
-import android.view.SurfaceHolder.Callback;
-import android.view.SurfaceView;
-import android.view.WindowManager;
-
-import com.googlecode.android_scripting.BaseApplication;
-import com.googlecode.android_scripting.FileUtils;
-import com.googlecode.android_scripting.FutureActivityTaskExecutor;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.future.FutureActivityTask;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcDefault;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.lang.reflect.Method;
-import java.util.concurrent.CountDownLatch;
-
-/**
- * Access Camera functions.
- *
- */
-public class CameraFacade extends RpcReceiver {
-
- private final Service mService;
- private final Parameters mParameters;
-
- private class BooleanResult {
- boolean mmResult = false;
- }
-
- public Camera openCamera(int cameraId) throws Exception {
- int sSdkLevel = Integer.parseInt(android.os.Build.VERSION.SDK);
- Camera result;
- if (sSdkLevel < 9) {
- result = Camera.open();
- } else {
- Method openCamera = Camera.class.getMethod("open", int.class);
- result = (Camera) openCamera.invoke(null, cameraId);
- }
- return result;
- }
-
- public CameraFacade(FacadeManager manager) throws Exception {
- super(manager);
- mService = manager.getService();
- Camera camera = openCamera(0);
- try {
- mParameters = camera.getParameters();
- } finally {
- camera.release();
- }
- }
-
- @Rpc(description = "Take a picture and save it to the specified path.", returns = "A map of Booleans autoFocus and takePicture where True indicates success. cameraId also included.")
- public Bundle cameraCapturePicture(
- @RpcParameter(name = "targetPath") final String targetPath,
- @RpcParameter(name = "useAutoFocus") @RpcDefault("true") Boolean useAutoFocus,
- @RpcParameter(name = "cameraId", description = "Id of camera to use. SDK 9") @RpcDefault("0") Integer cameraId)
- throws Exception {
- final BooleanResult autoFocusResult = new BooleanResult();
- final BooleanResult takePictureResult = new BooleanResult();
- Camera camera = openCamera(cameraId);
- camera.setParameters(mParameters);
-
- try {
- Method method = camera.getClass().getMethod("setDisplayOrientation", int.class);
- method.invoke(camera, 90);
- } catch (Exception e) {
- Log.e(e);
- }
-
- try {
- FutureActivityTask<SurfaceHolder> previewTask = setPreviewDisplay(camera);
- camera.startPreview();
- if (useAutoFocus) {
- autoFocus(autoFocusResult, camera);
- }
- takePicture(new File(targetPath), takePictureResult, camera);
- previewTask.finish();
- } catch (Exception e) {
- Log.e(e);
- } finally {
- camera.release();
- }
-
- Bundle result = new Bundle();
- result.putBoolean("autoFocus", autoFocusResult.mmResult);
- result.putBoolean("takePicture", takePictureResult.mmResult);
- result.putInt("cameraId", cameraId);
- return result;
- }
-
- private FutureActivityTask<SurfaceHolder> setPreviewDisplay(Camera camera) throws IOException,
- InterruptedException {
- FutureActivityTask<SurfaceHolder> task = new FutureActivityTask<SurfaceHolder>() {
- @Override
- public void onCreate() {
- super.onCreate();
- final SurfaceView view = new SurfaceView(getActivity());
- getActivity().setContentView(view);
- getActivity().getWindow().setSoftInputMode(
- WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED);
- view.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
- view.getHolder().addCallback(new Callback() {
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
- }
-
- @Override
- public void surfaceCreated(SurfaceHolder holder) {
- setResult(view.getHolder());
- }
-
- @Override
- public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
- }
- });
- }
- };
- FutureActivityTaskExecutor taskQueue =
- ((BaseApplication) mService.getApplication()).getTaskExecutor();
- taskQueue.execute(task);
- camera.setPreviewDisplay(task.getResult());
- return task;
- }
-
- private void takePicture(final File file, final BooleanResult takePictureResult,
- final Camera camera) throws InterruptedException {
- final CountDownLatch latch = new CountDownLatch(1);
- camera.takePicture(null, null, new PictureCallback() {
- @Override
- public void onPictureTaken(byte[] data, Camera camera) {
- if (!FileUtils.makeDirectories(file.getParentFile(), 0755)) {
- takePictureResult.mmResult = false;
- return;
- }
- try {
- FileOutputStream output = new FileOutputStream(file);
- output.write(data);
- output.close();
- takePictureResult.mmResult = true;
- } catch (FileNotFoundException e) {
- Log.e("Failed to save picture.", e);
- takePictureResult.mmResult = false;
- return;
- } catch (IOException e) {
- Log.e("Failed to save picture.", e);
- takePictureResult.mmResult = false;
- return;
- } finally {
- latch.countDown();
- }
- }
- });
- latch.await();
- }
-
- private void autoFocus(final BooleanResult result, final Camera camera)
- throws InterruptedException {
- final CountDownLatch latch = new CountDownLatch(1);
- {
- camera.autoFocus(new AutoFocusCallback() {
- @Override
- public void onAutoFocus(boolean success, Camera camera) {
- result.mmResult = success;
- latch.countDown();
- }
- });
- latch.await();
- }
- }
-
- @Override
- public void shutdown() {
- // Nothing to clean up.
- }
-
- @Rpc(description = "Starts the image capture application to take a picture and saves it to the specified path.")
- public void cameraInteractiveCapturePicture(
- @RpcParameter(name = "targetPath") final String targetPath) {
- Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
- File file = new File(targetPath);
- intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
- AndroidFacade facade = mManager.getReceiver(AndroidFacade.class);
- facade.startActivityForResult(intent);
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/CommonIntentsFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/CommonIntentsFacade.java
deleted file mode 100644
index ffa464c..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/CommonIntentsFacade.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade;
-
-import android.app.SearchManager;
-import android.content.ActivityNotFoundException;
-import android.content.Intent;
-import android.net.Uri;
-import android.provider.Contacts.People;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcOptional;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-import java.io.File;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-/**
- * A selection of commonly used intents. <br>
- * <br>
- * These can be used to trigger some common tasks.
- *
- */
-public class CommonIntentsFacade extends RpcReceiver {
-
- private final AndroidFacade mAndroidFacade;
-
- public CommonIntentsFacade(FacadeManager manager) {
- super(manager);
- mAndroidFacade = manager.getReceiver(AndroidFacade.class);
- }
-
- @Override
- public void shutdown() {
- }
-
- @Rpc(description = "Display content to be picked by URI (e.g. contacts)", returns = "A map of result values.")
- public Intent pick(@RpcParameter(name = "uri") String uri) throws JSONException {
- return mAndroidFacade.startActivityForResult(Intent.ACTION_PICK, uri, null, null, null, null);
- }
-
- @Rpc(description = "Starts the barcode scanner.", returns = "A Map representation of the result Intent.")
- public Intent scanBarcode() throws JSONException {
- try {
- return mAndroidFacade.startActivityForResult("com.google.zxing.client.android.SCAN", null,
- null, null, null, null);
- } catch (ActivityNotFoundException e) {
- Log.e("No Activity found to scan a barcode!", e);
- return null;
- }
- }
-
- private void view(Uri uri, String type) {
- Intent intent = new Intent(Intent.ACTION_VIEW);
- intent.setDataAndType(uri, type);
- mAndroidFacade.startActivity(intent);
- }
-
- @Rpc(description = "Start activity with view action by URI (i.e. browser, contacts, etc.).")
- public void view(
- @RpcParameter(name = "uri") String uri,
- @RpcParameter(name = "type", description = "MIME type/subtype of the URI") @RpcOptional String type,
- @RpcParameter(name = "extras", description = "a Map of extras to add to the Intent") @RpcOptional JSONObject extras)
- throws Exception {
- mAndroidFacade.startActivity(Intent.ACTION_VIEW, uri, type, extras, true, null, null);
- }
-
- @Rpc(description = "Opens a map search for query (e.g. pizza, 123 My Street).")
- public void viewMap(@RpcParameter(name = "query, e.g. pizza, 123 My Street") String query)
- throws Exception {
- view("geo:0,0?q=" + query, null, null);
- }
-
- @Rpc(description = "Opens the list of contacts.")
- public void viewContacts() throws JSONException {
- view(People.CONTENT_URI, null);
- }
-
- @Rpc(description = "Opens the browser to display a local HTML file.")
- public void viewHtml(
- @RpcParameter(name = "path", description = "the path to the HTML file") String path)
- throws JSONException {
- File file = new File(path);
- view(Uri.fromFile(file), "text/html");
- }
-
- @Rpc(description = "Starts a search for the given query.")
- public void search(@RpcParameter(name = "query") String query) {
- Intent intent = new Intent(Intent.ACTION_SEARCH);
- intent.putExtra(SearchManager.QUERY, query);
- mAndroidFacade.startActivity(intent);
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/ConnectivityManagerFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/ConnectivityManagerFacade.java
deleted file mode 100644
index 594c934..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/ConnectivityManagerFacade.java
+++ /dev/null
@@ -1,721 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade;
-
-import android.app.Service;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.ConnectivityManager;
-import android.net.ConnectivityManager.NetworkCallback;
-import android.net.ConnectivityManager.PacketKeepaliveCallback;
-import android.net.ConnectivityManager.PacketKeepalive;
-import android.net.LinkProperties;
-import android.net.Network;
-import android.net.NetworkCapabilities;
-import android.net.NetworkRequest;
-import android.net.NetworkInfo;
-import android.provider.Settings.SettingNotFoundException;
-import android.os.Bundle;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.facade.telephony.TelephonyConstants;
-import com.googlecode.android_scripting.facade.telephony.TelephonyEvents;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcOptional;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.HashMap;
-
-/**
- * Access ConnectivityManager functions.
- */
-public class ConnectivityManagerFacade extends RpcReceiver {
-
- public static int AIRPLANE_MODE_OFF = 0;
- public static int AIRPLANE_MODE_ON = 1;
-
- class ConnectivityReceiver extends BroadcastReceiver {
-
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
-
- if (!action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
- Log.e("ConnectivityReceiver received non-connectivity action!");
- return;
- }
-
- Bundle b = intent.getExtras();
-
- if (b == null) {
- Log.e("ConnectivityReceiver failed to receive extras!");
- return;
- }
-
- int netType =
- b.getInt(ConnectivityManager.EXTRA_NETWORK_TYPE,
- ConnectivityManager.TYPE_NONE);
-
- if (netType == ConnectivityManager.TYPE_NONE) {
- Log.i("ConnectivityReceiver received change to TYPE_NONE.");
- return;
- }
-
- /*
- * Technically there is a race condition here, but retrieving the NetworkInfo from the
- * bundle is deprecated. See ConnectivityManager.EXTRA_NETWORK_INFO
- */
- for (NetworkInfo info : mManager.getAllNetworkInfo()) {
- if (info.getType() == netType) {
- mEventFacade.postEvent(TelephonyConstants.EventConnectivityChanged, info);
- }
- }
- }
- }
-
- class PacketKeepaliveReceiver extends PacketKeepaliveCallback {
- public static final int EVENT_INVALID = -1;
- public static final int EVENT_NONE = 0;
- public static final int EVENT_STARTED = 1 << 0;
- public static final int EVENT_STOPPED = 1 << 1;
- public static final int EVENT_ERROR = 1 << 2;
- public static final int EVENT_ALL = EVENT_STARTED |
- EVENT_STOPPED |
- EVENT_ERROR;
- private int mEvents;
- public String mId;
- public PacketKeepalive mPacketKeepalive;
-
- public PacketKeepaliveReceiver(int events) {
- super();
- mEvents = events;
- mId = this.toString();
- }
-
- public void startListeningForEvents(int events) {
- mEvents |= events & EVENT_ALL;
- }
-
- public void stopListeningForEvents(int events) {
- mEvents &= ~(events & EVENT_ALL);
- }
-
- @Override
- public void onStarted() {
- Log.d("PacketKeepaliveCallback on start!");
- if ((mEvents & EVENT_STARTED) == EVENT_STARTED) {
- mEventFacade.postEvent(
- TelephonyConstants.EventPacketKeepaliveCallback,
- new TelephonyEvents.PacketKeepaliveEvent(
- mId,
- getPacketKeepaliveReceiverEventString(EVENT_STARTED)));
- }
- }
-
- @Override
- public void onStopped() {
- Log.d("PacketKeepaliveCallback on stop!");
- if ((mEvents & EVENT_STOPPED) == EVENT_STOPPED) {
- mEventFacade.postEvent(
- TelephonyConstants.EventPacketKeepaliveCallback,
- new TelephonyEvents.PacketKeepaliveEvent(
- mId,
- getPacketKeepaliveReceiverEventString(EVENT_STOPPED)));
- }
- }
-
- @Override
- public void onError(int error) {
- Log.d("PacketKeepaliveCallback on error! - code:" + error);
- if ((mEvents & EVENT_ERROR) == EVENT_ERROR) {
- mEventFacade.postEvent(
- TelephonyConstants.EventPacketKeepaliveCallback,
- new TelephonyEvents.PacketKeepaliveEvent(
- mId,
- getPacketKeepaliveReceiverEventString(EVENT_ERROR)));
- }
- }
- }
-
- class NetworkCallback extends ConnectivityManager.NetworkCallback {
- public static final int EVENT_INVALID = -1;
- public static final int EVENT_NONE = 0;
- public static final int EVENT_PRECHECK = 1 << 0;
- public static final int EVENT_AVAILABLE = 1 << 1;
- public static final int EVENT_LOSING = 1 << 2;
- public static final int EVENT_LOST = 1 << 3;
- public static final int EVENT_UNAVAILABLE = 1 << 4;
- public static final int EVENT_CAPABILITIES_CHANGED = 1 << 5;
- public static final int EVENT_SUSPENDED = 1 << 6;
- public static final int EVENT_RESUMED = 1 << 7;
- public static final int EVENT_LINK_PROPERTIES_CHANGED = 1 << 8;
- public static final int EVENT_ALL = EVENT_PRECHECK |
- EVENT_AVAILABLE |
- EVENT_LOSING |
- EVENT_LOST |
- EVENT_UNAVAILABLE |
- EVENT_CAPABILITIES_CHANGED |
- EVENT_SUSPENDED |
- EVENT_RESUMED |
- EVENT_LINK_PROPERTIES_CHANGED;
-
- private int mEvents;
- public String mId;
-
- public NetworkCallback(int events) {
- super();
- mEvents = events;
- mId = this.toString();
- }
-
- public void startListeningForEvents(int events) {
- mEvents |= events & EVENT_ALL;
- }
-
- public void stopListeningForEvents(int events) {
- mEvents &= ~(events & EVENT_ALL);
- }
-
- @Override
- public void onPreCheck(Network network) {
- Log.d("NetworkCallback onPreCheck");
- if ((mEvents & EVENT_PRECHECK) == EVENT_PRECHECK) {
- mEventFacade.postEvent(
- TelephonyConstants.EventNetworkCallback,
- new TelephonyEvents.NetworkCallbackEvent(
- mId,
- getNetworkCallbackEventString(EVENT_PRECHECK),
- TelephonyEvents.NetworkCallbackEvent.INVALID_VALUE,
- TelephonyEvents.NetworkCallbackEvent.INVALID_VALUE));
- }
- }
-
- @Override
- public void onAvailable(Network network) {
- Log.d("NetworkCallback onAvailable");
- if ((mEvents & EVENT_AVAILABLE) == EVENT_AVAILABLE) {
- mEventFacade.postEvent(
- TelephonyConstants.EventNetworkCallback,
- new TelephonyEvents.NetworkCallbackEvent(
- mId,
- getNetworkCallbackEventString(EVENT_AVAILABLE),
- TelephonyEvents.NetworkCallbackEvent.INVALID_VALUE,
- TelephonyEvents.NetworkCallbackEvent.INVALID_VALUE));
- }
- }
-
- @Override
- public void onLosing(Network network, int maxMsToLive) {
- Log.d("NetworkCallback onLosing");
- if ((mEvents & EVENT_LOSING) == EVENT_LOSING) {
- mEventFacade.postEvent(
- TelephonyConstants.EventNetworkCallback,
- new TelephonyEvents.NetworkCallbackEvent(
- mId,
- getNetworkCallbackEventString(EVENT_LOSING),
- TelephonyEvents.NetworkCallbackEvent.INVALID_VALUE,
- maxMsToLive));
- }
- }
-
- @Override
- public void onLost(Network network) {
- Log.d("NetworkCallback onLost");
- if ((mEvents & EVENT_LOST) == EVENT_LOST) {
- mEventFacade.postEvent(
- TelephonyConstants.EventNetworkCallback,
- new TelephonyEvents.NetworkCallbackEvent(
- mId,
- getNetworkCallbackEventString(EVENT_LOST),
- TelephonyEvents.NetworkCallbackEvent.INVALID_VALUE,
- TelephonyEvents.NetworkCallbackEvent.INVALID_VALUE));
- }
- }
-
- @Override
- public void onUnavailable() {
- Log.d("NetworkCallback onUnavailable");
- if ((mEvents & EVENT_UNAVAILABLE) == EVENT_UNAVAILABLE) {
- mEventFacade.postEvent(
- TelephonyConstants.EventNetworkCallback,
- new TelephonyEvents.NetworkCallbackEvent(
- mId,
- getNetworkCallbackEventString(EVENT_UNAVAILABLE),
- TelephonyEvents.NetworkCallbackEvent.INVALID_VALUE,
- TelephonyEvents.NetworkCallbackEvent.INVALID_VALUE));
- }
- }
-
- @Override
- public void onCapabilitiesChanged(Network network,
- NetworkCapabilities networkCapabilities) {
- Log.d("NetworkCallback onCapabilitiesChanged. RSSI:" +
- networkCapabilities.getSignalStrength());
- if ((mEvents & EVENT_CAPABILITIES_CHANGED) == EVENT_CAPABILITIES_CHANGED) {
- mEventFacade.postEvent(
- TelephonyConstants.EventNetworkCallback,
- new TelephonyEvents.NetworkCallbackEvent(
- mId,
- getNetworkCallbackEventString(EVENT_CAPABILITIES_CHANGED),
- networkCapabilities.getSignalStrength(),
- TelephonyEvents.NetworkCallbackEvent.INVALID_VALUE));
- }
- }
-
- @Override
- public void onNetworkSuspended(Network network) {
- Log.d("NetworkCallback onNetworkSuspended");
- if ((mEvents & EVENT_SUSPENDED) == EVENT_SUSPENDED) {
- mEventFacade.postEvent(
- TelephonyConstants.EventNetworkCallback,
- new TelephonyEvents.NetworkCallbackEvent(
- mId,
- getNetworkCallbackEventString(EVENT_SUSPENDED),
- TelephonyEvents.NetworkCallbackEvent.INVALID_VALUE,
- TelephonyEvents.NetworkCallbackEvent.INVALID_VALUE));
- }
- }
-
- @Override
- public void onLinkPropertiesChanged(Network network,
- LinkProperties linkProperties) {
- Log.d("NetworkCallback onLinkPropertiesChanged");
- if ((mEvents & EVENT_LINK_PROPERTIES_CHANGED) == EVENT_LINK_PROPERTIES_CHANGED) {
- mEventFacade.postEvent(
- TelephonyConstants.EventNetworkCallback,
- new TelephonyEvents.NetworkCallbackEvent(
- mId,
- getNetworkCallbackEventString(EVENT_LINK_PROPERTIES_CHANGED),
- TelephonyEvents.NetworkCallbackEvent.INVALID_VALUE,
- TelephonyEvents.NetworkCallbackEvent.INVALID_VALUE));
- }
- }
-
- @Override
- public void onNetworkResumed(Network network) {
- Log.d("NetworkCallback onNetworkResumed");
- if ((mEvents & EVENT_RESUMED) == EVENT_RESUMED) {
- mEventFacade.postEvent(
- TelephonyConstants.EventNetworkCallback,
- new TelephonyEvents.NetworkCallbackEvent(
- mId,
- getNetworkCallbackEventString(EVENT_RESUMED),
- TelephonyEvents.NetworkCallbackEvent.INVALID_VALUE,
- TelephonyEvents.NetworkCallbackEvent.INVALID_VALUE));
- }
- }
- }
-
- private static int getNetworkCallbackEvent(String event) {
- switch (event) {
- case TelephonyConstants.NetworkCallbackPreCheck:
- return NetworkCallback.EVENT_PRECHECK;
- case TelephonyConstants.NetworkCallbackAvailable:
- return NetworkCallback.EVENT_AVAILABLE;
- case TelephonyConstants.NetworkCallbackLosing:
- return NetworkCallback.EVENT_LOSING;
- case TelephonyConstants.NetworkCallbackLost:
- return NetworkCallback.EVENT_LOST;
- case TelephonyConstants.NetworkCallbackUnavailable:
- return NetworkCallback.EVENT_UNAVAILABLE;
- case TelephonyConstants.NetworkCallbackCapabilitiesChanged:
- return NetworkCallback.EVENT_CAPABILITIES_CHANGED;
- case TelephonyConstants.NetworkCallbackSuspended:
- return NetworkCallback.EVENT_SUSPENDED;
- case TelephonyConstants.NetworkCallbackResumed:
- return NetworkCallback.EVENT_RESUMED;
- case TelephonyConstants.NetworkCallbackLinkPropertiesChanged:
- return NetworkCallback.EVENT_LINK_PROPERTIES_CHANGED;
- }
- return NetworkCallback.EVENT_INVALID;
- }
-
- private static String getNetworkCallbackEventString(int event) {
- switch (event) {
- case NetworkCallback.EVENT_PRECHECK:
- return TelephonyConstants.NetworkCallbackPreCheck;
- case NetworkCallback.EVENT_AVAILABLE:
- return TelephonyConstants.NetworkCallbackAvailable;
- case NetworkCallback.EVENT_LOSING:
- return TelephonyConstants.NetworkCallbackLosing;
- case NetworkCallback.EVENT_LOST:
- return TelephonyConstants.NetworkCallbackLost;
- case NetworkCallback.EVENT_UNAVAILABLE:
- return TelephonyConstants.NetworkCallbackUnavailable;
- case NetworkCallback.EVENT_CAPABILITIES_CHANGED:
- return TelephonyConstants.NetworkCallbackCapabilitiesChanged;
- case NetworkCallback.EVENT_SUSPENDED:
- return TelephonyConstants.NetworkCallbackSuspended;
- case NetworkCallback.EVENT_RESUMED:
- return TelephonyConstants.NetworkCallbackResumed;
- case NetworkCallback.EVENT_LINK_PROPERTIES_CHANGED:
- return TelephonyConstants.NetworkCallbackLinkPropertiesChanged;
- }
- return TelephonyConstants.NetworkCallbackInvalid;
- }
-
- private static int getPacketKeepaliveReceiverEvent(String event) {
- switch (event) {
- case TelephonyConstants.PacketKeepaliveCallbackStarted:
- return PacketKeepaliveReceiver.EVENT_STARTED;
- case TelephonyConstants.PacketKeepaliveCallbackStopped:
- return PacketKeepaliveReceiver.EVENT_STOPPED;
- case TelephonyConstants.PacketKeepaliveCallbackError:
- return PacketKeepaliveReceiver.EVENT_ERROR;
- }
- return PacketKeepaliveReceiver.EVENT_INVALID;
- }
-
- private static String getPacketKeepaliveReceiverEventString(int event) {
- switch (event) {
- case PacketKeepaliveReceiver.EVENT_STARTED:
- return TelephonyConstants.PacketKeepaliveCallbackStarted;
- case PacketKeepaliveReceiver.EVENT_STOPPED:
- return TelephonyConstants.PacketKeepaliveCallbackStopped;
- case PacketKeepaliveReceiver.EVENT_ERROR:
- return TelephonyConstants.PacketKeepaliveCallbackError;
- }
- return TelephonyConstants.PacketKeepaliveCallbackInvalid;
- }
-
- private final ConnectivityManager mManager;
- private final Service mService;
- private final Context mContext;
- private final ConnectivityReceiver mConnectivityReceiver;
- private final EventFacade mEventFacade;
- private PacketKeepalive mPacketKeepalive;
- private NetworkCallback mNetworkCallback;
- private static HashMap<String, PacketKeepaliveReceiver> mPacketKeepaliveReceiverMap =
- new HashMap<String, PacketKeepaliveReceiver>();
- private static HashMap<String, NetworkCallback> mNetworkCallbackMap =
- new HashMap<String, NetworkCallback>();
- private boolean mTrackingConnectivityStateChange;
-
- public ConnectivityManagerFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mContext = mService.getBaseContext();
- mManager = (ConnectivityManager) mService.getSystemService(Context.CONNECTIVITY_SERVICE);
- mEventFacade = manager.getReceiver(EventFacade.class);
- mConnectivityReceiver = new ConnectivityReceiver();
- mTrackingConnectivityStateChange = false;
- }
-
- @Rpc(description = "Listen for connectivity changes")
- public void connectivityStartTrackingConnectivityStateChange() {
- if (!mTrackingConnectivityStateChange) {
- mTrackingConnectivityStateChange = true;
- mContext.registerReceiver(mConnectivityReceiver,
- new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
- }
- }
-
- @Rpc(description = "start natt keep alive")
- public String connectivityStartNattKeepalive(Integer intervalSeconds, String srcAddrString,
- Integer srcPort, String dstAddrString) throws UnknownHostException {
- try {
- Network mNetwork = mManager.getActiveNetwork();
- InetAddress srcAddr = InetAddress.getByName(srcAddrString);
- InetAddress dstAddr = InetAddress.getByName(dstAddrString);
- Log.d("startNattKeepalive srcAddr:" + srcAddr.getHostAddress());
- Log.d("startNattKeepalive dstAddr:" + dstAddr.getHostAddress());
- Log.d("startNattKeepalive srcPort:" + srcPort);
- Log.d("startNattKeepalive intervalSeconds:" + intervalSeconds);
- PacketKeepaliveReceiver mPacketKeepaliveReceiver = new PacketKeepaliveReceiver(
- PacketKeepaliveReceiver.EVENT_ALL);
- mPacketKeepalive = mManager.startNattKeepalive(mNetwork, (int) intervalSeconds,
- mPacketKeepaliveReceiver, srcAddr, (int) srcPort, dstAddr);
- if (mPacketKeepalive != null) {
- mPacketKeepaliveReceiver.mPacketKeepalive = mPacketKeepalive;
- String key = mPacketKeepaliveReceiver.mId;
- mPacketKeepaliveReceiverMap.put(key, mPacketKeepaliveReceiver);
- return key;
- } else {
- Log.e("startNattKeepalive fail, startNattKeepalive return null");
- return null;
- }
- } catch (UnknownHostException e) {
- Log.e("startNattKeepalive UnknownHostException");
- return null;
- }
- }
-
- @Rpc(description = "stop natt keep alive")
- public Boolean connectivityStopNattKeepalive(String key) {
- PacketKeepaliveReceiver mPacketKeepaliveReceiver =
- mPacketKeepaliveReceiverMap.get(key);
- if (mPacketKeepaliveReceiver != null) {
- mPacketKeepaliveReceiverMap.remove(key);
- mPacketKeepaliveReceiver.mPacketKeepalive.stop();
- return true;
- } else {
- return false;
- }
- }
-
- @Rpc(description = "start listening for NattKeepalive Event")
- public Boolean connectivityNattKeepaliveStartListeningForEvent(String key, String eventString) {
- PacketKeepaliveReceiver mPacketKeepaliveReceiver =
- mPacketKeepaliveReceiverMap.get(key);
- if (mPacketKeepaliveReceiver != null) {
- int event = getPacketKeepaliveReceiverEvent(eventString);
- if (event == PacketKeepaliveReceiver.EVENT_INVALID) {
- return false;
- }
- mPacketKeepaliveReceiver.startListeningForEvents(event);
- return true;
- } else {
- return false;
- }
- }
-
- @Rpc(description = "stop listening for NattKeepalive Event")
- public Boolean connectivityNattKeepaliveStopListeningForEvent(String key, String eventString) {
- PacketKeepaliveReceiver mPacketKeepaliveReceiver =
- mPacketKeepaliveReceiverMap.get(key);
- if (mPacketKeepaliveReceiver != null) {
- int event = getPacketKeepaliveReceiverEvent(eventString);
- if (event == PacketKeepaliveReceiver.EVENT_INVALID) {
- return false;
- }
- mPacketKeepaliveReceiver.stopListeningForEvents(event);
- return true;
- } else {
- return false;
- }
- }
-
- @Rpc(description = "start listening for NetworkCallback Event")
- public Boolean connectivityNetworkCallbackStartListeningForEvent(String key, String eventString) {
- NetworkCallback mNetworkCallback = mNetworkCallbackMap.get(key);
- if (mNetworkCallback != null) {
- int event = getNetworkCallbackEvent(eventString);
- if (event == NetworkCallback.EVENT_INVALID) {
- return false;
- }
- mNetworkCallback.startListeningForEvents(event);
- return true;
- } else {
- return false;
- }
- }
-
- @Rpc(description = "stop listening for NetworkCallback Event")
- public Boolean connectivityNetworkCallbackStopListeningForEvent(String key, String eventString) {
- NetworkCallback mNetworkCallback = mNetworkCallbackMap.get(key);
- if (mNetworkCallback != null) {
- int event = getNetworkCallbackEvent(eventString);
- if (event == NetworkCallback.EVENT_INVALID) {
- return false;
- }
- mNetworkCallback.stopListeningForEvents(event);
- return true;
- } else {
- return false;
- }
- }
-
- @Rpc(description = "Set Rssi Threshold Monitor")
- public String connectivitySetRssiThresholdMonitor(Integer rssi) {
- Log.d("SL4A:setRssiThresholdMonitor rssi = " + rssi);
- NetworkRequest.Builder builder = new NetworkRequest.Builder();
- builder.setSignalStrength((int) rssi);
- builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
- NetworkRequest networkRequest = builder.build();
- mNetworkCallback = new NetworkCallback(NetworkCallback.EVENT_ALL);
- mManager.registerNetworkCallback(networkRequest, mNetworkCallback);
- String key = mNetworkCallback.mId;
- mNetworkCallbackMap.put(key, mNetworkCallback);
- return key;
- }
-
- @Rpc(description = "Stop Rssi Threshold Monitor")
- public Boolean connectivityStopRssiThresholdMonitor(String key) {
- Log.d("SL4A:stopRssiThresholdMonitor key = " + key);
- return connectivityUnregisterNetworkCallback(key);
- }
-
- private NetworkRequest buildNetworkRequestFromJson(JSONObject configJson)
- throws JSONException {
- NetworkRequest.Builder builder = new NetworkRequest.Builder();
-
- if (configJson.has("TransportType")) {
- Log.d("build TransportType" + configJson.getInt("TransportType"));
- builder.addTransportType(configJson.getInt("TransportType"));
- }
- if (configJson.has("SignalStrength")) {
- Log.d("build SignalStrength" + configJson.getInt("SignalStrength"));
- builder.setSignalStrength(configJson.getInt("SignalStrength"));
- }
- if (configJson.has("Capability")) {
- JSONArray capabilities = configJson.getJSONArray("Capability");
- for (int i = 0; i < capabilities.length(); i++) {
- Log.d("build Capability" + capabilities.getInt(i));
- builder.addCapability(capabilities.getInt(i));
- }
- }
- if (configJson.has("LinkUpstreamBandwidthKbps")) {
- Log.d("build LinkUpstreamBandwidthKbps" + configJson.getInt(
- "LinkUpstreamBandwidthKbps"));
- builder.setLinkUpstreamBandwidthKbps(configJson.getInt(
- "LinkUpstreamBandwidthKbps"));
- }
- if (configJson.has("LinkDownstreamBandwidthKbps")) {
- Log.d("build LinkDownstreamBandwidthKbps" + configJson.getInt(
- "LinkDownstreamBandwidthKbps"));
- builder.setLinkDownstreamBandwidthKbps(configJson.getInt(
- "LinkDownstreamBandwidthKbps"));
- }
- if (configJson.has("NetworkSpecifier")) {
- Log.d("build NetworkSpecifier" + configJson.getString("NetworkSpecifier"));
- builder.setNetworkSpecifier(configJson.getString(
- "NetworkSpecifier"));
- }
- NetworkRequest networkRequest = builder.build();
- return networkRequest;
- }
-
- @Rpc(description = "register a network callback")
- public String connectivityRegisterNetworkCallback(@RpcParameter(name = "configJson")
- JSONObject configJson) throws JSONException {
- NetworkRequest networkRequest = buildNetworkRequestFromJson(configJson);
- mNetworkCallback = new NetworkCallback(NetworkCallback.EVENT_ALL);
- mManager.registerNetworkCallback(networkRequest, mNetworkCallback);
- String key = mNetworkCallback.mId;
- mNetworkCallbackMap.put(key, mNetworkCallback);
- return key;
- }
-
- @Rpc(description = "unregister a network callback")
- public Boolean connectivityUnregisterNetworkCallback(@RpcParameter(name = "key")
- String key) {
- mNetworkCallback = mNetworkCallbackMap.get(key);
- if (mNetworkCallback != null) {
- mNetworkCallbackMap.remove(key);
- mManager.unregisterNetworkCallback(mNetworkCallback);
- return true;
- } else {
- return false;
- }
- }
-
- @Rpc(description = "request a network")
- public String connectivityRequestNetwork(@RpcParameter(name = "configJson")
- JSONObject configJson) throws JSONException {
- NetworkRequest networkRequest = buildNetworkRequestFromJson(configJson);
- mNetworkCallback = new NetworkCallback(NetworkCallback.EVENT_ALL);
- mManager.requestNetwork(networkRequest, mNetworkCallback);
- String key = mNetworkCallback.mId;
- mNetworkCallbackMap.put(key, mNetworkCallback);
- return key;
- }
-
- @Rpc(description = "Stop listening for connectivity changes")
- public void connectivityStopTrackingConnectivityStateChange() {
- if (mTrackingConnectivityStateChange) {
- mTrackingConnectivityStateChange = false;
- mContext.unregisterReceiver(mConnectivityReceiver);
- }
- }
-
- @Rpc(description = "Get the extra information about the network state provided by lower network layers.")
- public String connectivityNetworkGetActiveConnectionExtraInfo() {
- NetworkInfo current = mManager.getActiveNetworkInfo();
- if (current == null) {
- Log.d("No network is active at the moment.");
- return null;
- }
- return current.getExtraInfo();
- }
-
- @Rpc(description = "Return the subtype name of the current network, null if not connected")
- public String connectivityNetworkGetActiveConnectionSubtypeName() {
- NetworkInfo current = mManager.getActiveNetworkInfo();
- if (current == null) {
- Log.d("No network is active at the moment.");
- return null;
- }
- return current.getSubtypeName();
- }
-
- @Rpc(description = "Return a human-readable name describe the type of the network, e.g. WIFI")
- public String connectivityNetworkGetActiveConnectionTypeName() {
- NetworkInfo current = mManager.getActiveNetworkInfo();
- if (current == null) {
- Log.d("No network is active at the moment.");
- return null;
- }
- return current.getTypeName();
- }
-
- @Rpc(description = "Get connection status information about all network types supported by the device.")
- public NetworkInfo[] connectivityNetworkGetAllInfo() {
- return mManager.getAllNetworkInfo();
- }
-
- @Rpc(description = "Check whether the active network is connected to the Internet.")
- public Boolean connectivityNetworkIsConnected() {
- NetworkInfo current = mManager.getActiveNetworkInfo();
- if (current == null) {
- Log.d("No network is active at the moment.");
- return false;
- }
- return current.isConnected();
- }
-
- @Rpc(description = "Checks the airplane mode setting.",
- returns = "True if airplane mode is enabled.")
- public Boolean connectivityCheckAirplaneMode() {
- try {
- return android.provider.Settings.System.getInt(mService.getContentResolver(),
- android.provider.Settings.Global.AIRPLANE_MODE_ON) == AIRPLANE_MODE_ON;
- } catch (SettingNotFoundException e) {
- return false;
- }
- }
-
- @Rpc(description = "Toggles airplane mode on and off.",
- returns = "True if airplane mode is enabled.")
- public void connectivityToggleAirplaneMode(@RpcParameter(name = "enabled")
- @RpcOptional
- Boolean enabled) {
- if (enabled == null) {
- enabled = !connectivityCheckAirplaneMode();
- }
- mManager.setAirplaneMode(enabled);
- }
-
- @Rpc(description = "Check if tethering supported or not.",
- returns = "True if tethering is supported.")
- public boolean connectivityIsTetheringSupported() {
- return mManager.isTetheringSupported();
- }
-
- @Override
- public void shutdown() {
- connectivityStopTrackingConnectivityStateChange();
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/ContactsFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/ContactsFacade.java
deleted file mode 100644
index 4ab4a1d..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/ContactsFacade.java
+++ /dev/null
@@ -1,303 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade;
-
-import android.app.Service;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.Intent;
-import android.database.Cursor;
-import android.net.Uri;
-import android.provider.ContactsContract;
-
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcOptional;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-/**
- * Provides access to contacts related functionality.
- *
- * @author MeanEYE.rcf (meaneye.rcf@gmail.com
- */
-public class ContactsFacade extends RpcReceiver {
- private static final Uri CONTACTS_URI = Uri.parse("content://contacts/people");
- private final ContentResolver mContentResolver;
- private final Service mService;
- private final CommonIntentsFacade mCommonIntentsFacade;
- public Uri mPhoneContent = null;
- public String mContactId;
- public String mPrimary;
- public String mPhoneNumber;
- public String mHasPhoneNumber;
-
- public ContactsFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mContentResolver = mService.getContentResolver();
- mCommonIntentsFacade = manager.getReceiver(CommonIntentsFacade.class);
- try {
- // Backward compatibility... get contract stuff using reflection
- Class<?> phone = Class.forName("android.provider.ContactsContract$CommonDataKinds$Phone");
- mPhoneContent = (Uri) phone.getField("CONTENT_URI").get(null);
- mContactId = (String) phone.getField("CONTACT_ID").get(null);
- mPrimary = (String) phone.getField("IS_PRIMARY").get(null);
- mPhoneNumber = (String) phone.getField("NUMBER").get(null);
- mHasPhoneNumber = (String) phone.getField("HAS_PHONE_NUMBER").get(null);
- } catch (Exception e) {
- }
- }
-
- private Uri buildUri(Integer id) {
- Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id);
- return uri;
- }
-
- @Rpc(description = "Displays a list of contacts to pick from.", returns = "A map of result values.")
- public Intent pickContact() throws JSONException {
- return mCommonIntentsFacade.pick("content://contacts/people");
- }
-
- @Rpc(description = "Displays a list of phone numbers to pick from.", returns = "The selected phone number.")
- public String pickPhone() throws JSONException {
- String result = null;
- Intent data = mCommonIntentsFacade.pick("content://contacts/phones");
- if (data != null) {
- Uri phoneData = data.getData();
- Cursor cursor = mService.getContentResolver().query(phoneData, null, null, null, null);
- if (cursor != null) {
- if (cursor.moveToFirst()) {
- result = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup.NUMBER));
- }
- cursor.close();
- }
- }
- return result;
- }
-
- @Rpc(description = "Returns a List of all possible attributes for contacts.")
- public List<String> contactsGetAttributes() {
- List<String> result = new ArrayList<String>();
- Cursor cursor = mContentResolver.query(CONTACTS_URI, null, null, null, null);
- if (cursor != null) {
- String[] columns = cursor.getColumnNames();
- for (int i = 0; i < columns.length; i++) {
- result.add(columns[i]);
- }
- cursor.close();
- }
- return result;
- }
-
- // TODO(MeanEYE.rcf): Add ability to narrow selection by providing named pairs of attributes.
- @Rpc(description = "Returns a List of all contact IDs.")
- public List<Integer> contactsGetIds() {
- List<Integer> result = new ArrayList<Integer>();
- String[] columns = { "_id" };
- Cursor cursor = mContentResolver.query(CONTACTS_URI, columns, null, null, null);
- if (cursor != null) {
- while (cursor.moveToNext()) {
- result.add(cursor.getInt(0));
- }
- cursor.close();
- }
- return result;
- }
-
- @Rpc(description = "Returns a List of all contacts.", returns = "a List of contacts as Maps")
- public List<JSONObject> contactsGet(
- @RpcParameter(name = "attributes") @RpcOptional JSONArray attributes) throws JSONException {
- List<JSONObject> result = new ArrayList<JSONObject>();
- String[] columns;
- if (attributes == null || attributes.length() == 0) {
- // In case no attributes are specified we set the default ones.
- columns = new String[] { "_id", "name", "primary_phone", "primary_email", "type" };
- } else {
- // Convert selected attributes list into usable string list.
- columns = new String[attributes.length()];
- for (int i = 0; i < attributes.length(); i++) {
- columns[i] = attributes.getString(i);
- }
- }
- List<String> queryList = new ArrayList<String>();
- for (String s : columns) {
- queryList.add(s);
- }
- if (!queryList.contains("_id")) {
- queryList.add("_id");
- }
-
- String[] query = queryList.toArray(new String[queryList.size()]);
- Cursor cursor = mContentResolver.query(CONTACTS_URI, query, null, null, null);
- if (cursor != null) {
- int idIndex = cursor.getColumnIndex("_id");
- while (cursor.moveToNext()) {
- String id = cursor.getString(idIndex);
- JSONObject message = new JSONObject();
- for (int i = 0; i < columns.length; i++) {
- String key = columns[i];
- String value = cursor.getString(cursor.getColumnIndex(key));
- if (mPhoneNumber != null) {
- if (key.equals("primary_phone")) {
- value = findPhone(id);
- }
- }
- message.put(key, value);
- }
- result.add(message);
- }
- cursor.close();
- }
- return result;
- }
-
- private String findPhone(String id) {
- String result = null;
- if (id == null || id.equals("")) {
- return result;
- }
- try {
- if (Integer.parseInt(id) > 0) {
- Cursor pCur =
- mContentResolver.query(mPhoneContent, new String[] { mPhoneNumber }, mContactId
- + " = ? and " + mPrimary + "=1", new String[] { id }, null);
- if (pCur != null) {
- pCur.getColumnNames();
- while (pCur.moveToNext()) {
- result = pCur.getString(0);
- break;
- }
- }
- pCur.close();
- }
- } catch (Exception e) {
- return null;
- }
- return result;
- }
-
- @Rpc(description = "Returns contacts by ID.")
- public JSONObject contactsGetById(@RpcParameter(name = "id") Integer id,
- @RpcParameter(name = "attributes") @RpcOptional JSONArray attributes) throws JSONException {
- JSONObject result = null;
- Uri uri = buildUri(id);
- String[] columns;
- if (attributes == null || attributes.length() == 0) {
- // In case no attributes are specified we set the default ones.
- columns = new String[] { "_id", "name", "primary_phone", "primary_email", "type" };
- } else {
- // Convert selected attributes list into usable string list.
- columns = new String[attributes.length()];
- for (int i = 0; i < attributes.length(); i++) {
- columns[i] = attributes.getString(i);
- }
- }
- Cursor cursor = mContentResolver.query(uri, columns, null, null, null);
- if (cursor != null) {
- result = new JSONObject();
- cursor.moveToFirst();
- for (int i = 0; i < columns.length; i++) {
- result.put(columns[i], cursor.getString(i));
- }
- cursor.close();
- }
- return result;
- }
-
- // TODO(MeanEYE.rcf): Add ability to narrow selection by providing named pairs of attributes.
- @Rpc(description = "Returns the number of contacts.")
- public Integer contactsGetCount() {
- Integer result = 0;
- Cursor cursor = mContentResolver.query(CONTACTS_URI, null, null, null, null);
- if (cursor != null) {
- result = cursor.getCount();
- cursor.close();
- }
- return result;
- }
-
- private String[] jsonToArray(JSONArray array) throws JSONException {
- String[] result = null;
- if (array != null && array.length() > 0) {
- result = new String[array.length()];
- for (int i = 0; i < array.length(); i++) {
- result[i] = array.getString(i);
- }
- }
- return result;
- }
-
- /**
- * Exactly as per <a href=
- * "http://developer.android.com/reference/android/content/ContentResolver.html#query%28android.net.Uri,%20java.lang.String[],%20java.lang.String,%20java.lang.String[],%20java.lang.String%29"
- * >ContentResolver.query</a>
- */
- @Rpc(description = "Content Resolver Query", returns = "result of query as Maps")
- public List<JSONObject> queryContent(
- @RpcParameter(name = "uri", description = "The URI, using the content:// scheme, for the content to retrieve.") String uri,
- @RpcParameter(name = "attributes", description = "A list of which columns to return. Passing null will return all columns") @RpcOptional JSONArray attributes,
- @RpcParameter(name = "selection", description = "A filter declaring which rows to return") @RpcOptional String selection,
- @RpcParameter(name = "selectionArgs", description = "You may include ?s in selection, which will be replaced by the values from selectionArgs") @RpcOptional JSONArray selectionArgs,
- @RpcParameter(name = "order", description = "How to order the rows") @RpcOptional String order)
- throws JSONException {
- List<JSONObject> result = new ArrayList<JSONObject>();
- String[] columns = jsonToArray(attributes);
- String[] args = jsonToArray(selectionArgs);
- Cursor cursor = mContentResolver.query(Uri.parse(uri), columns, selection, args, order);
- if (cursor != null) {
- String[] names = cursor.getColumnNames();
- while (cursor.moveToNext()) {
- JSONObject message = new JSONObject();
- for (int i = 0; i < cursor.getColumnCount(); i++) {
- String key = names[i];
- String value = cursor.getString(i);
- message.put(key, value);
- }
- result.add(message);
- }
- cursor.close();
- }
- return result;
- }
-
- @Rpc(description = "Content Resolver Query Attributes", returns = "a list of available columns for a given content uri")
- public JSONArray queryAttributes(
- @RpcParameter(name = "uri", description = "The URI, using the content:// scheme, for the content to retrieve.") String uri)
- throws JSONException {
- JSONArray result = new JSONArray();
- Cursor cursor = mContentResolver.query(Uri.parse(uri), null, "1=0", null, null);
- if (cursor != null) {
- String[] names = cursor.getColumnNames();
- for (String name : names) {
- result.put(name);
- }
- cursor.close();
- }
- return result;
- }
-
- @Override
- public void shutdown() {
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/DisplayFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/DisplayFacade.java
deleted file mode 100644
index d0c472c..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/DisplayFacade.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade;
-
-import java.util.HashMap;
-
-import android.app.Service;
-import android.content.Context;
-import android.graphics.Point;
-import android.hardware.display.DisplayManager;
-import android.util.DisplayMetrics;
-import android.view.Display;
-
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcDefault;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-public class DisplayFacade extends RpcReceiver {
-
- private final Service mService;
- private final DisplayManager mDisplayManager;
- private HashMap<Integer, Display> mDisplays;
-
- public DisplayFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mDisplayManager = (DisplayManager) mService.getSystemService(Context.DISPLAY_SERVICE);
- updateDisplays(mDisplayManager.getDisplays());
- }
-
- private void updateDisplays(Display[] displays) {
- if (mDisplays == null) {
- mDisplays = new HashMap<Integer, Display>();
- }
- mDisplays.clear();
- for(Display d : displays) {
- mDisplays.put(d.getDisplayId(), d);
- }
- }
-
- @Rpc(description = "Get a list of IDs of the logical displays connected."
- + "Also updates the cached displays.")
- public Integer[] displayGetDisplays() {
- Display[] displays = mDisplayManager.getDisplays();
- updateDisplays(displays);
- Integer[] results = new Integer[displays.length];
- for(int i = 0; i < displays.length; i++) {
- results[i] = displays[i].getDisplayId();
- }
- return results;
- }
-
- @Rpc(description = "Get the size of the specified display in pixels.")
- public Point displayGetSize(
- @RpcParameter(name = "displayId")
- @RpcDefault(value = "0")
- Integer displayId) {
- Point outSize = new Point();
- Display d = mDisplays.get(displayId);
- d.getSize(outSize);
- return outSize;
- }
-
- @Rpc(description = "Get the maximum screen size dimension that will happen.")
- public Integer displayGetMaximumSizeDimension(
- @RpcParameter(name = "displayId")
- @RpcDefault(value = "0")
- Integer displayId) {
- Display d = mDisplays.get(displayId);
- return d.getMaximumSizeDimension();
- }
-
- @Rpc(description = "Get display metrics based on the real size of this display.")
- public DisplayMetrics displayGetRealMetrics(
- @RpcParameter(name = "displayId")
- @RpcDefault(value = "0")
- Integer displayId) {
- Display d = mDisplays.get(displayId);
- DisplayMetrics outMetrics = new DisplayMetrics();
- d.getRealMetrics(outMetrics);
- return outMetrics;
- }
-
- @Override
- public void shutdown() {
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/EventFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/EventFacade.java
deleted file mode 100644
index 36e620d..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/EventFacade.java
+++ /dev/null
@@ -1,437 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Queue;
-import java.util.Set;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.TimeUnit;
-
-import org.json.JSONException;
-
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Bundle;
-
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Multimap;
-import com.google.common.collect.Multimaps;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.event.Event;
-import com.googlecode.android_scripting.event.EventObserver;
-import com.googlecode.android_scripting.event.EventServer;
-import com.googlecode.android_scripting.future.FutureResult;
-import com.googlecode.android_scripting.jsonrpc.JsonBuilder;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcDefault;
-import com.googlecode.android_scripting.rpc.RpcDeprecated;
-import com.googlecode.android_scripting.rpc.RpcName;
-import com.googlecode.android_scripting.rpc.RpcOptional;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-/**
- * Manage the event queue. <br>
- * <br>
- * <b>Usage Notes:</b><br>
- * EventFacade APIs interact with the Event Queue (a data buffer containing up to 1024 event
- * entries).<br>
- * Events are automatically entered into the Event Queue following API calls such as startSensing()
- * and startLocating().<br>
- * The Event Facade provides control over how events are entered into (and removed from) the Event
- * Queue.<br>
- * The Event Queue provides a useful means of recording background events (such as sensor data) when
- * the phone is busy with foreground activities.
- *
- * @author Felix Arends (felix.arends@gmail.com)
- */
-public class EventFacade extends RpcReceiver {
- /**
- * The maximum length of the event queue. Old events will be discarded when this limit is
- * exceeded.
- */
- private static final int MAX_QUEUE_SIZE = 1024;
- private final Queue<Event> mEventQueue = new ConcurrentLinkedQueue<Event>();
- private final CopyOnWriteArrayList<EventObserver> mGlobalEventObservers =
- new CopyOnWriteArrayList<EventObserver>();
- private final Multimap<String, EventObserver> mNamedEventObservers = Multimaps
- .synchronizedListMultimap(ArrayListMultimap.<String, EventObserver> create());
- private EventServer mEventServer = null;
- private final HashMap<String, BroadcastListener> mBroadcastListeners =
- new HashMap<String, BroadcastListener>();
- private final Context mContext;
- private boolean bEventServerRunning;
-
- public EventFacade(FacadeManager manager) {
- super(manager);
- mContext = manager.getService().getApplicationContext();
- Log.v("Creating new EventFacade Instance()");
- bEventServerRunning = false;
- }
-
- /**
- * Example (python): droid.eventClearBuffer()
- */
- @Rpc(description = "Clears all events from the event buffer.")
- public void eventClearBuffer() {
- mEventQueue.clear();
- }
-
- /**
- * Registers a listener for a new broadcast signal
- */
- @Rpc(description = "Registers a listener for a new broadcast signal")
- public boolean eventRegisterForBroadcast(
- @RpcParameter(name = "category") String category,
- @RpcParameter(name = "enqueue",
- description = "Should this events be added to the event queue or only dispatched") @RpcDefault(value = "true") Boolean enqueue) {
- if (mBroadcastListeners.containsKey(category)) {
- return false;
- }
-
- BroadcastListener b = new BroadcastListener(this, enqueue.booleanValue());
- IntentFilter c = new IntentFilter(category);
- mContext.registerReceiver(b, c);
- mBroadcastListeners.put(category, b);
-
- return true;
- }
-
- @Rpc(description = "Stop listening for a broadcast signal")
- public void eventUnregisterForBroadcast(
- @RpcParameter(name = "category") String category) {
- if (!mBroadcastListeners.containsKey(category)) {
- return;
- }
-
- mContext.unregisterReceiver(mBroadcastListeners.get(category));
- mBroadcastListeners.remove(category);
- }
-
- @Rpc(description = "Lists all the broadcast signals we are listening for")
- public Set<String> eventGetBrodcastCategories() {
- return mBroadcastListeners.keySet();
- }
-
- /**
- * Actual data returned in the map will depend on the type of event.
- *
- * <pre>
- * Example (python):
- * import android, time
- * droid = android.Android()
- * droid.startSensing()
- * time.sleep(1)
- * droid.eventClearBuffer()
- * time.sleep(1)
- * e = eventPoll(1).result
- * event_entry_number = 0
- * x = e[event_entry_ number]['data']['xforce']
- * </pre>
- *
- * e has the format:<br>
- * [{u'data': {u'accuracy': 0, u'pitch': -0.48766891956329345, u'xmag': -5.6875, u'azimuth':
- * 0.3312483489513397, u'zforce': 8.3492730000000002, u'yforce': 4.5628165999999997, u'time':
- * 1297072704.813, u'ymag': -11.125, u'zmag': -42.375, u'roll': -0.059393649548292161,
- * u'xforce': 0.42223078000000003}, u'name': u'sensors', u'time': 1297072704813000L}]<br>
- * x has the string value of the x force data (0.42223078000000003) at the time of the event
- * entry. </pre>
- */
-
- @Rpc(description = "Returns and removes the oldest n events (i.e. location or sensor update, etc.) from the event buffer.",
- returns = "A List of Maps of event properties.")
- public List<Event> eventPoll(
- @RpcParameter(name = "number_of_events") @RpcDefault("1") Integer number_of_events) {
- List<Event> events = Lists.newArrayList();
- for (int i = 0; i < number_of_events; i++) {
- Event event = mEventQueue.poll();
- if (event == null) {
- break;
- }
- events.add(event);
- }
- return events;
- }
-
- @Rpc(description = "Blocks until an event with the supplied name occurs. Event is removed from the buffer if removeEvent is True.",
- returns = "Map of event properties.")
- public Event eventWaitFor(
- @RpcParameter(name = "eventName")
- final String eventName,
- @RpcParameter(name = "removeEvent")
- final Boolean removeEvent,
- @RpcParameter(name = "timeout", description = "the maximum time to wait (in ms)") @RpcOptional Integer timeout)
- throws InterruptedException {
- Event result = null;
- final FutureResult<Event> futureEvent;
- synchronized (mEventQueue) { // First check to make sure it isn't already there
- for (Event event : mEventQueue) {
- if (event.getName().equals(eventName)) {
- result = event;
- if (removeEvent)
- mEventQueue.remove(event);
- return result;
- }
- }
- futureEvent = new FutureResult<Event>();
- addNamedEventObserver(eventName, new EventObserver() {
- @Override
- public void onEventReceived(Event event) {
- if (event.getName().equals(eventName)) {
- synchronized (futureEvent) {
- if (!futureEvent.isDone()) {
- futureEvent.set(event);
- // TODO(navtej) Remove log.
- Log.v(String.format("Removeing observer (%s) got event (%s)",
- this,
- event));
- removeEventObserver(this);
- }
- if (removeEvent)
- mEventQueue.remove(event);
- }
- }
- }
- });
- }
- if (futureEvent != null) {
- if (timeout != null) {
- result = futureEvent.get(timeout, TimeUnit.MILLISECONDS);
- } else {
- result = futureEvent.get();
- }
- }
- return result;
- }
-
- @Rpc(description = "Blocks until an event occurs. The returned event is removed from the buffer.",
- returns = "Map of event properties.")
- public Event eventWait(
- @RpcParameter(name = "timeout", description = "the maximum time to wait") @RpcOptional Integer timeout)
- throws InterruptedException {
- Event result = null;
- final FutureResult<Event> futureEvent = new FutureResult<Event>();
- EventObserver observer;
- synchronized (mEventQueue) { // Anything in queue?
- if (mEventQueue.size() > 0) {
- return mEventQueue.poll(); // return it.
- }
- observer = new EventObserver() {
- @Override
- public void onEventReceived(Event event) { // set up observer for any events.
- synchronized (futureEvent) {
- if (!futureEvent.isDone()) {
- futureEvent.set(event);
- // TODO(navtej) Remove log.
- Log.v(String.format("onEventReceived for event (%s)", event));
- }
- }
- }
- };
- addGlobalEventObserver(observer);
- }
- if (timeout != null) {
- result = futureEvent.get(timeout, TimeUnit.MILLISECONDS);
- } else {
- result = futureEvent.get();
- }
- if (result != null) {
- mEventQueue.remove(result);
- }
- // TODO(navtej) Remove log.
- Log.v(String.format("Removeing observer (%s) got event (%s)", observer, result));
- if (observer != null) {
- removeEventObserver(observer); // Make quite sure this goes away.
- }
- return result;
- }
-
- /**
- * <pre>
- * Example:
- * import android
- * from datetime import datetime
- * droid = android.Android()
- * t = datetime.now()
- * droid.eventPost('Some Event', t)
- * </pre>
- */
- @Rpc(description = "Post an event to the event queue.")
- public void eventPost(
- @RpcParameter(name = "name", description = "Name of event") String name,
- @RpcParameter(name = "data", description = "Data contained in event.") String data,
- @RpcParameter(name = "enqueue",
- description = "Set to False if you don't want your events to be added to the event queue, just dispatched.") @RpcOptional @RpcDefault("false") Boolean enqueue) {
- postEvent(name, data, enqueue.booleanValue());
- }
-
- /**
- * Post an event and queue it
- */
- public void postEvent(String name, Object data) {
- postEvent(name, data, true);
- }
-
- /**
- * Posts an event with to the event queue.
- */
- public void postEvent(String name, Object data, boolean enqueue) {
- Event event = new Event(name, data);
- if (enqueue != false) {
- synchronized (mEventQueue) {
- while (mEventQueue.size() >= MAX_QUEUE_SIZE) {
- mEventQueue.remove();
- }
- mEventQueue.add(event);
- }
- Log.v(String.format("postEvent(%s)", name));
- }
- synchronized (mNamedEventObservers) {
- for (EventObserver observer : mNamedEventObservers.get(name)) {
- observer.onEventReceived(event);
- }
- }
- synchronized (mGlobalEventObservers) {
- // TODO(navtej) Remove log.
- Log.v(String.format("mGlobalEventObservers size (%s)", mGlobalEventObservers.size()));
- for (EventObserver observer : mGlobalEventObservers) {
- observer.onEventReceived(event);
- }
- }
- }
-
- @RpcDeprecated(value = "eventPost", release = "r4")
- @Rpc(description = "Post an event to the event queue.")
- @RpcName(name = "postEvent")
- public void rpcPostEvent(
- @RpcParameter(name = "name") String name,
- @RpcParameter(name = "data") String data) {
- postEvent(name, data);
- }
-
- @RpcDeprecated(value = "eventPoll", release = "r4")
- @Rpc(description = "Returns and removes the oldest event (i.e. location or sensor update, etc.) from the event buffer.",
- returns = "Map of event properties.")
- public Event receiveEvent() {
- return mEventQueue.poll();
- }
-
- @RpcDeprecated(value = "eventWaitFor", release = "r4")
- @Rpc(description = "Blocks until an event with the supplied name occurs. Event is removed from the buffer if removeEvent is True.",
- returns = "Map of event properties.")
- public Event waitForEvent(
- @RpcParameter(name = "eventName")
- final String eventName,
- @RpcOptional
- final Boolean removeEvent,
- @RpcParameter(name = "timeout", description = "the maximum time to wait") @RpcOptional Integer timeout)
- throws InterruptedException {
- return eventWaitFor(eventName, removeEvent, timeout);
- }
-
- @Rpc(description = "Opens up a socket where you can read for events posted")
- public int startEventDispatcher(
- @RpcParameter(name = "port", description = "Port to use") @RpcDefault("0") @RpcOptional() Integer port) {
- if (mEventServer == null) {
- if (port == null) {
- port = 0;
- }
- mEventServer = new EventServer(port);
- addGlobalEventObserver(mEventServer);
- bEventServerRunning = true;
- }
- return mEventServer.getAddress().getPort();
- }
-
- @Rpc(description = "sl4a session is shutting down, send terminate event to client.")
- public void closeSl4aSession() {
- eventClearBuffer();
- postEvent("EventDispatcherShutdown", null);
- }
-
- @Rpc(description = "Stops the event server, you can't read in the port anymore")
- public void stopEventDispatcher() throws RuntimeException {
- if (bEventServerRunning == true) {
- if (mEventServer == null) {
- throw new RuntimeException("Not running");
- }
- bEventServerRunning = false;
- mEventServer.shutdown();
- Log.v(String.format("stopEventDispatcher (%s)", mEventServer));
- removeEventObserver(mEventServer);
- mEventServer = null;
- }
- return;
- }
-
- @Override
- public void shutdown() {
-
- try {
- stopEventDispatcher();
- } catch (Exception e) {
- Log.e("Exception tearing down event dispatcher", e);
- }
- mGlobalEventObservers.clear();
- mEventQueue.clear();
- }
-
- public void addNamedEventObserver(String eventName, EventObserver observer) {
- mNamedEventObservers.put(eventName, observer);
- }
-
- public void addGlobalEventObserver(EventObserver observer) {
- mGlobalEventObservers.add(observer);
- }
-
- public void removeEventObserver(EventObserver observer) {
- mNamedEventObservers.removeAll(observer);
- mGlobalEventObservers.remove(observer);
- }
-
- public class BroadcastListener extends android.content.BroadcastReceiver {
- private EventFacade mParent;
- private boolean mEnQueue;
-
- public BroadcastListener(EventFacade parent, boolean enqueue) {
- mParent = parent;
- mEnQueue = enqueue;
- }
-
- @Override
- public void onReceive(Context context, Intent intent) {
- Bundle data;
- if (intent.getExtras() != null) {
- data = (Bundle) intent.getExtras().clone();
- } else {
- data = new Bundle();
- }
- data.putString("action", intent.getAction());
- try {
- mParent.eventPost("sl4a", JsonBuilder.build(data).toString(), mEnQueue);
- } catch (JSONException e) {
- e.printStackTrace();
- }
- }
-
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/FacadeManager.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/FacadeManager.java
deleted file mode 100644
index 90de7f9..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/FacadeManager.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade;
-
-import android.app.Service;
-import android.content.Intent;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.exception.Sl4aException;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiverManager;
-import com.googlecode.android_scripting.rpc.RpcDeprecated;
-import com.googlecode.android_scripting.rpc.RpcMinSdk;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Collection;
-
-public class FacadeManager extends RpcReceiverManager {
-
- private final Service mService;
- private final Intent mIntent;
- private int mSdkLevel;
-
- public FacadeManager(int sdkLevel, Service service, Intent intent,
- Collection<Class<? extends RpcReceiver>> classList) {
- super(classList);
- mSdkLevel = sdkLevel;
- mService = service;
- mIntent = intent;
- }
-
- public int getSdkLevel() {
- return mSdkLevel;
- }
-
- public Service getService() {
- return mService;
- }
-
- public Intent getIntent() {
- return mIntent;
- }
-
- @Override
- public Object invoke(Class<? extends RpcReceiver> clazz, Method method, Object[] args)
- throws Exception {
- try {
- if (method.isAnnotationPresent(RpcDeprecated.class)) {
- String replacedBy = method.getAnnotation(RpcDeprecated.class).value();
- String title = method.getName() + " is deprecated";
- Log.notify(mService, title, title, String.format("Please use %s instead.", replacedBy));
- } else if (method.isAnnotationPresent(RpcMinSdk.class)) {
- int requiredSdkLevel = method.getAnnotation(RpcMinSdk.class).value();
- if (mSdkLevel < requiredSdkLevel) {
- throw new Sl4aException(String.format("%s requires API level %d, current level is %d",
- method.getName(), requiredSdkLevel, mSdkLevel));
- }
- }
- return super.invoke(clazz, method, args);
- } catch (InvocationTargetException e) {
- if (e.getCause() instanceof SecurityException) {
- Log.notify(mService, "RPC invoke failed...", mService.getPackageName(), e.getCause()
- .getMessage());
- }
- throw e;
- }
- }
-
- public AndroidFacade.Resources getAndroidFacadeResources() {
- return new AndroidFacade.Resources() {
- @Override
- public int getLogo48() {
- // TODO(Alexey): As an alternative, ask application for resource ids.
- String packageName = mService.getApplication().getPackageName();
- return mService.getResources().getIdentifier("script_logo_48", "drawable", packageName);
- }
- };
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/FacadeManagerFactory.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/FacadeManagerFactory.java
deleted file mode 100644
index e436d03..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/FacadeManagerFactory.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade;
-
-import android.app.Service;
-import android.content.Intent;
-
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiverManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiverManagerFactory;
-
-import java.util.HashMap;
-import java.util.Collection;
-import java.util.Map;
-
-public class FacadeManagerFactory implements RpcReceiverManagerFactory {
-
- private final int mSdkLevel;
- private final Service mService;
- private final Intent mIntent;
- private final Collection<Class<? extends RpcReceiver>> mClassList;
- private final Map<Integer, RpcReceiverManager> mFacadeManagers;
-
- public FacadeManagerFactory(int sdkLevel, Service service, Intent intent,
- Collection<Class<? extends RpcReceiver>> classList) {
- mSdkLevel = sdkLevel;
- mService = service;
- mIntent = intent;
- mClassList = classList;
- mFacadeManagers = new HashMap<Integer, RpcReceiverManager>();
- }
-
- @Override
- public FacadeManager create(Integer UID) {
- FacadeManager facadeManager = new FacadeManager(mSdkLevel, mService, mIntent, mClassList);
- mFacadeManagers.put(UID, facadeManager);
- return facadeManager;
- }
-
- @Override
- public Map<Integer, RpcReceiverManager> getRpcReceiverManagers() {
- return mFacadeManagers;
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/LocationFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/LocationFacade.java
deleted file mode 100644
index eed244e..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/LocationFacade.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade;
-
-import android.app.Service;
-import android.content.Context;
-import android.location.Address;
-import android.location.Geocoder;
-import android.location.Location;
-import android.location.LocationListener;
-import android.location.LocationManager;
-import android.os.Bundle;
-
-import com.google.common.collect.Maps;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcDefault;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-import com.googlecode.android_scripting.rpc.RpcStartEvent;
-import com.googlecode.android_scripting.rpc.RpcStopEvent;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-/**
- * This facade exposes the LocationManager related functionality.<br>
- * <br>
- * <b>Overview</b><br>
- * Once activated by 'startLocating' the LocationFacade attempts to return location data collected
- * via GPS or the cell network. If neither are available the last known location may be retrieved.
- * If both are available the format of the returned data is:<br>
- * {u'network': {u'altitude': 0, u'provider': u'network', u'longitude': -0.38509020000000002,
- * u'time': 1297079691231L, u'latitude': 52.410557300000001, u'speed': 0, u'accuracy': 75}, u'gps':
- * {u'altitude': 51, u'provider': u'gps', u'longitude': -0.38537094593048096, u'time':
- * 1297079709000L, u'latitude': 52.41076922416687, u'speed': 0, u'accuracy': 24}}<br>
- * If neither are available {} is returned. <br>
- * Example (python):<br>
- *
- * <pre>
- * import android, time
- * droid = android.Android()
- * droid.startLocating()
- * time.sleep(15)
- * loc = droid.readLocation().result
- * if loc = {}:
- * loc = getLastKnownLocation().result
- * if loc != {}:
- * try:
- * n = loc['gps']
- * except KeyError:
- * n = loc['network']
- * la = n['latitude']
- * lo = n['longitude']
- * address = droid.geocode(la, lo).result
- * droid.stopLocating()
- * </pre>
- *
- * The address format is:<br>
- * [{u'thoroughfare': u'Some Street', u'locality': u'Some Town', u'sub_admin_area': u'Some Borough',
- * u'admin_area': u'Some City', u'feature_name': u'House Numbers', u'country_code': u'GB',
- * u'country_name': u'United Kingdom', u'postal_code': u'ST1 1'}]
- *
- * @author Damon Kohler (damonkohler@gmail.com)
- * @author Felix Arends (felix.arends@gmail.com)
- */
-public class LocationFacade extends RpcReceiver {
- private final EventFacade mEventFacade;
- private final Service mService;
- private final Map<String, Location> mLocationUpdates;
- private final LocationManager mLocationManager;
- private final Geocoder mGeocoder;
-
- private final LocationListener mLocationListener = new LocationListener() {
- @Override
- public synchronized void onLocationChanged(Location location) {
- mLocationUpdates.put(location.getProvider(), location);
- Map<String, Location> copy = Maps.newHashMap();
- for (Entry<String, Location> entry : mLocationUpdates.entrySet()) {
- copy.put(entry.getKey(), entry.getValue());
- }
- mEventFacade.postEvent("location", copy);
- }
-
- @Override
- public void onProviderDisabled(String provider) {
- }
-
- @Override
- public void onProviderEnabled(String provider) {
- }
-
- @Override
- public void onStatusChanged(String provider, int status, Bundle extras) {
- }
- };
-
- public LocationFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mEventFacade = manager.getReceiver(EventFacade.class);
- mGeocoder = new Geocoder(mService);
- mLocationManager = (LocationManager) mService.getSystemService(Context.LOCATION_SERVICE);
- mLocationUpdates = new HashMap<String, Location>();
- }
-
- @Override
- public void shutdown() {
- stopLocating();
- }
-
- @Rpc(description = "Returns availables providers on the phone")
- public List<String> locationProviders() {
- return mLocationManager.getAllProviders();
- }
-
- @Rpc(description = "Ask if provider is enabled")
- public boolean locationProviderEnabled(
- @RpcParameter(name = "provider", description = "Name of location provider") String provider) {
- return mLocationManager.isProviderEnabled(provider);
- }
-
- @Rpc(description = "Starts collecting location data.")
- @RpcStartEvent("location")
- public void startLocating(
- @RpcParameter(name = "minDistance", description = "minimum time between updates in milliseconds") @RpcDefault("60000") Integer minUpdateTime,
- @RpcParameter(name = "minUpdateDistance", description = "minimum distance between updates in meters") @RpcDefault("30") Integer minUpdateDistance) {
- for (String provider : mLocationManager.getAllProviders()) {
- mLocationManager.requestLocationUpdates(provider, minUpdateTime, minUpdateDistance,
- mLocationListener, mService.getMainLooper());
- }
- }
-
- @Rpc(description = "Returns the current location as indicated by all available providers.", returns = "A map of location information by provider.")
- public Map<String, Location> readLocation() {
- return mLocationUpdates;
- }
-
- @Rpc(description = "Stops collecting location data.")
- @RpcStopEvent("location")
- public synchronized void stopLocating() {
- mLocationManager.removeUpdates(mLocationListener);
- mLocationUpdates.clear();
- }
-
- @Rpc(description = "Returns the last known location of the device.", returns = "A map of location information by provider.")
- public Map<String, Location> getLastKnownLocation() {
- Map<String, Location> location = new HashMap<String, Location>();
- for (String provider : mLocationManager.getAllProviders()) {
- location.put(provider, mLocationManager.getLastKnownLocation(provider));
- }
- return location;
- }
-
- @Rpc(description = "Returns a list of addresses for the given latitude and longitude.", returns = "A list of addresses.")
- public List<Address> geocode(
- @RpcParameter(name = "latitude") Double latitude,
- @RpcParameter(name = "longitude") Double longitude,
- @RpcParameter(name = "maxResults", description = "maximum number of results") @RpcDefault("1") Integer maxResults)
- throws IOException {
- return mGeocoder.getFromLocation(latitude, longitude, maxResults);
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/PreferencesFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/PreferencesFacade.java
deleted file mode 100644
index 31225ff..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/PreferencesFacade.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade;
-
-import android.app.Service;
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.Editor;
-import android.preference.PreferenceManager;
-
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcOptional;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-import java.io.IOException;
-import java.util.Map;
-
-/**
- * This facade allows access to the Preferences interface.
- *
- * <br>
- * <b>Notes:</b> <br>
- * <b>filename</b> - Filename indicates which preference file to refer to. If no filename is
- * supplied (the default) then the SharedPreferences uses is the default for the SL4A application.<br>
- * <b>prefPutValue</b> - uses "MODE_PRIVATE" when writing to preferences. Save values to the default
- * shared preferences is explicitly disallowed.<br>
- * <br>
- * See <a
- * href=http://developer.android.com/reference/java/util/prefs/Preferences.html>Preferences</a> and
- * <a href=http://developer.android.com/guide/topics/data/data-storage.html#pref>Shared
- * Preferences</a> in the android documentation on how preferences work.
- *
- * @author Robbie Matthews (rjmatthews62@gmail.com)
- */
-
-public class PreferencesFacade extends RpcReceiver {
-
- private Service mService;
-
- public PreferencesFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- }
-
- @Rpc(description = "Read a value from shared preferences")
- public Object prefGetValue(
- @RpcParameter(name = "key") String key,
- @RpcParameter(name = "filename", description = "Desired preferences file. If not defined, uses the default Shared Preferences.") @RpcOptional String filename) {
- SharedPreferences p = getPref(filename);
- return p.getAll().get(key);
- }
-
- @Rpc(description = "Write a value to shared preferences")
- public void prefPutValue(
- @RpcParameter(name = "key") String key,
- @RpcParameter(name = "value") Object value,
- @RpcParameter(name = "filename", description = "Desired preferences file. If not defined, uses the default Shared Preferences.") @RpcOptional String filename)
- throws IOException {
- if (filename == null || filename.equals("")) {
- throw new IOException("Can't write to default preferences.");
- }
- SharedPreferences p = getPref(filename);
- Editor e = p.edit();
- if (value instanceof Boolean) {
- e.putBoolean(key, (Boolean) value);
- } else if (value instanceof Long) {
- e.putLong(key, (Long) value);
- } else if (value instanceof Integer) {
- e.putLong(key, (Integer) value);
- } else if (value instanceof Float) {
- e.putFloat(key, (Float) value);
- } else if (value instanceof Double) { // TODO: Not sure if this is a good idea
- e.putFloat(key, ((Double) value).floatValue());
- } else {
- e.putString(key, value.toString());
- }
- e.commit();
- }
-
- @Rpc(description = "Get list of Shared Preference Values", returns = "Map of key,value")
- public Map<String, ?> prefGetAll(
- @RpcParameter(name = "filename", description = "Desired preferences file. If not defined, uses the default Shared Preferences.") @RpcOptional String filename) {
- return getPref(filename).getAll();
- }
-
- private SharedPreferences getPref(String filename) {
- if (filename == null || filename.equals("")) {
- return PreferenceManager.getDefaultSharedPreferences(mService);
- }
- return mService.getSharedPreferences(filename, 0);
-
- }
-
- @Override
- public void shutdown() {
-
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/SensorManagerFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/SensorManagerFacade.java
deleted file mode 100644
index 6c4c7b7..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/SensorManagerFacade.java
+++ /dev/null
@@ -1,496 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade;
-
-import android.content.Context;
-import android.hardware.Sensor;
-import android.hardware.SensorEvent;
-import android.hardware.SensorEventListener;
-import android.hardware.SensorManager;
-import android.os.Bundle;
-
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcDefault;
-import com.googlecode.android_scripting.rpc.RpcDeprecated;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-import com.googlecode.android_scripting.rpc.RpcStartEvent;
-import com.googlecode.android_scripting.rpc.RpcStopEvent;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Exposes the SensorManager related functionality. <br>
- * <br>
- * <b>Guidance notes</b> <br>
- * For reasons of economy the sensors on smart phones are usually low cost and, therefore, low
- * accuracy (usually represented by 10 bit data). The floating point data values obtained from
- * sensor readings have up to 16 decimal places, the majority of which are noise. On many phones the
- * accelerometer is limited (by the phone manufacturer) to a maximum reading of 2g. The magnetometer
- * (which also provides orientation readings) is strongly affected by the presence of ferrous metals
- * and can give large errors in vehicles, on board ship etc.
- *
- * Following a startSensingTimed(A,B) api call sensor events are entered into the Event Queue (see
- * EventFacade). For the A parameter: 1 = All Sensors, 2 = Accelerometer, 3 = Magnetometer and 4 =
- * Light. The B parameter is the minimum delay between recordings in milliseconds. To avoid
- * duplicate readings the minimum delay should be 20 milliseconds. The light sensor will probably be
- * much slower (taking about 1 second to register a change in light level). Note that if the light
- * level is constant no sensor events will be registered by the light sensor.
- *
- * Following a startSensingThreshold(A,B,C) api call sensor events greater than a given threshold
- * are entered into the Event Queue. For the A parameter: 1 = Orientation, 2 = Accelerometer, 3 =
- * Magnetometer and 4 = Light. The B parameter is the integer value of the required threshold level.
- * For orientation sensing the integer threshold value is in milliradians. Since orientation events
- * can exceed the threshold value for long periods only crossing and return events are recorded. The
- * C parameter is the required axis (XYZ) of the sensor: 0 = No axis, 1 = X, 2 = Y, 3 = X+Y, 4 = Z,
- * 5= X+Z, 6 = Y+Z, 7 = X+Y+Z. For orientation X = azimuth, Y = pitch and Z = roll. <br>
- *
- * <br>
- * <b>Example (python)</b>
- *
- * <pre>
- * import android, time
- * droid = android.Android()
- * droid.startSensingTimed(1, 250)
- * time.sleep(1)
- * s1 = droid.readSensors().result
- * s2 = droid.sensorsGetAccuracy().result
- * s3 = droid.sensorsGetLight().result
- * s4 = droid.sensorsReadAccelerometer().result
- * s5 = droid.sensorsReadMagnetometer().result
- * s6 = droid.sensorsReadOrientation().result
- * droid.stopSensing()
- * </pre>
- *
- * Returns:<br>
- * s1 = {u'accuracy': 3, u'pitch': -0.47323511242866517, u'xmag': 1.75, u'azimuth':
- * -0.26701245009899138, u'zforce': 8.4718560000000007, u'yforce': 4.2495484000000001, u'time':
- * 1297160391.2820001, u'ymag': -8.9375, u'zmag': -41.0625, u'roll': -0.031366908922791481,
- * u'xforce': 0.23154590999999999}<br>
- * s2 = 3 (Highest accuracy)<br>
- * s3 = None ---(not available on many phones)<br>
- * s4 = [0.23154590999999999, 4.2495484000000001, 8.4718560000000007] ----(x, y, z accelerations)<br>
- * s5 = [1.75, -8.9375, -41.0625] -----(x, y, z magnetic readings)<br>
- * s6 = [-0.26701245009899138, -0.47323511242866517, -0.031366908922791481] ---(azimuth, pitch, roll
- * in radians)<br>
- *
- * @author Damon Kohler (damonkohler@gmail.com)
- * @author Felix Arends (felix.arends@gmail.com)
- * @author Alexey Reznichenko (alexey.reznichenko@gmail.com)
- * @author Robbie Mathews (rjmatthews62@gmail.com)
- * @author John Karwatzki (jokar49@gmail.com)
- */
-public class SensorManagerFacade extends RpcReceiver {
- private final EventFacade mEventFacade;
- private final SensorManager mSensorManager;
-
- private volatile Bundle mSensorReadings;
-
- private volatile Integer mAccuracy;
- private volatile Integer mSensorNumber;
- private volatile Integer mXAxis = 0;
- private volatile Integer mYAxis = 0;
- private volatile Integer mZAxis = 0;
- private volatile Integer mThreshing = 0;
- private volatile Integer mThreshOrientation = 0;
- private volatile Integer mXCrossed = 0;
- private volatile Integer mYCrossed = 0;
- private volatile Integer mZCrossed = 0;
-
- private volatile Float mThreshold;
- private volatile Float mXForce;
- private volatile Float mYForce;
- private volatile Float mZForce;
-
- private volatile Float mXMag;
- private volatile Float mYMag;
- private volatile Float mZMag;
-
- private volatile Float mLight;
-
- private volatile Double mAzimuth;
- private volatile Double mPitch;
- private volatile Double mRoll;
-
- private volatile Long mLastTime;
- private volatile Long mDelayTime;
-
- private SensorEventListener mSensorListener;
-
- public SensorManagerFacade(FacadeManager manager) {
- super(manager);
- mEventFacade = manager.getReceiver(EventFacade.class);
- mSensorManager = (SensorManager) manager.getService().getSystemService(Context.SENSOR_SERVICE);
- }
-
- @Rpc(description = "Starts recording sensor data to be available for polling.")
- @RpcStartEvent("sensors")
- public void startSensingTimed(
- @RpcParameter(name = "sensorNumber", description = "1 = All, 2 = Accelerometer, 3 = Magnetometer and 4 = Light") Integer sensorNumber,
- @RpcParameter(name = "delayTime", description = "Minimum time between readings in milliseconds") Integer delayTime) {
- mSensorNumber = sensorNumber;
- if (delayTime < 20) {
- delayTime = 20;
- }
- mDelayTime = (long) (delayTime);
- mLastTime = System.currentTimeMillis();
- if (mSensorListener == null) {
- mSensorListener = new SensorValuesCollector();
- mSensorReadings = new Bundle();
- switch (mSensorNumber) {
- case 1:
- for (Sensor sensor : mSensorManager.getSensorList(Sensor.TYPE_ALL)) {
- mSensorManager.registerListener(mSensorListener, sensor,
- SensorManager.SENSOR_DELAY_FASTEST);
- }
- break;
- case 2:
- for (Sensor sensor : mSensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER)) {
- mSensorManager.registerListener(mSensorListener, sensor,
- SensorManager.SENSOR_DELAY_FASTEST);
- }
- break;
- case 3:
- for (Sensor sensor : mSensorManager.getSensorList(Sensor.TYPE_MAGNETIC_FIELD)) {
- mSensorManager.registerListener(mSensorListener, sensor,
- SensorManager.SENSOR_DELAY_FASTEST);
- }
- break;
- case 4:
- for (Sensor sensor : mSensorManager.getSensorList(Sensor.TYPE_LIGHT)) {
- mSensorManager.registerListener(mSensorListener, sensor,
- SensorManager.SENSOR_DELAY_FASTEST);
- }
- }
- }
- }
-
- @Rpc(description = "Records to the Event Queue sensor data exceeding a chosen threshold.")
- @RpcStartEvent("threshold")
- public void startSensingThreshold(
-
- @RpcParameter(name = "sensorNumber", description = "1 = Orientation, 2 = Accelerometer, 3 = Magnetometer and 4 = Light") Integer sensorNumber,
- @RpcParameter(name = "threshold", description = "Threshold level for chosen sensor (integer)") Integer threshold,
- @RpcParameter(name = "axis", description = "0 = No axis, 1 = X, 2 = Y, 3 = X+Y, 4 = Z, 5= X+Z, 6 = Y+Z, 7 = X+Y+Z") Integer axis) {
- mSensorNumber = sensorNumber;
- mXAxis = axis & 1;
- mYAxis = axis & 2;
- mZAxis = axis & 4;
- if (mSensorNumber == 1) {
- mThreshing = 0;
- mThreshOrientation = 1;
- mThreshold = ((float) threshold) / ((float) 1000);
- } else {
- mThreshing = 1;
- mThreshold = (float) threshold;
- }
- startSensingTimed(mSensorNumber, 20);
- }
-
- @Rpc(description = "Returns the most recently recorded sensor data.")
- public Bundle readSensors() {
- if (mSensorReadings == null) {
- return null;
- }
- synchronized (mSensorReadings) {
- return new Bundle(mSensorReadings);
- }
- }
-
- @Rpc(description = "Stops collecting sensor data.")
- @RpcStopEvent("sensors")
- public void stopSensing() {
- mSensorManager.unregisterListener(mSensorListener);
- mSensorListener = null;
- mSensorReadings = null;
- mThreshing = 0;
- mThreshOrientation = 0;
- }
-
- @Rpc(description = "Returns the most recently received accuracy value.")
- public Integer sensorsGetAccuracy() {
- return mAccuracy;
- }
-
- @Rpc(description = "Returns the most recently received light value.")
- public Float sensorsGetLight() {
- return mLight;
- }
-
- @Rpc(description = "Returns the most recently received accelerometer values.", returns = "a List of Floats [(acceleration on the) X axis, Y axis, Z axis].")
- public List<Float> sensorsReadAccelerometer() {
- synchronized (mSensorReadings) {
- return Arrays.asList(mXForce, mYForce, mZForce);
- }
- }
-
- @Rpc(description = "Returns the most recently received magnetic field values.", returns = "a List of Floats [(magnetic field value for) X axis, Y axis, Z axis].")
- public List<Float> sensorsReadMagnetometer() {
- synchronized (mSensorReadings) {
- return Arrays.asList(mXMag, mYMag, mZMag);
- }
- }
-
- @Rpc(description = "Returns the most recently received orientation values.", returns = "a List of Doubles [azimuth, pitch, roll].")
- public List<Double> sensorsReadOrientation() {
- synchronized (mSensorReadings) {
- return Arrays.asList(mAzimuth, mPitch, mRoll);
- }
- }
-
- @Rpc(description = "Starts recording sensor data to be available for polling.")
- @RpcDeprecated(value = "startSensingTimed or startSensingThreshhold", release = "4")
- public void startSensing(
- @RpcParameter(name = "sampleSize", description = "number of samples for calculating average readings") @RpcDefault("5") Integer sampleSize) {
- if (mSensorListener == null) {
- startSensingTimed(1, 220);
- }
- }
-
- @Override
- public void shutdown() {
- stopSensing();
- }
-
- private class SensorValuesCollector implements SensorEventListener {
- private final static int MATRIX_SIZE = 9;
-
- private final RollingAverage mmAzimuth;
- private final RollingAverage mmPitch;
- private final RollingAverage mmRoll;
-
- private float[] mmGeomagneticValues;
- private float[] mmGravityValues;
- private float[] mmR;
- private float[] mmOrientation;
-
- public SensorValuesCollector() {
- mmAzimuth = new RollingAverage();
- mmPitch = new RollingAverage();
- mmRoll = new RollingAverage();
- }
-
- private void postEvent() {
- mSensorReadings.putDouble("time", System.currentTimeMillis() / 1000.0);
- mEventFacade.postEvent("sensors", mSensorReadings.clone());
- }
-
- @Override
- public void onAccuracyChanged(Sensor sensor, int accuracy) {
- if (mSensorReadings == null) {
- return;
- }
- synchronized (mSensorReadings) {
- mSensorReadings.putInt("accuracy", accuracy);
- mAccuracy = accuracy;
-
- }
- }
-
- @Override
- public void onSensorChanged(SensorEvent event) {
- if (mSensorReadings == null) {
- return;
- }
- synchronized (mSensorReadings) {
- switch (event.sensor.getType()) {
- case Sensor.TYPE_ACCELEROMETER:
- mXForce = event.values[0];
- mYForce = event.values[1];
- mZForce = event.values[2];
- if (mThreshing == 0) {
- mSensorReadings.putFloat("xforce", mXForce);
- mSensorReadings.putFloat("yforce", mYForce);
- mSensorReadings.putFloat("zforce", mZForce);
- if ((mSensorNumber == 2) && (System.currentTimeMillis() > (mDelayTime + mLastTime))) {
- mLastTime = System.currentTimeMillis();
- postEvent();
- }
- }
- if ((mThreshing == 1) && (mSensorNumber == 2)) {
- if ((Math.abs(mXForce) > mThreshold) && (mXAxis == 1)) {
- mSensorReadings.putFloat("xforce", mXForce);
- postEvent();
- }
-
- if ((Math.abs(mYForce) > mThreshold) && (mYAxis == 2)) {
- mSensorReadings.putFloat("yforce", mYForce);
- postEvent();
- }
-
- if ((Math.abs(mZForce) > mThreshold) && (mZAxis == 4)) {
- mSensorReadings.putFloat("zforce", mZForce);
- postEvent();
- }
- }
-
- mmGravityValues = event.values.clone();
- break;
- case Sensor.TYPE_MAGNETIC_FIELD:
- mXMag = event.values[0];
- mYMag = event.values[1];
- mZMag = event.values[2];
- if (mThreshing == 0) {
- mSensorReadings.putFloat("xMag", mXMag);
- mSensorReadings.putFloat("yMag", mYMag);
- mSensorReadings.putFloat("zMag", mZMag);
- if ((mSensorNumber == 3) && (System.currentTimeMillis() > (mDelayTime + mLastTime))) {
- mLastTime = System.currentTimeMillis();
- postEvent();
- }
- }
- if ((mThreshing == 1) && (mSensorNumber == 3)) {
- if ((Math.abs(mXMag) > mThreshold) && (mXAxis == 1)) {
- mSensorReadings.putFloat("xforce", mXMag);
- postEvent();
- }
- if ((Math.abs(mYMag) > mThreshold) && (mYAxis == 2)) {
- mSensorReadings.putFloat("yforce", mYMag);
- postEvent();
- }
- if ((Math.abs(mZMag) > mThreshold) && (mZAxis == 4)) {
- mSensorReadings.putFloat("zforce", mZMag);
- postEvent();
- }
- }
- mmGeomagneticValues = event.values.clone();
- break;
- case Sensor.TYPE_LIGHT:
- mLight = event.values[0];
- if (mThreshing == 0) {
- mSensorReadings.putFloat("light", mLight);
- if ((mSensorNumber == 4) && (System.currentTimeMillis() > (mDelayTime + mLastTime))) {
- mLastTime = System.currentTimeMillis();
- postEvent();
- }
- }
- if ((mThreshing == 1) && (mSensorNumber == 4)) {
- if (mLight > mThreshold) {
- mSensorReadings.putFloat("light", mLight);
- postEvent();
- }
- }
- break;
-
- }
- if (mSensorNumber == 1) {
- if (mmGeomagneticValues != null && mmGravityValues != null) {
- if (mmR == null) {
- mmR = new float[MATRIX_SIZE];
- }
- if (SensorManager.getRotationMatrix(mmR, null, mmGravityValues, mmGeomagneticValues)) {
- if (mmOrientation == null) {
- mmOrientation = new float[3];
- }
- SensorManager.getOrientation(mmR, mmOrientation);
- mmAzimuth.add(mmOrientation[0]);
- mmPitch.add(mmOrientation[1]);
- mmRoll.add(mmOrientation[2]);
-
- mAzimuth = mmAzimuth.get();
- mPitch = mmPitch.get();
- mRoll = mmRoll.get();
- if (mThreshOrientation == 0) {
- mSensorReadings.putDouble("azimuth", mAzimuth);
- mSensorReadings.putDouble("pitch", mPitch);
- mSensorReadings.putDouble("roll", mRoll);
- if ((mSensorNumber == 1) && (System.currentTimeMillis() > (mDelayTime + mLastTime))) {
- mLastTime = System.currentTimeMillis();
- postEvent();
- }
- }
- if ((mThreshOrientation == 1) && (mSensorNumber == 1)) {
- if ((mXAxis == 1) && (mXCrossed == 0)) {
- if (Math.abs(mAzimuth) > ((double) mThreshold)) {
- mSensorReadings.putDouble("azimuth", mAzimuth);
- postEvent();
- mXCrossed = 1;
- }
- }
- if ((mXAxis == 1) && (mXCrossed == 1)) {
- if (Math.abs(mAzimuth) < ((double) mThreshold)) {
- mSensorReadings.putDouble("azimuth", mAzimuth);
- postEvent();
- mXCrossed = 0;
- }
- }
- if ((mYAxis == 2) && (mYCrossed == 0)) {
- if (Math.abs(mPitch) > ((double) mThreshold)) {
- mSensorReadings.putDouble("pitch", mPitch);
- postEvent();
- mYCrossed = 1;
- }
- }
- if ((mYAxis == 2) && (mYCrossed == 1)) {
- if (Math.abs(mPitch) < ((double) mThreshold)) {
- mSensorReadings.putDouble("pitch", mPitch);
- postEvent();
- mYCrossed = 0;
- }
- }
- if ((mZAxis == 4) && (mZCrossed == 0)) {
- if (Math.abs(mRoll) > ((double) mThreshold)) {
- mSensorReadings.putDouble("roll", mRoll);
- postEvent();
- mZCrossed = 1;
- }
- }
- if ((mZAxis == 4) && (mZCrossed == 1)) {
- if (Math.abs(mRoll) < ((double) mThreshold)) {
- mSensorReadings.putDouble("roll", mRoll);
- postEvent();
- mZCrossed = 0;
- }
- }
- }
- }
- }
- }
- }
- }
- }
-
- static class RollingAverage {
- private final int mmSampleSize;
- private final double mmData[];
- private int mmIndex = 0;
- private boolean mmFilled = false;
- private double mmSum = 0.0;
-
- public RollingAverage() {
- mmSampleSize = 5;
- mmData = new double[mmSampleSize];
- }
-
- public void add(double value) {
- mmSum -= mmData[mmIndex];
- mmData[mmIndex] = value;
- mmSum += mmData[mmIndex];
- ++mmIndex;
- mmIndex %= mmSampleSize;
- mmFilled = (!mmFilled) ? mmIndex == 0 : mmFilled;
- }
-
- public double get() throws IllegalStateException {
- if (!mmFilled && mmIndex == 0) {
- throw new IllegalStateException("No values to average.");
- }
- return (mmFilled) ? (mmSum / mmSampleSize) : (mmSum / mmIndex);
- }
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/SettingsFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/SettingsFacade.java
deleted file mode 100644
index 42e2fd9..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/SettingsFacade.java
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade;
-
-import android.app.AlarmManager;
-import android.app.Service;
-import android.app.admin.DevicePolicyManager;
-import android.content.Context;
-import android.content.Intent;
-import android.media.AudioManager;
-import android.os.PowerManager;
-import android.os.SystemClock;
-import android.os.UserHandle;
-import android.provider.Settings.SettingNotFoundException;
-import android.view.WindowManager;
-
-import com.android.internal.widget.LockPatternUtils;
-import com.googlecode.android_scripting.BaseApplication;
-import com.googlecode.android_scripting.FutureActivityTaskExecutor;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.future.FutureActivityTask;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcOptional;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-/**
- * Exposes phone settings functionality.
- *
- * @author Frank Spychalski (frank.spychalski@gmail.com)
- */
-public class SettingsFacade extends RpcReceiver {
-
- private final Service mService;
- private final AndroidFacade mAndroidFacade;
- private final AudioManager mAudio;
- private final PowerManager mPower;
- private final AlarmManager mAlarm;
- private final LockPatternUtils mLockPatternUtils;
-
- /**
- * Creates a new SettingsFacade.
- *
- * @param service is the {@link Context} the APIs will run under
- */
- public SettingsFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mAndroidFacade = manager.getReceiver(AndroidFacade.class);
- mAudio = (AudioManager) mService.getSystemService(Context.AUDIO_SERVICE);
- mPower = (PowerManager) mService.getSystemService(Context.POWER_SERVICE);
- mAlarm = (AlarmManager) mService.getSystemService(Context.ALARM_SERVICE);
- mLockPatternUtils = new LockPatternUtils(mService);
- }
-
- @Rpc(description = "Sets the screen timeout to this number of seconds.",
- returns = "The original screen timeout.")
- public Integer setScreenTimeout(@RpcParameter(name = "value") Integer value) {
- Integer oldValue = getScreenTimeout();
- android.provider.Settings.System.putInt(mService.getContentResolver(),
- android.provider.Settings.System.SCREEN_OFF_TIMEOUT, value * 1000);
- return oldValue;
- }
-
- @Rpc(description = "Returns the current screen timeout in seconds.",
- returns = "the current screen timeout in seconds.")
- public Integer getScreenTimeout() {
- try {
- return android.provider.Settings.System.getInt(mService.getContentResolver(),
- android.provider.Settings.System.SCREEN_OFF_TIMEOUT) / 1000;
- } catch (SettingNotFoundException e) {
- return 0;
- }
- }
-
- @Rpc(description = "Checks the ringer silent mode setting.",
- returns = "True if ringer silent mode is enabled.")
- public Boolean checkRingerSilentMode() {
- return mAudio.getRingerMode() == AudioManager.RINGER_MODE_SILENT;
- }
-
- @Rpc(description = "Toggles ringer silent mode on and off.",
- returns = "True if ringer silent mode is enabled.")
- public Boolean toggleRingerSilentMode(
- @RpcParameter(name = "enabled") @RpcOptional Boolean enabled) {
- if (enabled == null) {
- enabled = !checkRingerSilentMode();
- }
- mAudio.setRingerMode(enabled ? AudioManager.RINGER_MODE_SILENT
- : AudioManager.RINGER_MODE_NORMAL);
- return enabled;
- }
-
- @Rpc(description = "Set the ringer to a specified mode")
- public void setRingerMode(@RpcParameter(name = "mode") Integer mode) throws Exception {
- if (AudioManager.isValidRingerMode(mode)) {
- mAudio.setRingerMode(mode);
- } else {
- throw new Exception("Ringer mode " + mode + " does not exist.");
- }
- }
-
- @Rpc(description = "Returns the current ringtone mode.",
- returns = "An integer representing the current ringer mode")
- public Integer getRingerMode() {
- return mAudio.getRingerMode();
- }
-
- @Rpc(description = "Returns the maximum ringer volume.")
- public int getMaxRingerVolume() {
- return mAudio.getStreamMaxVolume(AudioManager.STREAM_RING);
- }
-
- @Rpc(description = "Returns the current ringer volume.")
- public int getRingerVolume() {
- return mAudio.getStreamVolume(AudioManager.STREAM_RING);
- }
-
- @Rpc(description = "Sets the ringer volume.")
- public void setRingerVolume(@RpcParameter(name = "volume") Integer volume) {
- mAudio.setStreamVolume(AudioManager.STREAM_RING, volume, 0);
- }
-
- @Rpc(description = "Returns the maximum media volume.")
- public int getMaxMediaVolume() {
- return mAudio.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
- }
-
- @Rpc(description = "Returns the current media volume.")
- public int getMediaVolume() {
- return mAudio.getStreamVolume(AudioManager.STREAM_MUSIC);
- }
-
- @Rpc(description = "Sets the media volume.")
- public void setMediaVolume(@RpcParameter(name = "volume") Integer volume) {
- mAudio.setStreamVolume(AudioManager.STREAM_MUSIC, volume, 0);
- }
-
- @Rpc(description = "Returns the screen backlight brightness.",
- returns = "the current screen brightness between 0 and 255")
- public Integer getScreenBrightness() {
- try {
- return android.provider.Settings.System.getInt(mService.getContentResolver(),
- android.provider.Settings.System.SCREEN_BRIGHTNESS);
- } catch (SettingNotFoundException e) {
- return 0;
- }
- }
-
- @Rpc(description = "return the system time since boot in nanoseconds")
- public long getSystemElapsedRealtimeNanos() {
- return SystemClock.elapsedRealtimeNanos();
- }
-
- @Rpc(description = "Sets the the screen backlight brightness.",
- returns = "the original screen brightness.")
- public Integer setScreenBrightness(
- @RpcParameter(name = "value", description = "brightness value between 0 and 255") Integer value) {
- if (value < 0) {
- value = 0;
- } else if (value > 255) {
- value = 255;
- }
- final int brightness = value;
- Integer oldValue = getScreenBrightness();
- android.provider.Settings.System.putInt(mService.getContentResolver(),
- android.provider.Settings.System.SCREEN_BRIGHTNESS, brightness);
-
- FutureActivityTask<Object> task = new FutureActivityTask<Object>() {
- @Override
- public void onCreate() {
- super.onCreate();
- WindowManager.LayoutParams lp = getActivity().getWindow().getAttributes();
- lp.screenBrightness = brightness * 1.0f / 255;
- getActivity().getWindow().setAttributes(lp);
- setResult(null);
- finish();
- }
- };
-
- FutureActivityTaskExecutor taskExecutor =
- ((BaseApplication) mService.getApplication()).getTaskExecutor();
- taskExecutor.execute(task);
-
- return oldValue;
- }
-
- @Rpc(description = "Returns true if the device is in an interactive state.")
- public Boolean isDeviceInteractive() throws Exception {
- return mPower.isInteractive();
- }
-
- @Rpc(description = "Issues a request to put the device to sleep after a delay.")
- public void goToSleep(Integer delay) {
- mPower.goToSleep(SystemClock.uptimeMillis() + delay);
- }
-
- @Rpc(description = "Issues a request to put the device to sleep right away.")
- public void goToSleepNow() {
- mPower.goToSleep(SystemClock.uptimeMillis());
- }
-
- @Rpc(description = "Issues a request to wake the device up right away.")
- public void wakeUpNow() {
- mPower.wakeUp(SystemClock.uptimeMillis());
- }
-
- @Rpc(description = "Get Up time of device.",
- returns = "Long value of device up time in milliseconds.")
- public long getDeviceUpTime() throws Exception {
- return SystemClock.elapsedRealtime();
- }
-
- @Rpc(description = "Set a string password to the device.")
- public void setDevicePassword(@RpcParameter(name = "password") String password) {
- // mLockPatternUtils.setLockPatternEnabled(true, UserHandle.myUserId());
- mLockPatternUtils.setLockScreenDisabled(false, UserHandle.myUserId());
- mLockPatternUtils.setCredentialRequiredToDecrypt(true);
- mLockPatternUtils.saveLockPassword(password, null,
- DevicePolicyManager.PASSWORD_QUALITY_NUMERIC, UserHandle.myUserId());
- }
-
- @Rpc(description = "Disable screen lock password on the device.")
- public void disableDevicePassword() {
- mLockPatternUtils.clearEncryptionPassword();
- // mLockPatternUtils.setLockPatternEnabled(false, UserHandle.myUserId());
- mLockPatternUtils.setLockScreenDisabled(true, UserHandle.myUserId());
- mLockPatternUtils.setCredentialRequiredToDecrypt(false);
- mLockPatternUtils.clearEncryptionPassword();
- mLockPatternUtils.clearLock(UserHandle.myUserId());
- mLockPatternUtils.setLockScreenDisabled(true, UserHandle.myUserId());
- }
-
- @Rpc(description = "Set the system time in epoch.")
- public void setTime(Long currentTime) {
- mAlarm.setTime(currentTime);
- }
-
- @Rpc(description = "Set the system time zone.")
- public void setTimeZone(@RpcParameter(name = "timeZone") String timeZone) {
- mAlarm.setTimeZone(timeZone);
- }
-
- @Rpc(description = "Show Home Screen")
- public void showHomeScreen() {
- Intent intent = new Intent(Intent.ACTION_MAIN);
- intent.addCategory(Intent.CATEGORY_HOME);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- try {
- mAndroidFacade.startActivityIntent(intent, false);
- } catch (RuntimeException e) {
- Log.d("showHomeScreen RuntimeException" + e);
- } catch (Exception e){
- Log.d("showHomeScreen exception" + e);
- }
- }
-
- @Override
- public void shutdown() {
- // Nothing to do yet.
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/SpeechRecognitionFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/SpeechRecognitionFacade.java
deleted file mode 100644
index 5409002..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/SpeechRecognitionFacade.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade;
-
-import android.content.Intent;
-import android.speech.RecognizerIntent;
-
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcOptional;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-import java.util.ArrayList;
-
-/**
- * A facade containing RPC implementations related to the speech-to-text functionality of Android.
- *
- * @author Felix Arends (felix.arends@gmail.com)
- *
- */
-public class SpeechRecognitionFacade extends RpcReceiver {
- private final AndroidFacade mAndroidFacade;
-
- /**
- * @param activityLauncher
- * a helper object that launches activities in a blocking manner
- */
- public SpeechRecognitionFacade(FacadeManager manager) {
- super(manager);
- mAndroidFacade = manager.getReceiver(AndroidFacade.class);
- }
-
- @Rpc(description = "Recognizes user's speech and returns the most likely result.", returns = "An empty string in case the speech cannot be recongnized.")
- public String recognizeSpeech(
- @RpcParameter(name = "prompt", description = "text prompt to show to the user when asking them to speak") @RpcOptional final String prompt,
- @RpcParameter(name = "language", description = "language override to inform the recognizer that it should expect speech in a language different than the one set in the java.util.Locale.getDefault()") @RpcOptional final String language,
- @RpcParameter(name = "languageModel", description = "informs the recognizer which speech model to prefer (see android.speech.RecognizeIntent)") @RpcOptional final String languageModel) {
- final Intent recognitionIntent =
- new Intent(android.speech.RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
-
- // Setup intent parameters (if provided).
- if (language != null) {
- recognitionIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "");
- }
- if (languageModel != null) {
- recognitionIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, "");
- }
- if (prompt != null) {
- recognitionIntent.putExtra(RecognizerIntent.EXTRA_PROMPT, "");
- }
-
- // Run the activity an retrieve the result.
- final Intent data = mAndroidFacade.startActivityForResult(recognitionIntent);
-
- if (data.hasExtra(android.speech.RecognizerIntent.EXTRA_RESULTS)) {
- // The result consists of an array-list containing one entry for each
- // possible result. The most likely result is the first entry.
- ArrayList<String> results =
- data.getStringArrayListExtra(android.speech.RecognizerIntent.EXTRA_RESULTS);
- return results.get(0);
- }
-
- return "";
- }
-
- @Override
- public void shutdown() {
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/TextToSpeechFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/TextToSpeechFacade.java
deleted file mode 100644
index 26991fb..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/TextToSpeechFacade.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade;
-
-import android.os.SystemClock;
-import android.speech.tts.TextToSpeech;
-import android.speech.tts.TextToSpeech.OnInitListener;
-
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-import java.util.concurrent.CountDownLatch;
-
-/**
- * Provides Text To Speech services
- */
-
-public class TextToSpeechFacade extends RpcReceiver {
-
- private final TextToSpeech mTts;
- private final CountDownLatch mOnInitLock;
-
- public TextToSpeechFacade(FacadeManager manager) {
- super(manager);
- mOnInitLock = new CountDownLatch(1);
- mTts = new TextToSpeech(manager.getService(), new OnInitListener() {
- @Override
- public void onInit(int arg0) {
- mOnInitLock.countDown();
- }
- });
- }
-
- @Override
- public void shutdown() {
- while (mTts.isSpeaking()) {
- SystemClock.sleep(100);
- }
- mTts.shutdown();
- }
-
- @Rpc(description = "Speaks the provided message via TTS.")
- public void ttsSpeak(@RpcParameter(name = "message") String message) throws InterruptedException {
- mOnInitLock.await();
- if (message != null) {
- mTts.speak(message, TextToSpeech.QUEUE_ADD, null);
- }
- }
-
- @Rpc(description = "Returns True if speech is currently in progress.")
- public Boolean ttsIsSpeaking() throws InterruptedException {
- mOnInitLock.await();
- return mTts.isSpeaking();
- }
-
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/ToneGeneratorFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/ToneGeneratorFacade.java
deleted file mode 100644
index c0bfe5f..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/ToneGeneratorFacade.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade;
-
-import android.media.AudioManager;
-import android.media.ToneGenerator;
-
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcDefault;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-/**
- * Generate DTMF tones.
- *
- */
-public class ToneGeneratorFacade extends RpcReceiver {
-
- private final ToneGenerator mToneGenerator;
-
- public ToneGeneratorFacade(FacadeManager manager) {
- super(manager);
- mToneGenerator = new ToneGenerator(AudioManager.STREAM_MUSIC, 100);
- }
-
- @Rpc(description = "Generate DTMF tones for the given phone number.")
- public void generateDtmfTones(
- @RpcParameter(name = "phoneNumber") String phoneNumber,
- @RpcParameter(name = "toneDuration", description = "duration of each tone in milliseconds") @RpcDefault("100") Integer toneDuration)
- throws InterruptedException {
- try {
- for (int i = 0; i < phoneNumber.length(); i++) {
- switch (phoneNumber.charAt(i)) {
- case '0':
- mToneGenerator.startTone(ToneGenerator.TONE_DTMF_0);
- Thread.sleep(toneDuration);
- break;
- case '1':
- mToneGenerator.startTone(ToneGenerator.TONE_DTMF_1);
- Thread.sleep(toneDuration);
- break;
- case '2':
- mToneGenerator.startTone(ToneGenerator.TONE_DTMF_2);
- Thread.sleep(toneDuration);
- break;
- case '3':
- mToneGenerator.startTone(ToneGenerator.TONE_DTMF_3);
- Thread.sleep(toneDuration);
- break;
- case '4':
- mToneGenerator.startTone(ToneGenerator.TONE_DTMF_4);
- Thread.sleep(toneDuration);
- break;
- case '5':
- mToneGenerator.startTone(ToneGenerator.TONE_DTMF_5);
- Thread.sleep(toneDuration);
- break;
- case '6':
- mToneGenerator.startTone(ToneGenerator.TONE_DTMF_6);
- Thread.sleep(toneDuration);
- break;
- case '7':
- mToneGenerator.startTone(ToneGenerator.TONE_DTMF_7);
- Thread.sleep(toneDuration);
- break;
- case '8':
- mToneGenerator.startTone(ToneGenerator.TONE_DTMF_8);
- Thread.sleep(toneDuration);
- break;
- case '9':
- mToneGenerator.startTone(ToneGenerator.TONE_DTMF_9);
- Thread.sleep(toneDuration);
- break;
- case '*':
- mToneGenerator.startTone(ToneGenerator.TONE_DTMF_S);
- Thread.sleep(toneDuration);
- break;
- case '#':
- mToneGenerator.startTone(ToneGenerator.TONE_DTMF_P);
- Thread.sleep(toneDuration);
- break;
- default:
- throw new RuntimeException("Cannot generate tone for '" + phoneNumber.charAt(i) + "'");
- }
- }
- } finally {
- mToneGenerator.stopTone();
- }
- }
-
- @Override
- public void shutdown() {
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/WakeLockFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/WakeLockFacade.java
deleted file mode 100644
index 966e286..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/WakeLockFacade.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade;
-
-import android.content.Context;
-import android.os.PowerManager;
-import android.os.PowerManager.WakeLock;
-
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-
-/**
- * A facade exposing some of the functionality of the PowerManager, in particular wake locks.
- *
- * @author Felix Arends (felixarends@gmail.com)
- * @author Damon Kohler (damonkohler@gmail.com)
- */
-public class WakeLockFacade extends RpcReceiver {
-
- private final static String WAKE_LOCK_TAG =
- "com.googlecode.android_scripting.facade.PowerManagerFacade";
- private final PowerManager mmPowerManager;
-
- private enum WakeLockType {
- FULL, PARTIAL, BRIGHT, DIM
- }
-
- private class WakeLockManager {
- private final Map<WakeLockType, WakeLock> mmLocks = new HashMap<WakeLockType, WakeLock>();
-
- public WakeLockManager(PowerManager mmPowerManager) {
- addWakeLock(WakeLockType.PARTIAL, PowerManager.PARTIAL_WAKE_LOCK);
- addWakeLock(WakeLockType.FULL, PowerManager.FULL_WAKE_LOCK
- | PowerManager.ON_AFTER_RELEASE);
- addWakeLock(WakeLockType.BRIGHT, PowerManager.SCREEN_BRIGHT_WAKE_LOCK
- | PowerManager.ON_AFTER_RELEASE);
- addWakeLock(WakeLockType.DIM, PowerManager.SCREEN_DIM_WAKE_LOCK
- | PowerManager.ON_AFTER_RELEASE);
- }
-
- private void addWakeLock(WakeLockType type, int flags) {
- WakeLock full = mmPowerManager.newWakeLock(flags, WAKE_LOCK_TAG);
- full.setReferenceCounted(false);
- mmLocks.put(type, full);
- }
-
- public void acquire(WakeLockType type) {
- mmLocks.get(type).acquire();
- for (Entry<WakeLockType, WakeLock> entry : mmLocks.entrySet()) {
- if (entry.getKey() != type) {
- entry.getValue().release();
- }
- }
- }
-
- public void release() {
- for (Entry<WakeLockType, WakeLock> entry : mmLocks.entrySet()) {
- entry.getValue().release();
- }
- }
- }
-
- private final WakeLockManager mManager;
-
- public WakeLockFacade(FacadeManager manager) {
- super(manager);
- mmPowerManager = (PowerManager) manager.getService()
- .getSystemService(Context.POWER_SERVICE);
- mManager = new WakeLockManager(mmPowerManager);
- }
-
- @Rpc(description = "Acquires a full wake lock (CPU on, screen bright, keyboard bright).")
- public void wakeLockAcquireFull() {
- mManager.acquire(WakeLockType.FULL);
- }
-
- @Rpc(description = "Acquires a partial wake lock (CPU on).")
- public void wakeLockAcquirePartial() {
- mManager.acquire(WakeLockType.PARTIAL);
- }
-
- @Rpc(description = "Acquires a bright wake lock (CPU on, screen bright).")
- public void wakeLockAcquireBright() {
- mManager.acquire(WakeLockType.BRIGHT);
- }
-
- @Rpc(description = "Acquires a dim wake lock (CPU on, screen dim).")
- public void wakeLockAcquireDim() {
- mManager.acquire(WakeLockType.DIM);
- }
-
- @Rpc(description = "Releases the wake lock.")
- public void wakeLockRelease() {
- mManager.release();
- }
-
- @Override
- public void shutdown() {
- wakeLockRelease();
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothA2dpFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothA2dpFacade.java
deleted file mode 100644
index 4a98d71..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothA2dpFacade.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.bluetooth;
-
-import java.util.List;
-
-import android.app.Service;
-import android.bluetooth.BluetoothA2dp;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothProfile;
-import android.bluetooth.BluetoothUuid;
-import android.os.ParcelUuid;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-public class BluetoothA2dpFacade extends RpcReceiver {
- static final ParcelUuid[] SINK_UUIDS = {
- BluetoothUuid.AudioSink, BluetoothUuid.AdvAudioDist,
- };
- private final Service mService;
- private final BluetoothAdapter mBluetoothAdapter;
-
- private static boolean sIsA2dpReady = false;
- private static BluetoothA2dp sA2dpProfile = null;
-
- public BluetoothA2dpFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
- mBluetoothAdapter.getProfileProxy(mService, new A2dpServiceListener(),
- BluetoothProfile.A2DP);
- }
-
- class A2dpServiceListener implements BluetoothProfile.ServiceListener {
- @Override
- public void onServiceConnected(int profile, BluetoothProfile proxy) {
- sA2dpProfile = (BluetoothA2dp) proxy;
- sIsA2dpReady = true;
- }
-
- @Override
- public void onServiceDisconnected(int profile) {
- sIsA2dpReady = false;
- }
- }
-
- public Boolean a2dpConnect(BluetoothDevice device) {
- List<BluetoothDevice> sinks = sA2dpProfile.getConnectedDevices();
- if (sinks != null) {
- for (BluetoothDevice sink : sinks) {
- sA2dpProfile.disconnect(sink);
- }
- }
- return sA2dpProfile.connect(device);
- }
-
- public Boolean a2dpDisconnect(BluetoothDevice device) {
- if (sA2dpProfile.getPriority(device) > BluetoothProfile.PRIORITY_ON) {
- sA2dpProfile.setPriority(device, BluetoothProfile.PRIORITY_ON);
- }
- return sA2dpProfile.disconnect(device);
- }
-
- /**
- * Checks to see if the A2DP profile is ready for use.
- *
- * @return Returns true if the A2DP Profile is ready.
- */
- @Rpc(description = "Is A2dp profile ready.")
- public Boolean bluetoothA2dpIsReady() {
- return sIsA2dpReady;
- }
-
- /**
- * Connect to remote device using the A2DP profile.
- *
- * @param deviceId the name or mac address of the remote Bluetooth device.
- * @return True if connected successfully.
- * @throws Exception
- */
- @Rpc(description = "Connect to an A2DP device.")
- public Boolean bluetoothA2dpConnect(
- @RpcParameter(name = "deviceID", description = "Name or MAC address of a bluetooth device.")
- String deviceID)
- throws Exception {
- if (sA2dpProfile == null)
- return false;
- BluetoothDevice mDevice = BluetoothFacade.getDevice(
- BluetoothFacade.DiscoveredDevices, deviceID);
- Log.d("Connecting to device " + mDevice.getAliasName());
- return a2dpConnect(mDevice);
- }
-
- /**
- * Disconnect a remote device using the A2DP profile.
- *
- * @param deviceId the name or mac address of the remote Bluetooth device.
- * @return True if connected successfully.
- * @throws Exception
- */
- @Rpc(description = "Disconnect an A2DP device.")
- public Boolean bluetoothA2dpDisconnect(
- @RpcParameter(name = "deviceID", description = "Name or MAC address of a device.")
- String deviceID)
- throws Exception {
- if (sA2dpProfile == null)
- return false;
- List<BluetoothDevice> connectedA2dpDevices = sA2dpProfile.getConnectedDevices();
- Log.d("Connected a2dp devices " + connectedA2dpDevices);
- BluetoothDevice mDevice = BluetoothFacade.getDevice(connectedA2dpDevices, deviceID);
- return a2dpDisconnect(mDevice);
- }
-
- /**
- * Get the list of devices connected through the A2DP profile.
- *
- * @return List of bluetooth devices that are in one of the following states:
- * connected, connecting, and disconnecting.
- */
- @Rpc(description = "Get all the devices connected through A2DP.")
- public List<BluetoothDevice> bluetoothA2dpGetConnectedDevices() {
- while (!sIsA2dpReady);
- return sA2dpProfile.getDevicesMatchingConnectionStates(
- new int[] {BluetoothProfile.STATE_CONNECTED,
- BluetoothProfile.STATE_CONNECTING,
- BluetoothProfile.STATE_DISCONNECTING});
- }
-
- @Override
- public void shutdown() {
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothAvrcpFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothAvrcpFacade.java
deleted file mode 100644
index 97dcdff..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothAvrcpFacade.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.bluetooth;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.List;
-
-import android.app.Service;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothAvrcpController;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothProfile;
-import android.bluetooth.BluetoothUuid;
-import android.os.ParcelUuid;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-public class BluetoothAvrcpFacade extends RpcReceiver {
- static final ParcelUuid[] AVRCP_UUIDS = {
- BluetoothUuid.AvrcpTarget, BluetoothUuid.AvrcpController
- };
- private final Service mService;
- private final BluetoothAdapter mBluetoothAdapter;
-
- private static boolean sIsAvrcpReady = false;
- private static BluetoothAvrcpController sAvrcpProfile = null;
-
- public BluetoothAvrcpFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
- mBluetoothAdapter.getProfileProxy(mService, new AvrcpServiceListener(),
- BluetoothProfile.AVRCP_CONTROLLER);
- }
-
- class AvrcpServiceListener implements BluetoothProfile.ServiceListener {
- @Override
- public void onServiceConnected(int profile, BluetoothProfile proxy) {
- sAvrcpProfile = (BluetoothAvrcpController) proxy;
- sIsAvrcpReady = true;
- }
-
- @Override
- public void onServiceDisconnected(int profile) {
- sIsAvrcpReady = false;
- }
- }
-
- @Rpc(description = "Is Avrcp profile ready.")
- public Boolean bluetoothAvrcpIsReady() {
- return sIsAvrcpReady;
- }
-
- @Rpc(description = "Get all the devices connected through AVRCP.")
- public List<BluetoothDevice> bluetoothAvrcpGetConnectedDevices() {
- if (!sIsAvrcpReady) {
- Log.d("AVRCP profile is not ready.");
- return null;
- }
- return sAvrcpProfile.getConnectedDevices();
- }
-
- @Rpc(description = "Close AVRCP connection.")
- public void bluetoothAvrcpDisconnect() throws NoSuchMethodException,
- IllegalAccessException,
- IllegalArgumentException,
- InvocationTargetException {
- if (!sIsAvrcpReady) {
- Log.d("AVRCP profile is not ready.");
- return;
- }
- Method m = sAvrcpProfile.getClass().getMethod("close");
- m.invoke(sAvrcpProfile);
- }
-
- @Rpc(description = "Send AVRPC passthrough command.")
- public void bluetoothAvrcpSendPassThroughCmd(
- @RpcParameter(name = "deviceID",
- description = "Name or MAC address of a bluetooth device.")
- String deviceID,
- @RpcParameter(name = "keyCode")
- Integer keyCode,
- @RpcParameter(name = "keyState")
- Integer keyState) throws Exception {
- if (!sIsAvrcpReady) {
- Log.d("AVRCP profile is not ready.");
- return;
- }
- BluetoothDevice mDevice = BluetoothFacade.getDevice(sAvrcpProfile.getConnectedDevices(),
- deviceID);
- sAvrcpProfile.sendPassThroughCmd(mDevice, keyCode, keyState);
- }
-
- @Override
- public void shutdown() {
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothBroadcastHelper.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothBroadcastHelper.java
deleted file mode 100644
index dc230cb..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothBroadcastHelper.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.bluetooth;
-
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-
-public class BluetoothBroadcastHelper {
-
- private static BroadcastReceiver mListener;
- private final Context mContext;
- private final BroadcastReceiver mReceiver;
- private final String[] mActions = {BluetoothDevice.ACTION_FOUND,
- BluetoothDevice.ACTION_UUID,
- BluetoothAdapter.ACTION_DISCOVERY_STARTED,
- BluetoothAdapter.ACTION_DISCOVERY_FINISHED};
-
- public BluetoothBroadcastHelper(Context context, BroadcastReceiver listener) {
- mContext = context;
- mListener = listener;
- mReceiver = new BluetoothReceiver();
- }
-
- public void startReceiver() {
- IntentFilter mIntentFilter = new IntentFilter();
- for(String action : mActions) {
- mIntentFilter.addAction(action);
- }
- mContext.registerReceiver(mReceiver, mIntentFilter);
- }
-
- public static class BluetoothReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- mListener.onReceive(context, intent);
- }
- }
-
- public void stopReceiver() {
- mContext.unregisterReceiver(mReceiver);
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothConnectionFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothConnectionFacade.java
deleted file mode 100644
index 7fb768f..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothConnectionFacade.java
+++ /dev/null
@@ -1,410 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.bluetooth;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import android.app.Service;
-import android.bluetooth.BluetoothA2dp;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothHeadset;
-import android.bluetooth.BluetoothInputDevice;
-import android.bluetooth.BluetoothUuid;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Bundle;
-import android.os.ParcelUuid;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.facade.EventFacade;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-public class BluetoothConnectionFacade extends RpcReceiver {
-
- private final Service mService;
- private final BluetoothAdapter mBluetoothAdapter;
- private final BluetoothPairingHelper mPairingHelper;
- private final Map<String, BroadcastReceiver> listeningDevices;
- private final EventFacade mEventFacade;
-
- private final IntentFilter mDiscoverConnectFilter;
- private final IntentFilter mPairingFilter;
- private final IntentFilter mBondFilter;
- private final IntentFilter mA2dpStateChangeFilter;
- private final IntentFilter mHidStateChangeFilter;
- private final IntentFilter mHspStateChangeFilter;
-
- private final Bundle mGoodNews;
- private final Bundle mBadNews;
-
- private BluetoothA2dpFacade mA2dpProfile;
- private BluetoothHidFacade mHidProfile;
- private BluetoothHspFacade mHspProfile;
-
- public BluetoothConnectionFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
- mPairingHelper = new BluetoothPairingHelper();
- // Use a synchronized map to avoid racing problems
- listeningDevices = Collections.synchronizedMap(new HashMap<String, BroadcastReceiver>());
-
- mEventFacade = manager.getReceiver(EventFacade.class);
- mA2dpProfile = manager.getReceiver(BluetoothA2dpFacade.class);
- mHidProfile = manager.getReceiver(BluetoothHidFacade.class);
- mHspProfile = manager.getReceiver(BluetoothHspFacade.class);
-
- mDiscoverConnectFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
- mDiscoverConnectFilter.addAction(BluetoothDevice.ACTION_UUID);
- mDiscoverConnectFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
-
- mPairingFilter = new IntentFilter(BluetoothDevice.ACTION_PAIRING_REQUEST);
- mPairingFilter.addAction(BluetoothDevice.ACTION_CONNECTION_ACCESS_REQUEST);
- mPairingFilter.setPriority(999);
-
- mBondFilter = new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
- mBondFilter.addAction(BluetoothDevice.ACTION_FOUND);
- mBondFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
-
- mA2dpStateChangeFilter = new IntentFilter(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED);
- mHidStateChangeFilter = new IntentFilter(BluetoothInputDevice.ACTION_CONNECTION_STATE_CHANGED);
- mHspStateChangeFilter = new IntentFilter(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED);
-
- mGoodNews = new Bundle();
- mGoodNews.putBoolean("Status", true);
- mBadNews = new Bundle();
- mBadNews.putBoolean("Status", false);
- }
-
- private void unregisterCachedListener(String listenerId) {
- BroadcastReceiver listener = listeningDevices.remove(listenerId);
- if (listener != null) {
- mService.unregisterReceiver(listener);
- }
- }
-
- /**
- * Connect to a specific device upon its discovery
- */
- public class DiscoverConnectReceiver extends BroadcastReceiver {
- private final String mDeviceID;
- private BluetoothDevice mDevice;
-
- /**
- * Constructor
- *
- * @param deviceID Either the device alias name or mac address.
- * @param bond If true, bond the device only.
- */
- public DiscoverConnectReceiver(String deviceID) {
- super();
- mDeviceID = deviceID;
- }
-
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- // The specified device is found.
- if (action.equals(BluetoothDevice.ACTION_FOUND)) {
- BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
- if (BluetoothFacade.deviceMatch(device, mDeviceID)) {
- Log.d("Found device " + device.getAliasName() + " for connection.");
- mBluetoothAdapter.cancelDiscovery();
- mDevice = device;
- }
- // After discovery stops.
- } else if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) {
- if (mDevice == null) {
- Log.d("Device " + mDeviceID + " not discovered.");
- mEventFacade.postEvent("Bond" + mDeviceID, mBadNews);
- return;
- }
- boolean status = mDevice.fetchUuidsWithSdp();
- Log.d("Initiated ACL connection: " + status);
- } else if (action.equals(BluetoothDevice.ACTION_UUID)) {
- BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
- if (BluetoothFacade.deviceMatch(device, mDeviceID)) {
- Log.d("Initiating connections.");
- connectProfile(device, mDeviceID);
- mService.unregisterReceiver(listeningDevices.remove("Connect" + mDeviceID));
- }
- }
- }
- }
-
- /**
- * Connect to a specific device upon its discovery
- */
- public class DiscoverBondReceiver extends BroadcastReceiver {
- private final String mDeviceID;
- private BluetoothDevice mDevice = null;
- private boolean started = false;
-
- /**
- * Constructor
- *
- * @param deviceID Either the device alias name or Mac address.
- */
- public DiscoverBondReceiver(String deviceID) {
- super();
- mDeviceID = deviceID;
- }
-
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- // The specified device is found.
- if (action.equals(BluetoothDevice.ACTION_FOUND)) {
- BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
- if (BluetoothFacade.deviceMatch(device, mDeviceID)) {
- Log.d("Found device " + device.getAliasName() + " for connection.");
- mBluetoothAdapter.cancelDiscovery();
- mDevice = device;
- }
- // After discovery stops.
- } else if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) {
- if (mDevice == null) {
- Log.d("Device " + mDeviceID + " was not discovered.");
- mEventFacade.postEvent("Bond", mBadNews);
- return;
- }
- // Attempt to initiate bonding.
- if (!started) {
- Log.d("Bond with " + mDevice.getAliasName());
- if (mDevice.createBond()) {
- started = true;
- Log.d("Bonding started.");
- } else {
- Log.e("Failed to bond with " + mDevice.getAliasName());
- mEventFacade.postEvent("Bond", mBadNews);
- mService.unregisterReceiver(listeningDevices.remove("Bond" + mDeviceID));
- }
- }
- } else if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)) {
- Log.d("Bond state changing.");
- BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
- if (BluetoothFacade.deviceMatch(device, mDeviceID)) {
- int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, -1);
- Log.d("New state is " + state);
- if (state == BluetoothDevice.BOND_BONDED) {
- Log.d("Bonding with " + mDeviceID + " successful.");
- mEventFacade.postEvent("Bond" + mDeviceID, mGoodNews);
- mService.unregisterReceiver(listeningDevices.remove("Bond" + mDeviceID));
- }
- }
- }
- }
- }
-
- public class ConnectStateChangeReceiver extends BroadcastReceiver {
- private final String mDeviceID;
-
- public ConnectStateChangeReceiver(String deviceID) {
- mDeviceID = deviceID;
- }
-
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
- // Check if received the specified device
- if (!BluetoothFacade.deviceMatch(device, mDeviceID)) {
- return;
- }
- if (action.equals(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED)) {
- int state = intent.getIntExtra(BluetoothA2dp.EXTRA_STATE, -1);
- if (state == BluetoothA2dp.STATE_CONNECTED) {
- Bundle a2dpGoodNews = (Bundle) mGoodNews.clone();
- a2dpGoodNews.putString("Type", "a2dp");
- mEventFacade.postEvent("A2dpConnect" + mDeviceID, a2dpGoodNews);
- unregisterCachedListener("A2dpConnecting" + mDeviceID);
- } else if (state == BluetoothA2dp.STATE_CONNECTING) {
- }
- }else if (action.equals(BluetoothInputDevice.ACTION_CONNECTION_STATE_CHANGED)) {
- int state = intent.getIntExtra(BluetoothInputDevice.EXTRA_STATE, -1);
- if (state == BluetoothInputDevice.STATE_CONNECTED) {
- mEventFacade.postEvent("HidConnect" + mDeviceID, mGoodNews);
- unregisterCachedListener("HidConnecting" + mDeviceID);
- }
- } else if (action.equals(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED)) {
- int state = intent.getIntExtra(BluetoothHeadset.EXTRA_STATE, -1);
- if (state == BluetoothHeadset.STATE_CONNECTED) {
- mEventFacade.postEvent("HspConnect" + mDeviceID, mGoodNews);
- unregisterCachedListener("HspConnecting" + mDeviceID);
- }
- }
- }
- }
-
- private void connectProfile(BluetoothDevice device, String deviceID) {
- mService.registerReceiver(mPairingHelper, mPairingFilter);
- ParcelUuid[] deviceUuids = device.getUuids();
- Log.d("Device uuid is " + deviceUuids);
- if (deviceUuids == null) {
- mEventFacade.postEvent("Connect", mBadNews);
- }
- if (BluetoothUuid.containsAnyUuid(BluetoothA2dpFacade.SINK_UUIDS, deviceUuids)) {
- Log.d("Connecting to " + device.getAliasName());
- boolean status = mA2dpProfile.a2dpConnect(device);
- if (status) {
- Log.d("Connecting A2dp...");
- ConnectStateChangeReceiver receiver = new ConnectStateChangeReceiver(deviceID);
- mService.registerReceiver(receiver, mA2dpStateChangeFilter);
- listeningDevices.put("A2dpConnecting" + deviceID, receiver);
- } else {
- Log.d("Failed starting A2dp connection.");
- Bundle a2dpBadNews = (Bundle) mBadNews.clone();
- a2dpBadNews.putString("Type", "a2dp");
- mEventFacade.postEvent("Connect", a2dpBadNews);
- }
- }
- if (BluetoothUuid.containsAnyUuid(BluetoothHidFacade.UUIDS, deviceUuids)) {
- boolean status = mHidProfile.hidConnect(device);
- if (status) {
- Log.d("Connecting Hid...");
- ConnectStateChangeReceiver receiver = new ConnectStateChangeReceiver(deviceID);
- mService.registerReceiver(receiver, mHidStateChangeFilter);
- listeningDevices.put("HidConnecting" + deviceID, receiver);
- } else {
- Log.d("Failed starting Hid connection.");
- mEventFacade.postEvent("HidConnect" + deviceID, mBadNews);
- }
- }
- if (BluetoothUuid.containsAnyUuid(BluetoothHspFacade.UUIDS, deviceUuids)) {
- boolean status = mHspProfile.hspConnect(device);
- if (status) {
- Log.d("Connecting Hsp...");
- ConnectStateChangeReceiver receiver = new ConnectStateChangeReceiver(deviceID);
- mService.registerReceiver(receiver, mHspStateChangeFilter);
- listeningDevices.put("HspConnecting" + deviceID, receiver);
- } else {
- Log.d("Failed starting Hsp connection.");
- mEventFacade.postEvent("HspConnect" + deviceID, mBadNews);
- }
- }
- mService.unregisterReceiver(mPairingHelper);
- }
-
- @Rpc(description = "Start intercepting all bluetooth connection pop-ups.")
- public void bluetoothStartPairingHelper() {
- mService.registerReceiver(mPairingHelper, mPairingFilter);
- }
-
- @Rpc(description = "Return a list of devices connected through bluetooth")
- public List<BluetoothDevice> bluetoothGetConnectedDevices() {
- ArrayList<BluetoothDevice> results = new ArrayList<BluetoothDevice>();
- for (BluetoothDevice bd : mBluetoothAdapter.getBondedDevices()) {
- if (bd.isConnected()) {
- results.add(bd);
- }
- }
- return results;
- }
-
- @Rpc(description = "Return true if a bluetooth device is connected.")
- public Boolean bluetoothIsDeviceConnected(String deviceID) {
- for (BluetoothDevice bd : mBluetoothAdapter.getBondedDevices()) {
- if (BluetoothFacade.deviceMatch(bd, deviceID)) {
- return bd.isConnected();
- }
- }
- return false;
- }
-
- @Rpc(description = "Connect to a specified device once it's discovered.",
- returns = "Whether discovery started successfully.")
- public Boolean bluetoothDiscoverAndConnect(
- @RpcParameter(name = "deviceID",
- description = "Name or MAC address of a bluetooth device.")
- String deviceID) {
- mBluetoothAdapter.cancelDiscovery();
- if (listeningDevices.containsKey(deviceID)) {
- Log.d("This device is already in the process of discovery and connecting.");
- return true;
- }
- DiscoverConnectReceiver receiver = new DiscoverConnectReceiver(deviceID);
- listeningDevices.put("Connect" + deviceID, receiver);
- mService.registerReceiver(receiver, mDiscoverConnectFilter);
- return mBluetoothAdapter.startDiscovery();
- }
-
- @Rpc(description = "Bond to a specified device once it's discovered.",
- returns = "Whether discovery started successfully. ")
- public Boolean bluetoothDiscoverAndBond(
- @RpcParameter(name = "deviceID",
- description = "Name or MAC address of a bluetooth device.")
- String deviceID) {
- mBluetoothAdapter.cancelDiscovery();
- if (listeningDevices.containsKey(deviceID)) {
- Log.d("This device is already in the process of discovery and bonding.");
- return true;
- }
- if (BluetoothFacade.deviceExists(mBluetoothAdapter.getBondedDevices(), deviceID)) {
- Log.d("Device " + deviceID + " is already bonded.");
- mEventFacade.postEvent("Bond" + deviceID, mGoodNews);
- return true;
- }
- DiscoverBondReceiver receiver = new DiscoverBondReceiver(deviceID);
- if (listeningDevices.containsKey("Bond" + deviceID)) {
- mService.unregisterReceiver(listeningDevices.remove("Bond" + deviceID));
- }
- listeningDevices.put("Bond" + deviceID, receiver);
- mService.registerReceiver(receiver, mBondFilter);
- Log.d("Start discovery for bonding.");
- return mBluetoothAdapter.startDiscovery();
- }
-
- @Rpc(description = "Unbond a device.",
- returns = "Whether the device was successfully unbonded.")
- public Boolean bluetoothUnbond(
- @RpcParameter(name = "deviceID",
- description = "Name or MAC address of a bluetooth device.")
- String deviceID) throws Exception {
- BluetoothDevice mDevice = BluetoothFacade.getDevice(mBluetoothAdapter.getBondedDevices(),
- deviceID);
- return mDevice.removeBond();
- }
-
- @Rpc(description = "Connect to a device that is already bonded.")
- public void bluetoothConnectBonded(
- @RpcParameter(name = "deviceID",
- description = "Name or MAC address of a bluetooth device.")
- String deviceID) throws Exception {
- BluetoothDevice mDevice = BluetoothFacade.getDevice(mBluetoothAdapter.getBondedDevices(),
- deviceID);
- connectProfile(mDevice, deviceID);
- }
-
- @Override
- public void shutdown() {
- for(BroadcastReceiver receiver : listeningDevices.values()) {
- mService.unregisterReceiver(receiver);
- }
- listeningDevices.clear();
- mService.unregisterReceiver(mPairingHelper);
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothDiscoveryHelper.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothDiscoveryHelper.java
deleted file mode 100644
index f625f03..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothDiscoveryHelper.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.bluetooth;
-
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-
-import java.util.Set;
-
-import com.googlecode.android_scripting.Log;
-
-public class BluetoothDiscoveryHelper {
-
- public static interface BluetoothDiscoveryListener {
- public void addBondedDevice(String name, String address);
-
- public void addDevice(String name, String address);
-
- public void scanDone();
- }
-
- private final Context mContext;
- private final BluetoothDiscoveryListener mListener;
- private final BroadcastReceiver mReceiver;
-
- public BluetoothDiscoveryHelper(Context context, BluetoothDiscoveryListener listener) {
- mContext = context;
- mListener = listener;
- mReceiver = new BluetoothReceiver();
- }
-
- private class BluetoothReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- final String action = intent.getAction();
-
- if (BluetoothDevice.ACTION_FOUND.equals(action)) {
- // Get the BluetoothDevice object from the Intent.
- BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
- Log.d("Found device " + device.getAliasName());
- // If it's already paired, skip it, because it's been listed already.
- if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
- mListener.addDevice(device.getName(), device.getAddress());
- }
- } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
- mListener.scanDone();
- }
- }
- }
-
- public void startDiscovery() {
- BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
-
- if (bluetoothAdapter.isDiscovering()) {
- bluetoothAdapter.cancelDiscovery();
- }
-
- Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();
- for (BluetoothDevice device : pairedDevices) {
- mListener.addBondedDevice(device.getName(), device.getAddress());
- }
-
- IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
- filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
- mContext.registerReceiver(mReceiver, filter);
-
- if (!bluetoothAdapter.isEnabled()) {
- bluetoothAdapter.enable();
- }
-
- bluetoothAdapter.startDiscovery();
- }
-
- public void cancel() {
- mContext.unregisterReceiver(mReceiver);
- mListener.scanDone();
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothFacade.java
deleted file mode 100644
index 474e6d9..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothFacade.java
+++ /dev/null
@@ -1,378 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.bluetooth;
-
-import android.app.Service;
-import android.bluetooth.BluetoothActivityEnergyInfo;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Bundle;
-import android.os.ParcelUuid;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.MainThread;
-import com.googlecode.android_scripting.facade.EventFacade;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcDefault;
-import com.googlecode.android_scripting.rpc.RpcOptional;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * Basic Bluetooth functions.
- */
-public class BluetoothFacade extends RpcReceiver {
- private final Service mService;
- private final BroadcastReceiver mDiscoveryReceiver;
- private final IntentFilter discoveryFilter;
- private final EventFacade mEventFacade;
- private final BluetoothStateReceiver mStateReceiver;
- private final BleStateReceiver mBleStateReceiver;
- private Map<String, BluetoothConnection> connections =
- new HashMap<String, BluetoothConnection>();
- private BluetoothAdapter mBluetoothAdapter;
-
- public static ConcurrentHashMap<String, BluetoothDevice> DiscoveredDevices;
-
- public BluetoothFacade(FacadeManager manager) {
- super(manager);
- mBluetoothAdapter = MainThread.run(manager.getService(), new Callable<BluetoothAdapter>() {
- @Override
- public BluetoothAdapter call() throws Exception {
- return BluetoothAdapter.getDefaultAdapter();
- }
- });
- mEventFacade = manager.getReceiver(EventFacade.class);
- mService = manager.getService();
-
- DiscoveredDevices = new ConcurrentHashMap<String, BluetoothDevice>();
- discoveryFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
- discoveryFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
- mDiscoveryReceiver = new DiscoveryCacheReceiver();
- mStateReceiver = new BluetoothStateReceiver();
- mBleStateReceiver = new BleStateReceiver();
- }
-
- class DiscoveryCacheReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (action.equals(BluetoothDevice.ACTION_FOUND)) {
- BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
- Log.d("Found device " + device.getAliasName());
- if (!DiscoveredDevices.containsKey(device.getAddress())) {
- String name = device.getAliasName();
- if (name != null) {
- DiscoveredDevices.put(device.getAliasName(), device);
- }
- DiscoveredDevices.put(device.getAddress(), device);
- }
- } else if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) {
- mEventFacade.postEvent("BluetoothDiscoveryFinished", new Bundle());
- mService.unregisterReceiver(mDiscoveryReceiver);
- }
- }
- }
-
- class BluetoothStateReceiver extends BroadcastReceiver {
-
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
- final int state = mBluetoothAdapter.getState();
- Bundle msg = new Bundle();
- if (state == BluetoothAdapter.STATE_ON) {
- msg.putString("State", "ON");
- mEventFacade.postEvent("BluetoothStateChangedOn", msg);
- mService.unregisterReceiver(mStateReceiver);
- } else if(state == BluetoothAdapter.STATE_OFF) {
- msg.putString("State", "OFF");
- mEventFacade.postEvent("BluetoothStateChangedOff", msg);
- mService.unregisterReceiver(mStateReceiver);
- }
- msg.clear();
- }
- }
- }
-
- class BleStateReceiver extends BroadcastReceiver {
-
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (action.equals(BluetoothAdapter.ACTION_BLE_STATE_CHANGED)) {
- int state = mBluetoothAdapter.getLeState();
- if (state == BluetoothAdapter.STATE_BLE_ON) {
- mEventFacade.postEvent("BleStateChangedOn", new Bundle());
- mService.unregisterReceiver(mBleStateReceiver);
- } else if (state == BluetoothAdapter.STATE_OFF) {
- mEventFacade.postEvent("BleStateChangedOff", new Bundle());
- mService.unregisterReceiver(mBleStateReceiver);
- }
- }
- }
- }
-
-
- public static boolean deviceMatch(BluetoothDevice device, String deviceID) {
- return deviceID.equals(device.getAliasName()) || deviceID.equals(device.getAddress());
- }
-
- public static <T> BluetoothDevice getDevice(ConcurrentHashMap<String, T> devices, String device)
- throws Exception {
- if (devices.containsKey(device)) {
- return (BluetoothDevice) devices.get(device);
- } else {
- throw new Exception("Can't find device " + device);
- }
- }
-
- public static BluetoothDevice getDevice(Collection<BluetoothDevice> devices, String deviceID)
- throws Exception {
- Log.d("Looking for " + deviceID);
- for (BluetoothDevice bd : devices) {
- Log.d(bd.getAliasName() + " " + bd.getAddress());
- if (deviceMatch(bd, deviceID)) {
- Log.d("Found match " + bd.getAliasName() + " " + bd.getAddress());
- return bd;
- }
- }
- throw new Exception("Can't find device " + deviceID);
- }
-
- public static boolean deviceExists(Collection<BluetoothDevice> devices, String deviceID) {
- for (BluetoothDevice bd : devices) {
- if (deviceMatch(bd, deviceID)) {
- Log.d("Found match " + bd.getAliasName() + " " + bd.getAddress());
- return true;
- }
- }
- return false;
- }
-
- @Rpc(description = "Requests that the device be made connectable.")
- public void bluetoothMakeConnectable() {
- mBluetoothAdapter
- .setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE);
- }
-
- @Rpc(description = "Requests that the device be discoverable for Bluetooth connections.")
- public void bluetoothMakeDiscoverable(
- @RpcParameter(name = "duration",
- description = "period of time, in seconds,"
- + "during which the device should be discoverable")
- @RpcDefault("300")
- Integer duration) {
- Log.d("Making discoverable for " + duration + " seconds.\n");
- mBluetoothAdapter
- .setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE, duration);
- }
-
- @Rpc(description = "Requests that the device be not discoverable.")
- public void bluetoothMakeUndiscoverable() {
- Log.d("Making undiscoverable\n");
- mBluetoothAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_NONE);
- }
-
- @Rpc(description = "Queries a remote device for it's name or null if it can't be resolved")
- public String bluetoothGetRemoteDeviceName(
- @RpcParameter(name = "address", description = "Bluetooth Address For Target Device")
- String address) {
- try {
- BluetoothDevice mDevice;
- mDevice = mBluetoothAdapter.getRemoteDevice(address);
- return mDevice.getName();
- } catch (Exception e) {
- return null;
- }
- }
-
- @Rpc(description = "Get local Bluetooth device name")
- public String bluetoothGetLocalName() {
- return mBluetoothAdapter.getName();
- }
-
- @Rpc(description = "Sets the Bluetooth visible device name", returns = "true on success")
- public boolean bluetoothSetLocalName(
- @RpcParameter(name = "name", description = "New local name")
- String name) {
- return mBluetoothAdapter.setName(name);
- }
-
- @Rpc(description = "Returns the hardware address of the local Bluetooth adapter. ")
- public String bluetoothGetLocalAddress() {
- return mBluetoothAdapter.getAddress();
- }
-
- @Rpc(description = "Returns the UUIDs supported by local Bluetooth adapter.")
- public ParcelUuid[] bluetoothGetLocalUuids() {
- return mBluetoothAdapter.getUuids();
- }
-
- @Rpc(description = "Gets the scan mode for the local dongle.\r\n" + "Return values:\r\n"
- + "\t-1 when Bluetooth is disabled.\r\n"
- + "\t0 if non discoverable and non connectable.\r\n"
- + "\r1 connectable non discoverable." + "\r3 connectable and discoverable.")
- public int bluetoothGetScanMode() {
- if (mBluetoothAdapter.getState() == BluetoothAdapter.STATE_OFF
- || mBluetoothAdapter.getState() == BluetoothAdapter.STATE_TURNING_OFF) {
- return -1;
- }
- switch (mBluetoothAdapter.getScanMode()) {
- case BluetoothAdapter.SCAN_MODE_NONE:
- return 0;
- case BluetoothAdapter.SCAN_MODE_CONNECTABLE:
- return 1;
- case BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE:
- return 3;
- default:
- return mBluetoothAdapter.getScanMode() - 20;
- }
- }
-
- @Rpc(description = "Return the set of BluetoothDevice that are paired to the local adapter.")
- public Set<BluetoothDevice> bluetoothGetBondedDevices() {
- return mBluetoothAdapter.getBondedDevices();
- }
-
- @Rpc(description = "Checks Bluetooth state.", returns = "True if Bluetooth is enabled.")
- public Boolean bluetoothCheckState() {
- return mBluetoothAdapter.isEnabled();
- }
-
- @Rpc(description = "Toggle Bluetooth on and off.", returns = "True if Bluetooth is enabled.")
- public Boolean bluetoothToggleState(@RpcParameter(name = "enabled")
- @RpcOptional
- Boolean enabled,
- @RpcParameter(name = "prompt",
- description = "Prompt the user to confirm changing the Bluetooth state.")
- @RpcDefault("false")
- Boolean prompt) {
- mService.registerReceiver(mStateReceiver,
- new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED));
- if (enabled == null) {
- enabled = !bluetoothCheckState();
- }
- if (enabled) {
- mBluetoothAdapter.enable();
- } else {
- shutdown();
- mBluetoothAdapter.disable();
- }
- return enabled;
- }
-
-
- @Rpc(description = "Start the remote device discovery process. ",
- returns = "true on success, false on error")
- public Boolean bluetoothStartDiscovery() {
- DiscoveredDevices.clear();
- mService.registerReceiver(mDiscoveryReceiver, discoveryFilter);
- return mBluetoothAdapter.startDiscovery();
- }
-
- @Rpc(description = "Cancel the current device discovery process.",
- returns = "true on success, false on error")
- public Boolean bluetoothCancelDiscovery() {
- try {
- mService.unregisterReceiver(mDiscoveryReceiver);
- } catch (IllegalArgumentException e) {
- Log.d("IllegalArgumentExeption found when trying to unregister reciever");
- }
- return mBluetoothAdapter.cancelDiscovery();
- }
-
- @Rpc(description = "If the local Bluetooth adapter is currently"
- + "in the device discovery process.")
- public Boolean bluetoothIsDiscovering() {
- return mBluetoothAdapter.isDiscovering();
- }
-
- @Rpc(description = "Get all the discovered bluetooth devices.")
- public Collection<BluetoothDevice> bluetoothGetDiscoveredDevices() {
- while (bluetoothIsDiscovering())
- ;
- return DiscoveredDevices.values();
- }
-
- @Rpc(description = "Enable or disable the Bluetooth HCI snoop log")
- public boolean bluetoothConfigHciSnoopLog(
- @RpcParameter(name = "value", description = "enable or disable log")
- Boolean value
- ) {
- return mBluetoothAdapter.configHciSnoopLog(value);
- }
-
- @Rpc(description = "Get Bluetooth controller activity energy info.")
- public String bluetoothGetControllerActivityEnergyInfo(
- @RpcParameter(name = "value")
- Integer value
- ) {
- BluetoothActivityEnergyInfo energyInfo = mBluetoothAdapter
- .getControllerActivityEnergyInfo(value);
- while (energyInfo == null) {
- energyInfo = mBluetoothAdapter.getControllerActivityEnergyInfo(value);
- }
- return energyInfo.toString();
- }
-
- @Rpc(description = "Return true if hardware has entries" +
- "available for matching beacons.")
- public boolean bluetoothIsHardwareTrackingFiltersAvailable() {
- return mBluetoothAdapter.isHardwareTrackingFiltersAvailable();
- }
-
- @Rpc(description = "Gets the current state of LE.")
- public int bluetoothGetLeState() {
- return mBluetoothAdapter.getLeState();
- }
-
- @Rpc(description = "Enables BLE functionalities.")
- public boolean bluetoothEnableBLE() {
- mService.registerReceiver(mBleStateReceiver,
- new IntentFilter(BluetoothAdapter.ACTION_BLE_STATE_CHANGED));
- return mBluetoothAdapter.enableBLE();
- }
-
- @Rpc(description = "Disables BLE functionalities.")
- public boolean bluetoothDisableBLE() {
- mService.registerReceiver(mBleStateReceiver,
- new IntentFilter(BluetoothAdapter.ACTION_BLE_STATE_CHANGED));
- return mBluetoothAdapter.disableBLE();
- }
-
- @Override
- public void shutdown() {
- for (Map.Entry<String, BluetoothConnection> entry : connections.entrySet()) {
- entry.getValue().stop();
- }
- connections.clear();
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothHidFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothHidFacade.java
deleted file mode 100644
index 8db50f1..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothHidFacade.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.bluetooth;
-
-import java.util.List;
-
-import android.app.Service;
-import android.bluetooth.BluetoothInputDevice;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothProfile;
-import android.bluetooth.BluetoothUuid;
-import android.os.ParcelUuid;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcDefault;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-public class BluetoothHidFacade extends RpcReceiver {
- public final static ParcelUuid[] UUIDS = { BluetoothUuid.Hid };
-
- private final Service mService;
- private final BluetoothAdapter mBluetoothAdapter;
-
- private static boolean sIsHidReady = false;
- private static BluetoothInputDevice sHidProfile = null;
-
- public BluetoothHidFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
- mBluetoothAdapter.getProfileProxy(mService, new HidServiceListener(),
- BluetoothProfile.INPUT_DEVICE);
- }
-
- class HidServiceListener implements BluetoothProfile.ServiceListener {
- @Override
- public void onServiceConnected(int profile, BluetoothProfile proxy) {
- sHidProfile = (BluetoothInputDevice) proxy;
- sIsHidReady = true;
- }
-
- @Override
- public void onServiceDisconnected(int profile) {
- sIsHidReady = false;
- }
- }
-
- public Boolean hidConnect(BluetoothDevice device) {
- if (sHidProfile == null) return false;
- return sHidProfile.connect(device);
- }
-
- public Boolean hidDisconnect(BluetoothDevice device) {
- if (sHidProfile == null) return false;
- return sHidProfile.disconnect(device);
- }
-
- @Rpc(description = "Is Hid profile ready.")
- public Boolean bluetoothHidIsReady() {
- return sIsHidReady;
- }
-
- @Rpc(description = "Connect to an HID device.")
- public Boolean bluetoothHidConnect(
- @RpcParameter(name = "device", description = "Name or MAC address of a bluetooth device.")
- String device)
- throws Exception {
- if (sHidProfile == null)
- return false;
- BluetoothDevice mDevice = BluetoothFacade.getDevice(BluetoothFacade.DiscoveredDevices, device);
- Log.d("Connecting to device " + mDevice.getAliasName());
- return hidConnect(mDevice);
- }
-
- @Rpc(description = "Disconnect an HID device.")
- public Boolean bluetoothHidDisconnect(
- @RpcParameter(name = "device", description = "Name or MAC address of a device.")
- String device)
- throws Exception {
- if (sHidProfile == null)
- return false;
- Log.d("Connected devices: " + sHidProfile.getConnectedDevices());
- BluetoothDevice mDevice = BluetoothFacade.getDevice(sHidProfile.getConnectedDevices(),
- device);
- return hidDisconnect(mDevice);
- }
-
- @Rpc(description = "Get all the devices connected through HID.")
- public List<BluetoothDevice> bluetoothHidGetConnectedDevices() {
- while (!sIsHidReady);
- return sHidProfile.getConnectedDevices();
- }
-
- @Rpc(description = "Get the connection status of a device.")
- public Integer bluetoothHidGetConnectionStatus(
- @RpcParameter(name = "deviceID",
- description = "Name or MAC address of a bluetooth device.")
- String deviceID) {
- if (sHidProfile == null) {
- return BluetoothProfile.STATE_DISCONNECTED;
- }
- List<BluetoothDevice> deviceList = sHidProfile.getConnectedDevices();
- BluetoothDevice device;
- try {
- device = BluetoothFacade.getDevice(deviceList, deviceID);
- } catch (Exception e) {
- return BluetoothProfile.STATE_DISCONNECTED;
- }
- return sHidProfile.getConnectionState(device);
- }
-
- @Rpc(description = "Send Set_Report command to the connected HID input device.")
- public Boolean bluetoothHidSetReport(
- @RpcParameter(name = "deviceID",
- description = "Name or MAC address of a bluetooth device.")
- String deviceID,
- @RpcParameter(name = "type")
- @RpcDefault(value = "1")
- String type,
- @RpcParameter(name = "report")
- String report) throws Exception {
- BluetoothDevice device = BluetoothFacade.getDevice(sHidProfile.getConnectedDevices(),
- deviceID);
- Log.d("type " + type.getBytes()[0]);
- return sHidProfile.setReport(device, type.getBytes()[0], report);
- }
-
- @Rpc(description = "Send Get_Report command to the connected HID input device.")
- public Boolean bluetoothHidGetReport(
- @RpcParameter(name = "deviceID",
- description = "Name or MAC address of a bluetooth device.")
- String deviceID,
- @RpcParameter(name = "type")
- @RpcDefault(value = "1")
- String type,
- @RpcParameter(name = "reportId")
- String reportId,
- @RpcParameter(name = "buffSize")
- Integer buffSize) throws Exception {
- BluetoothDevice device = BluetoothFacade.getDevice(sHidProfile.getConnectedDevices(),
- deviceID);
- Log.d("type " + type.getBytes()[0] + "reportId " + reportId.getBytes()[0]);
- return sHidProfile.getReport(device, type.getBytes()[0], reportId.getBytes()[0], buffSize);
- }
-
- @Rpc(description = "Send data to a connected HID device.")
- public Boolean bluetoothHidSendData(
- @RpcParameter(name = "deviceID",
- description = "Name or MAC address of a bluetooth device.")
- String deviceID,
- @RpcParameter(name = "report")
- String report) throws Exception {
- BluetoothDevice device = BluetoothFacade.getDevice(sHidProfile.getConnectedDevices(),
- deviceID);
- return sHidProfile.sendData(device, report);
- }
-
- @Rpc(description = "Send virtual unplug to a connected HID device.")
- public Boolean bluetoothHidVirtualUnplug(
- @RpcParameter(name = "deviceID",
- description = "Name or MAC address of a bluetooth device.")
- String deviceID) throws Exception {
- BluetoothDevice device = BluetoothFacade.getDevice(sHidProfile.getConnectedDevices(),
- deviceID);
- return sHidProfile.virtualUnplug(device);
- }
-
- @Rpc(description = "Test byte transfer.")
- public byte[] testByte() {
- byte[] bts = {0b01,0b10,0b11,0b100};
- return bts;
- }
-
- @Override
- public void shutdown() {
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothHspFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothHspFacade.java
deleted file mode 100644
index f4514cc..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothHspFacade.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.bluetooth;
-
-import java.util.List;
-
-import android.app.Service;
-import android.bluetooth.BluetoothHeadset;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothProfile;
-import android.bluetooth.BluetoothUuid;
-import android.os.ParcelUuid;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-public class BluetoothHspFacade extends RpcReceiver {
- static final ParcelUuid[] UUIDS = {
- BluetoothUuid.HSP, BluetoothUuid.Handsfree
- };
-
- private final Service mService;
- private final BluetoothAdapter mBluetoothAdapter;
-
- private static boolean sIsHspReady = false;
- private static BluetoothHeadset sHspProfile = null;
-
- public BluetoothHspFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
- mBluetoothAdapter.getProfileProxy(mService, new HspServiceListener(),
- BluetoothProfile.HEADSET);
- }
-
- class HspServiceListener implements BluetoothProfile.ServiceListener {
- @Override
- public void onServiceConnected(int profile, BluetoothProfile proxy) {
- sHspProfile = (BluetoothHeadset) proxy;
- sIsHspReady = true;
- }
-
- @Override
- public void onServiceDisconnected(int profile) {
- sIsHspReady = false;
- }
- }
-
- public Boolean hspConnect(BluetoothDevice device) {
- if (sHspProfile == null) return false;
- return sHspProfile.connect(device);
- }
-
- public Boolean hspDisconnect(BluetoothDevice device) {
- if (sHspProfile == null) return false;
- return sHspProfile.disconnect(device);
- }
-
- @Rpc(description = "Is Hsp profile ready.")
- public Boolean bluetoothHspIsReady() {
- return sIsHspReady;
- }
-
- @Rpc(description = "Connect to an HSP device.")
- public Boolean bluetoothHspConnect(
- @RpcParameter(name = "device", description = "Name or MAC address of a bluetooth device.")
- String device)
- throws Exception {
- if (sHspProfile == null)
- return false;
- BluetoothDevice mDevice = BluetoothFacade.getDevice(BluetoothFacade.DiscoveredDevices, device);
- Log.d("Connecting to device " + mDevice.getAliasName());
- return hspConnect(mDevice);
- }
-
- @Rpc(description = "Disconnect an HSP device.")
- public Boolean bluetoothHspDisconnect(
- @RpcParameter(name = "device", description = "Name or MAC address of a device.")
- String device)
- throws Exception {
- if (sHspProfile == null)
- return false;
- Log.d("Connected devices: " + sHspProfile.getConnectedDevices());
- BluetoothDevice mDevice = BluetoothFacade.getDevice(sHspProfile.getConnectedDevices(),
- device);
- return hspDisconnect(mDevice);
- }
-
- @Rpc(description = "Get all the devices connected through HSP.")
- public List<BluetoothDevice> bluetoothHspGetConnectedDevices() {
- while (!sIsHspReady);
- return sHspProfile.getConnectedDevices();
- }
-
- @Rpc(description = "Get the connection status of a device.")
- public Integer bluetoothHspGetConnectionStatus(
- @RpcParameter(name = "deviceID",
- description = "Name or MAC address of a bluetooth device.")
- String deviceID) {
- if (sHspProfile == null) {
- return BluetoothProfile.STATE_DISCONNECTED;
- }
- List<BluetoothDevice> deviceList = sHspProfile.getConnectedDevices();
- BluetoothDevice device;
- try {
- device = BluetoothFacade.getDevice(deviceList, deviceID);
- } catch (Exception e) {
- return BluetoothProfile.STATE_DISCONNECTED;
- }
- return sHspProfile.getConnectionState(device);
- }
-
- @Override
- public void shutdown() {
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothLeAdvertiseFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothLeAdvertiseFacade.java
deleted file mode 100644
index 3537c9a..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothLeAdvertiseFacade.java
+++ /dev/null
@@ -1,605 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.bluetooth;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.concurrent.Callable;
-
-import android.app.Service;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.le.AdvertiseCallback;
-import android.bluetooth.le.AdvertiseData;
-import android.bluetooth.le.AdvertiseData.Builder;
-import android.bluetooth.le.AdvertiseSettings;
-import android.bluetooth.le.BluetoothLeAdvertiser;
-import android.os.Bundle;
-import android.os.ParcelUuid;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.MainThread;
-import com.googlecode.android_scripting.facade.EventFacade;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-import com.googlecode.android_scripting.ConvertUtils;
-
-/**
- * BluetoothLe Advertise functions.
- */
-
-public class BluetoothLeAdvertiseFacade extends RpcReceiver {
-
- private final EventFacade mEventFacade;
- private BluetoothAdapter mBluetoothAdapter;
- private static int BleAdvertiseCallbackCount;
- private static int BleAdvertiseSettingsCount;
- private static int BleAdvertiseDataCount;
- private final HashMap<Integer, myAdvertiseCallback> mAdvertiseCallbackList;
- private final BluetoothLeAdvertiser mAdvertise;
- private final Service mService;
- private Builder mAdvertiseDataBuilder;
- private android.bluetooth.le.AdvertiseSettings.Builder mAdvertiseSettingsBuilder;
- private final HashMap<Integer, AdvertiseData> mAdvertiseDataList;
- private final HashMap<Integer, AdvertiseSettings> mAdvertiseSettingsList;
-
- public BluetoothLeAdvertiseFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mBluetoothAdapter = MainThread.run(mService,
- new Callable<BluetoothAdapter>() {
- @Override
- public BluetoothAdapter call() throws Exception {
- return BluetoothAdapter.getDefaultAdapter();
- }
- });
- mEventFacade = manager.getReceiver(EventFacade.class);
- mAdvertiseCallbackList = new HashMap<Integer, myAdvertiseCallback>();
- mAdvertise = mBluetoothAdapter.getBluetoothLeAdvertiser();
- mAdvertiseDataList = new HashMap<Integer, AdvertiseData>();
- mAdvertiseSettingsList = new HashMap<Integer, AdvertiseSettings>();
- mAdvertiseDataBuilder = new Builder();
- mAdvertiseSettingsBuilder = new android.bluetooth.le.AdvertiseSettings.Builder();
- }
-
- /**
- * Constructs a myAdvertiseCallback obj and returns its index
- *
- * @return myAdvertiseCallback.index
- */
- @Rpc(description = "Generate a new myAdvertisement Object")
- public Integer bleGenBleAdvertiseCallback() {
- BleAdvertiseCallbackCount += 1;
- int index = BleAdvertiseCallbackCount;
- myAdvertiseCallback mCallback = new myAdvertiseCallback(index);
- mAdvertiseCallbackList.put(mCallback.index,
- mCallback);
- return mCallback.index;
- }
-
- /**
- * Constructs a AdvertiseData obj and returns its index
- *
- * @return index
- */
- @Rpc(description = "Constructs a new Builder obj for AdvertiseData and returns its index")
- public Integer bleBuildAdvertiseData() {
- BleAdvertiseDataCount += 1;
- int index = BleAdvertiseDataCount;
- mAdvertiseDataList.put(index,
- mAdvertiseDataBuilder.build());
- mAdvertiseDataBuilder = new Builder();
- return index;
- }
-
- /**
- * Constructs a Advertise Settings obj and returns its index
- *
- * @return index
- */
- @Rpc(description = "Constructs a new Builder obj for AdvertiseData and returns its index")
- public Integer bleBuildAdvertiseSettings() {
- BleAdvertiseSettingsCount += 1;
- int index = BleAdvertiseSettingsCount;
- mAdvertiseSettingsList.put(index,
- mAdvertiseSettingsBuilder.build());
- mAdvertiseSettingsBuilder = new android.bluetooth.le.AdvertiseSettings.Builder();
- return index;
- }
-
- /**
- * Stops a ble advertisement
- *
- * @param index the id of the advertisement to stop advertising on
- * @throws Exception
- */
- @Rpc(description = "Stops an ongoing ble advertisement")
- public void bleStopBleAdvertising(
- @RpcParameter(name = "index")
- Integer index) throws Exception {
- if (mAdvertiseCallbackList.get(index) != null) {
- Log.d("bluetooth_le mAdvertise " + index);
- mAdvertise.stopAdvertising(mAdvertiseCallbackList
- .get(index));
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
- }
- }
-
- /**
- * Starts ble advertising
- *
- * @param callbackIndex The advertisementCallback index
- * @param dataIndex the AdvertiseData index
- * @param settingsIndex the advertisementsettings index
- * @throws Exception
- */
- @Rpc(description = "Starts ble advertisement")
- public void bleStartBleAdvertising(
- @RpcParameter(name = "callbackIndex")
- Integer callbackIndex,
- @RpcParameter(name = "dataIndex")
- Integer dataIndex,
- @RpcParameter(name = "settingsIndex")
- Integer settingsIndex
- ) throws Exception {
- AdvertiseData mData = new AdvertiseData.Builder().build();
- AdvertiseSettings mSettings = new AdvertiseSettings.Builder().build();
- if (mAdvertiseDataList.get(dataIndex) != null) {
- mData = mAdvertiseDataList.get(dataIndex);
- } else {
- throw new Exception("Invalid dataIndex input:" + Integer.toString(dataIndex));
- }
- if (mAdvertiseSettingsList.get(settingsIndex) != null) {
- mSettings = mAdvertiseSettingsList.get(settingsIndex);
- } else {
- throw new Exception("Invalid settingsIndex input:" + Integer.toString(settingsIndex));
- }
- if (mAdvertiseCallbackList.get(callbackIndex) != null) {
- Log.d("bluetooth_le starting a background advertisement on callback index: "
- + Integer.toString(callbackIndex));
- mAdvertise
- .startAdvertising(mSettings, mData, mAdvertiseCallbackList.get(callbackIndex));
- } else {
- throw new Exception("Invalid callbackIndex input" + Integer.toString(callbackIndex));
- }
- }
-
- /**
- * Starts ble advertising with a scanResponse. ScanResponses are created in the same way
- * AdvertiseData is created since they share the same object type.
- *
- * @param callbackIndex The advertisementCallback index
- * @param dataIndex the AdvertiseData index
- * @param settingsIndex the advertisementsettings index
- * @param scanResponseIndex the scanResponse index
- * @throws Exception
- */
- @Rpc(description = "Starts ble advertisement")
- public void bleStartBleAdvertisingWithScanResponse(
- @RpcParameter(name = "callbackIndex")
- Integer callbackIndex,
- @RpcParameter(name = "dataIndex")
- Integer dataIndex,
- @RpcParameter(name = "settingsIndex")
- Integer settingsIndex,
- @RpcParameter(name = "scanResponseIndex")
- Integer scanResponseIndex
- ) throws Exception {
- AdvertiseData mData = new AdvertiseData.Builder().build();
- AdvertiseSettings mSettings = new AdvertiseSettings.Builder().build();
- AdvertiseData mScanResponse = new AdvertiseData.Builder().build();
-
- if (mAdvertiseDataList.get(dataIndex) != null) {
- mData = mAdvertiseDataList.get(dataIndex);
- } else {
- throw new Exception("Invalid dataIndex input:" + Integer.toString(dataIndex));
- }
- if (mAdvertiseSettingsList.get(settingsIndex) != null) {
- mSettings = mAdvertiseSettingsList.get(settingsIndex);
- } else {
- throw new Exception("Invalid settingsIndex input:" + Integer.toString(settingsIndex));
- }
- if (mAdvertiseDataList.get(scanResponseIndex) != null) {
- mScanResponse = mAdvertiseDataList.get(scanResponseIndex);
- } else {
- throw new Exception("Invalid scanResponseIndex input:"
- + Integer.toString(settingsIndex));
- }
- if (mAdvertiseCallbackList.get(callbackIndex) != null) {
- Log.d("bluetooth_le starting a background advertise on callback index: "
- + Integer.toString(callbackIndex));
- mAdvertise
- .startAdvertising(mSettings, mData, mScanResponse,
- mAdvertiseCallbackList.get(callbackIndex));
- } else {
- throw new Exception("Invalid callbackIndex input" + Integer.toString(callbackIndex));
- }
- }
-
- /**
- * Get ble advertisement settings mode
- *
- * @param index the advertise settings object to use
- * @return the mode of the advertise settings object
- * @throws Exception
- */
- @Rpc(description = "Get ble advertisement settings mode")
- public int bleGetAdvertiseSettingsMode(
- @RpcParameter(name = "index")
- Integer index) throws Exception {
- if (mAdvertiseSettingsList.get(index) != null) {
- AdvertiseSettings mSettings = mAdvertiseSettingsList.get(index);
- return mSettings.getMode();
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
- }
- }
-
- /**
- * Get ble advertisement settings tx power level
- *
- * @param index the advertise settings object to use
- * @return the tx power level of the advertise settings object
- * @throws Exception
- */
- @Rpc(description = "Get ble advertisement settings tx power level")
- public int bleGetAdvertiseSettingsTxPowerLevel(
- @RpcParameter(name = "index")
- Integer index) throws Exception {
- if (mAdvertiseSettingsList.get(index) != null) {
- AdvertiseSettings mSettings = mAdvertiseSettingsList.get(index);
- return mSettings.getTxPowerLevel();
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
- }
- }
-
- /**
- * Get ble advertisement settings isConnectable value
- *
- * @param index the advertise settings object to use
- * @return the boolean value whether the advertisement will indicate
- * connectable.
- * @throws Exception
- */
- @Rpc(description = "Get ble advertisement settings isConnectable value")
- public boolean bleGetAdvertiseSettingsIsConnectable(
- @RpcParameter(name = "index")
- Integer index) throws Exception {
- if (mAdvertiseSettingsList.get(index) != null) {
- AdvertiseSettings mSettings = mAdvertiseSettingsList.get(index);
- return mSettings.isConnectable();
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
- }
- }
-
- /**
- * Get ble advertisement data include tx power level
- *
- * @param index the advertise data object to use
- * @return True if include tx power level, false otherwise
- * @throws Exception
- */
- @Rpc(description = "Get ble advertisement data include tx power level")
- public Boolean bleGetAdvertiseDataIncludeTxPowerLevel(
- @RpcParameter(name = "index")
- Integer index) throws Exception {
- if (mAdvertiseDataList.get(index) != null) {
- AdvertiseData mData = mAdvertiseDataList.get(index);
- return mData.getIncludeTxPowerLevel();
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
- }
- }
-
- /**
- * Get ble advertisement data manufacturer specific data
- *
- * @param index the advertise data object to use
- * @param manufacturerId the id that corresponds to the manufacturer specific data.
- * @return the corresponding manufacturer specific data to the manufacturer id.
- * @throws Exception
- */
- @Rpc(description = "Get ble advertisement data manufacturer specific data")
- public String bleGetAdvertiseDataManufacturerSpecificData(
- @RpcParameter(name = "index")
- Integer index,
- @RpcParameter(name = "manufacturerId")
- Integer manufacturerId) throws Exception {
- if (mAdvertiseDataList.get(index) != null) {
- AdvertiseData mData = mAdvertiseDataList.get(index);
- if (mData.getManufacturerSpecificData() != null) {
- return ConvertUtils.convertByteArrayToString(mData.getManufacturerSpecificData().get(manufacturerId));
- } else {
- throw new Exception("Invalid manufacturerId input:" + Integer.toString(manufacturerId));
- }
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
-
- }
- }
-
- /**
- * Get ble advertisement data include device name
- *
- * @param index the advertise data object to use
- * @return the advertisement data's include device name
- * @throws Exception
- */
- @Rpc(description = "Get ble advertisement include device name")
- public Boolean bleGetAdvertiseDataIncludeDeviceName(
- @RpcParameter(name = "index")
- Integer index) throws Exception {
- if (mAdvertiseDataList.get(index) != null) {
- AdvertiseData mData = mAdvertiseDataList.get(index);
- return mData.getIncludeDeviceName();
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
- }
- }
-
- /**
- * Get ble advertisement Service Data
- *
- * @param index the advertise data object to use
- * @param serviceUuid the uuid corresponding to the service data.
- * @return the advertisement data's service data
- * @throws Exception
- */
- @Rpc(description = "Get ble advertisement Service Data")
- public String bleGetAdvertiseDataServiceData(
- @RpcParameter(name = "index")
- Integer index,
- @RpcParameter(name = "serviceUuid")
- String serviceUuid) throws Exception {
- ParcelUuid uuidKey = ParcelUuid.fromString(serviceUuid);
- if (mAdvertiseDataList.get(index) != null) {
- AdvertiseData mData = mAdvertiseDataList.get(index);
- if (mData.getServiceData().containsKey(uuidKey)) {
- return ConvertUtils.convertByteArrayToString(mData.getServiceData().get(uuidKey));
- } else {
- throw new Exception("Invalid serviceUuid input:" + serviceUuid);
- }
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
- }
- }
-
- /**
- * Get ble advertisement Service Uuids
- *
- * @param index the advertise data object to use
- * @return the advertisement data's Service Uuids
- * @throws Exception
- */
- @Rpc(description = "Get ble advertisement Service Uuids")
- public List<ParcelUuid> bleGetAdvertiseDataServiceUuids(
- @RpcParameter(name = "index")
- Integer index) throws Exception {
- if (mAdvertiseDataList.get(index) != null) {
- AdvertiseData mData = mAdvertiseDataList.get(index);
- return mData.getServiceUuids();
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
- }
- }
-
- /**
- * Set ble advertisement data service uuids
- *
- * @param uuidList
- * @throws Exception
- */
- @Rpc(description = "Set ble advertisement data service uuids")
- public void bleSetAdvertiseDataSetServiceUuids(
- @RpcParameter(name = "uuidList")
- String[] uuidList
- ) {
- for (String uuid : uuidList) {
- mAdvertiseDataBuilder.addServiceUuid(ParcelUuid.fromString(uuid));
- }
- }
-
- /**
- * Set ble advertise data service uuids
- *
- * @param serviceDataUuid
- * @param serviceData
- * @throws Exception
- */
- @Rpc(description = "Set ble advertise data service uuids")
- public void bleAddAdvertiseDataServiceData(
- @RpcParameter(name = "serviceDataUuid")
- String serviceDataUuid,
- @RpcParameter(name = "serviceData")
- String serviceData
- ) {
- mAdvertiseDataBuilder.addServiceData(
- ParcelUuid.fromString(serviceDataUuid),
- ConvertUtils.convertStringToByteArray(serviceData));
- }
-
- /**
- * Set ble advertise data manufacturer id
- *
- * @param manufacturerId the manufacturer id to set
- * @param manufacturerSpecificData the manufacturer specific data to set
- * @throws Exception
- */
- @Rpc(description = "Set ble advertise data manufacturerId")
- public void bleAddAdvertiseDataManufacturerId(
- @RpcParameter(name = "manufacturerId")
- Integer manufacturerId,
- @RpcParameter(name = "manufacturerSpecificData")
- String manufacturerSpecificData
- ) {
- mAdvertiseDataBuilder.addManufacturerData(manufacturerId,
- ConvertUtils.convertStringToByteArray(manufacturerSpecificData));
- }
-
- /**
- * Set ble advertise settings advertise mode
- *
- * @param advertiseMode
- * @throws Exception
- */
- @Rpc(description = "Set ble advertise settings advertise mode")
- public void bleSetAdvertiseSettingsAdvertiseMode(
- @RpcParameter(name = "advertiseMode")
- Integer advertiseMode
- ) {
- mAdvertiseSettingsBuilder.setAdvertiseMode(advertiseMode);
- }
-
- /**
- * Set ble advertise settings tx power level
- *
- * @param txPowerLevel the tx power level to set
- * @throws Exception
- */
- @Rpc(description = "Set ble advertise settings tx power level")
- public void bleSetAdvertiseSettingsTxPowerLevel(
- @RpcParameter(name = "txPowerLevel")
- Integer txPowerLevel
- ) {
- mAdvertiseSettingsBuilder.setTxPowerLevel(txPowerLevel);
- }
-
- /**
- * Set ble advertise settings the isConnectable value
- *
- * @param type the isConnectable value
- * @throws Exception
- */
- @Rpc(description = "Set ble advertise settings isConnectable value")
- public void bleSetAdvertiseSettingsIsConnectable(
- @RpcParameter(name = "value")
- Boolean value
- ) {
- mAdvertiseSettingsBuilder.setConnectable(value);
- }
-
- /**
- * Set ble advertisement data include tx power level
- *
- * @param includeTxPowerLevel boolean whether to include the tx power level or not in the
- * advertisement
- */
- @Rpc(description = "Set ble advertisement data include tx power level")
- public void bleSetAdvertiseDataIncludeTxPowerLevel(
- @RpcParameter(name = "includeTxPowerLevel")
- Boolean includeTxPowerLevel
- ) {
- mAdvertiseDataBuilder.setIncludeTxPowerLevel(includeTxPowerLevel);
- }
-
- /**
- * Set ble advertisement settings set timeout
- *
- * @param timeoutSeconds Limit advertising to a given amount of time.
- */
- @Rpc(description = "Set ble advertisement data include tx power level")
- public void bleSetAdvertiseSettingsTimeout(
- @RpcParameter(name = "timeoutSeconds")
- Integer timeoutSeconds
- ) {
- mAdvertiseSettingsBuilder.setTimeout(timeoutSeconds);
- }
-
- /**
- * Set ble advertisement data include device name
- *
- * @param includeDeviceName boolean whether to include device name or not in the
- * advertisement
- */
- @Rpc(description = "Set ble advertisement data include device name")
- public void bleSetAdvertiseDataIncludeDeviceName(
- @RpcParameter(name = "includeDeviceName")
- Boolean includeDeviceName
- ) {
- mAdvertiseDataBuilder.setIncludeDeviceName(includeDeviceName);
- }
-
- private class myAdvertiseCallback extends AdvertiseCallback {
- public Integer index;
- private final Bundle mResults;
- String mEventType;
-
- public myAdvertiseCallback(int idx) {
- index = idx;
- mEventType = "BleAdvertise";
- mResults = new Bundle();
- }
-
- @Override
- public void onStartSuccess(AdvertiseSettings settingsInEffect) {
- Log.d("bluetooth_le_advertisement onSuccess " + mEventType + " "
- + index);
- mResults.putString("Type", "onSuccess");
- mResults.putParcelable("SettingsInEffect", settingsInEffect);
- mEventFacade.postEvent(mEventType + index + "onSuccess", mResults.clone());
- mResults.clear();
- }
-
- @Override
- public void onStartFailure(int errorCode) {
- String errorString = "UNKNOWN_ERROR_CODE";
- if (errorCode == AdvertiseCallback.ADVERTISE_FAILED_ALREADY_STARTED) {
- errorString = "ADVERTISE_FAILED_ALREADY_STARTED";
- } else if (errorCode == AdvertiseCallback.ADVERTISE_FAILED_DATA_TOO_LARGE) {
- errorString = "ADVERTISE_FAILED_DATA_TOO_LARGE";
- } else if (errorCode == AdvertiseCallback.ADVERTISE_FAILED_FEATURE_UNSUPPORTED) {
- errorString = "ADVERTISE_FAILED_FEATURE_UNSUPPORTED";
- } else if (errorCode == AdvertiseCallback.ADVERTISE_FAILED_INTERNAL_ERROR) {
- errorString = "ADVERTISE_FAILED_INTERNAL_ERROR";
- } else if (errorCode == AdvertiseCallback.ADVERTISE_FAILED_TOO_MANY_ADVERTISERS) {
- errorString = "ADVERTISE_FAILED_TOO_MANY_ADVERTISERS";
- }
- Log.d("bluetooth_le_advertisement onFailure " + mEventType + " "
- + index + " error " + errorString);
- mResults.putString("Type", "onFailure");
- mResults.putInt("ErrorCode", errorCode);
- mResults.putString("Error", errorString);
- mEventFacade.postEvent(mEventType + index + "onFailure",
- mResults.clone());
- mResults.clear();
- }
- }
-
- @Override
- public void shutdown() {
- if (mBluetoothAdapter.getState() == BluetoothAdapter.STATE_ON) {
- for (myAdvertiseCallback mAdvertise : mAdvertiseCallbackList
- .values()) {
- if (mAdvertise != null) {
- try{
- mBluetoothAdapter.getBluetoothLeAdvertiser()
- .stopAdvertising(mAdvertise);
- } catch (NullPointerException e) {
- Log.e("Failed to stop ble advertising.", e);
- }
- }
- }
- }
- mAdvertiseCallbackList.clear();
- mAdvertiseSettingsList.clear();
- mAdvertiseDataList.clear();
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothLeScanFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothLeScanFacade.java
deleted file mode 100644
index 7ae78a2..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothLeScanFacade.java
+++ /dev/null
@@ -1,924 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.bluetooth;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.UUID;
-import java.util.concurrent.Callable;
-
-import android.app.Service;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.le.BluetoothLeScanner;
-import android.bluetooth.le.ScanCallback;
-import android.bluetooth.le.ScanFilter;
-import android.bluetooth.BluetoothAdapter.LeScanCallback;
-import android.bluetooth.le.ScanFilter.Builder;
-import android.bluetooth.le.ScanResult;
-import android.bluetooth.le.ScanSettings;
-import android.os.Bundle;
-import android.os.ParcelUuid;
-
-import com.googlecode.android_scripting.ConvertUtils;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.MainThread;
-import com.googlecode.android_scripting.facade.EventFacade;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcOptional;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-/**
- * BluetoothLe Scan functions.
- */
-
-public class BluetoothLeScanFacade extends RpcReceiver {
-
- private final EventFacade mEventFacade;
-
- private BluetoothAdapter mBluetoothAdapter;
- private static int ScanCallbackCount;
- private static int FilterListCount;
- private static int LeScanCallbackCount;
- private static int ScanSettingsCount;
- private final Service mService;
- private final BluetoothLeScanner mScanner;
- private android.bluetooth.le.ScanSettings.Builder mScanSettingsBuilder;
- private Builder mScanFilterBuilder;
- private final HashMap<Integer, myScanCallback> mScanCallbackList;
- private final HashMap<Integer, myLeScanCallback> mLeScanCallbackList;
- private final HashMap<Integer, ArrayList<ScanFilter>> mScanFilterList;
- private final HashMap<Integer, ScanSettings> mScanSettingsList;
-
- public BluetoothLeScanFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mBluetoothAdapter = MainThread.run(mService,
- new Callable<BluetoothAdapter>() {
- @Override
- public BluetoothAdapter call() throws Exception {
- return BluetoothAdapter.getDefaultAdapter();
- }
- });
- mScanner = mBluetoothAdapter.getBluetoothLeScanner();
- mEventFacade = manager.getReceiver(EventFacade.class);
- mScanFilterList = new HashMap<Integer, ArrayList<ScanFilter>>();
- mLeScanCallbackList = new HashMap<Integer, myLeScanCallback>();
- mScanSettingsList = new HashMap<Integer, ScanSettings>();
- mScanCallbackList = new HashMap<Integer, myScanCallback>();
- mScanFilterBuilder = new Builder();
- mScanSettingsBuilder = new android.bluetooth.le.ScanSettings.Builder();
- }
-
- /**
- * Constructs a myScanCallback obj and returns its index
- *
- * @return Integer myScanCallback.index
- */
- @Rpc(description = "Generate a new myScanCallback Object")
- public Integer bleGenScanCallback() {
- ScanCallbackCount += 1;
- int index = ScanCallbackCount;
- myScanCallback mScan = new myScanCallback(index);
- mScanCallbackList.put(mScan.index, mScan);
- return mScan.index;
- }
-
- /**
- * Constructs a myLeScanCallback obj and returns its index
- *
- * @return Integer myScanCallback.index
- */
- @Rpc(description = "Generate a new myScanCallback Object")
- public Integer bleGenLeScanCallback() {
- LeScanCallbackCount += 1;
- int index = LeScanCallbackCount;
- myLeScanCallback mScan = new myLeScanCallback(index);
- mLeScanCallbackList.put(mScan.index, mScan);
- return mScan.index;
- }
-
- /**
- * Constructs a new filter list array and returns its index
- *
- * @return Integer index
- */
- @Rpc(description = "Generate a new Filter list")
- public Integer bleGenFilterList() {
- FilterListCount += 1;
- int index = FilterListCount;
- mScanFilterList.put(index, new ArrayList<ScanFilter>());
- return index;
- }
-
- /**
- * Constructs a new filter list array and returns its index
- *
- * @return Integer index
- */
- @Rpc(description = "Generate a new Filter list")
- public Integer bleBuildScanFilter(
- @RpcParameter(name = "filterIndex")
- Integer filterIndex
- ) {
- mScanFilterList.get(filterIndex).add(mScanFilterBuilder.build());
- mScanFilterBuilder = new Builder();
- return mScanFilterList.get(filterIndex).size()-1;
- }
-
- /**
- * Constructs a new scan setting and returns its index
- *
- * @return Integer index
- */
- @Rpc(description = "Generate a new scan settings Object")
- public Integer bleBuildScanSetting() {
- ScanSettingsCount += 1;
- int index = ScanSettingsCount;
- mScanSettingsList.put(index, mScanSettingsBuilder.build());
- mScanSettingsBuilder = new android.bluetooth.le.ScanSettings.Builder();
- return index;
- }
-
- /**
- * Stops a ble scan
- *
- * @param index the id of the myScan whose ScanCallback to stop
- * @throws Exception
- */
- @Rpc(description = "Stops an ongoing ble advertisement scan")
- public void bleStopBleScan(
- @RpcParameter(name = "index")
- Integer index) throws Exception {
- Log.d("bluetooth_le_scan mScanCallback " + index);
- if (mScanCallbackList.get(index) != null) {
- myScanCallback mScanCallback = mScanCallbackList.get(index);
- mScanner.stopScan(mScanCallback);
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
- }
- }
-
- /**
- * Stops a classic ble scan
- *
- * @param index the id of the myScan whose LeScanCallback to stop
- * @throws Exception
- */
- @Rpc(description = "Stops an ongoing classic ble scan")
- public void bleStopClassicBleScan(
- @RpcParameter(name = "index")
- Integer index) throws Exception {
- Log.d("bluetooth_le_scan mLeScanCallback " + index);
- if (mLeScanCallbackList.get(index) != null) {
- myLeScanCallback mLeScanCallback = mLeScanCallbackList.get(index);
- mBluetoothAdapter.stopLeScan(mLeScanCallback);
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
- }
- }
-
- /**
- * Starts a ble scan
- *
- * @param index the id of the myScan whose ScanCallback to start
- * @throws Exception
- */
- @Rpc(description = "Starts a ble advertisement scan")
- public void bleStartBleScan(
- @RpcParameter(name = "filterListIndex")
- Integer filterListIndex,
- @RpcParameter(name = "scanSettingsIndex")
- Integer scanSettingsIndex,
- @RpcParameter(name = "callbackIndex")
- Integer callbackIndex
- ) throws Exception {
- Log.d("bluetooth_le_scan starting a background scan");
- ArrayList<ScanFilter> mScanFilters = new ArrayList<ScanFilter>();
- mScanFilters.add(new ScanFilter.Builder().build());
- ScanSettings mScanSettings = new ScanSettings.Builder().build();
- if (mScanFilterList.get(filterListIndex) != null) {
- mScanFilters = mScanFilterList.get(filterListIndex);
- } else {
- throw new Exception("Invalid filterListIndex input:"
- + Integer.toString(filterListIndex));
- }
- if (mScanSettingsList.get(scanSettingsIndex) != null) {
- mScanSettings = mScanSettingsList.get(scanSettingsIndex);
- } else if (!mScanSettingsList.isEmpty()) {
- throw new Exception("Invalid scanSettingsIndex input:"
- + Integer.toString(scanSettingsIndex));
- }
- if (mScanCallbackList.get(callbackIndex) != null) {
- mScanner.startScan(mScanFilters, mScanSettings, mScanCallbackList.get(callbackIndex));
- } else {
- throw new Exception("Invalid filterListIndex input:"
- + Integer.toString(filterListIndex));
- }
- }
-
- /**
- * Starts a classic ble scan
- *
- * @param index the id of the myScan whose ScanCallback to start
- * @throws Exception
- */
- @Rpc(description = "Starts a classic ble advertisement scan")
- public boolean bleStartClassicBleScan(
- @RpcParameter(name = "leCallbackIndex")
- Integer leCallbackIndex
- ) throws Exception {
- Log.d("bluetooth_le_scan starting a background scan");
- boolean result = false;
- if (mLeScanCallbackList.get(leCallbackIndex) != null) {
- result = mBluetoothAdapter.startLeScan(mLeScanCallbackList.get(leCallbackIndex));
- } else {
- throw new Exception("Invalid leCallbackIndex input:"
- + Integer.toString(leCallbackIndex));
- }
- return result;
- }
-
- /**
- * Starts a classic ble scan with service Uuids
- *
- * @param index the id of the myScan whose ScanCallback to start
- * @throws Exception
- */
- @Rpc(description = "Starts a classic ble advertisement scan with service Uuids")
- public boolean bleStartClassicBleScanWithServiceUuids(
- @RpcParameter(name = "leCallbackIndex")
- Integer leCallbackIndex,
- @RpcParameter(name = "serviceUuids")
- String[] serviceUuidList
- ) throws Exception {
- Log.d("bluetooth_le_scan starting a background scan");
- UUID[] serviceUuids = new UUID[serviceUuidList.length];
- for (int i = 0; i < serviceUuidList.length; i++) {
- serviceUuids[i] = UUID.fromString(serviceUuidList[i]);
- }
- boolean result = false;
- if (mLeScanCallbackList.get(leCallbackIndex) != null) {
- result = mBluetoothAdapter.startLeScan(serviceUuids,
- mLeScanCallbackList.get(leCallbackIndex));
- System.out.println(result);
- } else {
- throw new Exception("Invalid leCallbackIndex input:"
- + Integer.toString(leCallbackIndex));
- }
- System.out.println(result);
- return result;
- }
-
- /**
- * Trigger onBatchScanResults
- *
- * @throws Exception
- */
- @Rpc(description = "Gets the results of the ble ScanCallback")
- public void bleFlushPendingScanResults(
- @RpcParameter(name = "callbackIndex")
- Integer callbackIndex
- ) throws Exception {
- if (mScanCallbackList.get(callbackIndex) != null) {
- mBluetoothAdapter
- .getBluetoothLeScanner().flushPendingScanResults(
- mScanCallbackList.get(callbackIndex));
- } else {
- throw new Exception("Invalid callbackIndex input:"
- + Integer.toString(callbackIndex));
- }
- }
-
- /**
- * Set scanSettings for ble scan. Note: You have to set all variables at once.
- *
- * @param callbackType Bluetooth LE scan callback type
- * @param reportDelaySeconds Time of delay for reporting the scan result
- * @param scanMode Bluetooth LE scan mode.
- * @param scanResultType Bluetooth LE scan result type
- * @throws Exception
- */
-
- /**
- * Set the scan setting's callback type
- * @param callbackType Bluetooth LE scan callback type
- */
- @Rpc(description = "Set the scan setting's callback type")
- public void bleSetScanSettingsCallbackType(
- @RpcParameter(name = "callbackType")
- Integer callbackType) {
- mScanSettingsBuilder.setCallbackType(callbackType);
- }
-
- /**
- * Set the scan setting's report delay millis
- * @param reportDelayMillis Time of delay for reporting the scan result
- */
- @Rpc(description = "Set the scan setting's report delay millis")
- public void bleSetScanSettingsReportDelayMillis(
- @RpcParameter(name = "reportDelayMillis")
- Long reportDelayMillis) {
- mScanSettingsBuilder.setReportDelay(reportDelayMillis);
- }
-
- /**
- * Set the scan setting's scan mode
- * @param scanMode Bluetooth LE scan mode.
- */
- @Rpc(description = "Set the scan setting's scan mode")
- public void bleSetScanSettingsScanMode(
- @RpcParameter(name = "scanMode")
- Integer scanMode) {
- mScanSettingsBuilder.setScanMode(scanMode);
- }
-
- /**
- * Set the scan setting's scan result type
- * @param scanResultType Bluetooth LE scan result type
- */
- @Rpc(description = "Set the scan setting's scan result type")
- public void bleSetScanSettingsResultType(
- @RpcParameter(name = "scanResultType")
- Integer scanResultType) {
- mScanSettingsBuilder.setScanResultType(scanResultType);
- }
- /**
- * Get ScanSetting's callback type
- *
- * @param index the ScanSetting object to use
- * @return the ScanSetting's callback type
- * @throws Exception
- */
- @Rpc(description = "Get ScanSetting's callback type")
- public Integer bleGetScanSettingsCallbackType(
- @RpcParameter(name = "index")
- Integer index
- ) throws Exception {
- if (mScanSettingsList.get(index) != null) {
- ScanSettings mScanSettings = mScanSettingsList.get(index);
- return mScanSettings.getCallbackType();
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
- }
- }
-
- /**
- * Get ScanSetting's report delay in milli seconds
- *
- * @param index the ScanSetting object to useSystemClock
- * @return the ScanSetting's report delay in milliseconds
- * @throws Exception
- */
- @Rpc(description = "Get ScanSetting's report delay milliseconds")
- public Long bleGetScanSettingsReportDelayMillis(
- @RpcParameter(name = "index")
- Integer index) throws Exception {
- if (mScanSettingsList.get(index) != null) {
- ScanSettings mScanSettings = mScanSettingsList.get(index);
- return mScanSettings.getReportDelayMillis();
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
- }
- }
-
- /**
- * Get ScanSetting's scan mode
- *
- * @param index the ScanSetting object to use
- * @return the ScanSetting's scan mode
- * @throws Exception
- */
- @Rpc(description = "Get ScanSetting's scan mode")
- public Integer bleGetScanSettingsScanMode(
- @RpcParameter(name = "index")
- Integer index) throws Exception {
- if (mScanSettingsList.get(index) != null) {
- ScanSettings mScanSettings = mScanSettingsList.get(index);
- return mScanSettings.getScanMode();
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
- }
- }
-
- /**
- * Get ScanSetting's scan result type
- *
- * @param index the ScanSetting object to use
- * @return the ScanSetting's scan result type
- * @throws Exception
- */
- @Rpc(description = "Get ScanSetting's scan result type")
- public Integer bleGetScanSettingsScanResultType(
- @RpcParameter(name = "index")
- Integer index) throws Exception {
- if (mScanSettingsList.get(index) != null) {
- ScanSettings mScanSettings = mScanSettingsList.get(index);
- return mScanSettings.getScanResultType();
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
- }
- }
-
- /**
- * Get ScanFilter's Manufacturer Id
- *
- * @param index the ScanFilter object to use
- * @return the ScanFilter's manufacturer id
- * @throws Exception
- */
- @Rpc(description = "Get ScanFilter's Manufacturer Id")
- public Integer bleGetScanFilterManufacturerId(
- @RpcParameter(name = "index")
- Integer index,
- @RpcParameter(name = "filterIndex")
- Integer filterIndex)
- throws Exception {
- if (mScanFilterList.get(index) != null) {
- if (mScanFilterList.get(index).get(filterIndex) != null) {
- return mScanFilterList.get(index)
- .get(filterIndex).getManufacturerId();
- } else {
- throw new Exception("Invalid filterIndex input:" + Integer.toString(filterIndex));
- }
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
- }
- }
-
- /**
- * Get ScanFilter's device address
- *
- * @param index the ScanFilter object to use
- * @return the ScanFilter's device address
- * @throws Exception
- */
- @Rpc(description = "Get ScanFilter's device address")
- public String bleGetScanFilterDeviceAddress(
- @RpcParameter(name = "index")
- Integer index,
- @RpcParameter(name = "filterIndex")
- Integer filterIndex)
- throws Exception {
- if (mScanFilterList.get(index) != null) {
- if (mScanFilterList.get(index).get(filterIndex) != null) {
- return mScanFilterList.get(index).get(filterIndex).getDeviceAddress();
- } else {
- throw new Exception("Invalid filterIndex input:" + Integer.toString(filterIndex));
- }
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
- }
- }
-
- /**
- * Get ScanFilter's device name
- *
- * @param index the ScanFilter object to use
- * @return the ScanFilter's device name
- * @throws Exception
- */
- @Rpc(description = "Get ScanFilter's device name")
- public String bleGetScanFilterDeviceName(
- @RpcParameter(name = "index")
- Integer index,
- @RpcParameter(name = "filterIndex")
- Integer filterIndex)
- throws Exception {
- if (mScanFilterList.get(index) != null) {
- if (mScanFilterList.get(index).get(filterIndex) != null) {
- return mScanFilterList.get(index).get(filterIndex).getDeviceName();
- } else {
- throw new Exception("Invalid filterIndex input:" + Integer.toString(filterIndex));
- }
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
- }
- }
-
- /**
- * Get ScanFilter's manufacturer data
- *
- * @param index the ScanFilter object to use
- * @return the ScanFilter's manufacturer data
- * @throws Exception
- */
- @Rpc(description = "Get ScanFilter's manufacturer data")
- public String bleGetScanFilterManufacturerData(
- @RpcParameter(name = "index")
- Integer index,
- @RpcParameter(name = "filterIndex")
- Integer filterIndex)
- throws Exception {
- if (mScanFilterList.get(index) != null) {
- if (mScanFilterList.get(index).get(filterIndex) != null) {
- return ConvertUtils.convertByteArrayToString(mScanFilterList.get(index)
- .get(filterIndex).getManufacturerData());
- } else {
- throw new Exception("Invalid filterIndex input:" + Integer.toString(filterIndex));
- }
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
- }
- }
-
- /**
- * Get ScanFilter's manufacturer data mask
- *
- * @param index the ScanFilter object to use
- * @return the ScanFilter's manufacturer data mask
- * @throws Exception
- */
- @Rpc(description = "Get ScanFilter's manufacturer data mask")
- public String bleGetScanFilterManufacturerDataMask(
- @RpcParameter(name = "index")
- Integer index,
- @RpcParameter(name = "filterIndex")
- Integer filterIndex)
- throws Exception {
- if (mScanFilterList.get(index) != null) {
- if (mScanFilterList.get(index).get(filterIndex) != null) {
- return ConvertUtils.convertByteArrayToString(mScanFilterList.get(index)
- .get(filterIndex).getManufacturerDataMask());
- } else {
- throw new Exception("Invalid filterIndex input:" + Integer.toString(filterIndex));
- }
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
- }
- }
-
- /**
- * Get ScanFilter's service data
- *
- * @param index the ScanFilter object to use
- * @return the ScanFilter's service data
- * @throws Exception
- */
- @Rpc(description = "Get ScanFilter's service data")
- public String bleGetScanFilterServiceData(
- @RpcParameter(name = "index")
- Integer index,
- @RpcParameter(name = "filterIndex")
- Integer filterIndex)
- throws Exception {
- if (mScanFilterList.get(index) != null) {
- if (mScanFilterList.get(index).get(filterIndex) != null) {
- return ConvertUtils.convertByteArrayToString(mScanFilterList
- .get(index).get(filterIndex).getServiceData());
- } else {
- throw new Exception("Invalid filterIndex input:" + Integer.toString(filterIndex));
- }
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
- }
- }
-
- /**
- * Get ScanFilter's service data mask
- *
- * @param index the ScanFilter object to use
- * @return the ScanFilter's service data mask
- * @throws Exception
- */
- @Rpc(description = "Get ScanFilter's service data mask")
- public String bleGetScanFilterServiceDataMask(
- @RpcParameter(name = "index")
- Integer index,
- @RpcParameter(name = "filterIndex")
- Integer filterIndex)
- throws Exception {
- if (mScanFilterList.get(index) != null) {
- if (mScanFilterList.get(index).get(filterIndex) != null) {
- return ConvertUtils.convertByteArrayToString(mScanFilterList.get(index)
- .get(filterIndex).getServiceDataMask());
- } else {
- throw new Exception("Invalid filterIndex input:" + Integer.toString(filterIndex));
- }
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
- }
- }
-
- /**
- * Get ScanFilter's service uuid
- *
- * @param index the ScanFilter object to use
- * @return the ScanFilter's service uuid
- * @throws Exception
- */
- @Rpc(description = "Get ScanFilter's service uuid")
- public String bleGetScanFilterServiceUuid(
- @RpcParameter(name = "index")
- Integer index,
- @RpcParameter(name = "filterIndex")
- Integer filterIndex)
- throws Exception {
- if (mScanFilterList.get(index) != null) {
- if (mScanFilterList.get(index).get(filterIndex) != null) {
- if (mScanFilterList.get(index).get(filterIndex).getServiceUuid() != null) {
- return mScanFilterList.get(index).get(filterIndex).getServiceUuid().toString();
- } else {
- throw new Exception("No Service Uuid set for filter:"
- + Integer.toString(filterIndex));
- }
- } else {
- throw new Exception("Invalid filterIndex input:" + Integer.toString(filterIndex));
- }
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
- }
- }
-
- /**
- * Get ScanFilter's service uuid mask
- *
- * @param index the ScanFilter object to use
- * @return the ScanFilter's service uuid mask
- * @throws Exception
- */
- @Rpc(description = "Get ScanFilter's service uuid mask")
- public String bleGetScanFilterServiceUuidMask(
- @RpcParameter(name = "index")
- Integer index,
- @RpcParameter(name = "filterIndex")
- Integer filterIndex)
- throws Exception {
- if (mScanFilterList.get(index) != null) {
- if (mScanFilterList.get(index).get(filterIndex) != null) {
- if (mScanFilterList.get(index).get(filterIndex).getServiceUuidMask() != null) {
- return mScanFilterList.get(index).get(filterIndex).getServiceUuidMask()
- .toString();
- } else {
- throw new Exception("No Service Uuid Mask set for filter:"
- + Integer.toString(filterIndex));
- }
- } else {
- throw new Exception("Invalid filterIndex input:" + Integer.toString(filterIndex));
- }
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
- }
- }
-
- /**
- * Add filter "macAddress" to existing ScanFilter
- *
- * @param macAddress the macAddress to filter against
- * @throws Exception
- */
- @Rpc(description = "Add filter \"macAddress\" to existing ScanFilter")
- public void bleSetScanFilterDeviceAddress(
- @RpcParameter(name = "macAddress")
- String macAddress
- ) {
- mScanFilterBuilder.setDeviceAddress(macAddress);
- }
-
- /**
- * Add filter "manufacturereDataId and/or manufacturerData" to existing ScanFilter
- *
- * @param manufacturerDataId the manufacturer data id to filter against
- * @param manufacturerDataMask the manufacturere data mask to filter against
- * @throws Exception
- */
- @Rpc(description = "Add filter \"manufacturereDataId and/or manufacturerData\" to existing ScanFilter")
- public void bleSetScanFilterManufacturerData(
- @RpcParameter(name = "manufacturerDataId")
- Integer manufacturerDataId,
- @RpcParameter(name = "manufacturerData")
- String manufacturerData,
- @RpcParameter(name = "manufacturerDataMask")
- @RpcOptional
- String manufacturerDataMask
- ){
- if (manufacturerDataMask != null) {
- mScanFilterBuilder.setManufacturerData(manufacturerDataId,
- ConvertUtils.convertStringToByteArray(manufacturerData),
- ConvertUtils.convertStringToByteArray(manufacturerDataMask));
- } else {
- mScanFilterBuilder.setManufacturerData(manufacturerDataId,
- ConvertUtils.convertStringToByteArray(manufacturerData));
- }
- }
-
- /**
- * Add filter "serviceData and serviceDataMask" to existing ScanFilter
- *
- * @param serviceData the service data to filter against
- * @param serviceDataMask the servie data mask to filter against
- * @throws Exception
- */
- @Rpc(description = "Add filter \"serviceData and serviceDataMask\" to existing ScanFilter ")
- public void bleSetScanFilterServiceData(
- @RpcParameter(name = "serviceUuid")
- String serviceUuid,
- @RpcParameter(name = "serviceData")
- String serviceData,
- @RpcParameter(name = "serviceDataMask")
- @RpcOptional
- String serviceDataMask
- ) {
- if (serviceDataMask != null) {
- mScanFilterBuilder
- .setServiceData(
- ParcelUuid.fromString(serviceUuid),
- ConvertUtils.convertStringToByteArray(serviceData),
- ConvertUtils.convertStringToByteArray(
- serviceDataMask));
- } else {
- mScanFilterBuilder.setServiceData(ParcelUuid.fromString(serviceUuid),
- ConvertUtils.convertStringToByteArray(serviceData));
- }
- }
-
- /**
- * Add filter "serviceUuid and/or serviceMask" to existing ScanFilter
- *
- * @param serviceUuid the service uuid to filter against
- * @param serviceMask the service mask to filter against
- * @throws Exception
- */
- @Rpc(description = "Add filter \"serviceUuid and/or serviceMask\" to existing ScanFilter")
- public void bleSetScanFilterServiceUuid(
- @RpcParameter(name = "serviceUuid")
- String serviceUuid,
- @RpcParameter(name = "serviceMask")
- @RpcOptional
- String serviceMask
- ) {
- if (serviceMask != null) {
- mScanFilterBuilder
- .setServiceUuid(ParcelUuid.fromString(serviceUuid),
- ParcelUuid.fromString(serviceMask));
- } else {
- mScanFilterBuilder.setServiceUuid(ParcelUuid.fromString(serviceUuid));
- }
- }
-
- /**
- * Add filter "device name" to existing ScanFilter
- *
- * @param name the device name to filter against
- * @throws Exception
- */
- @Rpc(description = "Sets the scan filter's device name")
- public void bleSetScanFilterDeviceName(
- @RpcParameter(name = "name")
- String name
- ) {
- mScanFilterBuilder.setDeviceName(name);
- }
-
- @Rpc(description = "Set the scan setting's match mode")
- public void bleSetScanSettingsMatchMode(
- @RpcParameter(name = "mode") Integer mode) {
- mScanSettingsBuilder.setMatchMode(mode);
- }
-
- @Rpc(description = "Get the scan setting's match mode")
- public int bleGetScanSettingsMatchMode(
- @RpcParameter(name = "scanSettingsIndex") Integer scanSettingsIndex
- ) {
- return mScanSettingsList.get(scanSettingsIndex).getMatchMode();
- }
-
- @Rpc(description = "Set the scan setting's number of matches")
- public void bleSetScanSettingsNumOfMatches(
- @RpcParameter(name = "matches") Integer matches) {
- mScanSettingsBuilder.setNumOfMatches(matches);
- }
-
- @Rpc(description = "Get the scan setting's number of matches")
- public int bleGetScanSettingsNumberOfMatches(
- @RpcParameter(name = "scanSettingsIndex")
- Integer scanSettingsIndex) {
- return mScanSettingsList.get(scanSettingsIndex).getNumOfMatches();
- }
-
- private class myScanCallback extends ScanCallback {
- public Integer index;
- String mEventType;
- private final Bundle mResults;
-
- public myScanCallback(Integer idx) {
- index = idx;
- mEventType = "BleScan";
- mResults = new Bundle();
- }
-
- @Override
- public void onScanFailed(int errorCode) {
- String errorString = "UNKNOWN_ERROR_CODE";
- if (errorCode == ScanCallback.SCAN_FAILED_ALREADY_STARTED) {
- errorString = "SCAN_FAILED_ALREADY_STARTED";
- } else if (errorCode == ScanCallback.SCAN_FAILED_APPLICATION_REGISTRATION_FAILED) {
- errorString = "SCAN_FAILED_APPLICATION_REGISTRATION_FAILED";
- } else if (errorCode == ScanCallback.SCAN_FAILED_FEATURE_UNSUPPORTED) {
- errorString = "SCAN_FAILED_FEATURE_UNSUPPORTED";
- } else if (errorCode == ScanCallback.SCAN_FAILED_INTERNAL_ERROR) {
- errorString = "SCAN_FAILED_INTERNAL_ERROR";
- }
- Log.d("bluetooth_le_scan change onScanFailed " + mEventType + " " + index + " error "
- + errorString);
- mResults.putInt("ID", index);
- mResults.putString("Type", "onScanFailed");
- mResults.putInt("ErrorCode", errorCode);
- mResults.putString("Error", errorString);
- mEventFacade.postEvent(mEventType + index + "onScanFailed",
- mResults.clone());
- mResults.clear();
- }
-
- @Override
- public void onScanResult(int callbackType, ScanResult result) {
- Log.d("bluetooth_le_scan change onUpdate " + mEventType + " " + index);
- mResults.putInt("ID", index);
- mResults.putInt("CallbackType", callbackType);
- mResults.putString("Type", "onScanResult");
- mResults.putParcelable("Result", result);
- mEventFacade.postEvent(mEventType + index + "onScanResults", mResults.clone());
- mResults.clear();
- }
-
- @Override
- public void onBatchScanResults(List<ScanResult> results) {
- Log.d("reportResult " + mEventType + " " + index);
- mResults.putLong("Timestamp", System.currentTimeMillis() / 1000);
- mResults.putInt("ID", index);
- mResults.putString("Type", "onBatchScanResults");
- mResults.putParcelableList("Results", results);
- mEventFacade.postEvent(mEventType + index + "onBatchScanResult", mResults.clone());
- mResults.clear();
- }
- }
-
- private class myLeScanCallback implements LeScanCallback {
- public Integer index;
- String mEventType;
- private final Bundle mResults;
-
- public myLeScanCallback(Integer idx) {
- index = idx;
- mEventType = "ClassicBleScan";
- mResults = new Bundle();
- }
-
- @Override
- public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
- Log.d("bluetooth_classic_le_scan " + mEventType + " " + index);
- mResults.putParcelable("Device", device);
- mResults.putInt("Rssi", rssi);
- mResults.putString("ScanRecord", ConvertUtils.convertByteArrayToString(scanRecord));
- mResults.putString("Type", "onLeScan");
- mEventFacade.postEvent(mEventType + index + "onLeScan", mResults.clone());
- mResults.clear();
- }
- }
-
- @Override
- public void shutdown() {
- if (mBluetoothAdapter.getState() == BluetoothAdapter.STATE_ON) {
- for (myScanCallback mScanCallback : mScanCallbackList.values()) {
- if (mScanCallback != null) {
- try {
- mBluetoothAdapter.getBluetoothLeScanner()
- .stopScan(mScanCallback);
- } catch (NullPointerException e) {
- Log.e("Failed to stop ble scan callback.", e);
- }
- }
- }
- for (myLeScanCallback mLeScanCallback : mLeScanCallbackList.values()) {
- if (mLeScanCallback != null) {
- try {
- mBluetoothAdapter.stopLeScan(mLeScanCallback);
- } catch (NullPointerException e) {
- Log.e("Failed to stop classic ble scan callback.", e);
- }
- }
- }
- }
- mScanCallbackList.clear();
- mScanFilterList.clear();
- mScanSettingsList.clear();
- mLeScanCallbackList.clear();
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothMapFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothMapFacade.java
deleted file mode 100644
index f1a593d..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothMapFacade.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.bluetooth;
-
-import java.util.List;
-
-import android.app.Service;
-import android.bluetooth.BluetoothMap;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothProfile;
-import android.bluetooth.BluetoothUuid;
-import android.os.ParcelUuid;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-public class BluetoothMapFacade extends RpcReceiver {
- static final ParcelUuid[] MAP_UUIDS = {
- BluetoothUuid.MAP,
- BluetoothUuid.MNS,
- BluetoothUuid.MAS,
- };
- private final Service mService;
- private final BluetoothAdapter mBluetoothAdapter;
-
- private static boolean sIsMapReady = false;
- private static BluetoothMap sMapProfile = null;
-
- public BluetoothMapFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
- mBluetoothAdapter.getProfileProxy(mService, new MapServiceListener(),
- BluetoothProfile.MAP);
- }
-
- class MapServiceListener implements BluetoothProfile.ServiceListener {
- @Override
- public void onServiceConnected(int profile, BluetoothProfile proxy) {
- sMapProfile = (BluetoothMap) proxy;
- sIsMapReady = true;
- }
-
- @Override
- public void onServiceDisconnected(int profile) {
- sIsMapReady = false;
- }
- }
-
- public Boolean mapDisconnect(BluetoothDevice device) {
- if (sMapProfile.getPriority(device) > BluetoothProfile.PRIORITY_ON) {
- sMapProfile.setPriority(device, BluetoothProfile.PRIORITY_ON);
- }
- return sMapProfile.disconnect(device);
- }
-
- @Rpc(description = "Is Map profile ready.")
- public Boolean bluetoothMapIsReady() {
- return sIsMapReady;
- }
-
- @Rpc(description = "Disconnect an MAP device.")
- public Boolean bluetoothMapDisconnect(
- @RpcParameter(name = "deviceID", description = "Name or MAC address of a device.")
- String deviceID)
- throws Exception {
- if (sMapProfile == null) return false;
- List<BluetoothDevice> connectedMapDevices = sMapProfile.getConnectedDevices();
- Log.d("Connected map devices: " + connectedMapDevices);
- BluetoothDevice mDevice = BluetoothFacade.getDevice(connectedMapDevices, deviceID);
- if (!connectedMapDevices.isEmpty() && connectedMapDevices.get(0).equals(mDevice)) {
- if (sMapProfile.getPriority(mDevice) > BluetoothProfile.PRIORITY_ON) {
- sMapProfile.setPriority(mDevice, BluetoothProfile.PRIORITY_ON);
- }
- return sMapProfile.disconnect(mDevice);
- } else {
- return false;
- }
- }
-
- @Rpc(description = "Get all the devices connected through MAP.")
- public List<BluetoothDevice> bluetoothMapGetConnectedDevices() {
- while (!sIsMapReady);
- return sMapProfile.getDevicesMatchingConnectionStates(
- new int[] {BluetoothProfile.STATE_CONNECTED,
- BluetoothProfile.STATE_CONNECTING,
- BluetoothProfile.STATE_DISCONNECTING});
- }
-
- @Rpc(description = "Get the currently connected remote Bluetooth device (PCE).")
- public BluetoothDevice bluetoothMapGetClient() {
- if (sMapProfile == null) { return null; }
- return sMapProfile.getClient();
- }
-
- @Override
- public void shutdown() {
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothPairingHelper.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothPairingHelper.java
deleted file mode 100644
index dbefd70..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothPairingHelper.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.bluetooth;
-
-import android.bluetooth.BluetoothDevice;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-
-import com.googlecode.android_scripting.Log;
-
-public class BluetoothPairingHelper extends BroadcastReceiver {
- public BluetoothPairingHelper() {
- super();
- Log.d("Pairing helper created.");
- }
- /**
- * Blindly confirm bluetooth connection/bonding requests.
- */
- @Override
- public void onReceive(Context c, Intent intent) {
- String action = intent.getAction();
- Log.d("Bluetooth pairing intent received: " + action);
- BluetoothDevice mDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
- if(action.equals(BluetoothDevice.ACTION_PAIRING_REQUEST)) {
- int type = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, BluetoothDevice.ERROR);
- Log.d("Processing Action Paring Request with type " + type);
- if(type == BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION ||
- type == BluetoothDevice.PAIRING_VARIANT_CONSENT) {
- mDevice.setPairingConfirmation(true);
- Log.d("Connection confirmed");
- abortBroadcast(); // Abort the broadcast so Settings app doesn't get it.
- }
- }
- else if(action.equals(BluetoothDevice.ACTION_CONNECTION_ACCESS_REQUEST)) {
- int type = intent.getIntExtra(BluetoothDevice.EXTRA_ACCESS_REQUEST_TYPE, BluetoothDevice.ERROR);
- Log.d("Processing Action Connection Access Request type " + type);
- if(type == BluetoothDevice.REQUEST_TYPE_MESSAGE_ACCESS ||
- type == BluetoothDevice.REQUEST_TYPE_PHONEBOOK_ACCESS ||
- type == BluetoothDevice.REQUEST_TYPE_PROFILE_CONNECTION) {
- Intent newIntent = new Intent(BluetoothDevice.ACTION_CONNECTION_ACCESS_REPLY);
- String mReturnPackage = intent.getStringExtra(BluetoothDevice.EXTRA_PACKAGE_NAME);
- String mReturnClass = intent.getStringExtra(BluetoothDevice.EXTRA_CLASS_NAME);
- int mRequestType = intent.getIntExtra(BluetoothDevice.EXTRA_ACCESS_REQUEST_TYPE,
- BluetoothDevice.REQUEST_TYPE_MESSAGE_ACCESS);
- if (mReturnPackage != null && mReturnClass != null) {
- newIntent.setClassName(mReturnPackage, mReturnClass);
- }
- newIntent.putExtra(BluetoothDevice.EXTRA_CONNECTION_ACCESS_RESULT,
- BluetoothDevice.CONNECTION_ACCESS_YES);
- newIntent.putExtra(BluetoothDevice.EXTRA_ALWAYS_ALLOWED, true);
- newIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, mDevice);
- newIntent.putExtra(BluetoothDevice.EXTRA_ACCESS_REQUEST_TYPE, mRequestType);
- Log.d("Sending connection access acceptance intent.");
- abortBroadcast();
- c.sendBroadcast(newIntent, android.Manifest.permission.BLUETOOTH_ADMIN);
- }
- }
- }
-} \ No newline at end of file
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothRfcommFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothRfcommFacade.java
deleted file mode 100644
index 484fba5..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothRfcommFacade.java
+++ /dev/null
@@ -1,463 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.bluetooth;
-
-import android.app.Service;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothServerSocket;
-import android.bluetooth.BluetoothSocket;
-import android.content.IntentFilter;
-import android.os.ParcelFileDescriptor;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcDefault;
-import com.googlecode.android_scripting.rpc.RpcOptional;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.UUID;
-import java.lang.reflect.Field;
-
-import org.apache.commons.codec.binary.Base64Codec;
-
-/**
- * Bluetooth functions.
- *
- */
-// Discovery functions added by Eden Sayag
-
-public class BluetoothRfcommFacade extends RpcReceiver {
-
- // UUID for SL4A.
- private static final String DEFAULT_UUID = "457807c0-4897-11df-9879-0800200c9a66";
- private static final String SDP_NAME = "SL4A";
- private final Service mService;
- private final BluetoothPairingHelper mPairingReceiver;
- private final BluetoothAdapter mBluetoothAdapter;
- private Map<String, BluetoothConnection>
- connections = new HashMap<String, BluetoothConnection>();
-
- public BluetoothRfcommFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mPairingReceiver = new BluetoothPairingHelper();
- mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
- }
-
- private BluetoothConnection getConnection(String connID) throws IOException {
- BluetoothConnection conn = null;
- if (connID.trim().length() > 0) {
- conn = connections.get(connID);
- } else if (connections.size() == 1) {
- conn = (BluetoothConnection) connections.values().toArray()[0];
- }
- if (conn == null) {
- throw new IOException("Bluetooth not ready for this connID.");
- }
- return conn;
- }
-
- private String addConnection(BluetoothConnection conn) {
- String uuid = UUID.randomUUID().toString();
- connections.put(uuid, conn);
- conn.setUUID(uuid);
- return uuid;
- }
-
- @Rpc(description = "Connect to a device over Bluetooth. "
- + "Blocks until the connection is established or fails.",
- returns = "True if the connection was established successfully.")
- public String bluetoothRfcommConnect(
- @RpcParameter(name = "address", description = "The mac address of the device to connect to.")
- String address,
- @RpcParameter(name = "uuid",
- description = "The UUID passed here must match the UUID used by the server device.")
- @RpcDefault(DEFAULT_UUID)
- String uuid)
- throws IOException {
- BluetoothDevice mDevice;
- BluetoothSocket mSocket;
- BluetoothConnection conn;
- mDevice = mBluetoothAdapter.getRemoteDevice(address);
- mSocket = mDevice.createRfcommSocketToServiceRecord(UUID.fromString(uuid));
-
- // Register a broadcast receiver to bypass manual confirmation
- IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_PAIRING_REQUEST);
- mService.registerReceiver(mPairingReceiver, filter);
-
- // Always cancel discovery because it will slow down a connection.
- mBluetoothAdapter.cancelDiscovery();
- mSocket.connect();
- conn = new BluetoothConnection(mSocket);
-
- mService.unregisterReceiver(mPairingReceiver);
- return addConnection(conn);
- }
-
- @Rpc(description = "Returns active Bluetooth connections.")
- public Map<String, String> bluetoothRfcommActiveConnections() {
- Map<String, String> out = new HashMap<String, String>();
- for (Map.Entry<String, BluetoothConnection> entry : connections.entrySet()) {
- if (entry.getValue().isConnected()) {
- out.put(entry.getKey(), entry.getValue().getRemoteBluetoothAddress());
- }
- }
- return out;
- }
-
- @Rpc(description = "Returns the name of the connected device.")
- public String bluetoothRfcommGetConnectedDeviceName(
- @RpcParameter(name = "connID", description = "Connection id")
- @RpcOptional @RpcDefault("")
- String connID)
- throws IOException {
- BluetoothConnection conn = getConnection(connID);
- return conn.getConnectedDeviceName();
- }
-
- @Rpc(description = "Listens for and accepts a Bluetooth connection."
- + "Blocks until the connection is established or fails.")
- public String bluetoothRfcommAccept(
- @RpcParameter(name = "uuid") @RpcDefault(DEFAULT_UUID) String uuid,
- @RpcParameter(name = "timeout",
- description = "How long to wait for a new connection, 0 is wait for ever")
- @RpcDefault("0") Integer timeout)
- throws IOException {
- Log.d("Accept bluetooth connection");
- BluetoothServerSocket mServerSocket;
- mServerSocket =
- mBluetoothAdapter.listenUsingRfcommWithServiceRecord(SDP_NAME, UUID.fromString(uuid));
- // Register a broadcast receiver to bypass manual confirmation
- IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_PAIRING_REQUEST);
- mService.registerReceiver(mPairingReceiver, filter);
-
- BluetoothSocket mSocket = mServerSocket.accept(timeout.intValue());
- BluetoothConnection conn = new BluetoothConnection(mSocket, mServerSocket);
- mService.unregisterReceiver(mPairingReceiver);
- return addConnection(conn);
- }
-
- @Rpc(description = "Sends ASCII characters over the currently open Bluetooth connection.")
- public void bluetoothRfcommWrite(@RpcParameter(name = "ascii") String ascii,
- @RpcParameter(name = "connID", description = "Connection id") @RpcDefault("") String connID)
- throws IOException {
- BluetoothConnection conn = getConnection(connID);
- try {
- conn.write(ascii);
- } catch (IOException e) {
- connections.remove(conn.getUUID());
- throw e;
- }
- }
-
- @Rpc(description = "Read up to bufferSize ASCII characters.")
- public String bluetoothRfcommRead(
- @RpcParameter(name = "bufferSize") @RpcDefault("4096") Integer bufferSize,
- @RpcParameter(name = "connID", description = "Connection id") @RpcOptional @RpcDefault("")
- String connID)
- throws IOException {
- BluetoothConnection conn = getConnection(connID);
- try {
- return conn.read(bufferSize);
- } catch (IOException e) {
- connections.remove(conn.getUUID());
- throw e;
- }
- }
-
- @Rpc(description = "Send bytes over the currently open Bluetooth connection.")
- public void bluetoothRfcommWriteBinary(
- @RpcParameter(name = "base64",
- description = "A base64 encoded String of the bytes to be sent.")
- String base64,
- @RpcParameter(name = "connID", description = "Connection id")
- @RpcDefault("") @RpcOptional
- String connID)
- throws IOException {
- BluetoothConnection conn = getConnection(connID);
- try {
- conn.write(Base64Codec.decodeBase64(base64));
- } catch (IOException e) {
- connections.remove(conn.getUUID());
- throw e;
- }
- }
-
- @Rpc(description = "Read up to bufferSize bytes and return a chunked, base64 encoded string.")
- public String bluetoothRfcommReadBinary(
- @RpcParameter(name = "bufferSize") @RpcDefault("4096") Integer bufferSize,
- @RpcParameter(name = "connID", description = "Connection id")
- @RpcDefault("") @RpcOptional
- String connID)
- throws IOException {
-
- BluetoothConnection conn = getConnection(connID);
- try {
- return Base64Codec.encodeBase64String(conn.readBinary(bufferSize));
- } catch (IOException e) {
- connections.remove(conn.getUUID());
- throw e;
- }
- }
-
- @Rpc(description = "Returns True if the next read is guaranteed not to block.")
- public Boolean bluetoothRfcommReadReady(
- @RpcParameter(name = "connID", description = "Connection id") @RpcDefault("") @RpcOptional
- String connID)
- throws IOException {
- BluetoothConnection conn = getConnection(connID);
- try {
- return conn.readReady();
- } catch (IOException e) {
- connections.remove(conn.getUUID());
- throw e;
- }
- }
-
- @Rpc(description = "Read the next line.")
- public String bluetoothRfcommReadLine(
- @RpcParameter(name = "connID", description = "Connection id") @RpcOptional @RpcDefault("")
- String connID)
- throws IOException {
- BluetoothConnection conn = getConnection(connID);
- try {
- return conn.readLine();
- } catch (IOException e) {
- connections.remove(conn.getUUID());
- throw e;
- }
- }
-
- @Rpc(description = "Stops Bluetooth connection.")
- public void bluetoothRfcommStop(
- @RpcParameter
- (name = "connID", description = "Connection id") @RpcOptional @RpcDefault("")
- String connID) {
- BluetoothConnection conn;
- try {
- conn = getConnection(connID);
- } catch (IOException e) {
- e.printStackTrace();
- return;
- }
- if (conn == null) {
- return;
- }
-
- conn.stop();
- connections.remove(conn.getUUID());
- }
-
- @Override
- public void shutdown() {
- for (Map.Entry<String, BluetoothConnection> entry : connections.entrySet()) {
- entry.getValue().stop();
- }
- connections.clear();
- }
-}
-
-class BluetoothConnection {
- private BluetoothSocket mSocket;
- private BluetoothDevice mDevice;
- private OutputStream mOutputStream;
- private InputStream mInputStream;
- private BufferedReader mReader;
- private BluetoothServerSocket mServerSocket;
- private String UUID;
-
- public BluetoothConnection(BluetoothSocket mSocket) throws IOException {
- this(mSocket, null);
- }
-
- public BluetoothConnection(BluetoothSocket mSocket, BluetoothServerSocket mServerSocket)
- throws IOException {
- this.mSocket = mSocket;
- mOutputStream = mSocket.getOutputStream();
- mInputStream = mSocket.getInputStream();
- mDevice = mSocket.getRemoteDevice();
- mReader = new BufferedReader(new InputStreamReader(mInputStream, "ASCII"));
- this.mServerSocket = mServerSocket;
- }
-
- public void setUUID(String UUID) {
- this.UUID = UUID;
- }
-
- public String getUUID() {
- return UUID;
- }
-
- public String getRemoteBluetoothAddress() {
- return mDevice.getAddress();
- }
-
- public boolean isConnected() {
- if (mSocket == null) {
- return false;
- }
- try {
- mSocket.getRemoteDevice();
- mInputStream.available();
- mReader.ready();
- return true;
- } catch (Exception e) {
- return false;
- }
- }
-
- public void write(byte[] out) throws IOException {
- if (mOutputStream != null) {
- mOutputStream.write(out);
- } else {
- throw new IOException("Bluetooth not ready.");
- }
- }
-
- public void write(String out) throws IOException {
- this.write(out.getBytes());
- }
-
- public Boolean readReady() throws IOException {
- if (mReader != null) {
- return mReader.ready();
- }
- throw new IOException("Bluetooth not ready.");
- }
-
- public byte[] readBinary() throws IOException {
- return this.readBinary(4096);
- }
-
- public byte[] readBinary(int bufferSize) throws IOException {
- if (mReader != null) {
- byte[] buffer = new byte[bufferSize];
- int bytesRead = mInputStream.read(buffer);
- if (bytesRead == -1) {
- Log.e("Read failed.");
- throw new IOException("Read failed.");
- }
- byte[] truncatedBuffer = new byte[bytesRead];
- System.arraycopy(buffer, 0, truncatedBuffer, 0, bytesRead);
- return truncatedBuffer;
- }
-
- throw new IOException("Bluetooth not ready.");
-
- }
-
- public String read() throws IOException {
- return this.read(4096);
- }
-
- public String read(int bufferSize) throws IOException {
- if (mReader != null) {
- char[] buffer = new char[bufferSize];
- int bytesRead = mReader.read(buffer);
- if (bytesRead == -1) {
- Log.e("Read failed.");
- throw new IOException("Read failed.");
- }
- return new String(buffer, 0, bytesRead);
- }
- throw new IOException("Bluetooth not ready.");
- }
-
- public String readLine() throws IOException {
- if (mReader != null) {
- return mReader.readLine();
- }
- throw new IOException("Bluetooth not ready.");
- }
-
- public String getConnectedDeviceName() {
- return mDevice.getName();
- }
-
- private synchronized void clearFileDescriptor() {
- try {
- Field field = BluetoothSocket.class.getDeclaredField("mPfd");
- field.setAccessible(true);
- ParcelFileDescriptor mPfd = (ParcelFileDescriptor) field.get(mSocket);
- if (mPfd == null)
- return;
- mPfd.close();
- mPfd = null;
- try { field.set(mSocket, mPfd); }
- catch(Exception e) {
- Log.d("Exception setting mPfd = null in cleanCloseFix(): " + e.toString());
- }
- } catch (Exception e) {
- Log.w("ParcelFileDescriptor could not be cleanly closed.", e);
- }
- }
-
- public void stop() {
- if (mSocket != null) {
- try {
- clearFileDescriptor();
- mSocket.close();
- } catch (IOException e) {
- Log.e(e);
- }
- }
- mSocket = null;
- if (mServerSocket != null) {
- try {
- mServerSocket.close();
- } catch (IOException e) {
- Log.e(e);
- }
- }
- mServerSocket = null;
-
- if (mInputStream != null) {
- try {
- mInputStream.close();
- } catch (IOException e) {
- Log.e(e);
- }
- }
- mInputStream = null;
- if (mOutputStream != null) {
- try {
- mOutputStream.close();
- } catch (IOException e) {
- Log.e(e);
- }
- }
- mOutputStream = null;
- if (mReader != null) {
- try {
- mReader.close();
- } catch (IOException e) {
- Log.e(e);
- }
- }
- mReader = null;
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/GattClientFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/GattClientFacade.java
deleted file mode 100644
index 0a96cd9..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/GattClientFacade.java
+++ /dev/null
@@ -1,956 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.bluetooth;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.UUID;
-import java.util.concurrent.Callable;
-
-import android.app.Service;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothGatt;
-import android.bluetooth.BluetoothGattCallback;
-import android.bluetooth.BluetoothManager;
-import android.bluetooth.BluetoothGattCharacteristic;
-import android.bluetooth.BluetoothGattDescriptor;
-import android.bluetooth.BluetoothGattService;
-import android.bluetooth.BluetoothProfile;
-import android.content.Context;
-import android.os.Bundle;
-
-import com.googlecode.android_scripting.ConvertUtils;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.MainThread;
-import com.googlecode.android_scripting.facade.EventFacade;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-import com.googlecode.android_scripting.rpc.RpcStopEvent;
-
-public class GattClientFacade extends RpcReceiver {
- private final EventFacade mEventFacade;
- private BluetoothAdapter mBluetoothAdapter;
- private BluetoothManager mBluetoothManager;
- private final Service mService;
- private final Context mContext;
- private final HashMap<Integer, myBluetoothGattCallback> mGattCallbackList;
- private final HashMap<Integer, BluetoothGatt> mBluetoothGattList;
- private final HashMap<Integer, BluetoothGattCharacteristic> mCharacteristicList;
- private final HashMap<Integer, BluetoothGattDescriptor> mDescriptorList;
- private final HashMap<Integer, BluetoothGattService> mGattServiceList;
- private final HashMap<Integer, List<BluetoothGattService>> mBluetoothGattDiscoveredServicesList;
- private final HashMap<Integer, List<BluetoothDevice>> mGattServerDiscoveredDevicesList;
- private static int GattCallbackCount;
- private static int BluetoothGattDiscoveredServicesCount;
- private static int BluetoothGattCount;
- private static int CharacteristicCount;
- private static int DescriptorCount;
- private static int GattServerCallbackCount;
- private static int GattServerCount;
- private static int GattServiceCount;
-
- public GattClientFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mContext = mService.getApplicationContext();
- mBluetoothAdapter = MainThread.run(mService,
- new Callable<BluetoothAdapter>() {
- @Override
- public BluetoothAdapter call() throws Exception {
- return BluetoothAdapter.getDefaultAdapter();
- }
- });
- mBluetoothManager = (BluetoothManager) mContext.getSystemService(Service.BLUETOOTH_SERVICE);
- mEventFacade = manager.getReceiver(EventFacade.class);
- mGattCallbackList = new HashMap<Integer, myBluetoothGattCallback>();
- mCharacteristicList = new HashMap<Integer, BluetoothGattCharacteristic>();
- mBluetoothGattList = new HashMap<Integer, BluetoothGatt>();
- mDescriptorList = new HashMap<Integer, BluetoothGattDescriptor>();
- mGattServiceList = new HashMap<Integer, BluetoothGattService>();
- mBluetoothGattDiscoveredServicesList = new HashMap<Integer, List<BluetoothGattService>>();
- mGattServerDiscoveredDevicesList = new HashMap<Integer, List<BluetoothDevice>>();
- }
-
- /**
- * Create a BluetoothGatt connection
- *
- * @param index of the callback to start a connection on
- * @param macAddress the mac address of the ble device
- * @param autoConnect Whether to directly connect to the remote device (false) or to
- * automatically connect as soon as the remote device becomes available (true)
- * @return the index of the BluetoothGatt object
- * @throws Exception
- */
- @Rpc(description = "Create a gatt connection")
- public int gattClientConnectGatt(
- @RpcParameter(name = "index")
- Integer index,
- @RpcParameter(name = "macAddress")
- String macAddress,
- @RpcParameter(name = "autoConnect")
- Boolean autoConnect
- ) throws Exception {
- if (mGattCallbackList.get(index) != null) {
- BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(macAddress);
- BluetoothGatt mBluetoothGatt = device.connectGatt(mService.getApplicationContext(),
- autoConnect,
- mGattCallbackList.get(index));
- BluetoothGattCount += 1;
- mBluetoothGattList.put(BluetoothGattCount, mBluetoothGatt);
- return BluetoothGattCount;
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
- }
- }
-
- /**
- * Trigger discovering of services on the BluetoothGatt object
- *
- * @param index The BluetoothGatt object index
- * @return true, if the remote service discovery has been started
- * @throws Exception
- */
- @Rpc(description = "Trigger discovering of services on the BluetoothGatt object")
- public boolean gattClientDiscoverServices(
- @RpcParameter(name = "index")
- Integer index
- ) throws Exception {
- if (mBluetoothGattList.get(index) != null) {
- return mBluetoothGattList.get(index).discoverServices();
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
- }
- }
-
- /**
- * Get the services from the BluetoothGatt object
- *
- * @param index The BluetoothGatt object index
- * @return a list of BluetoothGattServices
- * @throws Exception
- */
- @Rpc(description = "Get the services from the BluetoothGatt object")
- public List<BluetoothGattService> gattClientGetServices(
- @RpcParameter(name = "index")
- Integer index
- ) throws Exception {
- if (mBluetoothGattList.get(index) != null) {
- return mBluetoothGattList.get(index).getServices();
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
- }
- }
-
- /**
- * Abort reliable write of a bluetooth gatt
- *
- * @param index the bluetooth gatt index
- * @throws Exception
- */
- @Rpc(description = "Abort reliable write of a bluetooth gatt")
- public void gattClientAbortReliableWrite(
- @RpcParameter(name = "index")
- Integer index
- ) throws Exception {
- if (mBluetoothGattList.get(index) != null) {
- mBluetoothGattList.get(index).abortReliableWrite();
- } else {
- throw new Exception("Invalid index input:" + index);
- }
- }
-
- /**
- * Begin reliable write of a bluetooth gatt
- *
- * @param index the bluetooth gatt index
- * @return
- * @throws Exception
- */
- @Rpc(description = "Begin reliable write of a bluetooth gatt")
- public boolean gattClientBeginReliableWrite(
- @RpcParameter(name = "index")
- Integer index
- ) throws Exception {
- if (mBluetoothGattList.get(index) != null) {
- return mBluetoothGattList.get(index).beginReliableWrite();
- } else {
- throw new Exception("Invalid index input:" + index);
- }
- }
-
- /**
- * Configure a bluetooth gatt's MTU
- *
- * @param index the bluetooth gatt index
- * @param mtu the MTU to set
- * @return
- * @throws Exception
- */
- @Rpc(description = "true, if the new MTU value has been requested successfully")
- public boolean gattClientRequestMtu(
- @RpcParameter(name = "index")
- Integer index,
- @RpcParameter(name = "mtu")
- Integer mtu
- ) throws Exception {
- if (mBluetoothGattList.get(index) != null) {
- return mBluetoothGattList.get(index).requestMtu(mtu);
- } else {
- throw new Exception("Invalid index input:" + index);
- }
- }
-
- /**
- * Disconnect a bluetooth gatt
- *
- * @param index the bluetooth gatt index
- * @throws Exception
- */
- @Rpc(description = "Disconnect a bluetooth gatt")
- @RpcStopEvent("GattConnect")
- public void gattClientDisconnect(
- @RpcParameter(name = "index")
- Integer index
- ) throws Exception {
- if (mBluetoothGattList.get(index) != null) {
- mBluetoothGattList.get(index).disconnect();
- } else {
- throw new Exception("Invalid index input:" + index);
- }
- }
-
- /**
- * Execute reliable write on a bluetooth gatt
- *
- * @param index the bluetooth gatt index
- * @return true, if the request to execute the transaction has been sent
- * @throws Exception
- */
- @Rpc(description = "Execute reliable write on a bluetooth gatt")
- public boolean gattExecuteReliableWrite(
- @RpcParameter(name = "index")
- Integer index
- ) throws Exception {
- if (mBluetoothGattList.get(index) != null) {
- return mBluetoothGattList.get(index).executeReliableWrite();
- } else {
- throw new Exception("Invalid index input:" + index);
- }
- }
-
- /**
- * Get a list of Bluetooth Devices connnected to the bluetooth gatt
- *
- * @param index the bluetooth gatt index
- * @return List of BluetoothDevice Objects
- * @throws Exception
- */
- @Rpc(description = "Get a list of Bluetooth Devices connnected to the bluetooth gatt")
- public List<BluetoothDevice> gattClientGetConnectedDevices(
- @RpcParameter(name = "index")
- Integer index
- ) throws Exception {
- if (mBluetoothGattList.get(index) != null) {
- return mBluetoothGattList.get(index).getConnectedDevices();
- } else {
- throw new Exception("Invalid index input:" + index);
- }
- }
-
- /**
- * Get the remote bluetooth device this GATT client targets to
- *
- * @param index the bluetooth gatt index
- * @return the remote bluetooth device this gatt client targets to
- * @throws Exception
- */
- @Rpc(description = "Get the remote bluetooth device this GATT client targets to")
- public BluetoothDevice gattGetDevice(
- @RpcParameter(name = "index")
- Integer index
- ) throws Exception {
- if (mBluetoothGattList.get(index) != null) {
- return mBluetoothGattList.get(index).getDevice();
- } else {
- throw new Exception("Invalid index input:" + index);
- }
- }
-
- /**
- * Get the bluetooth devices matching input connection states
- *
- * @param index the bluetooth gatt index
- * @param states the list of states to match
- * @return The list of BluetoothDevice objects that match the states
- * @throws Exception
- */
- @Rpc(description = "Get the bluetooth devices matching input connection states")
- public List<BluetoothDevice> gattClientGetDevicesMatchingConnectionStates(
- @RpcParameter(name = "index")
- Integer index,
- @RpcParameter(name = "states")
- int[] states
- ) throws Exception {
- if (mBluetoothGattList.get(index) != null) {
- return mBluetoothGattList.get(index).getDevicesMatchingConnectionStates(states);
- } else {
- throw new Exception("Invalid index input:" + index);
- }
- }
-
- /**
- * Get the service from an input UUID
- *
- * @param index the bluetooth gatt index
- * @return BluetoothGattService related to the bluetooth gatt
- * @throws Exception
- */
- @Rpc(description = "Get the service from an input UUID")
- public ArrayList<String> gattClientGetServiceUuidList(
- @RpcParameter(name = "index")
- Integer index
- ) throws Exception {
- if (mBluetoothGattList.get(index) != null) {
- ArrayList<String> serviceUuidList = new ArrayList<String>();
- for (BluetoothGattService service : mBluetoothGattList.get(index).getServices()) {
- serviceUuidList.add(service.getUuid().toString());
- }
- return serviceUuidList;
- } else {
- throw new Exception("Invalid index input:" + index);
- }
- }
-
- /**
- * Reads the requested characteristic from the associated remote device.
- * @param gattIndex the BluetoothGatt server accociated with the device
- * @param discoveredServiceListIndex the index returned from the discovered
- * services callback
- * @param serviceIndex the service index of the discovered services
- * @param characteristicUuid the characteristic uuid to read
- * @return true, if the read operation was initiated successfully
- * @throws Exception
- */
- @Rpc(description = "Reads the requested characteristic from the associated remote device.")
- public boolean gattClientReadCharacteristic(
- @RpcParameter(name = "gattIndex") Integer gattIndex,
- @RpcParameter(name = "discoveredServiceListIndex") Integer discoveredServiceListIndex,
- @RpcParameter(name = "serviceIndex") Integer serviceIndex,
- @RpcParameter(name = "characteristicUuid") String characteristicUuid) throws Exception {
- BluetoothGatt bluetoothGatt = mBluetoothGattList.get(gattIndex);
- if (bluetoothGatt == null) {
- throw new Exception("Invalid gattIndex " + gattIndex);
- }
- List<BluetoothGattService> discoveredServiceList =
- mBluetoothGattDiscoveredServicesList.get(discoveredServiceListIndex);
- if (discoveredServiceList == null) {
- throw new Exception("Invalid discoveredServiceListIndex " + discoveredServiceListIndex);
- }
- BluetoothGattService gattService = discoveredServiceList.get(serviceIndex);
- if (gattService == null) {
- throw new Exception("Invalid serviceIndex " + serviceIndex);
- }
- UUID cUuid = UUID.fromString(characteristicUuid);
- BluetoothGattCharacteristic gattCharacteristic = gattService.getCharacteristic(cUuid);
- if (gattCharacteristic == null) {
- throw new Exception("Invalid characteristic uuid: " + characteristicUuid);
- }
- return bluetoothGatt.readCharacteristic(gattCharacteristic);
- }
-
- /**
- * Reads the value for a given descriptor from the associated remote device
- * @param gattIndex - the gatt index to use
- * @param discoveredServiceListIndex - the discvered serivice list index
- * @param serviceIndex - the servce index of the discoveredServiceListIndex
- * @param characteristicUuid - the characteristic uuid in which the descriptor is
- * @param descriptorUuid - the descriptor uuid to read
- * @return
- * @throws Exception
- */
- @Rpc(description = "Reads the value for a given descriptor from the associated remote device")
- public boolean gattClientReadDescriptor(@RpcParameter(name = "gattIndex") Integer gattIndex,
- @RpcParameter(name = "discoveredServiceListIndex") Integer discoveredServiceListIndex,
- @RpcParameter(name = "serviceIndex") Integer serviceIndex,
- @RpcParameter(name = "characteristicUuid") String characteristicUuid,
- @RpcParameter(name = "descriptorUuid") String descriptorUuid) throws Exception {
- BluetoothGatt bluetoothGatt = mBluetoothGattList.get(gattIndex);
- if (bluetoothGatt == null) {
- throw new Exception("Invalid gattIndex " + gattIndex);
- }
- List<BluetoothGattService> gattServiceList = mBluetoothGattDiscoveredServicesList.get(
- discoveredServiceListIndex);
- if (gattServiceList == null) {
- throw new Exception("Invalid discoveredServiceListIndex " + discoveredServiceListIndex);
- }
- BluetoothGattService gattService = gattServiceList.get(serviceIndex);
- if (gattService == null) {
- throw new Exception("Invalid serviceIndex " + serviceIndex);
- }
- UUID cUuid = UUID.fromString(characteristicUuid);
- BluetoothGattCharacteristic gattCharacteristic = gattService.getCharacteristic(cUuid);
- if (gattCharacteristic == null) {
- throw new Exception("Invalid characteristic uuid: " + characteristicUuid);
- }
- UUID dUuid = UUID.fromString(descriptorUuid);
- BluetoothGattDescriptor gattDescriptor = gattCharacteristic.getDescriptor(dUuid);
- if (gattDescriptor == null) {
- throw new Exception("Invalid descriptor uuid: " + descriptorUuid);
- }
- return bluetoothGatt.readDescriptor(gattDescriptor);
- }
-
- /**
- * Write the value of a given descriptor to the associated remote device
- *
- * @param index the bluetooth gatt index
- * @param serviceIndex the service index to write to
- * @param characteristicUuid the uuid where the descriptor lives
- * @param descriptorIndex the descriptor index
- * @return true, if the write operation was initiated successfully
- * @throws Exception
- */
- @Rpc(description = "Write the value of a given descriptor to the associated remote device")
- public boolean gattClientWriteDescriptor(@RpcParameter(name = "gattIndex") Integer gattIndex,
- @RpcParameter(name = "discoveredServiceListIndex") Integer discoveredServiceListIndex,
- @RpcParameter(name = "serviceIndex") Integer serviceIndex,
- @RpcParameter(name = "characteristicUuid") String characteristicUuid,
- @RpcParameter(name = "descriptorUuid") String descriptorUuid) throws Exception {
- BluetoothGatt bluetoothGatt = mBluetoothGattList.get(gattIndex);
- if (bluetoothGatt == null) {
- throw new Exception("Invalid gattIndex " + gattIndex);
- }
- List<BluetoothGattService> discoveredServiceList =
- mBluetoothGattDiscoveredServicesList.get(discoveredServiceListIndex);
- if (discoveredServiceList == null) {
- throw new Exception("Invalid discoveredServiceListIndex " + discoveredServiceListIndex);
- }
- BluetoothGattService gattService = discoveredServiceList.get(serviceIndex);
- if (gattService == null) {
- throw new Exception("Invalid serviceIndex " + serviceIndex);
- }
- UUID cUuid = UUID.fromString(characteristicUuid);
- BluetoothGattCharacteristic gattCharacteristic = gattService.getCharacteristic(cUuid);
- if (gattCharacteristic == null) {
- throw new Exception("Invalid characteristic uuid: " + characteristicUuid);
- }
- UUID dUuid = UUID.fromString(descriptorUuid);
- BluetoothGattDescriptor gattDescriptor = gattCharacteristic.getDescriptor(dUuid);
- if (gattDescriptor == null) {
- throw new Exception("Invalid descriptor uuid: " + descriptorUuid);
- }
- return bluetoothGatt.writeDescriptor(gattDescriptor);
- }
-
- /**
- * Write the value to a discovered descriptor.
- * @param gattIndex - the gatt index to use
- * @param discoveredServiceListIndex - the discovered service list index
- * @param serviceIndex - the service index of the discoveredServiceListIndex
- * @param characteristicUuid - the characteristic uuid in which the descriptor is
- * @param descriptorUuid - the descriptor uuid to read
- * @param value - the value to set the descriptor to
- * @return true is the value was set to the descriptor
- * @throws Exception
- */
- @Rpc(description = "Write the value of a given descriptor to the associated remote device")
- public boolean gattClientDescriptorSetValue(@RpcParameter(name = "gattIndex") Integer gattIndex,
- @RpcParameter(name = "discoveredServiceListIndex") Integer discoveredServiceListIndex,
- @RpcParameter(name = "serviceIndex") Integer serviceIndex,
- @RpcParameter(name = "characteristicUuid") String characteristicUuid,
- @RpcParameter(name = "descriptorUuid") String descriptorUuid,
- @RpcParameter(name = "value") String value) throws Exception {
- if (mBluetoothGattList.get(gattIndex) == null) {
- throw new Exception("Invalid gattIndex " + gattIndex);
- }
- List<BluetoothGattService> discoveredServiceList =
- mBluetoothGattDiscoveredServicesList.get(discoveredServiceListIndex);
- if (discoveredServiceList == null) {
- throw new Exception("Invalid discoveredServiceListIndex " + discoveredServiceListIndex);
- }
- BluetoothGattService gattService = discoveredServiceList.get(serviceIndex);
- if (gattService == null) {
- throw new Exception("Invalid serviceIndex " + serviceIndex);
- }
- UUID cUuid = UUID.fromString(characteristicUuid);
- BluetoothGattCharacteristic gattCharacteristic = gattService.getCharacteristic(cUuid);
- if (gattCharacteristic == null) {
- throw new Exception("Invalid characteristic uuid: " + characteristicUuid);
- }
- UUID dUuid = UUID.fromString(descriptorUuid);
- BluetoothGattDescriptor gattDescriptor = gattCharacteristic.getDescriptor(dUuid);
- if (gattDescriptor == null) {
- throw new Exception("Invalid descriptor uuid: " + descriptorUuid);
- }
- byte[] byteArray = ConvertUtils.convertStringToByteArray(value);
- return gattDescriptor.setValue(byteArray);
- }
-
- /**
- * Write the value of a given characteristic to the associated remote device
- *
- * @param index the bluetooth gatt index
- * @param serviceIndex the service where the characteristic lives
- * @param characteristicUuid the characteristic uuid to write to
- * @return true, if the write operation was successful
- * @throws Exception
- */
- @Rpc(description = "Write the value of a given characteristic to the associated remote device")
- public boolean gattClientWriteCharacteristic(@RpcParameter(name = "gattIndex") Integer gattIndex,
- @RpcParameter(name = "discoveredServiceListIndex") Integer discoveredServiceListIndex,
- @RpcParameter(name = "serviceIndex") Integer serviceIndex,
- @RpcParameter(name = "characteristicUuid") String characteristicUuid) throws Exception {
- BluetoothGatt bluetoothGatt = mBluetoothGattList.get(gattIndex);
- if (bluetoothGatt == null) {
- throw new Exception("Invalid gattIndex " + gattIndex);
- }
- List<BluetoothGattService> discoveredServiceList =
- mBluetoothGattDiscoveredServicesList.get(discoveredServiceListIndex);
- if (discoveredServiceList == null) {
- throw new Exception("Invalid discoveredServiceListIndex " + discoveredServiceListIndex);
- }
- BluetoothGattService gattService = discoveredServiceList.get(serviceIndex);
- if (gattService == null) {
- throw new Exception("Invalid serviceIndex " + serviceIndex);
- }
- UUID cUuid = UUID.fromString(characteristicUuid);
- BluetoothGattCharacteristic gattCharacteristic = gattService.getCharacteristic(cUuid);
- if (gattCharacteristic == null) {
- throw new Exception("Invalid characteristic uuid: " + characteristicUuid);
- }
- return bluetoothGatt.writeCharacteristic(gattCharacteristic);
- }
-
- /**
- * Write the value to a discovered characteristic.
- * @param gattIndex - the gatt index to use
- * @param discoveredServiceListIndex - the discovered service list index
- * @param serviceIndex - the service index of the discoveredServiceListIndex
- * @param characteristicUuid - the characteristic uuid in which the descriptor is
- * @param value - the value to set the characteristic to
- * @return true, if the value was set to the characteristic
- * @throws Exception
- */
- @Rpc(description = "Write the value of a given characteristic to the associated remote device")
- public boolean gattClientCharacteristicSetValue(@RpcParameter(name = "gattIndex") Integer gattIndex,
- @RpcParameter(name = "discoveredServiceListIndex") Integer discoveredServiceListIndex,
- @RpcParameter(name = "serviceIndex") Integer serviceIndex,
- @RpcParameter(name = "characteristicUuid") String characteristicUuid,
- @RpcParameter(name = "value") String value) throws Exception {
- if (mBluetoothGattList.get(gattIndex) == null) {
- throw new Exception("Invalid gattIndex " + gattIndex);
- }
- List<BluetoothGattService> discoveredServiceList =
- mBluetoothGattDiscoveredServicesList.get(discoveredServiceListIndex);
- if (discoveredServiceList == null) {
- throw new Exception("Invalid discoveredServiceListIndex " + discoveredServiceListIndex);
- }
- BluetoothGattService gattService = discoveredServiceList.get(serviceIndex);
- if (gattService == null) {
- throw new Exception("Invalid serviceIndex " + serviceIndex);
- }
- UUID cUuid = UUID.fromString(characteristicUuid);
- BluetoothGattCharacteristic gattCharacteristic = gattService.getCharacteristic(cUuid);
- if (gattCharacteristic == null) {
- throw new Exception("Invalid characteristic uuid: " + characteristicUuid);
- }
- byte[] byteArray = ConvertUtils.convertStringToByteArray(value);
- return gattCharacteristic.setValue(byteArray);
- }
- /**
- * Read the RSSI for a connected remote device
- *
- * @param index the bluetooth gatt index
- * @return true, if the RSSI value has been requested successfully
- * @throws Exception
- */
- @Rpc(description = "Read the RSSI for a connected remote device")
- public boolean gattClientReadRSSI(
- @RpcParameter(name = "index")
- Integer index
- ) throws Exception {
- if (mBluetoothGattList.get(index) != null) {
- return mBluetoothGattList.get(index).readRemoteRssi();
- } else {
- throw new Exception("Invalid index input:" + index);
- }
- }
-
- /**
- * Clears the internal cache and forces a refresh of the services from the remote device
- *
- * @param index the bluetooth gatt index
- * @return Clears the internal cache and forces a refresh of the services from the remote
- * device.
- * @throws Exception
- */
- @Rpc(description = "Clears the internal cache and forces a refresh of the services from the remote device")
- public boolean gattClientRefresh(
- @RpcParameter(name = "index")
- Integer index
- ) throws Exception {
- if (mBluetoothGattList.get(index) != null) {
- return mBluetoothGattList.get(index).refresh();
- } else {
- throw new Exception("Invalid index input:" + index);
- }
- }
-
- /**
- * Request a connection parameter update.
- * @param index the bluetooth gatt index
- * @param connectionPriority connection priority
- * @return boolean True if successful False otherwise.
- * @throws Exception
- */
- @Rpc(description = "Request a connection parameter update. from the Bluetooth Gatt")
- public boolean gattClientRequestConnectionPriority(
- @RpcParameter(name = "index")
- Integer index,
- @RpcParameter(name = "connectionPriority")
- Integer connectionPriority
- ) throws Exception {
- boolean result = false;
- if (mBluetoothGattList.get(index) != null) {
- result = mBluetoothGattList.get(index).requestConnectionPriority(
- connectionPriority);
- } else {
- throw new Exception("Invalid index input:" + index);
- }
- return result;
- }
-
- /**
- * Sets the characteristic notification of a bluetooth gatt
- *
- * @param index the bluetooth gatt index
- * @param characteristicIndex the characteristic index
- * @param enable Enable or disable notifications/indications for a given characteristic
- * @return true, if the requested notification status was set successfully
- * @throws Exception
- */
- @Rpc(description = "Sets the characteristic notification of a bluetooth gatt")
- public boolean gattClientSetCharacteristicNotification(
- @RpcParameter(name = "gattIndex")
- Integer gattIndex,
- @RpcParameter(name = "discoveredServiceListIndex")
- Integer discoveredServiceListIndex,
- @RpcParameter(name = "serviceIndex")
- Integer serviceIndex,
- @RpcParameter(name = "characteristicUuid")
- String characteristicUuid,
- @RpcParameter(name = "enable")
- Boolean enable
- ) throws Exception {
- if (mBluetoothGattList.get(gattIndex) != null) {
- if(mBluetoothGattDiscoveredServicesList.get(discoveredServiceListIndex) != null) {
- List<BluetoothGattService> discoveredServiceList =
- mBluetoothGattDiscoveredServicesList.get(discoveredServiceListIndex);
- if (discoveredServiceList.get(serviceIndex) != null) {
- UUID cUuid = UUID.fromString(characteristicUuid);
- if (discoveredServiceList.get(serviceIndex).getCharacteristic(cUuid) != null) {
- return mBluetoothGattList.get(gattIndex).setCharacteristicNotification(
- discoveredServiceList.get(serviceIndex).getCharacteristic(cUuid), enable);
- } else {
- throw new Exception ("Invalid characteristic uuid: " + characteristicUuid);
- }
- } else {
- throw new Exception ("Invalid serviceIndex " + serviceIndex);
- }
- } else {
- throw new Exception("Invalid discoveredServiceListIndex: " + discoveredServiceListIndex);
- }
- } else {
- throw new Exception("Invalid gattIndex input: " + gattIndex);
- }
- }
-
- /**
- * Create a new GattCallback object
- *
- * @return the index of the callback object
- */
- @Rpc(description = "Create a new GattCallback object")
- public Integer gattCreateGattCallback() {
- GattCallbackCount += 1;
- int index = GattCallbackCount;
- mGattCallbackList.put(index, new myBluetoothGattCallback(index));
- return index;
- }
-
- /**
- * Returns the list of discovered Bluetooth Gatt Services.
- * @throws Exception
- */
- @Rpc(description = "Get Bluetooth Gatt Services")
- public int gattClientGetDiscoveredServicesCount (
- @RpcParameter(name = "index")
- Integer index
- ) throws Exception {
- if (mBluetoothGattDiscoveredServicesList.get(index) != null) {
- return mBluetoothGattDiscoveredServicesList.get(index).size();
- } else {
- throw new Exception("Invalid index input:" + index);
- }
- }
-
- /**
- * Returns the discovered Bluetooth Gatt Service Uuid.
- * @throws Exception
- */
- @Rpc(description = "Get Bluetooth Gatt Service Uuid")
- public String gattClientGetDiscoveredServiceUuid (
- @RpcParameter(name = "index")
- Integer index,
- @RpcParameter(name = "serviceIndex")
- Integer serviceIndex
- ) throws Exception {
- List<BluetoothGattService> mBluetoothServiceList =
- mBluetoothGattDiscoveredServicesList.get(index);
- if (mBluetoothServiceList != null) {
- return mBluetoothServiceList.get(serviceIndex).getUuid().toString();
- } else {
- throw new Exception("Invalid index input:" + index);
- }
- }
-
- /**
- * Get discovered characteristic uuids from the pheripheral device.
- * @param index the index of the bluetooth gatt discovered services list
- * @param serviceIndex the service to get
- * @return the list of characteristic uuids
- * @throws Exception
- */
- @Rpc(description = "Get Bluetooth Gatt Services")
- public ArrayList<String> gattClientGetDiscoveredCharacteristicUuids (
- @RpcParameter(name = "index")
- Integer index,
- @RpcParameter(name = "serviceIndex")
- Integer serviceIndex
- ) throws Exception {
- if (mBluetoothGattDiscoveredServicesList.get(index) != null) {
- if (mBluetoothGattDiscoveredServicesList.get(index).get(serviceIndex) != null) {
- ArrayList<String> uuidList = new ArrayList<String>();
- List<BluetoothGattCharacteristic> charList = mBluetoothGattDiscoveredServicesList.get(index).get(serviceIndex).getCharacteristics();
- for (BluetoothGattCharacteristic mChar : charList) {
- uuidList.add(mChar.getUuid().toString());
- }
- return uuidList;
- } else {
- throw new Exception("Invalid serviceIndex input:" + index);
- }
- } else {
- throw new Exception("Invalid index input:" + index);
- }
- }
-
- /**
- * Get discovered descriptor uuids from the pheripheral device.
- * @param index the discovered services list index
- * @param serviceIndex the service index of the discovered services list
- * @param characteristicUuid the characteristicUuid to select from the
- * discovered service which contains the list of descriptors.
- * @return the list of descriptor uuids
- * @throws Exception
- */
- @Rpc(description = "Get Bluetooth Gatt Services")
- public ArrayList<String> gattClientGetDiscoveredDescriptorUuids (
- @RpcParameter(name = "index")
- Integer index,
- @RpcParameter(name = "serviceIndex")
- Integer serviceIndex,
- @RpcParameter(name = "characteristicUuid")
- String characteristicUuid
- ) throws Exception {
- if (mBluetoothGattDiscoveredServicesList.get(index) != null) {
- if (mBluetoothGattDiscoveredServicesList.get(index).get(serviceIndex) != null) {
- BluetoothGattService service = mBluetoothGattDiscoveredServicesList.get(index).get(serviceIndex);
- UUID cUuid = UUID.fromString(characteristicUuid);
- if (service.getCharacteristic(cUuid) != null) {
- ArrayList<String> uuidList = new ArrayList<String>();
- for (BluetoothGattDescriptor mDesc : service.getCharacteristic(cUuid).getDescriptors()) {
- uuidList.add(mDesc.getUuid().toString());
- }
- return uuidList;
- } else {
- throw new Exception("Invalid characeristicUuid : "
- + characteristicUuid);
- }
- } else {
- throw new Exception("Invalid serviceIndex input:"
- + index);
- }
- } else {
- throw new Exception("Invalid index input:"
- + index);
- }
- }
-
- private class myBluetoothGattCallback extends BluetoothGattCallback {
- private final Bundle mResults;
- private final int index;
- private final String mEventType;
-
- public myBluetoothGattCallback(int idx) {
- mResults = new Bundle();
- mEventType = "GattConnect";
- index = idx;
- }
-
- @Override
- public void onConnectionStateChange(BluetoothGatt gatt, int status,
- int newState) {
- Log.d("gatt_connect change onConnectionStateChange " + mEventType + " " + index);
- if (newState == BluetoothProfile.STATE_CONNECTED) {
- Log.d("State Connected to mac address "
- + gatt.getDevice().getAddress() + " status " + status);
- } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
- Log.d("State Disconnected from mac address "
- + gatt.getDevice().getAddress() + " status " + status);
- } else if (newState == BluetoothProfile.STATE_CONNECTING) {
- Log.d("State Connecting to mac address "
- + gatt.getDevice().getAddress() + " status " + status);
- } else if (newState == BluetoothProfile.STATE_DISCONNECTING) {
- Log.d("State Disconnecting from mac address "
- + gatt.getDevice().getAddress() + " status " + status);
- }
- mResults.putInt("Status", status);
- mResults.putInt("State", newState);
- mEventFacade
- .postEvent(mEventType + index + "onConnectionStateChange", mResults.clone());
- mResults.clear();
- }
-
- @Override
- public void onServicesDiscovered(BluetoothGatt gatt, int status) {
- Log.d("gatt_connect change onServicesDiscovered " + mEventType + " " + index);
- int idx = BluetoothGattDiscoveredServicesCount++;
- mBluetoothGattDiscoveredServicesList.put(idx, gatt.getServices());
- mResults.putInt("ServicesIndex", idx);
- mResults.putInt("Status", status);
- for (BluetoothGattService se: gatt.getServices()) {
- System.out.println("SWAG: " + se.getUuid().toString());
- }
- mEventFacade
- .postEvent(mEventType + index + "onServicesDiscovered", mResults.clone());
- mResults.clear();
- }
-
- @Override
- public void onCharacteristicRead(BluetoothGatt gatt,
- BluetoothGattCharacteristic characteristic,
- int status) {
- Log.d("gatt_connect change onCharacteristicRead " + mEventType + " " + index);
- mResults.putInt("Status", status);
- mResults.putString("CharacteristicUuid", characteristic.getUuid().toString());
- mEventFacade
- .postEvent(mEventType + index + "onCharacteristicRead", mResults.clone());
- mResults.clear();
- }
-
- @Override
- public void onCharacteristicWrite(BluetoothGatt gatt,
- BluetoothGattCharacteristic characteristic, int status) {
- Log.d("gatt_connect change onCharacteristicWrite " + mEventType + " " + index);
- mResults.putInt("Status", status);
- mResults.putString("CharacteristicUuid", characteristic.getUuid().toString());
- mEventFacade
- .postEvent(mEventType + index + "onCharacteristicWrite", mResults.clone());
- mResults.clear();
- }
-
- @Override
- public void onCharacteristicChanged(BluetoothGatt gatt,
- BluetoothGattCharacteristic characteristic) {
- Log.d("gatt_connect change onCharacteristicChanged " + mEventType + " " + index);
- mResults.putInt("ID", index);
- mResults.putString("CharacteristicUuid", characteristic.getUuid().toString());
- mEventFacade
- .postEvent(mEventType + index + "onCharacteristicChanged", mResults.clone());
- mResults.clear();
- }
-
- @Override
- public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor,
- int status) {
- Log.d("gatt_connect change onServicesDiscovered " + mEventType + " " + index);
- mResults.putInt("Status", status);
- mResults.putString("DescriptorUuid", descriptor.getUuid().toString());
- mEventFacade
- .postEvent(mEventType + index + "onDescriptorRead", mResults.clone());
- mResults.clear();
- }
-
- @Override
- public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor,
- int status) {
- Log.d("gatt_connect change onDescriptorWrite " + mEventType + " " + index);
- mResults.putInt("ID", index);
- mResults.putInt("Status", status);
- mResults.putString("DescriptorUuid", descriptor.getUuid().toString());
- mEventFacade
- .postEvent(mEventType + index + "onDescriptorWrite", mResults.clone());
- mResults.clear();
- }
-
- @Override
- public void onReliableWriteCompleted(BluetoothGatt gatt, int status) {
- Log.d("gatt_connect change onReliableWriteCompleted " + mEventType + " "
- + index);
- mResults.putInt("Status", status);
- mEventFacade
- .postEvent(mEventType + index + "onReliableWriteCompleted", mResults.clone());
- mResults.clear();
- }
-
- @Override
- public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) {
- Log.d("gatt_connect change onReadRemoteRssi " + mEventType + " " + index);
- mResults.putInt("Status", status);
- mResults.putInt("Rssi", rssi);
- mEventFacade
- .postEvent(mEventType + index + "onReadRemoteRssi", mResults.clone());
- mResults.clear();
- }
-
- @Override
- public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
- Log.d("gatt_connect change onMtuChanged " + mEventType + " " + index);
- mResults.putInt("Status", status);
- mResults.putInt("MTU", mtu);
- mEventFacade
- .postEvent(mEventType + index + "onMtuChanged", mResults.clone());
- mResults.clear();
- }
- }
-
- @Override
- public void shutdown() {
- if (!mBluetoothGattList.isEmpty()) {
- if (mBluetoothGattList.values() != null) {
- for (BluetoothGatt mBluetoothGatt : mBluetoothGattList.values()) {
- mBluetoothGatt.close();
- }
- }
- }
- mGattCallbackList.clear();
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/GattServerFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/GattServerFacade.java
deleted file mode 100644
index df03fe2..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/bluetooth/GattServerFacade.java
+++ /dev/null
@@ -1,535 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.bluetooth;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.UUID;
-import java.util.concurrent.Callable;
-
-import android.app.Service;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothGatt;
-import android.bluetooth.BluetoothGattServer;
-import android.bluetooth.BluetoothManager;
-import android.bluetooth.BluetoothGattCharacteristic;
-import android.bluetooth.BluetoothGattServerCallback;
-import android.bluetooth.BluetoothGattDescriptor;
-import android.bluetooth.BluetoothGattService;
-import android.bluetooth.BluetoothProfile;
-import android.content.Context;
-import android.os.Bundle;
-
-import com.googlecode.android_scripting.ConvertUtils;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.MainThread;
-import com.googlecode.android_scripting.facade.EventFacade;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-public class GattServerFacade extends RpcReceiver {
- private final EventFacade mEventFacade;
- private BluetoothAdapter mBluetoothAdapter;
- private BluetoothManager mBluetoothManager;
- private final Service mService;
- private final Context mContext;
- private final HashMap<Integer, BluetoothGattCharacteristic> mCharacteristicList;
- private final HashMap<Integer, BluetoothGattDescriptor> mDescriptorList;
- private final HashMap<Integer, BluetoothGattServer> mBluetoothGattServerList;
- private final HashMap<Integer, myBluetoothGattServerCallback> mBluetoothGattServerCallbackList;
- private final HashMap<Integer, BluetoothGattService> mGattServiceList;
- private final HashMap<Integer, List<BluetoothGattService>> mBluetoothGattDiscoveredServicesList;
- private final HashMap<Integer, List<BluetoothDevice>> mGattServerDiscoveredDevicesList;
- private static int CharacteristicCount;
- private static int DescriptorCount;
- private static int GattServerCallbackCount;
- private static int GattServerCount;
- private static int GattServiceCount;
-
- public GattServerFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mContext = mService.getApplicationContext();
- mBluetoothAdapter = MainThread.run(mService, new Callable<BluetoothAdapter>() {
- @Override
- public BluetoothAdapter call() throws Exception {
- return BluetoothAdapter.getDefaultAdapter();
- }
- });
- mBluetoothManager = (BluetoothManager) mContext.getSystemService(Service.BLUETOOTH_SERVICE);
- mEventFacade = manager.getReceiver(EventFacade.class);
- mCharacteristicList = new HashMap<Integer, BluetoothGattCharacteristic>();
- mDescriptorList = new HashMap<Integer, BluetoothGattDescriptor>();
- mBluetoothGattServerList = new HashMap<Integer, BluetoothGattServer>();
- mBluetoothGattServerCallbackList = new HashMap<Integer, myBluetoothGattServerCallback>();
- mGattServiceList = new HashMap<Integer, BluetoothGattService>();
- mBluetoothGattDiscoveredServicesList = new HashMap<Integer, List<BluetoothGattService>>();
- mGattServerDiscoveredDevicesList = new HashMap<Integer, List<BluetoothDevice>>();
- }
-
- /**
- * Open a new Gatt server.
- *
- * @param index the bluetooth gatt server callback to open on
- * @return the index of the newly opened gatt server
- * @throws Exception
- */
- @Rpc(description = "Open new gatt server")
- public int gattServerOpenGattServer(@RpcParameter(name = "index") Integer index)
- throws Exception {
- if (mBluetoothGattServerCallbackList.get(index) != null) {
- BluetoothGattServer mGattServer =
- mBluetoothManager.openGattServer(mContext, mBluetoothGattServerCallbackList.get(index));
- GattServerCount += 1;
- int in = GattServerCount;
- mBluetoothGattServerList.put(in, mGattServer);
- return in;
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
- }
- }
-
- /**
- * Add a service to a bluetooth gatt server
- *
- * @param index the bluetooth gatt server to add a service to
- * @param serviceIndex the service to add to the bluetooth gatt server
- * @throws Exception
- */
- @Rpc(description = "Add service to bluetooth gatt server")
- public void gattServerAddService(@RpcParameter(name = "index") Integer index,
- @RpcParameter(name = "serviceIndex") Integer serviceIndex) throws Exception {
- if (mBluetoothGattServerList.get(index) != null) {
- if (mGattServiceList.get(serviceIndex) != null) {
- mBluetoothGattServerList.get(index).addService(mGattServiceList.get(serviceIndex));
- } else {
- throw new Exception("Invalid serviceIndex input:" + Integer.toString(serviceIndex));
- }
- } else {
- throw new Exception("Invalid index input:" + Integer.toString(index));
- }
- }
-
- /**
- * Get connected devices of the gatt server
- *
- * @param gattServerIndex the gatt server index
- * @throws Exception
- */
- @Rpc(description = "Return a list of connected gatt devices.")
- public List<BluetoothDevice> gattServerGetConnectedDevices(
- @RpcParameter(name = "gattServerIndex") Integer gattServerIndex) throws Exception {
- if (mBluetoothGattServerList.get(gattServerIndex) == null) {
- throw new Exception("Invalid gattServerIndex: " + Integer.toString(gattServerIndex));
- }
- List<BluetoothDevice> connectedDevices =
- mBluetoothManager.getConnectedDevices(BluetoothProfile.GATT_SERVER);
- mGattServerDiscoveredDevicesList.put(gattServerIndex, connectedDevices);
- return connectedDevices;
- }
-
- /**
- * Get connected devices of the gatt server
- *
- * @param gattServerIndex the gatt server index
- * @param bluetoothDeviceIndex the remotely connected bluetooth device
- * @param requestId the ID of the request that was received with the callback
- * @param status the status of the request to be sent to the remote devices
- * @param offset value offset for partial read/write response
- * @param value the value of the attribute that was read/written
- * @throws Exception
- */
- @Rpc(description = "Send a response after a write.")
- public void gattServerSendResponse(
- @RpcParameter(name = "gattServerIndex") Integer gattServerIndex,
- @RpcParameter(name = "bluetoothDeviceIndex") Integer bluetoothDeviceIndex,
- @RpcParameter(name = "requestId") Integer requestId,
- @RpcParameter(name = "status") Integer status, @RpcParameter(name = "offset") Integer offset,
- @RpcParameter(name = "value") String value) throws Exception {
-
- BluetoothGattServer gattServer = mBluetoothGattServerList.get(gattServerIndex);
- if (gattServer == null)
- throw new Exception("Invalid gattServerIndex: " + Integer.toString(gattServerIndex));
- List<BluetoothDevice> connectedDevices = mGattServerDiscoveredDevicesList.get(gattServerIndex);
- if (connectedDevices == null)
- throw new Exception(
- "Connected device list empty for gattServerIndex:" + Integer.toString(gattServerIndex));
- BluetoothDevice bluetoothDevice = connectedDevices.get(bluetoothDeviceIndex);
- if (bluetoothDevice == null)
- throw new Exception(
- "Invalid bluetoothDeviceIndex: " + Integer.toString(bluetoothDeviceIndex));
- gattServer.sendResponse(bluetoothDevice, requestId, status, offset,
- ConvertUtils.convertStringToByteArray(value));
- }
-
- /**
- * Create a new bluetooth gatt service
- *
- * @param uuid the UUID that characterises the service
- * @param serviceType the service type
- * @return The index of the new bluetooth gatt service
- */
- @Rpc(description = "Create new bluetooth gatt service")
- public int gattServerCreateService(@RpcParameter(name = "uuid") String uuid,
- @RpcParameter(name = "serviceType") Integer serviceType) {
- GattServiceCount += 1;
- int index = GattServiceCount;
- mGattServiceList.put(index, new BluetoothGattService(UUID.fromString(uuid), serviceType));
- return index;
- }
-
- /**
- * Add a characteristic to a bluetooth gatt service
- *
- * @param index the bluetooth gatt service index
- * @param serviceUuid the service Uuid to get
- * @param characteristicIndex the character index to use
- * @throws Exception
- */
- @Rpc(description = "Add a characteristic to a bluetooth gatt service")
- public void gattServiceAddCharacteristic(@RpcParameter(name = "index") Integer index,
- @RpcParameter(name = "serviceUuid") String serviceUuid,
- @RpcParameter(name = "characteristicIndex") Integer characteristicIndex) throws Exception {
- if (mBluetoothGattServerList.get(index) != null
- && mBluetoothGattServerList.get(index).getService(UUID.fromString(serviceUuid)) != null
- && mCharacteristicList.get(characteristicIndex) != null) {
- mBluetoothGattServerList.get(index).getService(UUID.fromString(serviceUuid))
- .addCharacteristic(mCharacteristicList.get(characteristicIndex));
- } else {
- if (mBluetoothGattServerList.get(index) == null) {
- throw new Exception("Invalid index input:" + index);
- } else if (mCharacteristicList.get(characteristicIndex) == null) {
- throw new Exception("Invalid characteristicIndex input:" + characteristicIndex);
- } else {
- throw new Exception("Invalid serviceUuid input:" + serviceUuid);
- }
- }
- }
-
- /**
- * Add a characteristic to a bluetooth gatt service
- *
- * @param index the bluetooth gatt service to add a characteristic to
- * @param characteristicIndex the characteristic to add
- * @throws Exception
- */
- @Rpc(description = "Add a characteristic to a bluetooth gatt service")
- public void gattServerAddCharacteristicToService(@RpcParameter(name = "index") Integer index,
- @RpcParameter(name = "characteristicIndex") Integer characteristicIndex
-
- ) throws Exception {
- if (mGattServiceList.get(index) != null) {
- if (mCharacteristicList.get(characteristicIndex) != null) {
- mGattServiceList.get(index).addCharacteristic(mCharacteristicList.get(characteristicIndex));
- } else {
- throw new Exception("Invalid index input:" + index);
- }
- } else {
- throw new Exception("Invalid index input:" + index);
- }
- }
-
- /**
- * Close a bluetooth gatt
- *
- * @param index the bluetooth gatt index to close
- * @throws Exception
- */
- @Rpc(description = "Close a bluetooth gatt")
- public void gattServerClose(@RpcParameter(name = "index") Integer index) throws Exception {
- if (mBluetoothGattServerList.get(index) != null) {
- mBluetoothGattServerList.get(index).close();
- } else {
- throw new Exception("Invalid index input:" + index);
- }
- }
-
- /**
- * Get a list of Bluetooth Devices connnected to the bluetooth gatt
- *
- * @param index the bluetooth gatt index
- * @return List of BluetoothDevice Objects
- * @throws Exception
- */
- @Rpc(description = "Get a list of Bluetooth Devices connnected to the bluetooth gatt")
- public List<BluetoothDevice> gattGetConnectedDevices(@RpcParameter(name = "index") Integer index)
- throws Exception {
- if (mBluetoothGattServerList.get(index) != null) {
- return mBluetoothGattServerList.get(index).getConnectedDevices();
- } else {
- throw new Exception("Invalid index input:" + index);
- }
- }
-
- /**
- * Get the service from an input UUID
- *
- * @param index the bluetooth gatt index
- * @return BluetoothGattService related to the bluetooth gatt
- * @throws Exception
- */
- @Rpc(description = "Get the service from an input UUID")
- public ArrayList<String> gattGetServiceUuidList(@RpcParameter(name = "index") Integer index)
- throws Exception {
- if (mBluetoothGattServerList.get(index) != null) {
- ArrayList<String> serviceUuidList = new ArrayList<String>();
- for (BluetoothGattService service : mBluetoothGattServerList.get(index).getServices()) {
- serviceUuidList.add(service.getUuid().toString());
- }
- return serviceUuidList;
- } else {
- throw new Exception("Invalid index input:" + index);
- }
- }
-
- /**
- * Get the service from an input UUID
- *
- * @param index the bluetooth gatt index
- * @param uuid the String uuid that matches the service
- * @return BluetoothGattService related to the bluetooth gatt
- * @throws Exception
- */
- @Rpc(description = "Get the service from an input UUID")
- public BluetoothGattService gattGetService(@RpcParameter(name = "index") Integer index,
- @RpcParameter(name = "uuid") String uuid) throws Exception {
- if (mBluetoothGattServerList.get(index) != null) {
- return mBluetoothGattServerList.get(index).getService(UUID.fromString(uuid));
- } else {
- throw new Exception("Invalid index input:" + index);
- }
- }
-
- /**
- * Add a descriptor to a bluetooth gatt characteristic
- *
- * @param index the bluetooth gatt characteristic to add a descriptor to
- * @param descriptorIndex the descritor index to add to the characteristic
- * @throws Exception
- */
- @Rpc(description = "add descriptor to blutooth gatt characteristic")
- public void gattServerCharacteristicAddDescriptor(@RpcParameter(name = "index") Integer index,
- @RpcParameter(name = "descriptorIndex") Integer descriptorIndex) throws Exception {
- if (mCharacteristicList.get(index) != null) {
- if (mDescriptorList.get(descriptorIndex) != null) {
- mCharacteristicList.get(index).addDescriptor(mDescriptorList.get(descriptorIndex));
- } else {
- throw new Exception("Invalid descriptorIndex input:" + descriptorIndex);
- }
- } else {
- throw new Exception("Invalid index input:" + index);
- }
- }
-
- /**
- * Create a new Characteristic object
- *
- * @param characteristicUuid uuid The UUID for this characteristic
- * @param property Properties of this characteristic
- * @param permission permissions Permissions for this characteristic
- * @return
- */
- @Rpc(description = "Create a new Characteristic object")
- public int gattServerCreateBluetoothGattCharacteristic(
- @RpcParameter(name = "characteristicUuid") String characteristicUuid,
- @RpcParameter(name = "property") Integer property,
- @RpcParameter(name = "permission") Integer permission) {
- CharacteristicCount += 1;
- int index = CharacteristicCount;
- BluetoothGattCharacteristic characteristic =
- new BluetoothGattCharacteristic(UUID.fromString(characteristicUuid), property, permission);
- mCharacteristicList.put(index, characteristic);
- return index;
- }
-
- /**
- * Create a new GattCallback object
- *
- * @return the index of the callback object
- */
- @Rpc(description = "Create a new GattCallback object")
- public Integer gattServerCreateGattServerCallback() {
- GattServerCallbackCount += 1;
- int index = GattServerCallbackCount;
- mBluetoothGattServerCallbackList.put(index, new myBluetoothGattServerCallback(index));
- return index;
- }
-
- /**
- * Create a new Descriptor object
- *
- * @param descriptorUuid the UUID for this descriptor
- * @param permissions Permissions for this descriptor
- * @return the index of the Descriptor object
- */
- @Rpc(description = "Create a new Descriptor object")
- public int gattServerCreateBluetoothGattDescriptor(
- @RpcParameter(name = "descriptorUuid") String descriptorUuid,
- @RpcParameter(name = "permissions") Integer permissions) {
- DescriptorCount += 1;
- int index = DescriptorCount;
- BluetoothGattDescriptor descriptor =
- new BluetoothGattDescriptor(UUID.fromString(descriptorUuid), permissions);
- mDescriptorList.put(index, descriptor);
- return index;
- }
-
- private class myBluetoothGattServerCallback extends BluetoothGattServerCallback {
- private final Bundle mResults;
- private final int index;
- private final String mEventType;
-
- public myBluetoothGattServerCallback(int idx) {
- mResults = new Bundle();
- mEventType = "GattServer";
- index = idx;
- }
-
- @Override
- public void onServiceAdded(int status, BluetoothGattService service) {
- Log.d("gatt_server change onServiceAdded " + mEventType + " " + index);
- mResults.putString("serviceUuid", service.getUuid().toString());
- mResults.putInt("instanceId", service.getInstanceId());
- mEventFacade.postEvent(mEventType + index + "onServiceAdded", mResults.clone());
- mResults.clear();
- }
-
- @Override
- public void onCharacteristicReadRequest(BluetoothDevice device, int requestId, int offset,
- BluetoothGattCharacteristic characteristic) {
- Log.d("gatt_server change onCharacteristicReadRequest " + mEventType + " " + index);
- mResults.putInt("requestId", requestId);
- mResults.putInt("offset", offset);
- mResults.putInt("instanceId", characteristic.getInstanceId());
- mResults.putInt("properties", characteristic.getProperties());
- mResults.putString("uuid", characteristic.getUuid().toString());
- mResults.putInt("permissions", characteristic.getPermissions());
- mEventFacade.postEvent(mEventType + index + "onCharacteristicReadRequest", mResults.clone());
- mResults.clear();
- }
-
- @Override
- public void onCharacteristicWriteRequest(BluetoothDevice device, int requestId,
- BluetoothGattCharacteristic characteristic, boolean preparedWrite, boolean responseNeeded,
- int offset, byte[] value) {
- Log.d("gatt_server change onCharacteristicWriteRequest " + mEventType + " " + index);
- mResults.putInt("requestId", requestId);
- mResults.putInt("offset", offset);
- mResults.putParcelable("BluetoothDevice", device);
- mResults.putBoolean("preparedWrite", preparedWrite);
- mResults.putBoolean("responseNeeded", responseNeeded);
- mResults.putString("value", ConvertUtils.convertByteArrayToString(value));
- mResults.putInt("instanceId", characteristic.getInstanceId());
- mResults.putInt("properties", characteristic.getProperties());
- mResults.putString("uuid", characteristic.getUuid().toString());
- mResults.putInt("permissions", characteristic.getPermissions());
- mEventFacade.postEvent(mEventType + index + "onCharacteristicWriteRequest", mResults.clone());
- mResults.clear();
-
- }
-
- @Override
- public void onDescriptorReadRequest(BluetoothDevice device, int requestId, int offset,
- BluetoothGattDescriptor descriptor) {
- Log.d("gatt_server change onDescriptorReadRequest " + mEventType + " " + index);
- mResults.putInt("requestId", requestId);
- mResults.putInt("offset", offset);
- mResults.putParcelable("BluetoothDevice", device);
- mResults.putInt("instanceId", descriptor.getInstanceId());
- mResults.putInt("permissions", descriptor.getPermissions());
- mResults.putString("uuid", descriptor.getUuid().toString());
- mEventFacade.postEvent(mEventType + index + "onDescriptorReadRequest", mResults.clone());
- mResults.clear();
- }
-
- @Override
- public void onDescriptorWriteRequest(BluetoothDevice device, int requestId,
- BluetoothGattDescriptor descriptor, boolean preparedWrite, boolean responseNeeded,
- int offset, byte[] value) {
- Log.d("gatt_server change onDescriptorWriteRequest " + mEventType + " " + index);
- mResults.putInt("requestId", requestId);
- mResults.putInt("offset", offset);
- mResults.putParcelable("BluetoothDevice", device);
- mResults.putBoolean("preparedWrite", preparedWrite);
- mResults.putBoolean("responseNeeded", responseNeeded);
- mResults.putString("value", ConvertUtils.convertByteArrayToString(value));
- mResults.putInt("instanceId", descriptor.getInstanceId());
- mResults.putInt("permissions", descriptor.getPermissions());
- mResults.putString("uuid", descriptor.getUuid().toString());
- mEventFacade.postEvent(mEventType + index + "onDescriptorWriteRequest", mResults.clone());
- mResults.clear();
- }
-
- @Override
- public void onExecuteWrite(BluetoothDevice device, int requestId, boolean execute) {
- Log.d("gatt_server change onExecuteWrite " + mEventType + " " + index);
- mResults.putParcelable("BluetoothDevice", device);
- mResults.putInt("requestId", requestId);
- mResults.putBoolean("execute", execute);
- mEventFacade.postEvent(mEventType + index + "onExecuteWrite", mResults.clone());
- mResults.clear();
- }
-
- @Override
- public void onNotificationSent(BluetoothDevice device, int status) {
- Log.d("gatt_server change onNotificationSent " + mEventType + " " + index);
- mResults.putParcelable("BluetoothDevice", device);
- mResults.putInt("status", status);
- mEventFacade.postEvent(mEventType + index + "onNotificationSent", mResults.clone());
- mResults.clear();
- }
-
- @Override
- public void onConnectionStateChange(BluetoothDevice device, int status, int newState) {
- Log.d("gatt_server change onConnectionStateChange " + mEventType + " " + index);
- if (newState == BluetoothProfile.STATE_CONNECTED) {
- Log.d("State Connected to mac address " + device.getAddress() + " status " + status);
- } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
- Log.d("State Disconnected from mac address " + device.getAddress() + " status " + status);
- }
- mResults.putParcelable("BluetoothDevice", device);
- mResults.putInt("status", status);
- mResults.putInt("newState", newState);
- mEventFacade.postEvent(mEventType + index + "onConnectionStateChange", mResults.clone());
- mResults.clear();
- }
-
- @Override
- public void onMtuChanged(BluetoothDevice device, int mtu) {
- Log.d("gatt_server change onMtuChanged " + mEventType + " " + index);
- mResults.putParcelable("BluetoothDevice", device);
- mResults.putInt("mtu", mtu);
- mEventFacade.postEvent(mEventType + index + "onMtuChanged", mResults.clone());
- mResults.clear();
- }
- }
-
- @Override
- public void shutdown() {
- if (!mBluetoothGattServerList.isEmpty()) {
- if (mBluetoothGattServerList.values() != null) {
- for (BluetoothGattServer mBluetoothGattServer : mBluetoothGattServerList.values()) {
- mBluetoothGattServer.close();
- }
- }
- }
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/media/AudioManagerFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/media/AudioManagerFacade.java
deleted file mode 100644
index b611678..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/media/AudioManagerFacade.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.media;
-
-import android.app.Service;
-import android.content.Context;
-import android.media.AudioManager;
-import android.media.AudioManager.OnAudioFocusChangeListener;
-
-import com.googlecode.android_scripting.facade.EventFacade;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-
-public class AudioManagerFacade extends RpcReceiver {
-
- private final Service mService;
- private final EventFacade mEventFacade;
- private final AudioManager mAudio;
- private final OnAudioFocusChangeListener mFocusChangeListener;
- private boolean mIsFocused;
-
- public AudioManagerFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mEventFacade = manager.getReceiver(EventFacade.class);
- mAudio = (AudioManager) mService.getSystemService(Context.AUDIO_SERVICE);
- mFocusChangeListener = new OnAudioFocusChangeListener() {
- public void onAudioFocusChange(int focusChange) {
- if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) {
- mIsFocused = false;
- } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
- mIsFocused = true;
- }
- }
- };
- }
-
- @Rpc(description = "Checks whether any music is active.")
- public Boolean audioIsMusicActive() {
- return mAudio.isMusicActive();
- }
-
- @Rpc(description = "Checks whether A2DP audio routing to the Bluetooth headset is on or off.")
- public Boolean audioIsBluetoothA2dpOn() {
- return mAudio.isBluetoothA2dpOn();
- }
-
- @Rpc(description = "Request audio focus for sl4a.")
- public Boolean audioRequestAudioFocus() {
- int status = mAudio.requestAudioFocus(mFocusChangeListener,
- AudioManager.STREAM_MUSIC,
- AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);
- if (status == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
- mIsFocused = true;
- return true;
- }
- mIsFocused = false;
- return false;
- }
-
- @Rpc(description = "Whether sl4a has the audio focus or not.")
- public Boolean audioIsFocused() {
- return mIsFocused;
- }
-
- @Override
- public void shutdown() {
- mAudio.abandonAudioFocus(mFocusChangeListener);
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/media/MediaButtonCallback.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/media/MediaButtonCallback.java
deleted file mode 100644
index fc7c11e..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/media/MediaButtonCallback.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.media;
-
-import android.content.Intent;
-import android.media.session.MediaSession;
-import android.os.Bundle;
-import android.view.KeyEvent;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.facade.EventFacade;
-
-public class MediaButtonCallback extends MediaSession.Callback {
- private final EventFacade mEventFacade;
- public MediaButtonCallback(EventFacade eventFacade) {
- this.mEventFacade = eventFacade;
- }
- private void handleKeyEvent(KeyEvent event) {
- int keyCode = event.getKeyCode();
- Log.d("Received ACTION_DOWN with keycode " + keyCode);
- Bundle msg = new Bundle();
- if (keyCode == KeyEvent.KEYCODE_MEDIA_PLAY) {
- msg.putString("ButtonPressed", "Play");
- } else if (keyCode == KeyEvent.KEYCODE_MEDIA_PAUSE) {
- msg.putString("ButtonPressed", "Pause");
- } else if (keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE) {
- msg.putString("ButtonPressed", "PlayPause");
- } else if (keyCode == KeyEvent.KEYCODE_MEDIA_STOP) {
- msg.putString("ButtonPressed", "Stop");
- } else if (keyCode == KeyEvent.KEYCODE_MEDIA_NEXT) {
- msg.putString("ButtonPressed", "Next");
- } else if (keyCode == KeyEvent.KEYCODE_MEDIA_PREVIOUS) {
- msg.putString("ButtonPressed", "Previous");
- } else if (keyCode == KeyEvent.KEYCODE_MEDIA_FAST_FORWARD) {
- msg.putString("ButtonPressed", "Forward");
- } else if (keyCode == KeyEvent.KEYCODE_MEDIA_REWIND) {
- msg.putString("ButtonPressed", "Rewind");
- }
- Log.d("Sending MediaButton event with ButtonPressed value "
- + msg.getString("ButtonPressed"));
- this.mEventFacade.postEvent("MediaButton", msg);
- }
-
- @Override
- public boolean onMediaButtonEvent(Intent mediaButtonIntent) {
- String action = mediaButtonIntent.getAction();
- Log.d("Received intent with action " + action);
- if (action.equals(Intent.ACTION_MEDIA_BUTTON)) {
- KeyEvent event = (KeyEvent) mediaButtonIntent
- .getParcelableExtra(Intent.EXTRA_KEY_EVENT);
- int keyAction = event.getAction();
- Log.d("Received KeyEvent with action " + keyAction);
- if (keyAction == KeyEvent.ACTION_DOWN) {
- handleKeyEvent(event);
- } else if (keyAction == KeyEvent.ACTION_UP) {
- handleKeyEvent(event);
- }
- return true;
- }
- return super.onMediaButtonEvent(mediaButtonIntent);
- }
-} \ No newline at end of file
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/media/MediaPlayerFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/media/MediaPlayerFacade.java
deleted file mode 100644
index 3925a38..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/media/MediaPlayerFacade.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.media;
-
-import android.app.Service;
-import android.media.MediaPlayer;
-import android.net.Uri;
-
-import com.googlecode.android_scripting.facade.EventFacade;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcDefault;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.Map;
-import java.util.Set;
-import java.util.Map.Entry;
-
-/**
- * This facade exposes basic mediaPlayer functionality. <br>
- * <br>
- * <b>Usage Notes:</b><br>
- * mediaPlayerFacade maintains a list of media streams, identified by a user supplied tag. If the
- * tag is null or blank, this tag defaults to "default"<br>
- * Basic operation is: mediaPlayOpen("file:///sdcard/MP3/sample.mp3","mytag",true)<br>
- * This will look for a media file at /sdcard/MP3/sample.mp3. Other urls should work. If the file
- * exists and is playable, this will return a true otherwise it will return a false. <br>
- * If play=true, then the media file will play immediately, otherwise it will wait for a
- * {@link #mediaPlayStart mediaPlayerStart} command. <br>
- * When done with the resource, use {@link #mediaPlayClose mediaPlayClose} <br>
- * You can get information about the loaded media with {@link #mediaPlayInfo mediaPlayInfo} This
- * returns a map with the following elements:
- * <ul>
- * <li>"tag" - user supplied tag identifying this mediaPlayer.
- * <li>"loaded" - true if loaded, false if not. If false, no other elements are returned.
- * <li>"duration" - length of the media in milliseconds.
- * <li>"position" - current position of playback in milliseconds. Controlled by
- * {@link #mediaPlaySeek mediaPlaySeek}
- * <li>"isplaying" - shows whether media is playing. Controlled by {@link #mediaPlayPause
- * mediaPlayPause} and {@link #mediaPlayStart mediaPlayStart}
- * <li>"url" - the url used to open this media.
- * <li>"looping" - whether media will loop. Controlled by {@link #mediaPlaySetLooping
- * mediaPlaySetLooping}
- * </ul>
- * <br>
- * You can use {@link #mediaPlayList mediaPlayList} to get a list of the loaded tags. <br>
- * {@link #mediaIsPlaying mediaIsPlaying} will return true if the media is playing.<br>
- * <b>Events:</b><br>
- * A playing media will throw a <b>"media"</b> event on completion. NB: In remote mode, a media file
- * will continue playing after the script has finished unless an explicit {@link #mediaPlayClose
- * mediaPlayClose} event is called.
- *
- * @author Robbie Matthews (rjmatthews62@gmail.com)
- */
-
-public class MediaPlayerFacade extends RpcReceiver implements MediaPlayer.OnCompletionListener {
-
- private final Service mService;
- static private final Map<String, MediaPlayer> mPlayers = new Hashtable<String, MediaPlayer>();
- static private final Map<String, String> mUrls = new Hashtable<String, String>();
-
- private final EventFacade mEventFacade;
-
- public MediaPlayerFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mEventFacade = manager.getReceiver(EventFacade.class);
- }
-
- private String getDefault(String tag) {
- return (tag == null || tag.equals("")) ? "default" : tag;
- }
-
- private MediaPlayer getPlayer(String tag) {
- tag = getDefault(tag);
- return mPlayers.get(tag);
- }
-
- private String getUrl(String tag) {
- tag = getDefault(tag);
- return mUrls.get(tag);
- }
-
- private void putMp(String tag, MediaPlayer player, String url) {
- tag = getDefault(tag);
- mPlayers.put(tag, player);
- mUrls.put(tag, url);
- }
-
- private void removeMp(String tag) {
- tag = getDefault(tag);
- MediaPlayer player = mPlayers.get(tag);
- if (player != null) {
- player.stop();
- player.release();
- }
- mPlayers.remove(tag);
- mUrls.remove(tag);
- }
-
- @Rpc(description = "Open a media file", returns = "true if play successful")
- public synchronized boolean mediaPlayOpen(@RpcParameter(name = "url",
- description = "url of media resource")
- String url, @RpcParameter(name = "tag", description = "string identifying resource")
- @RpcDefault(value = "default")
- String tag, @RpcParameter(name = "play", description = "start playing immediately")
- @RpcDefault(value = "true")
- Boolean play) {
- removeMp(tag);
- MediaPlayer player = getPlayer(tag);
- player = MediaPlayer.create(mService, Uri.parse(url));
- if (player != null) {
- putMp(tag, player, url);
- player.setOnCompletionListener(this);
- if (play) {
- player.start();
- }
- }
- return player != null;
- }
-
- @Rpc(description = "pause playing media file", returns = "true if successful")
- public synchronized boolean mediaPlayPause(
- @RpcParameter(name = "tag", description = "string identifying resource")
- @RpcDefault(value = "default")
- String tag) {
- MediaPlayer player = getPlayer(tag);
- if (player == null) {
- return false;
- }
- player.pause();
- return true;
- }
-
- @Rpc(description = "Start playing media file.", returns = "true if successful")
- public synchronized boolean mediaPlayStart(
- @RpcParameter(name = "tag", description = "string identifying resource")
- @RpcDefault(value = "default")
- String tag) {
- MediaPlayer player = getPlayer(tag);
- if (player == null) {
- return false;
- }
- player.start();
- return mediaIsPlaying(tag);
- }
-
- @Rpc(description = "Stop playing media file.", returns = "true if successful")
- public synchronized boolean mediaPlayStop(
- @RpcParameter(name = "tag", description = "string identifying resource")
- @RpcDefault(value = "default")
- String tag) {
- MediaPlayer player = getPlayer(tag);
- if (player == null) {
- return false;
- }
- player.stop();
- return !mediaIsPlaying(tag) && player.getCurrentPosition() == 0;
- }
-
- @Rpc(description = "Stop all players.")
- public synchronized void mediaPlayStopAll() {
- for (MediaPlayer p : mPlayers.values()) {
- p.stop();
- }
- }
-
- @Rpc(description = "Seek To Position", returns = "New Position (in ms)")
- public synchronized int mediaPlaySeek(@RpcParameter(name = "msec",
- description = "Position in millseconds")
- Integer msec, @RpcParameter(name = "tag", description = "string identifying resource")
- @RpcDefault(value = "default")
- String tag) {
- MediaPlayer player = getPlayer(tag);
- if (player == null) {
- return 0;
- }
- player.seekTo(msec);
- return player.getCurrentPosition();
- }
-
- @Rpc(description = "Close media file", returns = "true if successful")
- public synchronized boolean mediaPlayClose(
- @RpcParameter(name = "tag", description = "string identifying resource")
- @RpcDefault(value = "default")
- String tag) throws Exception {
- if (!mPlayers.containsKey(tag)) {
- return false;
- }
- removeMp(tag);
- return true;
- }
-
- @Rpc(description = "Checks if media file is playing.", returns = "true if playing")
- public synchronized boolean mediaIsPlaying(
- @RpcParameter(name = "tag", description = "string identifying resource")
- @RpcDefault(value = "default")
- String tag) {
- MediaPlayer player = getPlayer(tag);
- return (player == null) ? false : player.isPlaying();
- }
-
- @Rpc(description = "Information on current media", returns = "Media Information")
- public synchronized Map<String, Object> mediaPlayGetInfo(
- @RpcParameter(name = "tag", description = "string identifying resource")
- @RpcDefault(value = "default")
- String tag) {
- Map<String, Object> result = new HashMap<String, Object>();
- MediaPlayer player = getPlayer(tag);
- result.put("tag", getDefault(tag));
- if (player == null) {
- result.put("loaded", false);
- } else {
- result.put("loaded", true);
- result.put("duration", player.getDuration());
- result.put("position", player.getCurrentPosition());
- result.put("isplaying", player.isPlaying());
- result.put("url", getUrl(tag));
- result.put("looping", player.isLooping());
- }
- return result;
- }
-
- @Rpc(description = "Lists currently loaded media", returns = "List of Media Tags")
- public Set<String> mediaPlayList() {
- return mPlayers.keySet();
- }
-
- @Rpc(description = "Set Looping", returns = "True if successful")
- public synchronized boolean mediaPlaySetLooping(@RpcParameter(name = "enabled")
- @RpcDefault(value = "true")
- Boolean enabled, @RpcParameter(name = "tag", description = "string identifying resource")
- @RpcDefault(value = "default")
- String tag) {
- MediaPlayer player = getPlayer(tag);
- if (player == null) {
- return false;
- }
- player.setLooping(enabled);
- return true;
- }
-
- @Rpc(description = "Checks if media file is playing.", returns = "true if playing")
- public synchronized void mediaSetNext(
- @RpcParameter(name = "tag", description = "string identifying resource")
- @RpcDefault(value = "default")
- String tag,
- @RpcParameter(name = "next", description = "tag of the next track to play.")
- String next) {
- MediaPlayer player = getPlayer(tag);
- MediaPlayer nPlayer = getPlayer(next);
- if (player == null) {
- throw new NullPointerException("Non-existent player tag " + tag);
- }
- if (nPlayer == null) {
- throw new NullPointerException("Non-existent player tag " + next);
- }
- player.setNextMediaPlayer(nPlayer);
- }
-
- @Override
- public synchronized void shutdown() {
- for (String key : mPlayers.keySet()) {
- MediaPlayer player = mPlayers.get(key);
- if (player != null) {
- player.stop();
- player.release();
- player = null;
- }
- }
- mPlayers.clear();
- mUrls.clear();
- }
-
- @Override
- public void onCompletion(MediaPlayer player) {
- String tag = getTag(player);
- if (tag != null) {
- Map<String, Object> data = new HashMap<String, Object>();
- data.put("action", "complete");
- data.put("tag", tag);
- mEventFacade.postEvent("media", data);
- }
- }
-
- private String getTag(MediaPlayer player) {
- for (Entry<String, MediaPlayer> m : mPlayers.entrySet()) {
- if (m.getValue() == player) {
- return m.getKey();
- }
- }
- return null;
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/media/MediaRecorderFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/media/MediaRecorderFacade.java
deleted file mode 100644
index ee67fe6..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/media/MediaRecorderFacade.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.media;
-
-import android.app.Service;
-import android.content.Intent;
-import android.media.MediaRecorder;
-import android.net.Uri;
-import android.provider.MediaStore;
-import android.view.SurfaceHolder;
-import android.view.SurfaceHolder.Callback;
-import android.view.SurfaceView;
-import android.view.WindowManager;
-
-import com.googlecode.android_scripting.BaseApplication;
-import com.googlecode.android_scripting.FutureActivityTaskExecutor;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.facade.AndroidFacade;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.future.FutureActivityTask;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcDefault;
-import com.googlecode.android_scripting.rpc.RpcOptional;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-import java.io.File;
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-/**
- * A facade for recording media.
- *
- * Guidance notes: Use e.g. '/sdcard/file.ext' for your media destination file. A file extension of
- * mpg will use the default settings for format and codec (often h263 which won't work with common
- * PC media players). A file extension of mp4 or 3gp will use the appropriate format with the (more
- * common) h264 codec. A video player such as QQPlayer (from the android market) plays both codecs
- * and uses the composition matrix (embedded in the video file) to correct for image rotation. Many
- * PC based media players ignore this matrix. Standard video sizes may be specified.
- *
- * @author Felix Arends (felix.arends@gmail.com)
- * @author Damon Kohler (damonkohler@gmail.com)
- * @author John Karwatzki (jokar49@gmail.com)
- */
-public class MediaRecorderFacade extends RpcReceiver {
-
- private final MediaRecorder mMediaRecorder = new MediaRecorder();
- private final Service mService;
-
- public MediaRecorderFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- }
-
- @Rpc(description = "Records audio from the microphone and saves it to the given location.")
- public void recorderStartMicrophone(@RpcParameter(name = "targetPath") String targetPath)
- throws IOException {
- startAudioRecording(targetPath, MediaRecorder.AudioSource.MIC);
- }
-
- @Rpc(description = "Records video from the camera and saves it to the given location. "
- + "\nDuration specifies the maximum duration of the recording session. "
- + "\nIf duration is 0 this method will return and the recording will only be stopped "
- + "\nwhen recorderStop is called or when a scripts exits. "
- + "\nOtherwise it will block for the time period equal to the duration argument."
- + "\nvideoSize: 0=160x120, 1=320x240, 2=352x288, 3=640x480, 4=800x480.")
- public void recorderStartVideo(@RpcParameter(name = "targetPath") String targetPath,
- @RpcParameter(name = "duration") @RpcDefault("0") Integer duration,
- @RpcParameter(name = "videoSize") @RpcDefault("1") Integer videoSize) throws Exception {
- int ms = convertSecondsToMilliseconds(duration);
- startVideoRecording(new File(targetPath), ms, videoSize);
- }
-
- private void startVideoRecording(File file, int milliseconds, int videoSize) throws Exception {
- mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
-
- int audioSource = MediaRecorder.AudioSource.MIC;
- try {
- Field source = Class.forName("android.media.MediaRecorder$AudioSource").getField("CAMCORDER");
- source.getInt(null);
- } catch (Exception e) {
- Log.e(e);
- }
- int xSize;
- int ySize;
- switch (videoSize) {
- case 0:
- xSize = 160;
- ySize = 120;
- break;
- case 1:
- xSize = 320;
- ySize = 240;
- break;
- case 2:
- xSize = 352;
- ySize = 288;
- break;
- case 3:
- xSize = 640;
- ySize = 480;
- break;
- case 4:
- xSize = 800;
- ySize = 480;
- break;
- default:
- xSize = 320;
- ySize = 240;
- break;
- }
-
- mMediaRecorder.setAudioSource(audioSource);
- String extension = file.toString().split("\\.")[1];
- if (extension.equals("mp4")) {
- mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
- mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
- mMediaRecorder.setVideoSize(xSize, ySize);
- mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
- } else if (extension.equals("3gp")) {
- mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
- mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
- mMediaRecorder.setVideoSize(xSize, ySize);
- mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
- } else {
-
- mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
- mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
- mMediaRecorder.setVideoSize(xSize, ySize);
- mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
- }
-
- mMediaRecorder.setOutputFile(file.getAbsolutePath());
- if (milliseconds > 0) {
- mMediaRecorder.setMaxDuration(milliseconds);
- }
- FutureActivityTask<Exception> prepTask = prepare();
- mMediaRecorder.start();
- if (milliseconds > 0) {
- new CountDownLatch(1).await(milliseconds, TimeUnit.MILLISECONDS);
- }
- prepTask.finish();
- }
-
- @Rpc(description = "Records video (and optionally audio) from the camera and saves it to the given location. "
- + "\nDuration specifies the maximum duration of the recording session. "
- + "\nIf duration is not provided this method will return immediately and the recording will only be stopped "
- + "\nwhen recorderStop is called or when a scripts exits. "
- + "\nOtherwise it will block for the time period equal to the duration argument.")
- public void recorderCaptureVideo(@RpcParameter(name = "targetPath") String targetPath,
- @RpcParameter(name = "duration") @RpcOptional Integer duration,
- @RpcParameter(name = "recordAudio") @RpcDefault("true") Boolean recordAudio) throws Exception {
- int ms = convertSecondsToMilliseconds(duration);
- startVideoRecording(new File(targetPath), ms, recordAudio);
- }
-
- private void startVideoRecording(File file, int milliseconds, boolean withAudio) throws Exception {
- mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
- if (withAudio) {
- int audioSource = MediaRecorder.AudioSource.MIC;
- try {
- Field source =
- Class.forName("android.media.MediaRecorder$AudioSource").getField("CAMCORDER");
- audioSource = source.getInt(null);
- } catch (Exception e) {
- Log.e(e);
- }
- mMediaRecorder.setAudioSource(audioSource);
- mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
- mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
- } else {
- mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
- }
- mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
- mMediaRecorder.setOutputFile(file.getAbsolutePath());
- if (milliseconds > 0) {
- mMediaRecorder.setMaxDuration(milliseconds);
- }
- FutureActivityTask<Exception> prepTask = prepare();
- mMediaRecorder.start();
- if (milliseconds > 0) {
- new CountDownLatch(1).await(milliseconds, TimeUnit.MILLISECONDS);
- }
- prepTask.finish();
- }
-
- private void startAudioRecording(String targetPath, int source) throws IOException {
- mMediaRecorder.setAudioSource(source);
- mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
- mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
- mMediaRecorder.setOutputFile(targetPath);
- mMediaRecorder.prepare();
- mMediaRecorder.start();
- }
-
- @Rpc(description = "Stops a previously started recording.")
- public void recorderStop() {
- mMediaRecorder.stop();
- mMediaRecorder.reset();
- }
-
- @Rpc(description = "Starts the video capture application to record a video and saves it to the specified path.")
- public void startInteractiveVideoRecording(@RpcParameter(name = "path") final String path) {
- Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
- File file = new File(path);
- intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
- AndroidFacade facade = mManager.getReceiver(AndroidFacade.class);
- facade.startActivityForResult(intent);
- }
-
- @Override
- public void shutdown() {
- mMediaRecorder.release();
- }
-
- // TODO(damonkohler): This shares a lot of code with the CameraFacade. It's probably worth moving
- // it there.
- private FutureActivityTask<Exception> prepare() throws Exception {
- FutureActivityTask<Exception> task = new FutureActivityTask<Exception>() {
- @Override
- public void onCreate() {
- super.onCreate();
- final SurfaceView view = new SurfaceView(getActivity());
- getActivity().setContentView(view);
- getActivity().getWindow().setSoftInputMode(
- WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED);
- view.getHolder().addCallback(new Callback() {
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
- }
-
- @Override
- public void surfaceCreated(SurfaceHolder holder) {
- try {
- mMediaRecorder.setPreviewDisplay(view.getHolder().getSurface());
- mMediaRecorder.prepare();
- setResult(null);
- } catch (IOException e) {
- setResult(e);
- }
- }
-
- @Override
- public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
- }
- });
- }
- };
-
- FutureActivityTaskExecutor taskExecutor =
- ((BaseApplication) mService.getApplication()).getTaskExecutor();
- taskExecutor.execute(task);
-
- Exception e = task.getResult();
- if (e != null) {
- throw e;
- }
- return task;
- }
-
- private int convertSecondsToMilliseconds(Integer seconds) {
- if (seconds == null) {
- return 0;
- }
- return (int) (seconds * 1000L);
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/media/MediaScannerFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/media/MediaScannerFacade.java
deleted file mode 100644
index fd885c7..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/media/MediaScannerFacade.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.media;
-
-import android.app.Service;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.media.MediaScanner;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Environment;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.facade.EventFacade;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-/**
- * Expose functionalities of MediaScanner related APIs.
- */
-public class MediaScannerFacade extends RpcReceiver {
-
- private final Service mService;
- private final MediaScanner mScanService;
- private final EventFacade mEventFacade;
- private final MediaScannerReceiver mReceiver;
-
- public MediaScannerFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mScanService = new MediaScanner(mService, "external");
- mEventFacade = manager.getReceiver(EventFacade.class);
- mReceiver = new MediaScannerReceiver();
- }
-
- public class MediaScannerReceiver extends BroadcastReceiver {
-
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if(action.equals(Intent.ACTION_MEDIA_SCANNER_FINISHED)) {
- Log.d("Scan finished, posting event.");
- mEventFacade.postEvent("MediaScanFinished", new Bundle());
- mService.unregisterReceiver(mReceiver);
- }
- }
- }
-
- @Rpc(description = "Scan external storage for media files.")
- public void mediaScanForFiles() {
- mService.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
- Uri.parse("file://" + Environment.getExternalStorageDirectory())));
- mService.registerReceiver(mReceiver,
- new IntentFilter(Intent.ACTION_MEDIA_SCANNER_FINISHED));
- }
-
- @Rpc(description = "Scan for a media file.")
- public void mediaScanForOneFile(@RpcParameter(name = "path") String path) {
- mService.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse(path)));
- }
-
- @Override
- public void shutdown() {
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/media/MediaSessionFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/media/MediaSessionFacade.java
deleted file mode 100644
index 130b392..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/media/MediaSessionFacade.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.media;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.Callable;
-
-import android.app.Service;
-import android.content.ComponentName;
-import android.content.Context;
-import android.media.session.MediaController;
-import android.media.session.MediaSession;
-import android.media.session.MediaSessionManager;
-import android.media.session.MediaSessionManager.OnActiveSessionsChangedListener;
-import android.media.session.PlaybackState;
-import android.media.session.MediaSession.Callback;
-import android.view.KeyEvent;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.MainThread;
-import com.googlecode.android_scripting.facade.EventFacade;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcDefault;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-/**
- * Expose functionalities of MediaSession related classes
- * like MediaSession, MediaSessionManager, MediaController.
- *
- */
-public class MediaSessionFacade extends RpcReceiver {
-
- private final Service mService;
- private final EventFacade mEventFacade;
- private final MediaSession mSession;
- private final MediaSessionManager mManager;
- private final OnActiveSessionsChangedListener mSessionListener;
- private final Callback mCallback;
-
- private List<MediaController> mActiveControllers = null;
-
- public MediaSessionFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mEventFacade = manager.getReceiver(EventFacade.class);
- Log.d("Creating MediaSession.");
- mSession = new MediaSession(mService, "SL4A");
- mSession.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS);
- mManager = (MediaSessionManager) mService.getSystemService(Context.MEDIA_SESSION_SERVICE);
- mCallback = new MediaButtonCallback(mEventFacade);
- mSessionListener = new MediaSessionListener();
- mManager.addOnActiveSessionsChangedListener(mSessionListener,
- new ComponentName(mService.getPackageName(), this.getClass().getName()));
- mSession.setActive(true);
- }
-
- private class MediaSessionListener implements OnActiveSessionsChangedListener {
-
- @Override
- public void onActiveSessionsChanged(List<MediaController> controllers) {
- Log.d("Active MediaSessions have changed. Update current controller.");
- int size = controllers.size();
- for (int i = 0; i < size; i++) {
- MediaController controller = controllers.get(i);
- long flags = controller.getFlags();
- // We only care about sessions that handle transport controls,
- // which will be true for apps using RCC
- if ((flags & MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS) != 0) {
- Log.d("The current active MediaSessions is " + controller.getTag());
- return;
- }
- }
- }
- }
-
- @Rpc(description = "Retrieve a list of active sessions.")
- public List<String> mediaGetActiveSessions() {
- mActiveControllers = mManager.getActiveSessions(null);
- List<String> results = new ArrayList<String>();
- for (MediaController mc : mActiveControllers) {
- results.add(mc.getTag());
- }
- return results;
- }
-
- @Rpc(description = "Add callback to media session.")
- public void mediaSessionAddCallback() {
- MainThread.run(mService, new Callable<Object>() {
- @Override
- public Object call() throws Exception {
- Log.d("Adding callback.");
- mSession.setCallback(mCallback);
- PlaybackState.Builder bob = new PlaybackState.Builder();
- bob.setActions(PlaybackState.ACTION_PLAY |
- PlaybackState.ACTION_PAUSE |
- PlaybackState.ACTION_STOP);
- bob.setState(PlaybackState.STATE_PLAYING, 0, 1);
- mSession.setPlaybackState(bob.build());
- return null;
- }
- });
- }
-
- @Rpc(description = "Whether current media session is active.")
- public Boolean mediaSessionIsActive() {
- return mSession.isActive();
- }
-
- @Rpc(description = "Simulate a media key press.")
- public void mediaDispatchMediaKeyEvent(String key) {
- int keyCode;
- if (key.equals("Play")) {
- keyCode = KeyEvent.KEYCODE_MEDIA_PLAY;
- } else if (key.equals("Pause")) {
- keyCode = KeyEvent.KEYCODE_MEDIA_PAUSE;
- } else if (key.equals("Stop")) {
- keyCode = KeyEvent.KEYCODE_MEDIA_STOP;
- } else if (key.equals("Next")) {
- keyCode = KeyEvent.KEYCODE_MEDIA_NEXT;
- } else if (key.equals("Previous")) {
- keyCode = KeyEvent.KEYCODE_MEDIA_PREVIOUS;
- } else if (key.equals("Forward")) {
- keyCode = KeyEvent.KEYCODE_MEDIA_FAST_FORWARD;
- } else if (key.equals("Rewind")) {
- keyCode = KeyEvent.KEYCODE_MEDIA_REWIND;
- } else {
- Log.d("Unrecognized media key.");
- return;
- }
- KeyEvent keyDown = new KeyEvent(KeyEvent.ACTION_DOWN, keyCode);
- KeyEvent keyUp = new KeyEvent(KeyEvent.ACTION_DOWN, keyCode);
- mManager.dispatchMediaKeyEvent(keyDown);
- mManager.dispatchMediaKeyEvent(keyUp);
- }
-
- private MediaController getMediaController(int idx) {
- return mActiveControllers.get(idx);
- }
-
- @Rpc(description = "Call Play on the currently active media session.")
- public void mediaSessionPlay(@RpcParameter(name = "index") @RpcDefault(value = "0")
- Integer idx) {
- getMediaController(idx).getTransportControls().play();
- }
-
- @Rpc(description = "Call Pause on the currently active media session.")
- public void mediaSessionPause(@RpcParameter(name = "index") @RpcDefault(value = "0")
- Integer idx) {
- getMediaController(idx).getTransportControls().pause();
- }
-
- @Rpc(description = "Call Stop on the currently active media session.")
- public void mediaSessionStop(@RpcParameter(name = "index") @RpcDefault(value = "0")
- Integer idx) {
- getMediaController(idx).getTransportControls().stop();
- }
-
- @Rpc(description = "Call Next on the currently active media session.")
- public void mediaSessionNext(@RpcParameter(name = "index") @RpcDefault(value = "0")
- Integer idx) {
- getMediaController(idx).getTransportControls().skipToNext();
- }
-
- @Override
- public void shutdown() {
- mSession.setCallback(null);
- mSession.release();
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/CarrierConfigFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/CarrierConfigFacade.java
deleted file mode 100644
index fc4d061..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/CarrierConfigFacade.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.telephony;
-
-import android.app.Activity;
-import android.app.Service;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.telephony.CarrierConfigManager;
-
-import com.googlecode.android_scripting.facade.AndroidFacade;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcDefault;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.MainThread;
-import com.googlecode.android_scripting.rpc.RpcOptional;
-
-public class CarrierConfigFacade extends RpcReceiver {
- private final Service mService;
- private final AndroidFacade mAndroidFacade;
- private final CarrierConfigManager mCarrierConfigManager;
-
- public CarrierConfigFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mAndroidFacade = manager.getReceiver(AndroidFacade.class);
- mCarrierConfigManager =
- (CarrierConfigManager)mService.getSystemService(Context.CARRIER_CONFIG_SERVICE);
- }
-
- @Rpc(description = "Tethering Entitlement Check")
- public boolean carrierConfigIsTetheringModeAllowed(String mode, Integer timeout) {
- String[] mProvisionApp = mService.getResources().getStringArray(
- com.android.internal.R.array.config_mobile_hotspot_provision_app);
- /* following check defined in
- frameworks/base/packages/SettingsLib/src/com/android/settingslib/TetherUtil.java
- isProvisioningNeeded
- */
- if ((mProvisionApp == null) || (mProvisionApp.length != 2)){
- Log.d("carrierConfigIsTetheringModeAllowed: no check is present.");
- return true;
- }
- Log.d("carrierConfigIsTetheringModeAllowed mProvisionApp 0 " + mProvisionApp[0]);
- Log.d("carrierConfigIsTetheringModeAllowed mProvisionApp 1 " + mProvisionApp[1]);
-
- /* defined in frameworks/base/packages/SettingsLib/src/com/android/settingslib/TetherUtil.java
- public static final int INVALID = -1;
- public static final int WIFI_TETHERING = 0;
- public static final int USB_TETHERING = 1;
- public static final int BLUETOOTH_TETHERING = 2;
- */
- // TODO: b/26273844 need to use android.settingslib.TetherUtil to
- // replace those private defines.
- final int INVALID = -1;
- final int WIFI_TETHERING = 0;
- final int USB_TETHERING = 1;
- final int BLUETOOTH_TETHERING = 2;
-
- /* defined in packages/apps/Settings/src/com/android/settings/TetherSettings.java
- private static final int PROVISION_REQUEST = 0;
- */
- final int PROVISION_REQUEST = 0;
-
- int mTetherChoice = INVALID;
- if (mode.equals("wifi")){
- mTetherChoice = WIFI_TETHERING;
- } else if (mode.equals("usb")) {
- mTetherChoice = USB_TETHERING;
- } else if (mode.equals("bluetooth")) {
- mTetherChoice = BLUETOOTH_TETHERING;
- }
- Intent intent = new Intent(Intent.ACTION_MAIN);
- intent.setClassName(mProvisionApp[0], mProvisionApp[1]);
- intent.putExtra("TETHER_TYPE", mTetherChoice);
- int result;
- try{
- result = mAndroidFacade.startActivityForResultCodeWithTimeout(
- intent, PROVISION_REQUEST, timeout);
- } catch (Exception e) {
- Log.d("phoneTetherCheck exception" + e.toString());
- return false;
- }
-
- if (result == Activity.RESULT_OK) {
- return true;
- } else {
- return false;
- }
- }
-
- @Override
- public void shutdown() {
-
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/ImsManagerFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/ImsManagerFacade.java
deleted file mode 100755
index 0a67c34..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/ImsManagerFacade.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.telephony;
-
-import android.app.Service;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.telephony.SubscriptionManager;
-
-import com.android.ims.ImsException;
-import com.android.ims.ImsManager;
-import com.android.ims.ImsConfig;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-/**
- * Exposes ImsManager functionality.
- */
-public class ImsManagerFacade extends RpcReceiver {
-
- private final Service mService;
- private final Context mContext;
- private ImsManager mImsManager;
-
- public ImsManagerFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mContext = mService.getBaseContext();
- mImsManager = ImsManager.getInstance(mContext,
- SubscriptionManager.getDefaultVoicePhoneId());
- }
-
- @Rpc(description = "Return True if Enhanced 4g Lte mode is enabled by platform.")
- public boolean imsIsEnhanced4gLteModeSettingEnabledByPlatform() {
- return ImsManager.isVolteEnabledByPlatform(mContext);
- }
-
- @Rpc(description = "Return True if Enhanced 4g Lte mode is enabled by user.")
- public boolean imsIsEnhanced4gLteModeSettingEnabledByUser() {
- return ImsManager.isEnhanced4gLteModeSettingEnabledByUser(mContext);
- }
-
- @Rpc(description = "Set Enhanced 4G mode.")
- public void imsSetEnhanced4gMode(
- @RpcParameter(name = "enable") Boolean enable) {
- ImsManager.setEnhanced4gLteModeSetting(mContext, enable);
- }
-
- @Rpc(description = "Check for VoLTE Provisioning.")
- public boolean imsIsVolteProvisionedOnDevice() {
- return mImsManager.isVolteProvisionedOnDevice(mContext);
- }
-
- @Rpc(description = "Set Modem Provisioning for VoLTE")
- public void imsSetVolteProvisioning(
- @RpcParameter(name = "enable") Boolean enable)
- throws ImsException{
- mImsManager.getConfigInterface().setProvisionedValue(
- ImsConfig.ConfigConstants.VLT_SETTING_ENABLED,
- enable? 1 : 0);
- }
-
- /**************************
- * Begin WFC Calling APIs
- **************************/
-
- @Rpc(description = "Return True if WiFi Calling is enabled for platform.")
- public boolean imsIsWfcEnabledByPlatform() {
- return ImsManager.isWfcEnabledByPlatform(mContext);
- }
-
- @Rpc(description = "Set whether or not WFC is enabled during roaming")
- public void imsSetWfcRoamingSetting(
- @RpcParameter(name = "enable")
- Boolean enable) {
- ImsManager.setWfcRoamingSetting(mContext, enable);
-
- }
-
- @Rpc(description = "Return True if WiFi Calling is enabled during roaming.")
- public boolean imsIsWfcRoamingEnabledByUser() {
- return ImsManager.isWfcRoamingEnabledByUser(mContext);
- }
-
- @Rpc(description = "Set the Wifi Calling Mode of operation")
- public void imsSetWfcMode(
- @RpcParameter(name = "mode")
- String mode)
- throws IllegalArgumentException {
-
- int mode_val;
-
- switch (mode.toUpperCase()) {
- case TelephonyConstants.WFC_MODE_WIFI_ONLY:
- mode_val =
- ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY;
- break;
- case TelephonyConstants.WFC_MODE_CELLULAR_PREFERRED:
- mode_val =
- ImsConfig.WfcModeFeatureValueConstants.CELLULAR_PREFERRED;
- break;
- case TelephonyConstants.WFC_MODE_WIFI_PREFERRED:
- mode_val =
- ImsConfig.WfcModeFeatureValueConstants.WIFI_PREFERRED;
- break;
- case TelephonyConstants.WFC_MODE_DISABLED:
- if (ImsManager.isWfcEnabledByPlatform(mContext) &&
- ImsManager.isWfcEnabledByUser(mContext) == true) {
- ImsManager.setWfcSetting(mContext, false);
- }
- return;
- default:
- throw new IllegalArgumentException("Invalid WfcMode");
- }
-
- ImsManager.setWfcMode(mContext, mode_val);
- if (ImsManager.isWfcEnabledByPlatform(mContext) &&
- ImsManager.isWfcEnabledByUser(mContext) == false) {
- ImsManager.setWfcSetting(mContext, true);
- }
-
- return;
- }
-
- @Rpc(description = "Return current WFC Mode if Enabled.")
- public String imsGetWfcMode() {
- if(ImsManager.isWfcEnabledByUser(mContext) == false) {
- return TelephonyConstants.WFC_MODE_DISABLED;
- }
- return TelephonyUtils.getWfcModeString(
- ImsManager.getWfcMode(mContext));
- }
-
- @Rpc(description = "Return True if WiFi Calling is enabled by user.")
- public boolean imsIsWfcEnabledByUser() {
- return ImsManager.isWfcEnabledByUser(mContext);
- }
-
- @Rpc(description = "Set whether or not WFC is enabled")
- public void imsSetWfcSetting(
- @RpcParameter(name = "enable") Boolean enable) {
- ImsManager.setWfcSetting(mContext,enable);
- }
-
- /**************************
- * Begin VT APIs
- **************************/
-
- @Rpc(description = "Return True if Video Calling is enabled by the platform.")
- public boolean imsIsVtEnabledByPlatform() {
- return ImsManager.isVtEnabledByPlatform(mContext);
- }
-
- @Override
- public void shutdown() {
-
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/InCallServiceImpl.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/InCallServiceImpl.java
deleted file mode 100644
index 965735a..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/InCallServiceImpl.java
+++ /dev/null
@@ -1,1416 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.telephony;
-
-import java.util.HashMap;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-import android.telecom.Call;
-import android.telecom.Call.Details;
-import android.telecom.CallAudioState;
-import android.telecom.Conference;
-import android.telecom.Connection;
-import android.telecom.ConnectionService;
-import android.telecom.InCallService;
-import android.telecom.Phone;
-import android.telecom.TelecomManager;
-import android.telecom.VideoProfile;
-import android.telecom.VideoProfile.CameraCapabilities;
-
-import com.googlecode.android_scripting.Log;
-
-import com.googlecode.android_scripting.facade.EventFacade;
-
-public class InCallServiceImpl extends InCallService {
-
- private static InCallServiceImpl mService = null;
-
- public static InCallServiceImpl getService() {
- return mService;
- }
-
- private static Object mLock = new Object();
-
- // Provides a return value for getCallState when no call is active
- public static final int STATE_INVALID = -1;
-
- // Provides a return value for getCallQuality when input is invalid
- public static final int QUALITY_INVALID = -1;
-
- // Provides a return value for getAudioRoute when input is invalid
- public static final int INVALID_AUDIO_ROUTE = -1;
-
- public static final int VIDEO_STATE_AUDIO_ONLY = VideoProfile.STATE_AUDIO_ONLY;
-
- public static final int VIDEO_STATE_TX_ENABLED = VideoProfile.STATE_TX_ENABLED;
-
- public static final int VIDEO_STATE_RX_ENABLED = VideoProfile.STATE_RX_ENABLED;
-
- public static final int VIDEO_STATE_BIDIRECTIONAL = VideoProfile.STATE_BIDIRECTIONAL;
-
- public static final int VIDEO_STATE_TX_PAUSED =
- VideoProfile.STATE_TX_ENABLED | VideoProfile.STATE_PAUSED;
-
- public static final int VIDEO_STATE_RX_PAUSED =
- VideoProfile.STATE_RX_ENABLED | VideoProfile.STATE_PAUSED;
-
- public static final int VIDEO_STATE_BIDIRECTIONAL_PAUSED =
- VideoProfile.STATE_BIDIRECTIONAL | VideoProfile.STATE_PAUSED;
-
- // Container class to return the call ID along with the event
- public class CallEvent<EventType> {
-
- private final String mCallId;
- private final EventType mEvent;
-
- CallEvent(String callId, EventType event) {
- mCallId = callId;
- mEvent = event;
- }
-
- public String getCallId() {
- return mCallId;
- }
-
- public EventType getEvent() {
- return mEvent;
- }
- }
-
- // Currently the same as a call event... here for future use
- public class VideoCallEvent<EventType> extends CallEvent<EventType> {
- VideoCallEvent(String callId, EventType event) {
- super(callId, event);
- }
- }
-
- private class CallCallback extends Call.Callback {
-
- // Invalid video state (valid >= 0)
- public static final int STATE_INVALID = InCallServiceImpl.STATE_INVALID;
-
- public static final int EVENT_INVALID = -1;
- public static final int EVENT_NONE = 0;
- public static final int EVENT_STATE_CHANGED = 1 << 0;
- public static final int EVENT_PARENT_CHANGED = 1 << 1;
- public static final int EVENT_CHILDREN_CHANGED = 1 << 2;
- public static final int EVENT_DETAILS_CHANGED = 1 << 3;
- public static final int EVENT_CANNED_TEXT_RESPONSES_LOADED = 1 << 4;
- public static final int EVENT_POST_DIAL_WAIT = 1 << 5;
- public static final int EVENT_VIDEO_CALL_CHANGED = 1 << 6;
- public static final int EVENT_CALL_DESTROYED = 1 << 7;
- public static final int EVENT_CONFERENCABLE_CALLS_CHANGED = 1 << 8;
-
- public static final int EVENT_ALL = EVENT_STATE_CHANGED |
- EVENT_PARENT_CHANGED |
- EVENT_CHILDREN_CHANGED |
- EVENT_DETAILS_CHANGED |
- EVENT_CANNED_TEXT_RESPONSES_LOADED |
- EVENT_POST_DIAL_WAIT |
- EVENT_VIDEO_CALL_CHANGED |
- EVENT_DETAILS_CHANGED |
- EVENT_CALL_DESTROYED |
- EVENT_CONFERENCABLE_CALLS_CHANGED;
-
- private int mEvents;
- private String mCallId;
-
- public CallCallback(String callId, int events) {
- super();
- mEvents = events & EVENT_ALL;
- mCallId = callId;
- }
-
- public void startListeningForEvents(int events) {
- mEvents |= events & EVENT_ALL;
- }
-
- public void stopListeningForEvents(int events) {
- mEvents &= ~(events & EVENT_ALL);
- }
-
- @Override
- public void onStateChanged(
- Call call, int state) {
- Log.d("CallCallback:onStateChanged()");
- if ((mEvents & EVENT_STATE_CHANGED)
- == EVENT_STATE_CHANGED) {
- servicePostEvent(TelephonyConstants.EventTelecomCallStateChanged,
- new CallEvent<String>(mCallId, getCallStateString(state)));
- }
- }
-
- @Override
- public void onParentChanged(
- Call call, Call parent) {
- Log.d("CallCallback:onParentChanged()");
- if ((mEvents & EVENT_PARENT_CHANGED)
- == EVENT_PARENT_CHANGED) {
- servicePostEvent(TelephonyConstants.EventTelecomCallParentChanged,
- new CallEvent<String>(mCallId, getCallId(parent)));
- }
- }
-
- @Override
- public void onChildrenChanged(
- Call call, List<Call> children) {
- Log.d("CallCallback:onChildrenChanged()");
-
- if ((mEvents & EVENT_CHILDREN_CHANGED)
- == EVENT_CHILDREN_CHANGED) {
- List<String> childList = new ArrayList<String>();
-
- for (Call child : children) {
- childList.add(getCallId(child));
- }
- servicePostEvent(TelephonyConstants.EventTelecomCallChildrenChanged,
- new CallEvent<List<String>>(mCallId, childList));
- }
- }
-
- @Override
- public void onDetailsChanged(
- Call call, Details details) {
- Log.d("CallCallback:onDetailsChanged()");
-
- if ((mEvents & EVENT_DETAILS_CHANGED)
- == EVENT_DETAILS_CHANGED) {
- servicePostEvent(TelephonyConstants.EventTelecomCallDetailsChanged,
- new CallEvent<Details>(mCallId, details));
- }
- }
-
- @Override
- public void onCannedTextResponsesLoaded(
- Call call, List<String> cannedTextResponses) {
- Log.d("CallCallback:onCannedTextResponsesLoaded()");
- if ((mEvents & EVENT_CANNED_TEXT_RESPONSES_LOADED)
- == EVENT_CANNED_TEXT_RESPONSES_LOADED) {
- servicePostEvent(TelephonyConstants.EventTelecomCallCannedTextResponsesLoaded,
- new CallEvent<List<String>>(mCallId, cannedTextResponses));
- }
- }
-
- @Override
- public void onPostDialWait(
- Call call, String remainingPostDialSequence) {
- Log.d("CallCallback:onPostDialWait()");
- if ((mEvents & EVENT_POST_DIAL_WAIT)
- == EVENT_POST_DIAL_WAIT) {
- servicePostEvent(TelephonyConstants.EventTelecomCallPostDialWait,
- new CallEvent<String>(mCallId, remainingPostDialSequence));
- }
- }
-
- @Override
- public void onVideoCallChanged(
- Call call, InCallService.VideoCall videoCall) {
-
- /*
- * There is a race condition such that the lifetime of the VideoCall is not aligned with
- * the lifetime of the underlying call object. We are using the onVideoCallChanged
- * method as a way of determining the lifetime of the VideoCall object rather than
- * onCallAdded/onCallRemoved.
- */
- Log.d("CallCallback:onVideoCallChanged()");
-
- if (call != null) {
- String callId = getCallId(call);
- CallContainer cc = mCallContainerMap.get(callId);
- if (cc == null) {
- Log.d(String.format("Call container returned null for callId %s", callId));
- }
- else {
- synchronized (mLock) {
- if (videoCall == null) {
- Log.d("Yo dawg, I heard you like null video calls.");
- // Try and see if the videoCall has been added/changed after firing the
- // callback
- // This probably won't work.
- videoCall = call.getVideoCall();
- }
- if (cc.getVideoCall() != videoCall) {
- if (videoCall == null) {
- // VideoCall object deleted
- cc.updateVideoCall(null, null);
- Log.d("Removing video call from call.");
- }
- else if (cc.getVideoCall() != null) {
- // Somehow we have a mismatched VideoCall ID!
- Log.d("Mismatched video calls for same call ID.");
- }
- else {
- Log.d("Huzzah, we have a video call!");
-
- VideoCallCallback videoCallCallback =
- new VideoCallCallback(callId, VideoCallCallback.EVENT_NONE);
-
- videoCall.registerCallback(videoCallCallback);
-
- cc.updateVideoCall(
- videoCall,
- videoCallCallback);
- }
- }
- else {
- Log.d("Change to existing video call.");
- }
-
- }
- }
- }
- else {
- Log.d("passed null call pointer to call callback");
- }
-
- if ((mEvents & EVENT_VIDEO_CALL_CHANGED)
- == EVENT_VIDEO_CALL_CHANGED) {
- // TODO: b/26273778 Need to determine what to return;
- // probably not the whole video call
- servicePostEvent(TelephonyConstants.EventTelecomCallVideoCallChanged,
- new CallEvent<String>(mCallId, videoCall.toString()));
- }
- }
-
- @Override
- public void onCallDestroyed(Call call) {
- Log.d("CallCallback:onCallDestroyed()");
-
- if ((mEvents & EVENT_CALL_DESTROYED)
- == EVENT_CALL_DESTROYED) {
- servicePostEvent(TelephonyConstants.EventTelecomCallDestroyed,
- new CallEvent<Call>(mCallId, call));
- }
- }
-
- @Override
- public void onConferenceableCallsChanged(
- Call call, List<Call> conferenceableCalls) {
- Log.d("CallCallback:onConferenceableCallsChanged()");
-
- if ((mEvents & EVENT_CONFERENCABLE_CALLS_CHANGED)
- == EVENT_CONFERENCABLE_CALLS_CHANGED) {
- List<String> confCallList = new ArrayList<String>();
- for (Call cc : conferenceableCalls) {
- confCallList.add(getCallId(cc));
- }
- servicePostEvent(TelephonyConstants.EventTelecomCallConferenceableCallsChanged,
- new CallEvent<List<String>>(mCallId, confCallList));
- }
- }
- }
-
- private class VideoCallCallback extends InCallService.VideoCall.Callback {
-
- public static final int EVENT_INVALID = -1;
- public static final int EVENT_NONE = 0;
- public static final int EVENT_SESSION_MODIFY_REQUEST_RECEIVED = 1 << 0;
- public static final int EVENT_SESSION_MODIFY_RESPONSE_RECEIVED = 1 << 1;
- public static final int EVENT_SESSION_EVENT = 1 << 2;
- public static final int EVENT_PEER_DIMENSIONS_CHANGED = 1 << 3;
- public static final int EVENT_VIDEO_QUALITY_CHANGED = 1 << 4;
- public static final int EVENT_DATA_USAGE_CHANGED = 1 << 5;
- public static final int EVENT_CAMERA_CAPABILITIES_CHANGED = 1 << 6;
- public static final int EVENT_ALL =
- EVENT_SESSION_MODIFY_REQUEST_RECEIVED |
- EVENT_SESSION_MODIFY_RESPONSE_RECEIVED |
- EVENT_SESSION_EVENT |
- EVENT_PEER_DIMENSIONS_CHANGED |
- EVENT_VIDEO_QUALITY_CHANGED |
- EVENT_DATA_USAGE_CHANGED |
- EVENT_CAMERA_CAPABILITIES_CHANGED;
-
- private String mCallId;
- private int mEvents;
-
- public VideoCallCallback(String callId, int listeners) {
-
- mCallId = callId;
- mEvents = listeners & EVENT_ALL;
- }
-
- public void startListeningForEvents(int events) {
- Log.d(String.format(
- "VideoCallCallback(%s):startListeningForEvents(%x): events:%x",
- mCallId, events, mEvents));
-
- mEvents |= events & EVENT_ALL;
-
- }
-
- public void stopListeningForEvents(int events) {
- mEvents &= ~(events & EVENT_ALL);
- }
-
- @Override
- public void onSessionModifyRequestReceived(VideoProfile videoProfile) {
- Log.d(String.format("VideoCallCallback(%s):onSessionModifyRequestReceived()", mCallId));
-
- if ((mEvents & EVENT_SESSION_MODIFY_REQUEST_RECEIVED)
- == EVENT_SESSION_MODIFY_REQUEST_RECEIVED) {
- servicePostEvent(TelephonyConstants.EventTelecomVideoCallSessionModifyRequestReceived,
- new VideoCallEvent<VideoProfile>(mCallId, videoProfile));
- }
-
- }
-
- @Override
- public void onSessionModifyResponseReceived(int status,
- VideoProfile requestedProfile, VideoProfile responseProfile) {
- Log.d("VideoCallCallback:onSessionModifyResponseReceived()");
-
- if ((mEvents & EVENT_SESSION_MODIFY_RESPONSE_RECEIVED)
- == EVENT_SESSION_MODIFY_RESPONSE_RECEIVED) {
-
- HashMap<String, VideoProfile> smrrInfo = new HashMap<String, VideoProfile>();
-
- smrrInfo.put("RequestedProfile", requestedProfile);
- smrrInfo.put("ResponseProfile", responseProfile);
-
- servicePostEvent(TelephonyConstants.EventTelecomVideoCallSessionModifyResponseReceived,
- new VideoCallEvent<HashMap<String, VideoProfile>>(mCallId, smrrInfo));
- }
- }
-
- @Override
- public void onCallSessionEvent(int event) {
- Log.d("VideoCallCallback:onCallSessionEvent()");
-
- String eventString = getVideoCallSessionEventString(event);
-
- if ((mEvents & EVENT_SESSION_EVENT)
- == EVENT_SESSION_EVENT) {
- servicePostEvent(TelephonyConstants.EventTelecomVideoCallSessionEvent,
- new VideoCallEvent<String>(mCallId, eventString));
- }
- }
-
- @Override
- public void onPeerDimensionsChanged(int width, int height) {
- Log.d("VideoCallCallback:onPeerDimensionsChanged()");
-
- if ((mEvents & EVENT_PEER_DIMENSIONS_CHANGED)
- == EVENT_PEER_DIMENSIONS_CHANGED) {
-
- HashMap<String, Integer> temp = new HashMap<String, Integer>();
- temp.put("Width", width);
- temp.put("Height", height);
-
- servicePostEvent(TelephonyConstants.EventTelecomVideoCallPeerDimensionsChanged,
- new VideoCallEvent<HashMap<String, Integer>>(mCallId, temp));
- }
- }
-
- @Override
- public void onVideoQualityChanged(int videoQuality) {
- Log.d("VideoCallCallback:onVideoQualityChanged()");
-
- if ((mEvents & EVENT_VIDEO_QUALITY_CHANGED)
- == EVENT_VIDEO_QUALITY_CHANGED) {
- servicePostEvent(TelephonyConstants.EventTelecomVideoCallVideoQualityChanged,
- new VideoCallEvent<String>(mCallId,
- getVideoCallQualityString(videoQuality)));
- }
- }
-
- @Override
- public void onCallDataUsageChanged(long dataUsage) {
- Log.d("VideoCallCallback:onCallDataUsageChanged()");
-
- if ((mEvents & EVENT_DATA_USAGE_CHANGED)
- == EVENT_DATA_USAGE_CHANGED) {
- servicePostEvent(TelephonyConstants.EventTelecomVideoCallDataUsageChanged,
- new VideoCallEvent<Long>(mCallId, dataUsage));
- }
- }
-
- @Override
- public void onCameraCapabilitiesChanged(
- CameraCapabilities cameraCapabilities) {
- Log.d("VideoCallCallback:onCallDataUsageChanged()");
-
- if ((mEvents & EVENT_DATA_USAGE_CHANGED)
- == EVENT_DATA_USAGE_CHANGED) {
- servicePostEvent(TelephonyConstants.EventTelecomVideoCallCameraCapabilities,
- new VideoCallEvent<CameraCapabilities>(mCallId, cameraCapabilities));
- }
-
- }
- }
-
- /*
- * Container Class for Call and CallCallback Objects
- */
- private class CallContainer {
-
- /*
- * Call Container Members
- */
-
- private Call mCall;
- private CallCallback mCallCallback;
- private VideoCall mVideoCall;
- private VideoCallCallback mVideoCallCallback;
-
- /*
- * Call Container Functions
- */
-
- public CallContainer(Call call,
- CallCallback callback,
- VideoCall videoCall,
- VideoCallCallback videoCallCallback) {
- mCall = call;
- mCallCallback = callback;
- mVideoCall = videoCall;
- mVideoCallCallback = videoCallCallback;
- }
-
- public Call getCall() {
- return mCall;
- }
-
- public CallCallback getCallback() {
- return mCallCallback;
- }
-
- public InCallService.VideoCall getVideoCall() {
- return mVideoCall;
- }
-
- public VideoCallCallback getVideoCallCallback() {
- return mVideoCallCallback;
- }
-
- public void updateVideoCall(VideoCall videoCall, VideoCallCallback videoCallCallback) {
- if (videoCall == null && videoCallCallback != null) {
- Log.d("UpdateVideoCall: videoCall and videoCallCallback are null.");
- return;
- }
- mVideoCall = videoCall;
- mVideoCallCallback = videoCallCallback;
- }
- }
-
- /*
- * TODO: b/26272583 Refactor so that these are instance members of the
- * incallservice. Then we can perform null checks using the design pattern
- * of the "manager" classes.
- */
-
- private static EventFacade mEventFacade = null;
- private static HashMap<String, CallContainer> mCallContainerMap =
- new HashMap<String, CallContainer>();
-
- @Override
- public void onCallAdded(Call call) {
- Log.d("onCallAdded: " + call.toString());
- String id = getCallId(call);
- Log.d("Adding " + id);
- CallCallback callCallback = new CallCallback(id, CallCallback.EVENT_NONE);
-
- call.registerCallback(callCallback);
-
- VideoCall videoCall = call.getVideoCall();
- VideoCallCallback videoCallCallback = null;
-
- if (videoCall != null) {
- synchronized (mLock) {
- if (getVideoCallById(id) == null) {
- videoCallCallback = new VideoCallCallback(id, VideoCallCallback.EVENT_NONE);
- videoCall.registerCallback(videoCallCallback);
- }
- }
- }
- else {
- // No valid video object
- Log.d("No Video Call provided to InCallService.");
- }
-
- mCallContainerMap.put(id,
- new CallContainer(call,
- callCallback,
- videoCall,
- videoCallCallback));
-
- /*
- * Once we have a call active, anchor the inCallService instance as a psuedo-singleton.
- * Because object lifetime is not guaranteed we shouldn't do this in the
- * constructor/destructor.
- */
- if (mService == null) {
- mService = this;
- }
- else if (mService != this) {
- Log.e("Multiple InCall Services Active in SL4A!");
- }
- }
-
- @Override
- public void onCallRemoved(Call call) {
- Log.d("onCallRemoved: " + call.toString());
- String id = getCallId(call);
- Log.d("Removing " + id);
-
- mCallContainerMap.remove(id);
-
- if (mCallContainerMap.size() == 0) {
- mService = null;
- }
- }
-
- public static void setEventFacade(EventFacade facade) {
- Log.d(String.format("setEventFacade(): Settings SL4A event facade to %s",
- (facade != null) ? facade.toString() : "null"));
- mEventFacade = facade;
- }
-
- private static boolean servicePostEvent(String eventName, Object event) {
-
- if (mEventFacade == null) {
- Log.d("servicePostEvent():SL4A eventFacade Is Null!!");
- return false;
- }
-
- mEventFacade.postEvent(eventName, event);
-
- return true;
- }
-
- public static String getCallId(Call call) {
- if (call != null) {
- return call.toString();
- }
- else
- return "";
- }
-
- public static String getVideoCallId(InCallServiceImpl.VideoCall videoCall) {
- if (videoCall != null)
- return videoCall.toString();
- else
- return "";
- }
-
- private static Call getCallById(String callId) {
-
- CallContainer cc = mCallContainerMap.get(callId);
-
- if (cc != null) {
- return cc.getCall();
- }
-
- return null;
- }
-
- private static CallCallback getCallCallbackById(String callId) {
-
- CallContainer cc = mCallContainerMap.get(callId);
-
- if (cc != null) {
- return cc.getCallback();
- }
-
- return null;
- }
-
- private static InCallService.VideoCall getVideoCallById(String callId) {
-
- CallContainer cc = mCallContainerMap.get(callId);
-
- if (cc != null) {
- return cc.getVideoCall();
-
- }
-
- return null;
- }
-
- private static VideoCallCallback
- getVideoCallListenerById(String callId) {
-
- CallContainer cc = mCallContainerMap.get(callId);
-
- if (cc != null) {
- return cc.getVideoCallCallback();
- }
-
- return null;
- }
-
- /*
- * Public Call/Phone Functions
- */
-
- public static void callDisconnect(String callId) {
- Call c = getCallById(callId);
- if (c == null) {
- Log.d("callDisconnect: callId is null");
- return;
- }
-
- c.disconnect();
- }
-
- public static void holdCall(String callId) {
- Call c = getCallById(callId);
- if (c == null) {
- Log.d("holdCall: callId is null");
- return;
- }
- c.hold();
- }
-
- public static void mergeCallsInConference(String callId) {
- Call c = getCallById(callId);
- if (c == null) {
- Log.d("mergeCallsInConference: callId is null");
- return;
- }
- c.mergeConference();
- }
-
- public static void splitCallFromConf(String callId) {
- Call c = getCallById(callId);
- if (c == null) {
- Log.d("splitCallFromConf: callId is null");
- return;
- }
- c.splitFromConference();
- }
-
- public static void unholdCall(String callId) {
- Call c = getCallById(callId);
- if (c == null) {
- Log.d("unholdCall: callId is null");
- return;
- }
- c.unhold();
- }
-
- public static void joinCallsInConf(String callIdOne, String callIdTwo) {
- Call callOne = getCallById(callIdOne);
- Call callTwo = getCallById(callIdTwo);
-
- if (callOne == null || callTwo == null) {
- Log.d("joinCallsInConf: callOne or CallTwo is null");
- return;
- }
-
- callOne.conference(callTwo);
- }
-
- public static Set<String> getCallIdList() {
- return mCallContainerMap.keySet();
- }
-
- public static void clearCallList() {
- mCallContainerMap.clear();
- }
-
- public static String callGetState(String callId) {
- Call c = getCallById(callId);
- if (c == null) {
- return getCallStateString(STATE_INVALID);
- }
-
- return getCallStateString(c.getState());
- }
-
- public static Call.Details callGetDetails(String callId) {
- Call c = getCallById(callId);
- if (c == null) {
- Log.d(String.format("Couldn't find an active call with ID:%s", callId));
- return null;
- }
-
- return c.getDetails();
- }
-
- public static List<String> callGetCallProperties(String callId) {
- Call.Details details = callGetDetails(callId);
-
- if (details == null) {
- return null;
- }
-
- return getCallPropertiesString(details.getCallProperties());
- }
-
- public static List<String> callGetCallCapabilities(String callId) {
- Call.Details details = callGetDetails(callId);
-
- if (details == null) {
- return null;
- }
-
- return getCallCapabilitiesString(details.getCallCapabilities());
- }
-
- @SuppressWarnings("deprecation")
- public static void overrideProximitySensor(Boolean screenOn) {
- InCallServiceImpl svc = getService();
- if (svc == null) {
- Log.d("overrideProximitySensor: InCallServiceImpl is null.");
- return;
- }
-
- Phone phone = svc.getPhone();
- if (phone == null) {
- Log.d("overrideProximitySensor: phone is null.");
- return;
- }
-
- phone.setProximitySensorOff(screenOn);
- }
-
- public static CallAudioState serviceGetCallAudioState() {
- InCallServiceImpl svc = getService();
-
- if (svc != null) {
- return svc.getCallAudioState();
- }
- else {
- return null;
- }
- }
-
- // Wonky name due to conflict with internal function
- public static void serviceSetAudioRoute(String route) {
- InCallServiceImpl svc = getService();
-
- if (svc == null) {
- Log.d("serviceSetAudioRoute: InCallServiceImpl is null.");
- return;
- }
-
- int r = getAudioRoute(route);
-
- Log.d(String.format("Setting Audio Route to %s:%d", route, r));
-
- if (r == INVALID_AUDIO_ROUTE) {
- Log.d(String.format("Invalid Audio route %s:%d", route, r));
- return;
- }
- svc.setAudioRoute(r);
- }
-
- public static void callStartListeningForEvent(String callId, String strEvent) {
-
- CallCallback cl = getCallCallbackById(callId);
-
- if (cl == null) {
- Log.d("callStartListeningForEvent: CallCallback is null.");
- return;
- }
-
- int event = getCallCallbackEvent(strEvent);
-
- if (event == CallCallback.EVENT_INVALID) {
- Log.d("callStartListeningForEvent: event is invalid.");
- return;
- }
-
- cl.startListeningForEvents(event);
- }
-
- public static void callStopListeningForEvent(String callId, String strEvent) {
- CallCallback cl = getCallCallbackById(callId);
-
- if (cl == null) {
- Log.d("callStopListeningForEvent: CallCallback is null.");
- return;
- }
-
- int event = getCallCallbackEvent(strEvent);
-
- if (event == CallCallback.EVENT_INVALID) {
- Log.d("callStopListeningForEvent: event is invalid.");
- return;
- }
-
- cl.stopListeningForEvents(event);
- }
-
- public static void videoCallStartListeningForEvent(String callId, String strEvent) {
- VideoCallCallback cl = getVideoCallListenerById(callId);
-
- if (cl == null) {
- Log.d(String.format("Couldn't find a call with call id:%s", callId));
- return;
- }
-
- int event = getVideoCallCallbackEvent(strEvent);
-
- if (event == VideoCallCallback.EVENT_INVALID) {
- Log.d(String.format("Failed to find a valid event:[%s]", strEvent));
- return;
- }
-
- cl.startListeningForEvents(event);
- }
-
- public static void videoCallStopListeningForEvent(String callId, String strEvent) {
- VideoCallCallback cl = getVideoCallListenerById(callId);
-
- if (cl == null) {
- Log.d("videoCallStopListeningForEvent: CallCallback is null.");
- return;
- }
-
- int event = getVideoCallCallbackEvent(strEvent);
-
- if (event == VideoCallCallback.EVENT_INVALID) {
- Log.d("getVideoCallCallbackEvent: event is invalid.");
- return;
- }
-
- cl.stopListeningForEvents(event);
- }
-
- public static String videoCallGetState(String callId) {
- Call c = getCallById(callId);
-
- int state = CallCallback.STATE_INVALID;
-
- if (c == null) {
- Log.d("videoCallGetState: call is null.");
- }
- else {
- state = c.getDetails().getVideoState();
- }
-
- return getVideoCallStateString(state);
- }
-
- public static void videoCallSendSessionModifyRequest(
- String callId, String videoStateString, String videoQualityString) {
- VideoCall vc = getVideoCallById(callId);
-
- if (vc == null) {
- Log.d("Invalid video call for call ID");
- return;
- }
-
- int videoState = getVideoCallState(videoStateString);
- int videoQuality = getVideoCallQuality(videoQualityString);
-
- Log.d(String.format("Sending Modify request for %s:%d, %s:%d",
- videoStateString, videoState, videoQualityString, videoQuality));
-
- if (videoState == CallCallback.STATE_INVALID ||
- videoQuality == QUALITY_INVALID || videoQuality == VideoProfile.QUALITY_UNKNOWN) {
- Log.d("Invalid session modify request!");
- return;
- }
-
- vc.sendSessionModifyRequest(new VideoProfile(videoState, videoQuality));
- }
-
- public static void videoCallSendSessionModifyResponse(
- String callId, String videoStateString, String videoQualityString) {
- VideoCall vc = getVideoCallById(callId);
-
- if (vc == null) {
- Log.d("Invalid video call for call ID");
- return;
- }
-
- int videoState = getVideoCallState(videoStateString);
- int videoQuality = getVideoCallQuality(videoQualityString);
-
- Log.d(String.format("Sending Modify request for %s:%d, %s:%d",
- videoStateString, videoState, videoQualityString, videoQuality));
-
- if (videoState == CallCallback.STATE_INVALID ||
- videoQuality == QUALITY_INVALID || videoQuality == VideoProfile.QUALITY_UNKNOWN) {
- Log.d("Invalid session modify request!");
- return;
- }
-
- vc.sendSessionModifyResponse(new VideoProfile(videoState, videoQuality));
- }
-
- public static void callAnswer(String callId, String videoState) {
- Call c = getCallById(callId);
-
- if (c == null) {
- Log.d("callAnswer: call is null.");
- }
-
- int state = getVideoCallState(videoState);
-
- if (state == CallCallback.STATE_INVALID) {
- Log.d("callAnswer: video state is invalid.");
- state = VideoProfile.STATE_AUDIO_ONLY;
- }
-
- c.answer(state);
- }
-
- public static void callReject(String callId, String message) {
- Call c = getCallById(callId);
-
- if (c == null) {
- Log.d("callReject: call is null.");
- }
-
- c.reject((message != null) ? true : false, message);
- }
-
- public static String getCallParent(String callId) {
- Call c = getCallById(callId);
-
- if (c == null) {
- Log.d("getCallParent: call is null.");
- return null;
- }
- Call callParent = c.getParent();
- return getCallId(callParent);
- }
-
- public static List<String> getCallChildren(String callId) {
- Call c = getCallById(callId);
-
- if (c == null) {
- Log.d("getCallChildren: call is null.");
- return null;
- }
- List<String> childrenList = new ArrayList<String>();
- List<Call> callChildren = c.getChildren();
- for (Call call : callChildren) {
- childrenList.add(getCallId(call));
- }
- return childrenList;
- }
-
- public static void swapCallsInConference(String callId) {
- Call c = getCallById(callId);
- if (c == null) {
- Log.d("swapCallsInConference: call is null.");
- return;
- }
- c.swapConference();
- }
-
- public static void callPlayDtmfTone(String callId, char digit) {
- Call c = getCallById(callId);
- if (c == null) {
- Log.d("callPlayDtmfTone: call is null.");
- return;
- }
- c.playDtmfTone(digit);
- }
-
- public static void callStopDtmfTone(String callId) {
- Call c = getCallById(callId);
- if (c == null) {
- Log.d("callStopDtmfTone: call is null.");
- return;
- }
- c.stopDtmfTone();
- }
-
- public static List<String> callGetCannedTextResponses(String callId) {
- Call c = getCallById(callId);
- if (c == null) {
- return null;
- }
-
- return c.getCannedTextResponses();
- }
-
- /*
- * String Mapping Functions for Facade Parameter Translation
- */
-
- public static String getVideoCallStateString(int state) {
- switch (state) {
- case VIDEO_STATE_AUDIO_ONLY:
- return TelephonyConstants.VT_STATE_AUDIO_ONLY;
- case VIDEO_STATE_TX_ENABLED:
- return TelephonyConstants.VT_STATE_TX_ENABLED;
- case VIDEO_STATE_RX_ENABLED:
- return TelephonyConstants.VT_STATE_RX_ENABLED;
- case VIDEO_STATE_BIDIRECTIONAL:
- return TelephonyConstants.VT_STATE_BIDIRECTIONAL;
- case VIDEO_STATE_TX_PAUSED:
- return TelephonyConstants.VT_STATE_TX_PAUSED;
- case VIDEO_STATE_RX_PAUSED:
- return TelephonyConstants.VT_STATE_RX_PAUSED;
- case VIDEO_STATE_BIDIRECTIONAL_PAUSED:
- return TelephonyConstants.VT_STATE_BIDIRECTIONAL_PAUSED;
- default:
- }
- Log.d("getVideoCallStateString: state is invalid.");
- return TelephonyConstants.VT_STATE_STATE_INVALID;
- }
-
- public static int getVideoCallState(String state) {
- switch (state.toUpperCase()) {
- case TelephonyConstants.VT_STATE_AUDIO_ONLY:
- return VIDEO_STATE_AUDIO_ONLY;
- case TelephonyConstants.VT_STATE_TX_ENABLED:
- return VIDEO_STATE_TX_ENABLED;
- case TelephonyConstants.VT_STATE_RX_ENABLED:
- return VIDEO_STATE_RX_ENABLED;
- case TelephonyConstants.VT_STATE_BIDIRECTIONAL:
- return VIDEO_STATE_BIDIRECTIONAL;
- case TelephonyConstants.VT_STATE_TX_PAUSED:
- return VIDEO_STATE_TX_PAUSED;
- case TelephonyConstants.VT_STATE_RX_PAUSED:
- return VIDEO_STATE_RX_PAUSED;
- case TelephonyConstants.VT_STATE_BIDIRECTIONAL_PAUSED:
- return VIDEO_STATE_BIDIRECTIONAL_PAUSED;
-
- default:
- }
- Log.d("getVideoCallState: state is invalid.");
- return CallCallback.STATE_INVALID;
- }
-
- private static int getVideoCallQuality(String quality) {
-
- switch (quality.toUpperCase()) {
- case TelephonyConstants.VT_VIDEO_QUALITY_UNKNOWN:
- return VideoProfile.QUALITY_UNKNOWN;
- case TelephonyConstants.VT_VIDEO_QUALITY_HIGH:
- return VideoProfile.QUALITY_HIGH;
- case TelephonyConstants.VT_VIDEO_QUALITY_MEDIUM:
- return VideoProfile.QUALITY_MEDIUM;
- case TelephonyConstants.VT_VIDEO_QUALITY_LOW:
- return VideoProfile.QUALITY_LOW;
- case TelephonyConstants.VT_VIDEO_QUALITY_DEFAULT:
- return VideoProfile.QUALITY_DEFAULT;
- default:
- }
- Log.d("getVideoCallQuality: quality is invalid.");
- return QUALITY_INVALID;
- }
-
- public static String getVideoCallQualityString(int quality) {
- switch (quality) {
- case VideoProfile.QUALITY_UNKNOWN:
- return TelephonyConstants.VT_VIDEO_QUALITY_UNKNOWN;
- case VideoProfile.QUALITY_HIGH:
- return TelephonyConstants.VT_VIDEO_QUALITY_HIGH;
- case VideoProfile.QUALITY_MEDIUM:
- return TelephonyConstants.VT_VIDEO_QUALITY_MEDIUM;
- case VideoProfile.QUALITY_LOW:
- return TelephonyConstants.VT_VIDEO_QUALITY_LOW;
- case VideoProfile.QUALITY_DEFAULT:
- return TelephonyConstants.VT_VIDEO_QUALITY_DEFAULT;
- default:
- }
- Log.d("getVideoCallQualityString: quality is invalid.");
- return TelephonyConstants.VT_VIDEO_QUALITY_INVALID;
- }
-
- private static int getCallCallbackEvent(String event) {
-
- switch (event.toUpperCase()) {
- case "EVENT_STATE_CHANGED":
- return CallCallback.EVENT_STATE_CHANGED;
- case "EVENT_PARENT_CHANGED":
- return CallCallback.EVENT_PARENT_CHANGED;
- case "EVENT_CHILDREN_CHANGED":
- return CallCallback.EVENT_CHILDREN_CHANGED;
- case "EVENT_DETAILS_CHANGED":
- return CallCallback.EVENT_DETAILS_CHANGED;
- case "EVENT_CANNED_TEXT_RESPONSES_LOADED":
- return CallCallback.EVENT_CANNED_TEXT_RESPONSES_LOADED;
- case "EVENT_POST_DIAL_WAIT":
- return CallCallback.EVENT_POST_DIAL_WAIT;
- case "EVENT_VIDEO_CALL_CHANGED":
- return CallCallback.EVENT_VIDEO_CALL_CHANGED;
- case "EVENT_CALL_DESTROYED":
- return CallCallback.EVENT_CALL_DESTROYED;
- case "EVENT_CONFERENCABLE_CALLS_CHANGED":
- return CallCallback.EVENT_CONFERENCABLE_CALLS_CHANGED;
- }
- Log.d("getCallCallbackEvent: event is invalid.");
- return CallCallback.EVENT_INVALID;
- }
-
- public static String getCallCallbackEventString(int event) {
-
- switch (event) {
- case CallCallback.EVENT_STATE_CHANGED:
- return "EVENT_STATE_CHANGED";
- case CallCallback.EVENT_PARENT_CHANGED:
- return "EVENT_PARENT_CHANGED";
- case CallCallback.EVENT_CHILDREN_CHANGED:
- return "EVENT_CHILDREN_CHANGED";
- case CallCallback.EVENT_DETAILS_CHANGED:
- return "EVENT_DETAILS_CHANGED";
- case CallCallback.EVENT_CANNED_TEXT_RESPONSES_LOADED:
- return "EVENT_CANNED_TEXT_RESPONSES_LOADED";
- case CallCallback.EVENT_POST_DIAL_WAIT:
- return "EVENT_POST_DIAL_WAIT";
- case CallCallback.EVENT_VIDEO_CALL_CHANGED:
- return "EVENT_VIDEO_CALL_CHANGED";
- case CallCallback.EVENT_CALL_DESTROYED:
- return "EVENT_CALL_DESTROYED";
- case CallCallback.EVENT_CONFERENCABLE_CALLS_CHANGED:
- return "EVENT_CONFERENCABLE_CALLS_CHANGED";
- }
- Log.d("getCallCallbackEventString: event is invalid.");
- return "EVENT_INVALID";
- }
-
- private static int getVideoCallCallbackEvent(String event) {
-
- switch (event) {
- case TelephonyConstants.EVENT_VIDEO_SESSION_MODIFY_REQUEST_RECEIVED:
- return VideoCallCallback.EVENT_SESSION_MODIFY_REQUEST_RECEIVED;
- case TelephonyConstants.EVENT_VIDEO_SESSION_MODIFY_RESPONSE_RECEIVED:
- return VideoCallCallback.EVENT_SESSION_MODIFY_RESPONSE_RECEIVED;
- case TelephonyConstants.EVENT_VIDEO_SESSION_EVENT:
- return VideoCallCallback.EVENT_SESSION_EVENT;
- case TelephonyConstants.EVENT_VIDEO_PEER_DIMENSIONS_CHANGED:
- return VideoCallCallback.EVENT_PEER_DIMENSIONS_CHANGED;
- case TelephonyConstants.EVENT_VIDEO_QUALITY_CHANGED:
- return VideoCallCallback.EVENT_VIDEO_QUALITY_CHANGED;
- case TelephonyConstants.EVENT_VIDEO_DATA_USAGE_CHANGED:
- return VideoCallCallback.EVENT_DATA_USAGE_CHANGED;
- case TelephonyConstants.EVENT_VIDEO_CAMERA_CAPABILITIES_CHANGED:
- return VideoCallCallback.EVENT_CAMERA_CAPABILITIES_CHANGED;
- }
- Log.d("getVideoCallCallbackEvent: event is invalid.");
- return CallCallback.EVENT_INVALID;
- }
-
- public static String getVideoCallCallbackEventString(int event) {
-
- switch (event) {
- case VideoCallCallback.EVENT_SESSION_MODIFY_REQUEST_RECEIVED:
- return TelephonyConstants.EVENT_VIDEO_SESSION_MODIFY_REQUEST_RECEIVED;
- case VideoCallCallback.EVENT_SESSION_MODIFY_RESPONSE_RECEIVED:
- return TelephonyConstants.EVENT_VIDEO_SESSION_MODIFY_RESPONSE_RECEIVED;
- case VideoCallCallback.EVENT_SESSION_EVENT:
- return TelephonyConstants.EVENT_VIDEO_SESSION_EVENT;
- case VideoCallCallback.EVENT_PEER_DIMENSIONS_CHANGED:
- return TelephonyConstants.EVENT_VIDEO_PEER_DIMENSIONS_CHANGED;
- case VideoCallCallback.EVENT_VIDEO_QUALITY_CHANGED:
- return TelephonyConstants.EVENT_VIDEO_QUALITY_CHANGED;
- case VideoCallCallback.EVENT_DATA_USAGE_CHANGED:
- return TelephonyConstants.EVENT_VIDEO_DATA_USAGE_CHANGED;
- case VideoCallCallback.EVENT_CAMERA_CAPABILITIES_CHANGED:
- return TelephonyConstants.EVENT_VIDEO_CAMERA_CAPABILITIES_CHANGED;
- }
- Log.d("getVideoCallCallbackEventString: event is invalid.");
- return TelephonyConstants.EVENT_VIDEO_INVALID;
- }
-
- public static String getCallStateString(int state) {
- switch (state) {
- case Call.STATE_NEW:
- return TelephonyConstants.CALL_STATE_NEW;
- case Call.STATE_DIALING:
- return TelephonyConstants.CALL_STATE_DIALING;
- case Call.STATE_RINGING:
- return TelephonyConstants.CALL_STATE_RINGING;
- case Call.STATE_HOLDING:
- return TelephonyConstants.CALL_STATE_HOLDING;
- case Call.STATE_ACTIVE:
- return TelephonyConstants.CALL_STATE_ACTIVE;
- case Call.STATE_DISCONNECTED:
- return TelephonyConstants.CALL_STATE_DISCONNECTED;
- case Call.STATE_PRE_DIAL_WAIT:
- return TelephonyConstants.CALL_STATE_PRE_DIAL_WAIT;
- case Call.STATE_CONNECTING:
- return TelephonyConstants.CALL_STATE_CONNECTING;
- case Call.STATE_DISCONNECTING:
- return TelephonyConstants.CALL_STATE_DISCONNECTING;
- case STATE_INVALID:
- return TelephonyConstants.CALL_STATE_INVALID;
- default:
- return TelephonyConstants.CALL_STATE_UNKNOWN;
- }
- }
-
- private static int getAudioRoute(String audioRoute) {
- switch (audioRoute.toUpperCase()) {
- case TelephonyConstants.AUDIO_ROUTE_BLUETOOTH:
- return CallAudioState.ROUTE_BLUETOOTH;
- case TelephonyConstants.AUDIO_ROUTE_EARPIECE:
- return CallAudioState.ROUTE_EARPIECE;
- case TelephonyConstants.AUDIO_ROUTE_SPEAKER:
- return CallAudioState.ROUTE_SPEAKER;
- case TelephonyConstants.AUDIO_ROUTE_WIRED_HEADSET:
- return CallAudioState.ROUTE_WIRED_HEADSET;
- case TelephonyConstants.AUDIO_ROUTE_WIRED_OR_EARPIECE:
- return CallAudioState.ROUTE_WIRED_OR_EARPIECE;
- default:
- return INVALID_AUDIO_ROUTE;
- }
- }
-
- public static String getAudioRouteString(int audioRoute) {
- return CallAudioState.audioRouteToString(audioRoute);
- }
-
- public static String getVideoCallSessionEventString(int event) {
-
- switch (event) {
- case Connection.VideoProvider.SESSION_EVENT_RX_PAUSE:
- return TelephonyConstants.SESSION_EVENT_RX_PAUSE;
- case Connection.VideoProvider.SESSION_EVENT_RX_RESUME:
- return TelephonyConstants.SESSION_EVENT_RX_RESUME;
- case Connection.VideoProvider.SESSION_EVENT_TX_START:
- return TelephonyConstants.SESSION_EVENT_TX_START;
- case Connection.VideoProvider.SESSION_EVENT_TX_STOP:
- return TelephonyConstants.SESSION_EVENT_TX_STOP;
- case Connection.VideoProvider.SESSION_EVENT_CAMERA_FAILURE:
- return TelephonyConstants.SESSION_EVENT_CAMERA_FAILURE;
- case Connection.VideoProvider.SESSION_EVENT_CAMERA_READY:
- return TelephonyConstants.SESSION_EVENT_CAMERA_READY;
- default:
- return TelephonyConstants.SESSION_EVENT_UNKNOWN;
- }
- }
-
- public static String getCallCapabilityString(int capability) {
- switch (capability) {
- case Call.Details.CAPABILITY_HOLD:
- return TelephonyConstants.CALL_CAPABILITY_HOLD;
- case Call.Details.CAPABILITY_SUPPORT_HOLD:
- return TelephonyConstants.CALL_CAPABILITY_SUPPORT_HOLD;
- case Call.Details.CAPABILITY_MERGE_CONFERENCE:
- return TelephonyConstants.CALL_CAPABILITY_MERGE_CONFERENCE;
- case Call.Details.CAPABILITY_SWAP_CONFERENCE:
- return TelephonyConstants.CALL_CAPABILITY_SWAP_CONFERENCE;
- case Call.Details.CAPABILITY_UNUSED_1:
- return TelephonyConstants.CALL_CAPABILITY_UNUSED_1;
- case Call.Details.CAPABILITY_RESPOND_VIA_TEXT:
- return TelephonyConstants.CALL_CAPABILITY_RESPOND_VIA_TEXT;
- case Call.Details.CAPABILITY_MUTE:
- return TelephonyConstants.CALL_CAPABILITY_MUTE;
- case Call.Details.CAPABILITY_MANAGE_CONFERENCE:
- return TelephonyConstants.CALL_CAPABILITY_MANAGE_CONFERENCE;
- case Call.Details.CAPABILITY_SUPPORTS_VT_LOCAL_RX:
- return TelephonyConstants.CALL_CAPABILITY_SUPPORTS_VT_LOCAL_RX;
- case Call.Details.CAPABILITY_SUPPORTS_VT_LOCAL_TX:
- return TelephonyConstants.CALL_CAPABILITY_SUPPORTS_VT_LOCAL_TX;
- case Call.Details.CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL:
- return TelephonyConstants.CALL_CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL;
- case Call.Details.CAPABILITY_SUPPORTS_VT_REMOTE_RX:
- return TelephonyConstants.CALL_CAPABILITY_SUPPORTS_VT_REMOTE_RX;
- case Call.Details.CAPABILITY_SUPPORTS_VT_REMOTE_TX:
- return TelephonyConstants.CALL_CAPABILITY_SUPPORTS_VT_REMOTE_TX;
- case Call.Details.CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL:
- return TelephonyConstants.CALL_CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL;
- case Call.Details.CAPABILITY_SEPARATE_FROM_CONFERENCE:
- return TelephonyConstants.CALL_CAPABILITY_SEPARATE_FROM_CONFERENCE;
- case Call.Details.CAPABILITY_DISCONNECT_FROM_CONFERENCE:
- return TelephonyConstants.CALL_CAPABILITY_DISCONNECT_FROM_CONFERENCE;
- case Call.Details.CAPABILITY_SPEED_UP_MT_AUDIO:
- return TelephonyConstants.CALL_CAPABILITY_SPEED_UP_MT_AUDIO;
- case Call.Details.CAPABILITY_CAN_UPGRADE_TO_VIDEO:
- return TelephonyConstants.CALL_CAPABILITY_CAN_UPGRADE_TO_VIDEO;
- case Call.Details.CAPABILITY_CAN_PAUSE_VIDEO:
- return TelephonyConstants.CALL_CAPABILITY_CAN_PAUSE_VIDEO;
- }
- return TelephonyConstants.CALL_CAPABILITY_UNKOWN;
- }
-
- public static List<String> getCallCapabilitiesString(int capabilities) {
- final int[] capabilityConstants = new int[] {
- Call.Details.CAPABILITY_HOLD,
- Call.Details.CAPABILITY_SUPPORT_HOLD,
- Call.Details.CAPABILITY_MERGE_CONFERENCE,
- Call.Details.CAPABILITY_SWAP_CONFERENCE,
- Call.Details.CAPABILITY_UNUSED_1,
- Call.Details.CAPABILITY_RESPOND_VIA_TEXT,
- Call.Details.CAPABILITY_MUTE,
- Call.Details.CAPABILITY_MANAGE_CONFERENCE,
- Call.Details.CAPABILITY_SUPPORTS_VT_LOCAL_RX,
- Call.Details.CAPABILITY_SUPPORTS_VT_LOCAL_TX,
- Call.Details.CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL,
- Call.Details.CAPABILITY_SUPPORTS_VT_REMOTE_RX,
- Call.Details.CAPABILITY_SUPPORTS_VT_REMOTE_TX,
- Call.Details.CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL,
- Call.Details.CAPABILITY_SEPARATE_FROM_CONFERENCE,
- Call.Details.CAPABILITY_DISCONNECT_FROM_CONFERENCE,
- Call.Details.CAPABILITY_SPEED_UP_MT_AUDIO,
- Call.Details.CAPABILITY_CAN_UPGRADE_TO_VIDEO,
- Call.Details.CAPABILITY_CAN_PAUSE_VIDEO
- };
-
- List<String> capabilityList = new ArrayList<String>();
-
- for (int capability : capabilityConstants) {
- if ((capabilities & capability) == capability) {
- capabilityList.add(getCallCapabilityString(capability));
- }
- }
- return capabilityList;
- }
-
- public static String getCallPropertyString(int property) {
-
- switch (property) {
- case Call.Details.PROPERTY_CONFERENCE:
- return TelephonyConstants.CALL_PROPERTY_CONFERENCE;
- case Call.Details.PROPERTY_GENERIC_CONFERENCE:
- return TelephonyConstants.CALL_PROPERTY_GENERIC_CONFERENCE;
- case Call.Details.PROPERTY_EMERGENCY_CALLBACK_MODE:
- return TelephonyConstants.CALL_PROPERTY_EMERGENCY_CALLBACK_MODE;
- case Call.Details.PROPERTY_WIFI:
- return TelephonyConstants.CALL_PROPERTY_WIFI;
- case Call.Details.PROPERTY_HIGH_DEF_AUDIO:
- return TelephonyConstants.CALL_PROPERTY_HIGH_DEF_AUDIO;
- default:
- return TelephonyConstants.CALL_PROPERTY_UNKNOWN;
- }
- }
-
- public static List<String> getCallPropertiesString(int properties) {
- final int[] propertyConstants = new int[] {
- Call.Details.PROPERTY_CONFERENCE,
- Call.Details.PROPERTY_GENERIC_CONFERENCE,
- Call.Details.PROPERTY_EMERGENCY_CALLBACK_MODE,
- Call.Details.PROPERTY_WIFI,
- Call.Details.PROPERTY_HIGH_DEF_AUDIO
- };
-
- List<String> propertyList = new ArrayList<String>();
-
- for (int property : propertyConstants) {
- if ((properties & property) == property) {
- propertyList.add(getCallPropertyString(property));
- }
- }
-
- return propertyList;
- }
-
- public static String getCallPresentationInfoString(int presentation) {
- switch (presentation) {
- case TelecomManager.PRESENTATION_ALLOWED:
- return TelephonyConstants.CALL_PRESENTATION_ALLOWED;
- case TelecomManager.PRESENTATION_RESTRICTED:
- return TelephonyConstants.CALL_PRESENTATION_RESTRICTED;
- case TelecomManager.PRESENTATION_PAYPHONE:
- return TelephonyConstants.CALL_PRESENTATION_PAYPHONE;
- default:
- return TelephonyConstants.CALL_PRESENTATION_UNKNOWN;
- }
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/SmsFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/SmsFacade.java
deleted file mode 100644
index 1744d2b..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/SmsFacade.java
+++ /dev/null
@@ -1,990 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.telephony;
-
-import com.google.android.mms.ContentType;
-import com.google.android.mms.InvalidHeaderValueException;
-import com.google.android.mms.pdu.CharacterSets;
-import com.google.android.mms.pdu.EncodedStringValue;
-import com.google.android.mms.pdu.GenericPdu;
-import com.google.android.mms.pdu.PduBody;
-import com.google.android.mms.pdu.PduComposer;
-import com.google.android.mms.pdu.PduHeaders;
-import com.google.android.mms.pdu.PduParser;
-import com.google.android.mms.pdu.PduPart;
-import com.google.android.mms.pdu.PduPersister;
-import com.google.android.mms.pdu.SendConf;
-import com.google.android.mms.pdu.SendReq;
-import com.google.android.mms.MmsException;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import android.app.Activity;
-import android.app.PendingIntent;
-import android.app.Service;
-import android.content.BroadcastReceiver;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.Uri;
-import android.os.Bundle;
-import android.provider.Telephony.Sms.Intents;
-import android.provider.Telephony.Mms;
-import android.telephony.SmsManager;
-import android.telephony.SmsMessage;
-import android.telephony.SmsCbMessage;
-import com.android.internal.telephony.gsm.SmsCbConstants;
-import com.android.internal.telephony.cdma.sms.SmsEnvelope;
-import android.telephony.SmsCbEtwsInfo;
-import android.telephony.SmsCbCmasInfo;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.facade.EventFacade;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcDefault;
-import com.googlecode.android_scripting.rpc.RpcOptional;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-import com.googlecode.android_scripting.facade.telephony.TelephonyConstants;
-
-//FIXME: Change the build order to use constants defined in here
-//import com.googlecode.android_scripting.provider.TelephonyTestProvider;
-
-/**
- * Exposes SmsManager functionality.
- */
-public class SmsFacade extends RpcReceiver {
-
- static final boolean DBG = false;
-
- private final EventFacade mEventFacade;
- private final SmsManager mSms;
- private final Context mContext;
- private final Service mService;
- private BroadcastReceiver mSmsSendListener;
- private BroadcastReceiver mSmsIncomingListener;
- private int mNumExpectedSentEvents;
- private int mNumExpectedDeliveredEvents;
- private boolean mListeningIncomingSms;
- private IntentFilter mEmergencyCBMessage;
- private BroadcastReceiver mGsmEmergencyCBMessageListener;
- private BroadcastReceiver mCdmaEmergencyCBMessageListener;
- private boolean mGsmEmergencyCBListenerRegistered;
- private boolean mCdmaEmergencyCBListenerRegistered;
- private boolean mSentReceiversRegistered;
- private Object lock = new Object();
-
- private BroadcastReceiver mMmsSendListener;
- private BroadcastReceiver mMmsIncomingListener;
- private boolean mListeningIncomingMms;
-
- TelephonyManager mTelephonyManager;
-
- private static final String SMS_MESSAGE_STATUS_DELIVERED_ACTION =
- "com.googlecode.android_scripting.sms.MESSAGE_STATUS_DELIVERED";
- private static final String SMS_MESSAGE_SENT_ACTION =
- "com.googlecode.android_scripting.sms.MESSAGE_SENT";
-
- private static final String EMERGENCY_CB_MESSAGE_RECEIVED_ACTION =
- "android.provider.Telephony.SMS_EMERGENCY_CB_RECEIVED";
-
- private static final String MMS_MESSAGE_SENT_ACTION =
- "com.googlecode.android_scripting.mms.MESSAGE_SENT";
-
- private final int MAX_MESSAGE_LENGTH = 160;
- private final int INTERNATIONAL_NUMBER_LENGTH = 12;
- private final int DOMESTIC_NUMBER_LENGTH = 10;
-
- private static final String DEFAULT_FROM_PHONE_NUMBER = new String("8675309");
-
- private final int[] mGsmCbMessageIdList = {
- SmsCbConstants.MESSAGE_ID_ETWS_EARTHQUAKE_WARNING,
- SmsCbConstants.MESSAGE_ID_ETWS_TSUNAMI_WARNING,
- SmsCbConstants.MESSAGE_ID_ETWS_EARTHQUAKE_AND_TSUNAMI_WARNING,
- SmsCbConstants.MESSAGE_ID_ETWS_TEST_MESSAGE,
- SmsCbConstants.MESSAGE_ID_ETWS_OTHER_EMERGENCY_TYPE,
- SmsCbConstants.MESSAGE_ID_CMAS_ALERT_PRESIDENTIAL_LEVEL,
- SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_OBSERVED,
- SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_LIKELY,
- SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_OBSERVED,
- SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_LIKELY,
- SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_IMMEDIATE_LIKELY,
- SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_OBSERVED,
- SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_LIKELY,
- SmsCbConstants.MESSAGE_ID_CMAS_ALERT_CHILD_ABDUCTION_EMERGENCY,
- SmsCbConstants.MESSAGE_ID_CMAS_ALERT_REQUIRED_MONTHLY_TEST,
- SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXERCISE
- };
-
- private final int[] mCdmaCbMessageIdList = {
- SmsEnvelope.SERVICE_CATEGORY_CMAS_PRESIDENTIAL_LEVEL_ALERT,
- SmsEnvelope.SERVICE_CATEGORY_CMAS_EXTREME_THREAT,
- SmsEnvelope.SERVICE_CATEGORY_CMAS_SEVERE_THREAT,
- SmsEnvelope.SERVICE_CATEGORY_CMAS_CHILD_ABDUCTION_EMERGENCY,
- SmsEnvelope.SERVICE_CATEGORY_CMAS_TEST_MESSAGE
- };
-
- public SmsFacade(FacadeManager manager) {
-
- super(manager);
- mService = manager.getService();
- mContext = mService;
- mSms = SmsManager.getDefault();
- mEventFacade = manager.getReceiver(EventFacade.class);
- mSmsSendListener = new SmsSendListener();
- mSmsIncomingListener = new SmsIncomingListener();
- mNumExpectedSentEvents = 0;
- mNumExpectedDeliveredEvents = 0;
- mListeningIncomingSms = false;
- mGsmEmergencyCBMessageListener = new SmsEmergencyCBMessageListener();
- mCdmaEmergencyCBMessageListener = new SmsEmergencyCBMessageListener();
- mGsmEmergencyCBListenerRegistered = false;
- mCdmaEmergencyCBListenerRegistered = false;
- mSentReceiversRegistered = false;
-
- mMmsIncomingListener = new MmsIncomingListener();
- mMmsSendListener = new MmsSendListener();
-
- mListeningIncomingMms = false;
-
- IntentFilter smsFilter = new IntentFilter(SMS_MESSAGE_SENT_ACTION);
- smsFilter.addAction(SMS_MESSAGE_STATUS_DELIVERED_ACTION);
-
- IntentFilter mmsFilter = new IntentFilter(MMS_MESSAGE_SENT_ACTION);
-
- synchronized (lock) {
- mService.registerReceiver(mSmsSendListener, smsFilter);
- mService.registerReceiver(mMmsSendListener, mmsFilter);
- mSentReceiversRegistered = true;
- }
-
- mTelephonyManager =
- (TelephonyManager) mService.getSystemService(Context.TELEPHONY_SERVICE);
- }
-
- // FIXME: Move to a utility class
- // FIXME: remove the MODE_WORLD_READABLE once we verify the use case
- @SuppressWarnings("deprecation")
- private boolean writeBytesToFile(String fileName, byte[] pdu) {
- FileOutputStream writer = null;
- try {
- writer = mContext.openFileOutput(fileName, Context.MODE_WORLD_READABLE);
- writer.write(pdu);
- return true;
- } catch (final IOException e) {
- return false;
- } finally {
- if (writer != null) {
- try {
- writer.close();
- } catch (IOException e) {
- }
- }
- }
- }
-
- // FIXME: Move to a utility class
- private boolean writeBytesToCacheFile(String fileName, byte[] pdu) {
- File mmsFile = new File(mContext.getCacheDir(), fileName);
- Log.d(String.format("filename:%s, directory:%s", fileName,
- mContext.getCacheDir().toString()));
- FileOutputStream writer = null;
- try {
- writer = new FileOutputStream(mmsFile);
- writer.write(pdu);
- return true;
- } catch (final IOException e) {
- Log.d("writeBytesToCacheFile() failed with " + e.toString());
- return false;
- } finally {
- if (writer != null) {
- try {
- writer.close();
- } catch (IOException e) {
- }
- }
- }
- }
-
- @Deprecated
- @Rpc(description = "Starts tracking incoming SMS.")
- public void smsStartTrackingIncomingMessage() {
- Log.d("Using Deprecated smsStartTrackingIncomingMessage!");
- smsStartTrackingIncomingSmsMessage();
- }
-
- @Rpc(description = "Starts tracking incoming SMS.")
- public void smsStartTrackingIncomingSmsMessage() {
- mService.registerReceiver(mSmsIncomingListener,
- new IntentFilter(Intents.SMS_RECEIVED_ACTION));
- mListeningIncomingSms = true;
- }
-
- @Deprecated
- @Rpc(description = "Stops tracking incoming SMS.")
- public void smsStopTrackingIncomingMessage() {
- Log.d("Using Deprecated smsStopTrackingIncomingMessage!");
- smsStopTrackingIncomingSmsMessage();
- }
-
- @Rpc(description = "Stops tracking incoming SMS.")
- public void smsStopTrackingIncomingSmsMessage() {
- if (mListeningIncomingSms) {
- mListeningIncomingSms = false;
- try {
- mService.unregisterReceiver(mSmsIncomingListener);
- } catch (Exception e) {
- Log.e("Tried to unregister nonexistent SMS Listener!");
- }
- }
- }
-
- @Rpc(description = "Starts tracking incoming MMS.")
- public void smsStartTrackingIncomingMmsMessage() {
- IntentFilter mmsReceived = new IntentFilter(Intents.MMS_DOWNLOADED_ACTION);
- mmsReceived.addAction(Intents.WAP_PUSH_RECEIVED_ACTION);
- mmsReceived.addAction(Intents.DATA_SMS_RECEIVED_ACTION);
- mService.registerReceiver(mMmsIncomingListener, mmsReceived);
- mListeningIncomingSms = true;
- }
-
- @Rpc(description = "Stops tracking incoming MMS.")
- public void smsStopTrackingIncomingMmsMessage() {
- if (mListeningIncomingMms) {
- mListeningIncomingMms = false;
- try {
- mService.unregisterReceiver(mMmsIncomingListener);
- } catch (Exception e) {
- Log.e("Tried to unregister nonexistent MMS Listener!");
- }
- }
- }
-
- // Currently requires 'adb shell su root setenforce 0'
- @Rpc(description = "Send a multimedia message to a specified number.")
- public void smsSendMultimediaMessage(
- @RpcParameter(name = "toPhoneNumber")
- String toPhoneNumber,
- @RpcParameter(name = "subject")
- String subject,
- @RpcParameter(name = "message")
- String message,
- @RpcParameter(name = "fromPhoneNumber")
- @RpcOptional
- String fromPhoneNumber,
- @RpcParameter(name = "fileName")
- @RpcOptional
- String fileName) {
-
- MmsBuilder mms = new MmsBuilder();
-
- mms.setToPhoneNumber(toPhoneNumber);
- if (fromPhoneNumber == null) {
- mTelephonyManager.getLine1Number(); //TODO: b/21592513 - multi-sim awareness
- }
-
- if (DBG) {
- Log.d(String.format(
- "Params:toPhoneNumber(%s),subject(%s),message(%s),fromPhoneNumber(%s),filename(%s)",
- toPhoneNumber, subject, message,
- (fromPhoneNumber != null) ? fromPhoneNumber : "",
- (fileName != null) ? fileName : ""));
- }
-
- mms.setFromPhoneNumber((fromPhoneNumber != null) ? fromPhoneNumber : DEFAULT_FROM_PHONE_NUMBER);
- mms.setSubject(subject);
- mms.setDate();
- mms.addMessageBody(message);
- mms.setMessageClass(MmsBuilder.MESSAGE_CLASS_PERSONAL);
- mms.setMessagePriority(MmsBuilder.DEFAULT_PRIORITY);
- mms.setDeliveryReport(true);
- mms.setReadReport(true);
- // Default to 1 week;
- mms.setExpirySeconds(MmsBuilder.DEFAULT_EXPIRY_TIME);
-
- Uri contentUri = null;
-
- String randomFileName = "mms." + String.valueOf(System.currentTimeMillis()) + ".dat";
-
- byte[] mmsBytes = mms.build();
- if (mmsBytes.length == 0) {
- Log.e("Failed to build PDU!");
- return;
- }
-
- if (writeBytesToCacheFile(randomFileName, mmsBytes) == false) {
- Log.e("Failed to write PDU to file");
- return;
- }
-
- contentUri = (new Uri.Builder())
- .authority("com.googlecode.android_scripting.provider.telephonytestprovider")
- .path("mms/" + randomFileName)
- .scheme(ContentResolver.SCHEME_CONTENT)
- .build();
-
- if (contentUri != null) {
- Log.d(String.format("URI String: %s", contentUri.toString()));
-
- SmsManager.getDefault().sendMultimediaMessage(mContext,
- contentUri, null/* locationUrl */, null/* configOverrides */,
- PendingIntent.getBroadcast(mService, 0,
- new Intent(MMS_MESSAGE_SENT_ACTION), 0)
- );
- }
- else {
- Log.d("smsSendMultimediaMessage():Content URI String is null");
- }
- }
-
- @Rpc(description = "Send a text message to a specified number.")
- public void smsSendTextMessage(
- @RpcParameter(name = "phoneNumber")
- String phoneNumber,
- @RpcParameter(name = "message")
- String message,
- @RpcParameter(name = "deliveryReportRequired")
- Boolean deliveryReportRequired) {
-
- if (message.length() > MAX_MESSAGE_LENGTH) {
- ArrayList<String> messagesParts = mSms.divideMessage(message);
- mNumExpectedSentEvents = mNumExpectedDeliveredEvents = messagesParts.size();
- ArrayList<PendingIntent> sentIntents = new ArrayList<PendingIntent>();
- ArrayList<PendingIntent> deliveredIntents = new ArrayList<PendingIntent>();
- for (int i = 0; i < messagesParts.size(); i++) {
- sentIntents.add(PendingIntent.getBroadcast(mService, 0,
- new Intent(SMS_MESSAGE_SENT_ACTION), 0));
- if (deliveryReportRequired) {
- deliveredIntents.add(
- PendingIntent.getBroadcast(mService, 0,
- new Intent(SMS_MESSAGE_STATUS_DELIVERED_ACTION), 0));
- }
- }
- mSms.sendMultipartTextMessage(
- phoneNumber, null, messagesParts,
- sentIntents, deliveryReportRequired ? deliveredIntents : null);
- } else {
- mNumExpectedSentEvents = mNumExpectedDeliveredEvents = 1;
- PendingIntent sentIntent = PendingIntent.getBroadcast(mService, 0,
- new Intent(SMS_MESSAGE_SENT_ACTION), 0);
- PendingIntent deliveredIntent = PendingIntent.getBroadcast(mService, 0,
- new Intent(SMS_MESSAGE_STATUS_DELIVERED_ACTION), 0);
- mSms.sendTextMessage(
- phoneNumber, null, message, sentIntent,
- deliveryReportRequired ? deliveredIntent : null);
- }
- }
-
- @Rpc(description = "Retrieves all messages currently stored on ICC.")
- public ArrayList<SmsMessage> smsGetAllMessagesFromIcc() {
- return SmsManager.getDefault().getAllMessagesFromIcc();
- }
-
- @Rpc(description = "Starts tracking GSM Emergency CB Messages.")
- public void smsStartTrackingGsmEmergencyCBMessage() {
- if (!mGsmEmergencyCBListenerRegistered) {
- for (int messageId : mGsmCbMessageIdList) {
- mSms.enableCellBroadcast(
- messageId,
- SmsManager.CELL_BROADCAST_RAN_TYPE_GSM);
- }
-
- mEmergencyCBMessage = new IntentFilter(EMERGENCY_CB_MESSAGE_RECEIVED_ACTION);
- mService.registerReceiver(mGsmEmergencyCBMessageListener,
- mEmergencyCBMessage);
- mGsmEmergencyCBListenerRegistered = true;
- }
- }
-
- @Rpc(description = "Stop tracking GSM Emergency CB Messages")
- public void smsStopTrackingGsmEmergencyCBMessage() {
- if (mGsmEmergencyCBListenerRegistered) {
- mService.unregisterReceiver(mGsmEmergencyCBMessageListener);
- mGsmEmergencyCBListenerRegistered = false;
- for (int messageId : mGsmCbMessageIdList) {
- mSms.disableCellBroadcast(
- messageId,
- SmsManager.CELL_BROADCAST_RAN_TYPE_GSM);
- }
- }
- }
-
- @Rpc(description = "Starts tracking CDMA Emergency CB Messages")
- public void smsStartTrackingCdmaEmergencyCBMessage() {
- if (!mCdmaEmergencyCBListenerRegistered) {
- for (int messageId : mCdmaCbMessageIdList) {
- mSms.enableCellBroadcast(
- messageId,
- SmsManager.CELL_BROADCAST_RAN_TYPE_CDMA);
- }
- mEmergencyCBMessage = new IntentFilter(EMERGENCY_CB_MESSAGE_RECEIVED_ACTION);
- mService.registerReceiver(mCdmaEmergencyCBMessageListener,
- mEmergencyCBMessage);
- mCdmaEmergencyCBListenerRegistered = true;
- }
- }
-
- @Rpc(description = "Stop tracking CDMA Emergency CB Message.")
- public void smsStopTrackingCdmaEmergencyCBMessage() {
- if (mCdmaEmergencyCBListenerRegistered) {
- mService.unregisterReceiver(mCdmaEmergencyCBMessageListener);
- mCdmaEmergencyCBListenerRegistered = false;
- for (int messageId : mCdmaCbMessageIdList) {
- mSms.disableCellBroadcast(
- messageId,
- SmsManager.CELL_BROADCAST_RAN_TYPE_CDMA);
- }
- }
- }
-
- private class SmsSendListener extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- Bundle event = new Bundle();
- event.putString("Type", "SmsDeliverStatus");
- String action = intent.getAction();
- int resultCode = getResultCode();
- if (SMS_MESSAGE_STATUS_DELIVERED_ACTION.equals(action)) {
- if (resultCode == Activity.RESULT_OK) {
- if (mNumExpectedDeliveredEvents == 1) {
- Log.d("SMS Message delivered successfully");
- mEventFacade.postEvent(TelephonyConstants.EventSmsDeliverSuccess, event);
- }
- if (mNumExpectedDeliveredEvents > 0) {
- mNumExpectedDeliveredEvents--;
- }
- } else {
- Log.e("SMS Message delivery failed");
- // TODO . Need to find the reason for failure from pdu
- mEventFacade.postEvent(TelephonyConstants.EventSmsDeliverFailure, event);
- }
- } else if (SMS_MESSAGE_SENT_ACTION.equals(action)) {
- if (resultCode == Activity.RESULT_OK) {
- if (mNumExpectedSentEvents == 1) {
- event.putString("Type", "SmsSentSuccess");
- Log.d("SMS Message sent successfully");
- mEventFacade.postEvent(TelephonyConstants.EventSmsSentSuccess, event);
- }
- if (mNumExpectedSentEvents > 0) {
- mNumExpectedSentEvents--;
- }
- } else {
- Log.e("SMS Message send failed");
- event.putString("Type", "SmsSentFailure");
- switch (resultCode) {
- case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
- event.putString("Reason", "GenericFailure");
- break;
- case SmsManager.RESULT_ERROR_RADIO_OFF:
- event.putString("Reason", "RadioOff");
- break;
- case SmsManager.RESULT_ERROR_NULL_PDU:
- event.putString("Reason", "NullPdu");
- break;
- case SmsManager.RESULT_ERROR_NO_SERVICE:
- event.putString("Reason", "NoService");
- break;
- case SmsManager.RESULT_ERROR_LIMIT_EXCEEDED:
- event.putString("Reason", "LimitExceeded");
- break;
- case SmsManager.RESULT_ERROR_FDN_CHECK_FAILURE:
- event.putString("Reason", "FdnCheckFailure");
- break;
- default:
- event.putString("Reason", "Unknown");
- break;
- }
- mEventFacade.postEvent(TelephonyConstants.EventSmsSentFailure, event);
- }
- }
- }
- }
-
- private class SmsIncomingListener extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (Intents.SMS_RECEIVED_ACTION.equals(action)) {
- Log.d("New SMS Received");
- Bundle extras = intent.getExtras();
- int subId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
- if (extras != null) {
- Bundle event = new Bundle();
- event.putString("Type", "NewSmsReceived");
- SmsMessage[] msgs = Intents.getMessagesFromIntent(intent);
- StringBuilder smsMsg = new StringBuilder();
-
- SmsMessage sms = msgs[0];
- String sender = sms.getOriginatingAddress();
- event.putString("Sender", formatPhoneNumber(sender));
-
- for (int i = 0; i < msgs.length; i++) {
- sms = msgs[i];
- smsMsg.append(sms.getMessageBody());
- }
- event.putString("Text", smsMsg.toString());
- // TODO
- // Need to explore how to get subId information.
- event.putInt("subscriptionId", subId);
- mEventFacade.postEvent(TelephonyConstants.EventSmsReceived, event);
- }
- }
- }
- }
-
- private class MmsSendListener extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- Bundle event = new Bundle();
- String action = intent.getAction();
- int resultCode = getResultCode();
- event.putString("ResultCode", Integer.toString(resultCode));
- if (MMS_MESSAGE_SENT_ACTION.equals(action)) {
- if (resultCode == Activity.RESULT_OK) {
- Log.d("MMS Message sent successfully");
- mEventFacade.postEvent(TelephonyConstants.EventMmsSentSuccess, event);
- } else {
- Log.e(String.format("MMS Message send failed: %d", resultCode));
- mEventFacade.postEvent(TelephonyConstants.EventMmsSentFailure, event);
- }
- } else {
- Log.e("MMS Send Listener Received Invalid Event" + intent.toString());
- }
- }
- }
-
- // b/21569494 - Never receiving ANY of these events: requires debugging
- private class MmsIncomingListener extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- Log.d("MmsIncomingListener Received an Intent " + intent.toString());
- String action = intent.getAction();
- if (Intents.MMS_DOWNLOADED_ACTION.equals(action)) {
- Log.d("New MMS Downloaded");
- mEventFacade.postEvent(TelephonyConstants.EventMmsDownloaded, new Bundle());
- }
- else if (Intents.WAP_PUSH_RECEIVED_ACTION.equals(action)) {
- Log.d("New Wap Push Received");
- mEventFacade.postEvent(TelephonyConstants.EventWapPushReceived, new Bundle());
- }
- else if (Intents.DATA_SMS_RECEIVED_ACTION.equals(action)) {
- Log.d("New Data SMS Received");
- mEventFacade.postEvent(TelephonyConstants.EventDataSmsReceived, new Bundle());
- }
- else {
- Log.e("MmsIncomingListener Received Unexpected Event" + intent.toString());
- }
- }
- }
-
- String formatPhoneNumber(String phoneNumber) {
- String senderNumberStr = null;
- int len = phoneNumber.length();
- if (len > 0) {
- /**
- * Currently this incomingNumber modification is specific for US numbers.
- */
- if ((INTERNATIONAL_NUMBER_LENGTH == len) && ('+' == phoneNumber.charAt(0))) {
- senderNumberStr = phoneNumber.substring(1);
- } else if (DOMESTIC_NUMBER_LENGTH == len) {
- senderNumberStr = '1' + phoneNumber;
- } else {
- senderNumberStr = phoneNumber;
- }
- }
- return senderNumberStr;
- }
-
- private class SmsEmergencyCBMessageListener extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (EMERGENCY_CB_MESSAGE_RECEIVED_ACTION.equals(intent.getAction())) {
- Bundle extras = intent.getExtras();
- if (extras != null) {
- Bundle event = new Bundle();
- String eventName = null;
- SmsCbMessage message = (SmsCbMessage) extras.get("message");
- if (message != null) {
- if (message.isEmergencyMessage()) {
- event.putString("geographicalScope", getGeographicalScope(
- message.getGeographicalScope()));
- event.putInt("serialNumber", message.getSerialNumber());
- event.putString("location", message.getLocation().toString());
- event.putInt("serviceCategory", message.getServiceCategory());
- event.putString("language", message.getLanguageCode());
- event.putString("message", message.getMessageBody());
- event.putString("priority", getPriority(message.getMessagePriority()));
- if (message.isCmasMessage()) {
- // CMAS message
- eventName = TelephonyConstants.EventCmasReceived;
- event.putString("cmasMessageClass", getCMASMessageClass(
- message.getCmasWarningInfo().getMessageClass()));
- event.putString("cmasCategory", getCMASCategory(
- message.getCmasWarningInfo().getCategory()));
- event.putString("cmasResponseType", getCMASResponseType(
- message.getCmasWarningInfo().getResponseType()));
- event.putString("cmasSeverity", getCMASSeverity(
- message.getCmasWarningInfo().getSeverity()));
- event.putString("cmasUrgency", getCMASUrgency(
- message.getCmasWarningInfo().getUrgency()));
- event.putString("cmasCertainty", getCMASCertainty(
- message.getCmasWarningInfo().getCertainty()));
- } else if (message.isEtwsMessage()) {
- // ETWS message
- eventName = TelephonyConstants.EventEtwsReceived;
- event.putString("etwsWarningType", getETWSWarningType(
- message.getEtwsWarningInfo().getWarningType()));
- event.putBoolean("etwsIsEmergencyUserAlert",
- message.getEtwsWarningInfo().isEmergencyUserAlert());
- event.putBoolean("etwsActivatePopup",
- message.getEtwsWarningInfo().isPopupAlert());
- } else {
- Log.d("Received message is not CMAS or ETWS");
- }
- if (eventName != null)
- mEventFacade.postEvent(eventName, event);
- }
- }
- } else {
- Log.d("Received Emergency CB without extras");
- }
- }
- }
- }
-
- private static String getETWSWarningType(int type) {
- switch (type) {
- case SmsCbEtwsInfo.ETWS_WARNING_TYPE_EARTHQUAKE:
- return "EARTHQUAKE";
- case SmsCbEtwsInfo.ETWS_WARNING_TYPE_TSUNAMI:
- return "TSUNAMI";
- case SmsCbEtwsInfo.ETWS_WARNING_TYPE_EARTHQUAKE_AND_TSUNAMI:
- return "EARTHQUAKE_AND_TSUNAMI";
- case SmsCbEtwsInfo.ETWS_WARNING_TYPE_TEST_MESSAGE:
- return "TEST_MESSAGE";
- case SmsCbEtwsInfo.ETWS_WARNING_TYPE_OTHER_EMERGENCY:
- return "OTHER_EMERGENCY";
- }
- return "UNKNOWN";
- }
-
- private static String getCMASMessageClass(int messageclass) {
- switch (messageclass) {
- case SmsCbCmasInfo.CMAS_CLASS_PRESIDENTIAL_LEVEL_ALERT:
- return "PRESIDENTIAL_LEVEL_ALERT";
- case SmsCbCmasInfo.CMAS_CLASS_EXTREME_THREAT:
- return "EXTREME_THREAT";
- case SmsCbCmasInfo.CMAS_CLASS_SEVERE_THREAT:
- return "SEVERE_THREAT";
- case SmsCbCmasInfo.CMAS_CLASS_CHILD_ABDUCTION_EMERGENCY:
- return "CHILD_ABDUCTION_EMERGENCY";
- case SmsCbCmasInfo.CMAS_CLASS_REQUIRED_MONTHLY_TEST:
- return "REQUIRED_MONTHLY_TEST";
- case SmsCbCmasInfo.CMAS_CLASS_CMAS_EXERCISE:
- return "CMAS_EXERCISE";
- }
- return "UNKNOWN";
- }
-
- private static String getCMASCategory(int category) {
- switch (category) {
- case SmsCbCmasInfo.CMAS_CATEGORY_GEO:
- return "GEOPHYSICAL";
- case SmsCbCmasInfo.CMAS_CATEGORY_MET:
- return "METEOROLOGICAL";
- case SmsCbCmasInfo.CMAS_CATEGORY_SAFETY:
- return "SAFETY";
- case SmsCbCmasInfo.CMAS_CATEGORY_SECURITY:
- return "SECURITY";
- case SmsCbCmasInfo.CMAS_CATEGORY_RESCUE:
- return "RESCUE";
- case SmsCbCmasInfo.CMAS_CATEGORY_FIRE:
- return "FIRE";
- case SmsCbCmasInfo.CMAS_CATEGORY_HEALTH:
- return "HEALTH";
- case SmsCbCmasInfo.CMAS_CATEGORY_ENV:
- return "ENVIRONMENTAL";
- case SmsCbCmasInfo.CMAS_CATEGORY_TRANSPORT:
- return "TRANSPORTATION";
- case SmsCbCmasInfo.CMAS_CATEGORY_INFRA:
- return "INFRASTRUCTURE";
- case SmsCbCmasInfo.CMAS_CATEGORY_CBRNE:
- return "CHEMICAL";
- case SmsCbCmasInfo.CMAS_CATEGORY_OTHER:
- return "OTHER";
- }
- return "UNKNOWN";
- }
-
- private static String getCMASResponseType(int type) {
- switch (type) {
- case SmsCbCmasInfo.CMAS_RESPONSE_TYPE_SHELTER:
- return "SHELTER";
- case SmsCbCmasInfo.CMAS_RESPONSE_TYPE_EVACUATE:
- return "EVACUATE";
- case SmsCbCmasInfo.CMAS_RESPONSE_TYPE_PREPARE:
- return "PREPARE";
- case SmsCbCmasInfo.CMAS_RESPONSE_TYPE_EXECUTE:
- return "EXECUTE";
- case SmsCbCmasInfo.CMAS_RESPONSE_TYPE_MONITOR:
- return "MONITOR";
- case SmsCbCmasInfo.CMAS_RESPONSE_TYPE_AVOID:
- return "AVOID";
- case SmsCbCmasInfo.CMAS_RESPONSE_TYPE_ASSESS:
- return "ASSESS";
- case SmsCbCmasInfo.CMAS_RESPONSE_TYPE_NONE:
- return "NONE";
- }
- return "UNKNOWN";
- }
-
- private static String getCMASSeverity(int severity) {
- switch (severity) {
- case SmsCbCmasInfo.CMAS_SEVERITY_EXTREME:
- return "EXTREME";
- case SmsCbCmasInfo.CMAS_SEVERITY_SEVERE:
- return "SEVERE";
- }
- return "UNKNOWN";
- }
-
- private static String getCMASUrgency(int urgency) {
- switch (urgency) {
- case SmsCbCmasInfo.CMAS_URGENCY_IMMEDIATE:
- return "IMMEDIATE";
- case SmsCbCmasInfo.CMAS_URGENCY_EXPECTED:
- return "EXPECTED";
- }
- return "UNKNOWN";
- }
-
- private static String getCMASCertainty(int certainty) {
- switch (certainty) {
- case SmsCbCmasInfo.CMAS_CERTAINTY_OBSERVED:
- return "IMMEDIATE";
- case SmsCbCmasInfo.CMAS_CERTAINTY_LIKELY:
- return "LIKELY";
- }
- return "UNKNOWN";
- }
-
- private static String getGeographicalScope(int scope) {
- switch (scope) {
- case SmsCbMessage.GEOGRAPHICAL_SCOPE_CELL_WIDE_IMMEDIATE:
- return "CELL_WIDE_IMMEDIATE";
- case SmsCbMessage.GEOGRAPHICAL_SCOPE_PLMN_WIDE:
- return "PLMN_WIDE ";
- case SmsCbMessage.GEOGRAPHICAL_SCOPE_LA_WIDE:
- return "LA_WIDE";
- case SmsCbMessage.GEOGRAPHICAL_SCOPE_CELL_WIDE:
- return "CELL_WIDE";
- }
- return "UNKNOWN";
- }
-
- private static String getPriority(int priority) {
- switch (priority) {
- case SmsCbMessage.MESSAGE_PRIORITY_NORMAL:
- return "NORMAL";
- case SmsCbMessage.MESSAGE_PRIORITY_INTERACTIVE:
- return "INTERACTIVE";
- case SmsCbMessage.MESSAGE_PRIORITY_URGENT:
- return "URGENT";
- case SmsCbMessage.MESSAGE_PRIORITY_EMERGENCY:
- return "EMERGENCY";
- }
- return "UNKNOWN";
- }
-
- @Override
- public void shutdown() {
-
- smsStopTrackingIncomingSmsMessage();
- smsStopTrackingIncomingMmsMessage();
- smsStopTrackingGsmEmergencyCBMessage();
- smsStopTrackingCdmaEmergencyCBMessage();
-
- synchronized (lock) {
- if (mSentReceiversRegistered) {
- mService.unregisterReceiver(mSmsSendListener);
- mService.unregisterReceiver(mMmsSendListener);
- mSentReceiversRegistered = false;
- }
- }
- }
-
- private class MmsBuilder {
-
- public static final String MESSAGE_CLASS_PERSONAL =
- PduHeaders.MESSAGE_CLASS_PERSONAL_STR;
-
- public static final String MESSAGE_CLASS_ADVERTISEMENT =
- PduHeaders.MESSAGE_CLASS_ADVERTISEMENT_STR;
-
- public static final String MESSAGE_CLASS_INFORMATIONAL =
- PduHeaders.MESSAGE_CLASS_INFORMATIONAL_STR;
-
- public static final String MESSAGE_CLASS_AUTO =
- PduHeaders.MESSAGE_CLASS_AUTO_STR;
-
- public static final int MESSAGE_PRIORITY_LOW = PduHeaders.PRIORITY_LOW;
- public static final int MESSAGE_PRIORITY_NORMAL = PduHeaders.PRIORITY_LOW;
- public static final int MESSAGE_PRIORITY_HIGH = PduHeaders.PRIORITY_LOW;
-
- private static final int DEFAULT_EXPIRY_TIME = 7 * 24 * 60 * 60;
- private static final int DEFAULT_PRIORITY = PduHeaders.PRIORITY_NORMAL;
-
- private SendReq mRequest;
- private PduBody mBody;
-
- // FIXME: Eventually this should be exposed as a parameter
- private static final String TEMP_CONTENT_FILE_NAME = "text0.txt";
-
- // Synchronized Multimedia Internet Language
- // Fragment for compatibility
- private static final String sSmilText =
- "<smil>" +
- "<head>" +
- "<layout>" +
- "<root-layout/>" +
- "<region height=\"100%%\" id=\"Text\" left=\"0%%\"" +
- " top=\"0%%\" width=\"100%%\"/>" +
- "</layout>" +
- "</head>" +
- "<body>" +
- "<par dur=\"8000ms\">" +
- "<text src=\"%s\" region=\"Text\"/>" +
- "</par>" +
- "</body>" +
- "</smil>";
-
- public MmsBuilder() {
- mRequest = new SendReq();
- mBody = new PduBody();
- }
-
- public void setFromPhoneNumber(String number) {
- mRequest.setFrom(new EncodedStringValue(number));
- }
-
- public void setToPhoneNumber(String number) {
- mRequest.setTo(new EncodedStringValue[] {
- new EncodedStringValue(number) });
- }
-
- public void setToPhoneNumbers(List<String> number) {
- mRequest.setTo(EncodedStringValue.encodeStrings((String[]) number.toArray()));
- }
-
- public void setSubject(String subject) {
- mRequest.setSubject(new EncodedStringValue(subject));
- }
-
- public void setDate() {
- setDate(System.currentTimeMillis() / 1000);
- }
-
- public void setDate(long time) {
- mRequest.setDate(time);
- }
-
- public void addMessageBody(String message) {
- addMessageBody(message, true);
- }
-
- public void setMessageClass(String messageClass) {
- mRequest.setMessageClass(messageClass.getBytes());
- }
-
- public void setMessagePriority(int priority) {
- try {
- mRequest.setPriority(priority);
- } catch (InvalidHeaderValueException e) {
- Log.e("Invalid Header Value "+e.toString());
- }
- }
-
- public void setDeliveryReport(boolean report) {
- try {
- mRequest.setDeliveryReport((report) ? PduHeaders.VALUE_YES : PduHeaders.VALUE_NO);
- } catch (InvalidHeaderValueException e) {
- Log.e("Invalid Header Value "+e.toString());
- }
- }
-
- public void setReadReport(boolean report) {
- try {
- mRequest.setReadReport((report) ? PduHeaders.VALUE_YES : PduHeaders.VALUE_NO);
- } catch (InvalidHeaderValueException e) {
- Log.e("Invalid Header Value "+e.toString());
- }
- }
-
- public void setExpirySeconds(int seconds) {
- mRequest.setExpiry(seconds);
- }
-
- public byte[] build() {
- mRequest.setBody(mBody);
-
- int msgSize = 0;
- for (int i = 0; i < mBody.getPartsNum(); i++) {
- msgSize += mBody.getPart(i).getDataLength();
- }
- mRequest.setMessageSize(msgSize);
-
- return new PduComposer(mContext, mRequest).make();
- }
-
- public void addMessageBody(String message, boolean addSmilFragment) {
- final PduPart part = new PduPart();
- part.setCharset(CharacterSets.UTF_8);
- part.setContentType(ContentType.TEXT_PLAIN.getBytes());
- part.setContentLocation("text0".getBytes());
- int index = TEMP_CONTENT_FILE_NAME.lastIndexOf(".");
- String contentId = (index == -1) ? TEMP_CONTENT_FILE_NAME
- : TEMP_CONTENT_FILE_NAME.substring(0, index);
- part.setContentId(contentId.getBytes());
- part.setContentId("txt".getBytes());
- part.setData(message.getBytes());
- mBody.addPart(part);
- if (addSmilFragment) {
- addSmilTextFragment(TEMP_CONTENT_FILE_NAME);
- }
- }
-
- private void addSmilTextFragment(String contentFilename) {
-
- final String smil = String.format(sSmilText, contentFilename);
- final PduPart smilPart = new PduPart();
- smilPart.setContentId("smil".getBytes());
- smilPart.setContentLocation("smil.xml".getBytes());
- smilPart.setContentType(ContentType.APP_SMIL.getBytes());
- smilPart.setData(smil.getBytes());
- mBody.addPart(0, smilPart);
- }
- }
-
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/SubscriptionManagerFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/SubscriptionManagerFacade.java
deleted file mode 100644
index 0031bc1..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/SubscriptionManagerFacade.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.telephony;
-
-import android.app.Service;
-import android.content.Context;
-import android.telephony.SubscriptionManager;
-import android.telephony.SubscriptionInfo;
-
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-import java.util.List;
-
-/**
- * Exposes SubscriptionManager functionality.
- */
-public class SubscriptionManagerFacade extends RpcReceiver {
-
- private final Service mService;
- private final Context mContext;
- private final SubscriptionManager mSubscriptionManager;
-
- public SubscriptionManagerFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mContext = mService.getBaseContext();
- mSubscriptionManager = SubscriptionManager.from(mContext);
- }
-
- @Rpc(description = "Return the default subscription ID")
- public Integer subscriptionGetDefaultSubId() {
- return SubscriptionManager.getDefaultSubscriptionId();
- }
-
- @Rpc(description = "Return the default data subscription ID")
- public Integer subscriptionGetDefaultDataSubId() {
- return SubscriptionManager.getDefaultDataSubscriptionId();
- }
-
- @Rpc(description = "Set the default data subscription ID")
- public void subscriptionSetDefaultDataSubId(
- @RpcParameter(name = "subId")
- Integer subId) {
- mSubscriptionManager.setDefaultDataSubId(subId);
- }
-
- @Rpc(description = "Return the default voice subscription ID")
- public Integer subscriptionGetDefaultVoiceSubId() {
- return SubscriptionManager.getDefaultVoiceSubscriptionId();
- }
-
- @Rpc(description = "Set the default voice subscription ID")
- public void subscriptionSetDefaultVoiceSubId(
- @RpcParameter(name = "subId")
- Integer subId) {
- mSubscriptionManager.setDefaultVoiceSubId(subId);
- }
-
- @Rpc(description = "Return the default sms subscription ID")
- public Integer subscriptionGetDefaultSmsSubId() {
- return SubscriptionManager.getDefaultSmsSubscriptionId();
- }
-
- @Rpc(description = "Set the default sms subscription ID")
- public void subscriptionSetDefaultSmsSubId(
- @RpcParameter(name = "subId")
- Integer subId) {
- mSubscriptionManager.setDefaultSmsSubId(subId);
- }
-
- @Rpc(description = "Return a List of all Subscription Info Records")
- public List<SubscriptionInfo> subscriptionGetAllSubInfoList() {
- return mSubscriptionManager.getAllSubscriptionInfoList();
- }
-
- @Rpc(description = "Return a List of all Active Subscription Info Records")
- public List<SubscriptionInfo> subscriptionGetActiveSubInfoList() {
- return mSubscriptionManager.getActiveSubscriptionInfoList();
- }
-
- @Rpc(description = "Return the Subscription Info for a Particular Subscription ID")
- public SubscriptionInfo subscriptionGetSubInfoForSubscriber(
- @RpcParameter(name = "subId")
- Integer subId) {
- return mSubscriptionManager.getActiveSubscriptionInfo(subId);
- }
-
- @Rpc(description = "Set Data Roaming Enabled or Disabled for a particular Subscription ID")
- public Integer subscriptionSetDataRoaming(Integer roaming, Integer subId) {
- if (roaming != SubscriptionManager.DATA_ROAMING_DISABLE) {
- return mSubscriptionManager.setDataRoaming(
- SubscriptionManager.DATA_ROAMING_ENABLE, subId);
- } else {
- return mSubscriptionManager.setDataRoaming(
- SubscriptionManager.DATA_ROAMING_DISABLE, subId);
- }
- }
-
- @Override
- public void shutdown() {
-
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/TelecomCallFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/TelecomCallFacade.java
deleted file mode 100644
index 070e649..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/TelecomCallFacade.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.telephony;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-import android.app.Service;
-import android.telecom.Call;
-import android.telecom.CallAudioState;
-import android.telecom.PhoneAccount;
-import android.telecom.PhoneAccountHandle;
-import android.telecom.VideoProfile;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.facade.EventFacade;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcOptional;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-/**
- * Exposes TelecomManager functionality.
- */
-public class TelecomCallFacade extends RpcReceiver {
-
- private final Service mService;
-
- private List<PhoneAccountHandle> mEnabledAccountHandles = null;
-
- public TelecomCallFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
-
- InCallServiceImpl.setEventFacade(
- manager.getReceiver(EventFacade.class));
- }
-
- @Override
- public void shutdown() {
- InCallServiceImpl.setEventFacade(null);
- }
-
- /**
- * Returns an identifier of the call. When a phone number is available, the number will be
- * returned. Otherwise, the standard object toString result of the Call object. e.g. A
- * conference call does not have a single number associated with it, thus the toString Id will
- * be returned.
- *
- * @param call
- * @return String
- */
-
- @Rpc(description = "Disconnect call by callId.")
- public void telecomCallDisconnect(
- @RpcParameter(name = "callId")
- String callId) {
- InCallServiceImpl.callDisconnect(callId);
- }
-
- @Rpc(description = "Hold call by callId")
- public void telecomCallHold(
- @RpcParameter(name = "callId")
- String callId) {
- InCallServiceImpl.holdCall(callId);
- }
-
- @Rpc(description = "Merge call to conference by callId")
- public void telecomCallMergeToConf(
- @RpcParameter(name = "callId")
- String callId) {
- InCallServiceImpl.mergeCallsInConference(callId);
- }
-
- @Rpc(description = "Split call from conference by callId.")
- public void telecomCallSplitFromConf(
- @RpcParameter(name = "callId")
- String callId) {
- InCallServiceImpl.splitCallFromConf(callId);
- }
-
- @Rpc(description = "Unhold call by callId")
- public void telecomCallUnhold(
- @RpcParameter(name = "callId")
- String callId) {
- InCallServiceImpl.unholdCall(callId);
- }
-
- @Rpc(description = "Joins two calls into a conference call. "
- + "Calls are identified by their "
- + "IDs listed by telecomPhoneGetCallIds")
- public void telecomCallJoinCallsInConf(
- @RpcParameter(name = "callIdOne")
- String callIdOne,
- @RpcParameter(name = "callIdTwo")
- String callIdTwo) {
- InCallServiceImpl.joinCallsInConf(callIdOne, callIdTwo);
- }
-
- @Rpc(description = "Obtains the current call audio state of the phone.")
- public CallAudioState telecomCallGetAudioState() {
- return InCallServiceImpl.serviceGetCallAudioState();
- }
-
- @Rpc(description = "Lists the IDs (phone numbers or hex hashes) "
- + "of the current calls.")
- public Set<String> telecomCallGetCallIds() {
- return InCallServiceImpl.getCallIdList();
- }
- @Rpc(description = "Get callId's children")
- public List<String> telecomCallGetCallChildren(
- @RpcParameter(name = "callId") String callId) {
- return InCallServiceImpl.getCallChildren(callId);
- }
- @Rpc(description = "Get callId's parent")
- public String telecomCallGetCallParent(
- @RpcParameter(name = "callId") String callId) {
- return InCallServiceImpl.getCallParent(callId);
- }
- @Rpc(description = "Swaps the calls within this conference")
- public void telecomCallSwapCallsInConference(
- @RpcParameter(name = "callId") String callId) {
- InCallServiceImpl.swapCallsInConference(callId);
- }
- @Rpc(description = "Play a dual-tone multi-frequency signaling (DTMF) tone")
- public void telecomCallPlayDtmfTone(
- @RpcParameter(name = "callId") String callId,
- @RpcParameter(name = "digit") String digitString) {
- for(int i = 0; i < digitString.length(); i++) {
- char c = digitString.charAt(i);
- InCallServiceImpl.callPlayDtmfTone(callId, c);
- }
- }
- @Rpc(description = "Stop any dual-tone multi-frequency signaling (DTMF) tone")
- public void telecomCallStopDtmfTone(
- @RpcParameter(name = "callId") String callId) {
- InCallServiceImpl.callStopDtmfTone(callId);
- }
- @Rpc(description = "Obtains a list of text message, user to reject call.")
- public List<String> telecomCallGetCannedTextResponses(
- @RpcParameter(name = "callId") String callId) {
- return InCallServiceImpl.callGetCannedTextResponses(callId);
- }
- @Rpc(description = "Reset the Call List.")
- public void telecomCallClearCallList() {
- InCallServiceImpl.clearCallList();
- }
-
- @Rpc(description = "Get the state of a call according to call id.")
- public String telecomCallGetCallState(
- @RpcParameter(name = "callId")
- String callId) {
-
- return InCallServiceImpl.callGetState(callId);
- }
-
- @Rpc(description = "Sets the audio route (SPEAKER, BLUETOOTH, etc...).")
- public void telecomCallSetAudioRoute(
- @RpcParameter(name = "route")
- String route) {
-
- InCallServiceImpl.serviceSetAudioRoute(route);
- }
-
- @Rpc(description = "Turns the proximity sensor off. "
- + "If screenOnImmediately is true, "
- + "the screen will be turned on immediately")
- public void telecomCallOverrideProximitySensor(
- @RpcParameter(name = "screenOn")
- Boolean screenOn) {
- InCallServiceImpl.overrideProximitySensor(screenOn);
- }
-
- @Rpc(description = "Answer a call of a specified id, with video state")
- public void telecomCallAnswer(
- @RpcParameter(name = "call")
- String callId,
- @RpcParameter(name = "videoState")
- String videoState) {
- InCallServiceImpl.callAnswer(callId, videoState);
- }
-
- @Rpc(description = "Answer a call of a specified id, with video state")
- public void telecomCallReject(
- @RpcParameter(name = "call")
- String callId,
- @RpcParameter(name = "message")
- String message) {
- InCallServiceImpl.callReject(callId, message);
- }
-
- @Rpc(description = "Start Listening for a VideoCall Event")
- public void telecomCallStartListeningForEvent(
- @RpcParameter(name = "call")
- String callId,
- @RpcParameter(name = "event")
- String event) {
- InCallServiceImpl.callStartListeningForEvent(callId, event);
- }
-
- @Rpc(description = "Stop Listening for a Call Event")
- public void telecomCallStopListeningForEvent(
- @RpcParameter(name = "call")
- String callId,
- @RpcParameter(name = "event")
- String event) {
- InCallServiceImpl.callStopListeningForEvent(callId, event);
- }
-
- @Rpc(description = "Get the detailed information about a call")
- public Call.Details telecomCallGetDetails(
- @RpcParameter(name = "callId")
- String callId) {
- return InCallServiceImpl.callGetDetails(callId);
- }
-
- @Rpc(description = "Return the capabilities for a call")
- public List<String> telecomCallGetCapabilities(
- @RpcParameter(name = "callId")
- String callId) {
- return InCallServiceImpl.callGetCallCapabilities(callId);
- }
-
- @Rpc(description = "Return the properties for a call")
- public List<String> telecomCallGetProperties(
- @RpcParameter(name = "callId")
- String callId) {
- return InCallServiceImpl.callGetCallProperties(callId);
- }
-
- @Rpc(description = "Start Listening for a VideoCall Event")
- public void telecomCallVideoStartListeningForEvent(
- @RpcParameter(name = "call")
- String callId,
- @RpcParameter(name = "event")
- String event) {
- InCallServiceImpl.videoCallStartListeningForEvent(callId, event);
- }
-
- @Rpc(description = "Stop Listening for a VideoCall Event")
- public void telecomCallVideoStopListeningForEvent(
- @RpcParameter(name = "call")
- String callId,
- @RpcParameter(name = "event")
- String event) {
- InCallServiceImpl.videoCallStopListeningForEvent(callId, event);
- }
-
- @Rpc(description = "Get the Video Call State")
- public String telecomCallVideoGetState(
- @RpcParameter(name = "call")
- String callId) {
- return InCallServiceImpl.videoCallGetState(callId);
- }
-
- @Rpc(description = "Send a request to modify the video call session parameters")
- public void telecomCallVideoSendSessionModifyRequest(
- @RpcParameter(name = "call")
- String callId,
- @RpcParameter(name = "videoState")
- String videoState,
- @RpcParameter(name = "videoQuality")
- String videoQuality) {
- InCallServiceImpl.videoCallSendSessionModifyRequest(callId, videoState, videoQuality);
- }
-
- @Rpc(description = "Send a response to a modify the video call session request")
- public void telecomCallVideoSendSessionModifyResponse(
- @RpcParameter(name = "call")
- String callId,
- @RpcParameter(name = "videoState")
- String videoState,
- @RpcParameter(name = "videoQuality")
- String videoQuality) {
- InCallServiceImpl.videoCallSendSessionModifyResponse(callId, videoState, videoQuality);
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/TelecomManagerFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/TelecomManagerFacade.java
deleted file mode 100644
index caa60ab..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/TelecomManagerFacade.java
+++ /dev/null
@@ -1,382 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.telephony;
-
-import java.io.UnsupportedEncodingException;
-import java.lang.reflect.Field;
-import java.net.URLEncoder;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import android.app.Service;
-import android.content.ContentResolver;
-import android.content.Intent;
-import android.database.Cursor;
-import android.telecom.AudioState;
-import android.telecom.Call;
-import android.telecom.PhoneAccount;
-import android.telecom.PhoneAccountHandle;
-import android.telecom.TelecomManager;
-import android.telecom.VideoProfile;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-import android.net.Uri;
-import android.provider.ContactsContract;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.facade.AndroidFacade;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcDefault;
-import com.googlecode.android_scripting.rpc.RpcOptional;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-/**
- * Exposes TelecomManager functionality.
- */
-public class TelecomManagerFacade extends RpcReceiver {
-
- private final Service mService;
- private final AndroidFacade mAndroidFacade;
-
- private final TelecomManager mTelecomManager;
- private final TelephonyManager mTelephonyManager;
-
- private List<PhoneAccountHandle> mEnabledAccountHandles = null;
-
- public TelecomManagerFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mTelecomManager = new TelecomManager(mService);
- mTelephonyManager = new TelephonyManager(mService);
- mAndroidFacade = manager.getReceiver(AndroidFacade.class);
- }
-
- @Override
- public void shutdown() {
- }
-
- @Rpc(description = "If there's a ringing call, accept on behalf of the user.")
- public void telecomAcceptRingingCall(
- @RpcOptional
- String videoState) {
-
- if (videoState == null) {
- mTelecomManager.acceptRingingCall();
- }
- else {
- int state = InCallServiceImpl.getVideoCallState(videoState);
-
- if (state == InCallServiceImpl.STATE_INVALID) {
- Log.e("telecomAcceptRingingCall: video state is invalid!");
- return;
- }
-
- mTelecomManager.acceptRingingCall(state);
- }
- }
-
- @Rpc(description = "Removes the missed-call notification if one is present.")
- public void telecomCancelMissedCallsNotification() {
- mTelecomManager.cancelMissedCallsNotification();
- }
-
- @Rpc(description = "Remove all Accounts that belong to the calling package from the system.")
- public void telecomClearAccounts() {
- mTelecomManager.clearAccounts();
- }
-
- @Rpc(description = "End an ongoing call.")
- public Boolean telecomEndCall() {
- return mTelecomManager.endCall();
- }
-
- @Rpc(description = "Get a list of all PhoneAccounts.")
- public List<PhoneAccount> telecomGetAllPhoneAccounts() {
- return mTelecomManager.getAllPhoneAccounts();
- }
-
- @Rpc(description = "Get the current call state.")
- public String telecomGetCallState() {
- int state = mTelecomManager.getCallState();
- return TelephonyUtils.getTelephonyCallStateString(state);
- }
-
- @Rpc(description = "Get the current tty mode.")
- public String telecomGetCurrentTtyMode() {
- int mode = mTelecomManager.getCurrentTtyMode();
- return TelephonyUtils.getTtyModeString(mode);
- }
-
- @Rpc(description = "Bring incallUI to foreground.")
- public void telecomShowInCallScreen(
- @RpcParameter(name = "showDialpad")
- @RpcOptional
- @RpcDefault("false")
- Boolean showDialpad) {
- mTelecomManager.showInCallScreen(showDialpad);
- }
-
- @Rpc(description = "Get the list of PhoneAccountHandles with calling capability.")
- public List<PhoneAccountHandle> telecomGetEnabledPhoneAccounts() {
- mEnabledAccountHandles = mTelecomManager.getCallCapablePhoneAccounts();
- return mEnabledAccountHandles;
- }
-
- @Rpc(description = "Set the user-chosen default PhoneAccount for making outgoing phone calls.")
- public void telecomSetUserSelectedOutgoingPhoneAccount(
- @RpcParameter(name = "phoneAccountHandleId")
- String phoneAccountHandleId) throws Exception {
-
- List<PhoneAccountHandle> accountHandles = mTelecomManager
- .getAllPhoneAccountHandles();
- for (PhoneAccountHandle handle : accountHandles) {
- if (handle.getId().equals(phoneAccountHandleId)) {
- mTelecomManager.setUserSelectedOutgoingPhoneAccount(handle);
- Log.d(String.format("Set default Outgoing Phone Account(%s)",
- phoneAccountHandleId));
- return;
- }
- }
- Log.d(String.format(
- "Failed to find a matching phoneAccountHandleId(%s).",
- phoneAccountHandleId));
- throw new Exception(String.format(
- "Failed to find a matching phoneAccountHandleId(%s).",
- phoneAccountHandleId));
- }
-
- @Rpc(description = "Get the user-chosen default PhoneAccount for making outgoing phone calls.")
- public PhoneAccountHandle telecomGetUserSelectedOutgoingPhoneAccount() {
- return mTelecomManager.getUserSelectedOutgoingPhoneAccount();
- }
-
- @Rpc(description = "Set the PhoneAccount corresponding to user selected subscription id " +
- " for making outgoing phone calls.")
- public void telecomSetUserSelectedOutgoingPhoneAccountBySubId(
- @RpcParameter(name = "subId")
- Integer subId) throws Exception {
- Iterator<PhoneAccountHandle> phoneAccounts =
- mTelecomManager.getCallCapablePhoneAccounts().listIterator();
-
- while (phoneAccounts.hasNext()) {
- PhoneAccountHandle phoneAccountHandle = phoneAccounts.next();
- PhoneAccount phoneAccount =
- mTelecomManager.getPhoneAccount(phoneAccountHandle);
- if (subId == mTelephonyManager.getSubIdForPhoneAccount(phoneAccount)) {
- mTelecomManager.setUserSelectedOutgoingPhoneAccount(phoneAccountHandle);
- Log.d(String.format(
- "Set default Outgoing Phone Account for subscription(%s)", subId));
- return;
- }
- }
- Log.d(String.format(
- "Failed to find a matching Phone Account for subscription (%s).",
- subId));
- throw new Exception(String.format(
- "Failed to find a matching Phone Account for subscription (%s).",
- subId));
- }
-
- @Rpc(description = "Returns whether there is an ongoing phone call.")
- public Boolean telecomIsInCall() {
- return mTelecomManager.isInCall();
- }
-
- @Rpc(description = "Returns whether there is a ringing incoming call.")
- public Boolean telecomIsRinging() {
- return mTelecomManager.isRinging();
- }
-
- @Rpc(description = "Silences the rigner if there's a ringing call.")
- public void telecomSilenceRinger() {
- mTelecomManager.silenceRinger();
- }
-
- @Rpc(description = "Swap two calls")
- public void telecomSwapCalls() {
- // TODO: b/26273475 Add logic to swap the foreground and back ground calls
- }
-
- @Rpc(description = "Toggles call waiting feature on or off for default voice subscription id.")
- public void toggleCallWaiting(
- @RpcParameter(name = "enabled")
- @RpcOptional
- Boolean enabled) {
- toggleCallWaitingForSubscription(
- SubscriptionManager.getDefaultVoiceSubscriptionId(), enabled);
- }
-
- @Rpc(description = "Toggles call waiting feature on or off for specified subscription id.")
- public void toggleCallWaitingForSubscription(
- @RpcParameter(name = "subId")
- @RpcOptional
- Integer subId,
- @RpcParameter(name = "enabled")
- @RpcOptional
- Boolean enabled) {
- // TODO: b/26273478 Enable or Disable the call waiting feature
- }
-
- @Rpc(description = "Sends an MMI string to Telecom for processing")
- public void telecomHandleMmi(
- @RpcParameter(name = "dialString")
- String dialString) {
- mTelecomManager.handleMmi(dialString);
- }
-
- // TODO: b/20917712 add support to pass arbitrary "Extras" object
- // for videoCall parameter
- @Deprecated
- @Rpc(description = "Calls a phone by resolving a generic URI.")
- public void telecomCall(
- @RpcParameter(name = "uriString")
- final String uriString,
- @RpcParameter(name = "videoCall")
- @RpcOptional
- @RpcDefault("false")
- Boolean videoCall) throws Exception {
-
- Log.w("Function telecomCall is deprecated; please use a URI-specific call");
-
- Uri uri = Uri.parse(uriString);
- if (uri.getScheme().equals("content")) {
- telecomCallContentUri(uriString, videoCall);
- }
- else {
- telecomCallNumber(uriString, videoCall);
- }
- }
-
- // TODO: b/20917712 add support to pass arbitrary "Extras" object
- // for videoCall parameter
- @Rpc(description = "Calls a phone by resolving a Content-type URI.")
- public void telecomCallContentUri(
- @RpcParameter(name = "uriString")
- final String uriString,
- @RpcParameter(name = "videoCall")
- @RpcOptional
- @RpcDefault("false")
- Boolean videoCall)
- throws Exception {
- Uri uri = Uri.parse(uriString);
- if (!uri.getScheme().equals("content")) {
- Log.e("Invalid URI!!");
- return;
- }
-
- String phoneNumberColumn = ContactsContract.PhoneLookup.NUMBER;
- String selectWhere = null;
- if ((FacadeManager.class.cast(mManager)).getSdkLevel() >= 5) {
- Class<?> contactsContract_Data_class =
- Class.forName("android.provider.ContactsContract$Data");
- Field RAW_CONTACT_ID_field =
- contactsContract_Data_class.getField("RAW_CONTACT_ID");
- selectWhere = RAW_CONTACT_ID_field.get(null).toString() + "="
- + uri.getLastPathSegment();
- Field CONTENT_URI_field =
- contactsContract_Data_class.getField("CONTENT_URI");
- uri = Uri.parse(CONTENT_URI_field.get(null).toString());
- Class<?> ContactsContract_CommonDataKinds_Phone_class =
- Class.forName("android.provider.ContactsContract$CommonDataKinds$Phone");
- Field NUMBER_field =
- ContactsContract_CommonDataKinds_Phone_class.getField("NUMBER");
- phoneNumberColumn = NUMBER_field.get(null).toString();
- }
- ContentResolver resolver = mService.getContentResolver();
- Cursor c = resolver.query(uri, new String[] {
- phoneNumberColumn
- },
- selectWhere, null, null);
- String number = "";
- if (c.moveToFirst()) {
- number = c.getString(c.getColumnIndexOrThrow(phoneNumberColumn));
- }
- c.close();
- telecomCallNumber(number, videoCall);
- }
-
- // TODO: b/20917712 add support to pass arbitrary "Extras" object
- // for videoCall parameter
- @Rpc(description = "Calls a phone number.")
- public void telecomCallNumber(
- @RpcParameter(name = "number")
- final String number,
- @RpcParameter(name = "videoCall")
- @RpcOptional
- @RpcDefault("false")
- Boolean videoCall)
- throws Exception {
- telecomCallTelUri("tel:" + URLEncoder.encode(number, "ASCII"), videoCall);
- }
-
- // TODO: b/20917712 add support to pass arbitrary "Extras" object
- // for videoCall parameter
- @Rpc(description = "Calls a phone by Tel-URI.")
- public void telecomCallTelUri(
- @RpcParameter(name = "uriString")
- final String uriString,
- @RpcParameter(name = "videoCall")
- @RpcOptional
- @RpcDefault("false")
- Boolean videoCall) throws Exception {
- if (!uriString.startsWith("tel:")) {
- Log.w("Invalid tel URI" + uriString);
- return;
- }
-
- Intent intent = new Intent(Intent.ACTION_CALL);
- intent.setDataAndType(Uri.parse(uriString).normalizeScheme(), null);
-
- if (videoCall) {
- Log.d("Placing a bi-directional video call");
- intent.putExtra(TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE,
- VideoProfile.STATE_BIDIRECTIONAL);
- }
-
- mAndroidFacade.startActivityIntent(intent, false);
- }
-
- @Rpc(description = "Calls an Emergency number.")
- public void telecomCallEmergencyNumber(
- @RpcParameter(name = "number")
- final String number)
- throws Exception {
- String uriString = "tel:" + URLEncoder.encode(number, "ASCII");
- mAndroidFacade.startActivity(Intent.ACTION_CALL_PRIVILEGED, uriString,
- null, null, null, null, null);
- }
-
- @Rpc(description = "Dials a contact/phone number by URI.")
- public void telecomDial(
- @RpcParameter(name = "uri")
- final String uri)
- throws Exception {
- mAndroidFacade.startActivity(Intent.ACTION_DIAL, uri, null, null, null,
- null, null);
- }
-
- @Rpc(description = "Dials a phone number.")
- public void telecomDialNumber(@RpcParameter(name = "phone number")
- final String number)
- throws Exception, UnsupportedEncodingException {
- telecomDial("tel:" + URLEncoder.encode(number, "ASCII"));
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/TelephonyConstants.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/TelephonyConstants.java
deleted file mode 100644
index 4c1b466..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/TelephonyConstants.java
+++ /dev/null
@@ -1,460 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.telephony;
-
-public class TelephonyConstants {
- /**
- * Constant for WiFi Calling WFC mode
- * **/
- public static final String WFC_MODE_WIFI_ONLY = "WIFI_ONLY";
- public static final String WFC_MODE_CELLULAR_PREFERRED = "CELLULAR_PREFERRED";
- public static final String WFC_MODE_WIFI_PREFERRED = "WIFI_PREFERRED";
- public static final String WFC_MODE_DISABLED = "DISABLED";
- public static final String WFC_MODE_UNKNOWN = "UNKNOWN";
-
- /**
- * Constant for Video Telephony VT state
- * **/
- public static final String VT_STATE_AUDIO_ONLY = "AUDIO_ONLY";
- public static final String VT_STATE_TX_ENABLED = "TX_ENABLED";
- public static final String VT_STATE_RX_ENABLED = "RX_ENABLED";
- public static final String VT_STATE_BIDIRECTIONAL = "BIDIRECTIONAL";
- public static final String VT_STATE_TX_PAUSED = "TX_PAUSED";
- public static final String VT_STATE_RX_PAUSED = "RX_PAUSED";
- public static final String VT_STATE_BIDIRECTIONAL_PAUSED = "BIDIRECTIONAL_PAUSED";
- public static final String VT_STATE_STATE_INVALID = "INVALID";
-
- /**
- * Constant for Video Telephony Video quality
- * **/
- public static final String VT_VIDEO_QUALITY_DEFAULT = "DEFAULT";
- public static final String VT_VIDEO_QUALITY_UNKNOWN = "UNKNOWN";
- public static final String VT_VIDEO_QUALITY_HIGH = "HIGH";
- public static final String VT_VIDEO_QUALITY_MEDIUM = "MEDIUM";
- public static final String VT_VIDEO_QUALITY_LOW = "LOW";
- public static final String VT_VIDEO_QUALITY_INVALID = "INVALID";
-
- /**
- * Constant for Call State (for call object)
- * **/
- public static final String CALL_STATE_ACTIVE = "ACTIVE";
- public static final String CALL_STATE_NEW = "NEW";
- public static final String CALL_STATE_DIALING = "DIALING";
- public static final String CALL_STATE_RINGING = "RINGING";
- public static final String CALL_STATE_HOLDING = "HOLDING";
- public static final String CALL_STATE_DISCONNECTED = "DISCONNECTED";
- public static final String CALL_STATE_PRE_DIAL_WAIT = "PRE_DIAL_WAIT";
- public static final String CALL_STATE_CONNECTING = "CONNECTING";
- public static final String CALL_STATE_DISCONNECTING = "DISCONNECTING";
- public static final String CALL_STATE_UNKNOWN = "UNKNOWN";
- public static final String CALL_STATE_INVALID = "INVALID";
-
- /**
- * Constant for PRECISE Call State (for call object)
- * **/
- public static final String PRECISE_CALL_STATE_ACTIVE = "ACTIVE";
- public static final String PRECISE_CALL_STATE_ALERTING = "ALERTING";
- public static final String PRECISE_CALL_STATE_DIALING = "DIALING";
- public static final String PRECISE_CALL_STATE_INCOMING = "INCOMING";
- public static final String PRECISE_CALL_STATE_HOLDING = "HOLDING";
- public static final String PRECISE_CALL_STATE_DISCONNECTED = "DISCONNECTED";
- public static final String PRECISE_CALL_STATE_WAITING = "WAITING";
- public static final String PRECISE_CALL_STATE_DISCONNECTING = "DISCONNECTING";
- public static final String PRECISE_CALL_STATE_IDLE = "IDLE";
- public static final String PRECISE_CALL_STATE_UNKNOWN = "UNKNOWN";
- public static final String PRECISE_CALL_STATE_INVALID = "INVALID";
-
- /**
- * Constant for DC POWER STATE
- * **/
- public static final String DC_POWER_STATE_LOW = "LOW";
- public static final String DC_POWER_STATE_HIGH = "HIGH";
- public static final String DC_POWER_STATE_MEDIUM = "MEDIUM";
- public static final String DC_POWER_STATE_UNKNOWN = "UNKNOWN";
-
- /**
- * Constant for Audio Route
- * **/
- public static final String AUDIO_ROUTE_EARPIECE = "EARPIECE";
- public static final String AUDIO_ROUTE_BLUETOOTH = "BLUETOOTH";
- public static final String AUDIO_ROUTE_SPEAKER = "SPEAKER";
- public static final String AUDIO_ROUTE_WIRED_HEADSET = "WIRED_HEADSET";
- public static final String AUDIO_ROUTE_WIRED_OR_EARPIECE = "WIRED_OR_EARPIECE";
-
- /**
- * Constant for Call Capability
- * **/
- public static final String CALL_CAPABILITY_HOLD = "HOLD";
- public static final String CALL_CAPABILITY_SUPPORT_HOLD = "SUPPORT_HOLD";
- public static final String CALL_CAPABILITY_MERGE_CONFERENCE = "MERGE_CONFERENCE";
- public static final String CALL_CAPABILITY_SWAP_CONFERENCE = "SWAP_CONFERENCE";
- public static final String CALL_CAPABILITY_UNUSED_1 = "UNUSED_1";
- public static final String CALL_CAPABILITY_RESPOND_VIA_TEXT = "RESPOND_VIA_TEXT";
- public static final String CALL_CAPABILITY_MUTE = "MUTE";
- public static final String CALL_CAPABILITY_MANAGE_CONFERENCE = "MANAGE_CONFERENCE";
- public static final String CALL_CAPABILITY_SUPPORTS_VT_LOCAL_RX = "SUPPORTS_VT_LOCAL_RX";
- public static final String CALL_CAPABILITY_SUPPORTS_VT_LOCAL_TX = "SUPPORTS_VT_LOCAL_TX";
- public static final String CALL_CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL = "SUPPORTS_VT_LOCAL_BIDIRECTIONAL";
- public static final String CALL_CAPABILITY_SUPPORTS_VT_REMOTE_RX = "SUPPORTS_VT_REMOTE_RX";
- public static final String CALL_CAPABILITY_SUPPORTS_VT_REMOTE_TX = "SUPPORTS_VT_REMOTE_TX";
- public static final String CALL_CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL = "SUPPORTS_VT_REMOTE_BIDIRECTIONAL";
- public static final String CALL_CAPABILITY_SEPARATE_FROM_CONFERENCE = "SEPARATE_FROM_CONFERENCE";
- public static final String CALL_CAPABILITY_DISCONNECT_FROM_CONFERENCE = "DISCONNECT_FROM_CONFERENCE";
- public static final String CALL_CAPABILITY_SPEED_UP_MT_AUDIO = "SPEED_UP_MT_AUDIO";
- public static final String CALL_CAPABILITY_CAN_UPGRADE_TO_VIDEO = "CAN_UPGRADE_TO_VIDEO";
- public static final String CALL_CAPABILITY_CAN_PAUSE_VIDEO = "CAN_PAUSE_VIDEO";
- public static final String CALL_CAPABILITY_UNKOWN = "UNKOWN";
-
- /**
- * Constant for Call Property
- * **/
- public static final String CALL_PROPERTY_HIGH_DEF_AUDIO = "HIGH_DEF_AUDIO";
- public static final String CALL_PROPERTY_CONFERENCE = "CONFERENCE";
- public static final String CALL_PROPERTY_GENERIC_CONFERENCE = "GENERIC_CONFERENCE";
- public static final String CALL_PROPERTY_WIFI = "WIFI";
- public static final String CALL_PROPERTY_EMERGENCY_CALLBACK_MODE = "EMERGENCY_CALLBACK_MODE";
- public static final String CALL_PROPERTY_UNKNOWN = "UNKNOWN";
-
- /**
- * Constant for Call Presentation
- * **/
- public static final String CALL_PRESENTATION_ALLOWED = "ALLOWED";
- public static final String CALL_PRESENTATION_RESTRICTED = "RESTRICTED";
- public static final String CALL_PRESENTATION_PAYPHONE = "PAYPHONE";
- public static final String CALL_PRESENTATION_UNKNOWN = "UNKNOWN";
-
- /**
- * Constant for Network RAT
- * **/
- public static final String RAT_IWLAN = "IWLAN";
- public static final String RAT_LTE = "LTE";
- public static final String RAT_4G = "4G";
- public static final String RAT_3G = "3G";
- public static final String RAT_2G = "2G";
- public static final String RAT_WCDMA = "WCDMA";
- public static final String RAT_UMTS = "UMTS";
- public static final String RAT_1XRTT = "1XRTT";
- public static final String RAT_EDGE = "EDGE";
- public static final String RAT_GPRS = "GPRS";
- public static final String RAT_HSDPA = "HSDPA";
- public static final String RAT_HSUPA = "HSUPA";
- public static final String RAT_CDMA = "CDMA";
- public static final String RAT_EVDO = "EVDO";
- public static final String RAT_EVDO_0 = "EVDO_0";
- public static final String RAT_EVDO_A = "EVDO_A";
- public static final String RAT_EVDO_B = "EVDO_B";
- public static final String RAT_IDEN = "IDEN";
- public static final String RAT_EHRPD = "EHRPD";
- public static final String RAT_HSPA = "HSPA";
- public static final String RAT_HSPAP = "HSPAP";
- public static final String RAT_GSM = "GSM";
- public static final String RAT_TD_SCDMA = "TD_SCDMA";
- public static final String RAT_GLOBAL = "GLOBAL";
- public static final String RAT_UNKNOWN = "UNKNOWN";
-
- /**
- * Constant for Phone Type
- * **/
- public static final String PHONE_TYPE_GSM = "GSM";
- public static final String PHONE_TYPE_NONE = "NONE";
- public static final String PHONE_TYPE_CDMA = "CDMA";
- public static final String PHONE_TYPE_SIP = "SIP";
-
- /**
- * Constant for SIM State
- * **/
- public static final String SIM_STATE_READY = "READY";
- public static final String SIM_STATE_UNKNOWN = "UNKNOWN";
- public static final String SIM_STATE_ABSENT = "ABSENT";
- public static final String SIM_STATE_PUK_REQUIRED = "PUK_REQUIRED";
- public static final String SIM_STATE_PIN_REQUIRED = "PIN_REQUIRED";
- public static final String SIM_STATE_NETWORK_LOCKED = "NETWORK_LOCKED";
- public static final String SIM_STATE_NOT_READY = "NOT_READY";
- public static final String SIM_STATE_PERM_DISABLED = "PERM_DISABLED";
- public static final String SIM_STATE_CARD_IO_ERROR = "CARD_IO_ERROR";
-
- /**
- * Constant for Data Connection State
- * **/
- public static final String DATA_STATE_CONNECTED = "CONNECTED";
- public static final String DATA_STATE_DISCONNECTED = "DISCONNECTED";
- public static final String DATA_STATE_CONNECTING = "CONNECTING";
- public static final String DATA_STATE_SUSPENDED = "SUSPENDED";
- public static final String DATA_STATE_UNKNOWN = "UNKNOWN";
-
- /**
- * Constant for Telephony Manager Call State
- * **/
- public static final String TELEPHONY_STATE_RINGING = "RINGING";
- public static final String TELEPHONY_STATE_IDLE = "IDLE";
- public static final String TELEPHONY_STATE_OFFHOOK = "OFFHOOK";
- public static final String TELEPHONY_STATE_UNKNOWN = "UNKNOWN";
-
- /**
- * Constant for TTY Mode
- * **/
- public static final String TTY_MODE_FULL = "FULL";
- public static final String TTY_MODE_HCO = "HCO";
- public static final String TTY_MODE_OFF = "OFF";
- public static final String TTY_MODE_VCO ="VCO";
-
- /**
- * Constant for Service State
- * **/
- public static final String SERVICE_STATE_EMERGENCY_ONLY = "EMERGENCY_ONLY";
- public static final String SERVICE_STATE_IN_SERVICE = "IN_SERVICE";
- public static final String SERVICE_STATE_OUT_OF_SERVICE = "OUT_OF_SERVICE";
- public static final String SERVICE_STATE_POWER_OFF = "POWER_OFF";
- public static final String SERVICE_STATE_UNKNOWN = "UNKNOWN";
-
- /**
- * Constant for VoLTE Hand-over Service State
- * **/
- public static final String VOLTE_SERVICE_STATE_HANDOVER_STARTED = "STARTED";
- public static final String VOLTE_SERVICE_STATE_HANDOVER_COMPLETED = "COMPLETED";
- public static final String VOLTE_SERVICE_STATE_HANDOVER_FAILED = "FAILED";
- public static final String VOLTE_SERVICE_STATE_HANDOVER_CANCELED = "CANCELED";
- public static final String VOLTE_SERVICE_STATE_HANDOVER_UNKNOWN = "UNKNOWN";
-
- /**
- * Constant for precise call state state listen level
- * **/
- public static final String PRECISE_CALL_STATE_LISTEN_LEVEL_FOREGROUND = "FOREGROUND";
- public static final String PRECISE_CALL_STATE_LISTEN_LEVEL_RINGING = "RINGING";
- public static final String PRECISE_CALL_STATE_LISTEN_LEVEL_BACKGROUND = "BACKGROUND";
-
- /**
- * Constant for Video Call Session Event Name
- * **/
- public static final String SESSION_EVENT_RX_PAUSE = "SESSION_EVENT_RX_PAUSE";
- public static final String SESSION_EVENT_RX_RESUME = "SESSION_EVENT_RX_RESUME";
- public static final String SESSION_EVENT_TX_START = "SESSION_EVENT_TX_START";
- public static final String SESSION_EVENT_TX_STOP = "SESSION_EVENT_TX_STOP";
- public static final String SESSION_EVENT_CAMERA_FAILURE = "SESSION_EVENT_CAMERA_FAILURE";
- public static final String SESSION_EVENT_CAMERA_READY = "SESSION_EVENT_CAMERA_READY";
- public static final String SESSION_EVENT_UNKNOWN = "SESSION_EVENT_UNKNOWN";
-
- /**
- * Constants used to Register or de-register for Video Call Callbacks
- * **/
- public static final String EVENT_VIDEO_SESSION_MODIFY_REQUEST_RECEIVED = "EVENT_VIDEO_SESSION_MODIFY_REQUEST_RECEIVED";
- public static final String EVENT_VIDEO_SESSION_MODIFY_RESPONSE_RECEIVED = "EVENT_VIDEO_SESSION_MODIFY_RESPONSE_RECEIVED";
- public static final String EVENT_VIDEO_SESSION_EVENT = "EVENT_VIDEO_SESSION_EVENT";
- public static final String EVENT_VIDEO_PEER_DIMENSIONS_CHANGED = "EVENT_VIDEO_PEER_DIMENSIONS_CHANGED";
- public static final String EVENT_VIDEO_QUALITY_CHANGED = "EVENT_VIDEO_QUALITY_CHANGED";
- public static final String EVENT_VIDEO_DATA_USAGE_CHANGED = "EVENT_VIDEO_DATA_USAGE_CHANGED";
- public static final String EVENT_VIDEO_CAMERA_CAPABILITIES_CHANGED = "EVENT_VIDEO_CAMERA_CAPABILITIES_CHANGED";
- public static final String EVENT_VIDEO_INVALID = "EVENT_VIDEO_INVALID";
-
- /**
- * Constant for Network Preference
- * **/
- public static final String NETWORK_MODE_WCDMA_PREF = "NETWORK_MODE_WCDMA_PREF";
- public static final String NETWORK_MODE_GSM_ONLY = "NETWORK_MODE_GSM_ONLY";
- public static final String NETWORK_MODE_WCDMA_ONLY = "NETWORK_MODE_WCDMA_ONLY";
- public static final String NETWORK_MODE_GSM_UMTS = "NETWORK_MODE_GSM_UMTS";
- public static final String NETWORK_MODE_CDMA = "NETWORK_MODE_CDMA";
- public static final String NETWORK_MODE_CDMA_NO_EVDO = "NETWORK_MODE_CDMA_NO_EVDO";
- public static final String NETWORK_MODE_EVDO_NO_CDMA = "NETWORK_MODE_EVDO_NO_CDMA";
- public static final String NETWORK_MODE_GLOBAL = "NETWORK_MODE_GLOBAL";
- public static final String NETWORK_MODE_LTE_CDMA_EVDO = "NETWORK_MODE_LTE_CDMA_EVDO";
- public static final String NETWORK_MODE_LTE_GSM_WCDMA = "NETWORK_MODE_LTE_GSM_WCDMA";
- public static final String NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA = "NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA";
- public static final String NETWORK_MODE_LTE_ONLY = "NETWORK_MODE_LTE_ONLY";
- public static final String NETWORK_MODE_LTE_WCDMA = "NETWORK_MODE_LTE_WCDMA";
- public static final String NETWORK_MODE_TDSCDMA_ONLY = "NETWORK_MODE_TDSCDMA_ONLY";
- public static final String NETWORK_MODE_TDSCDMA_WCDMA = "NETWORK_MODE_TDSCDMA_WCDMA";
- public static final String NETWORK_MODE_LTE_TDSCDMA = "NETWORK_MODE_LTE_TDSCDMA";
- public static final String NETWORK_MODE_TDSCDMA_GSM = "NETWORK_MODE_TDSCDMA_GSM";
- public static final String NETWORK_MODE_LTE_TDSCDMA_GSM = "NETWORK_MODE_LTE_TDSCDMA_GSM";
- public static final String NETWORK_MODE_TDSCDMA_GSM_WCDMA = "NETWORK_MODE_TDSCDMA_GSM_WCDMA";
- public static final String NETWORK_MODE_LTE_TDSCDMA_WCDMA = "NETWORK_MODE_LTE_TDSCDMA_WCDMA";
- public static final String NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA = "NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA";
- public static final String NETWORK_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA = "NETWORK_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA";
- public static final String NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA = "NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA";
- public static final String NETWORK_MODE_INVALID = "INVALID";
-
- /**
- * Constant for Messaging Event Name
- * **/
- public static final String EventSmsDeliverSuccess = "SmsDeliverSuccess";
- public static final String EventSmsDeliverFailure = "SmsDeliverFailure";
- public static final String EventSmsSentSuccess = "SmsSentSuccess";
- public static final String EventSmsSentFailure = "SmsSentFailure";
- public static final String EventSmsReceived = "SmsReceived";
- public static final String EventMmsSentSuccess = "MmsSentSuccess";
- public static final String EventMmsSentFailure = "MmsSentFailure";
- public static final String EventMmsDownloaded = "MmsDownloaded";
- public static final String EventWapPushReceived = "WapPushReceived";
- public static final String EventDataSmsReceived = "DataSmsReceived";
- public static final String EventCmasReceived = "CmasReceived";
- public static final String EventEtwsReceived = "EtwsReceived";
-
- /**
- * Constant for Telecom Call Event Name
- * **/
- public static final String EventTelecomCallStateChanged = "TelecomCallStateChanged";
- public static final String EventTelecomCallParentChanged = "TelecomCallParentChanged";
- public static final String EventTelecomCallChildrenChanged = "TelecomCallChildrenChanged";
- public static final String EventTelecomCallDetailsChanged = "TelecomCallDetailsChanged";
- public static final String EventTelecomCallCannedTextResponsesLoaded = "TelecomCallCannedTextResponsesLoaded";
- public static final String EventTelecomCallPostDialWait = "TelecomCallPostDialWait";
- public static final String EventTelecomCallVideoCallChanged = "TelecomCallVideoCallChanged";
- public static final String EventTelecomCallDestroyed = "TelecomCallDestroyed";
- public static final String EventTelecomCallConferenceableCallsChanged = "TelecomCallConferenceableCallsChanged";
-
- /**
- * Constant for Video Call Event Name
- * **/
- public static final String EventTelecomVideoCallSessionModifyRequestReceived = "TelecomVideoCallSessionModifyRequestReceived";
- public static final String EventTelecomVideoCallSessionModifyResponseReceived = "TelecomVideoCallSessionModifyResponseReceived";
- public static final String EventTelecomVideoCallSessionEvent = "TelecomVideoCallSessionEvent";
- public static final String EventTelecomVideoCallPeerDimensionsChanged = "TelecomVideoCallPeerDimensionsChanged";
- public static final String EventTelecomVideoCallVideoQualityChanged = "TelecomVideoCallVideoQualityChanged";
- public static final String EventTelecomVideoCallDataUsageChanged = "TelecomVideoCallDataUsageChanged";
- public static final String EventTelecomVideoCallCameraCapabilities = "TelecomVideoCallCameraCapabilities";
-
- /**
- * Constant for Other Event Name
- * **/
- public static final String EventCellInfoChanged = "CellInfoChanged";
- public static final String EventCallStateChanged = "CallStateChanged";
- public static final String EventPreciseStateChanged = "PreciseStateChanged";
- public static final String EventDataConnectionRealTimeInfoChanged = "DataConnectionRealTimeInfoChanged";
- public static final String EventDataConnectionStateChanged = "DataConnectionStateChanged";
- public static final String EventServiceStateChanged = "ServiceStateChanged";
- public static final String EventSignalStrengthChanged = "SignalStrengthChanged";
- public static final String EventVolteServiceStateChanged = "VolteServiceStateChanged";
- public static final String EventMessageWaitingIndicatorChanged = "MessageWaitingIndicatorChanged";
- public static final String EventConnectivityChanged = "ConnectivityChanged";
-
- /**
- * Constant for Packet Keep Alive Call Back
- * **/
- public static final String EventPacketKeepaliveCallback = "PacketKeepaliveCallback";
-
- /*Sub-Event Names*/
- public static final String PacketKeepaliveCallbackStarted = "Started";
- public static final String PacketKeepaliveCallbackStopped = "Stopped";
- public static final String PacketKeepaliveCallbackError = "Error";
- public static final String PacketKeepaliveCallbackInvalid = "Invalid";
-
- /**
- * Constant for Network Call Back
- * **/
- public static final String EventNetworkCallback = "NetworkCallback";
-
- /*Sub-Event Names*/
- public static final String NetworkCallbackPreCheck = "PreCheck";
- public static final String NetworkCallbackAvailable = "Available";
- public static final String NetworkCallbackLosing = "Losing";
- public static final String NetworkCallbackLost = "Lost";
- public static final String NetworkCallbackUnavailable = "Unavailable";
- public static final String NetworkCallbackCapabilitiesChanged = "CapabilitiesChanged";
- public static final String NetworkCallbackSuspended = "Suspended";
- public static final String NetworkCallbackResumed = "Resumed";
- public static final String NetworkCallbackLinkPropertiesChanged = "LinkPropertiesChanged";
- public static final String NetworkCallbackInvalid = "Invalid";
-
- /**
- * Constant for Signal Strength fields
- * **/
- public static class SignalStrengthContainer {
- public static final String SIGNAL_STRENGTH_GSM = "gsmSignalStrength";
- public static final String SIGNAL_STRENGTH_GSM_DBM = "gsmDbm";
- public static final String SIGNAL_STRENGTH_GSM_LEVEL = "gsmLevel";
- public static final String SIGNAL_STRENGTH_GSM_ASU_LEVEL = "gsmAsuLevel";
- public static final String SIGNAL_STRENGTH_GSM_BIT_ERROR_RATE = "gsmBitErrorRate";
- public static final String SIGNAL_STRENGTH_CDMA_DBM = "cdmaDbm";
- public static final String SIGNAL_STRENGTH_CDMA_LEVEL = "cdmaLevel";
- public static final String SIGNAL_STRENGTH_CDMA_ASU_LEVEL = "cdmaAsuLevel";
- public static final String SIGNAL_STRENGTH_CDMA_ECIO = "cdmaEcio";
- public static final String SIGNAL_STRENGTH_EVDO_DBM = "evdoDbm";
- public static final String SIGNAL_STRENGTH_EVDO_ECIO = "evdoEcio";
- public static final String SIGNAL_STRENGTH_LTE = "lteSignalStrength";
- public static final String SIGNAL_STRENGTH_LTE_DBM = "lteDbm";
- public static final String SIGNAL_STRENGTH_LTE_LEVEL = "lteLevel";
- public static final String SIGNAL_STRENGTH_LTE_ASU_LEVEL = "lteAsuLevel";
- public static final String SIGNAL_STRENGTH_DBM = "dbm";
- public static final String SIGNAL_STRENGTH_LEVEL = "level";
- public static final String SIGNAL_STRENGTH_ASU_LEVEL = "asuLevel";
- }
-
- public static class CallStateContainer {
- public static final String INCOMING_NUMBER = "incomingNumber";
- public static final String SUBSCRIPTION_ID = "subscriptionId";
- public static final String CALL_STATE = "callState";
- }
-
- public static class PreciseCallStateContainer {
- public static final String TYPE = "type";
- public static final String CAUSE = "cause";
- public static final String SUBSCRIPTION_ID = "subscriptionId";
- public static final String PRECISE_CALL_STATE = "preciseCallState";
- }
-
- public static class DataConnectionRealTimeInfoContainer {
- public static final String TYPE = "type";
- public static final String TIME = "time";
- public static final String SUBSCRIPTION_ID = "subscriptionId";
- public static final String DATA_CONNECTION_POWER_STATE = "dataConnectionPowerState";
- }
-
- public static class DataConnectionStateContainer {
- public static final String TYPE = "type";
- public static final String DATA_NETWORK_TYPE = "dataNetworkType";
- public static final String STATE_CODE = "stateCode";
- public static final String SUBSCRIPTION_ID = "subscriptionId";
- public static final String DATA_CONNECTION_STATE = "dataConnectionState";
- }
-
- public static class ServiceStateContainer {
- public static final String VOICE_REG_STATE = "voiceRegState";
- public static final String VOICE_NETWORK_TYPE = "voiceNetworkType";
- public static final String DATA_REG_STATE = "dataRegState";
- public static final String DATA_NETWORK_TYPE = "dataNetworkType";
- public static final String OPERATOR_NAME = "operatorName";
- public static final String OPERATOR_ID = "operatorId";
- public static final String IS_MANUAL_NW_SELECTION = "isManualNwSelection";
- public static final String ROAMING = "roaming";
- public static final String IS_EMERGENCY_ONLY = "isEmergencyOnly";
- public static final String NETWORK_ID = "networkId";
- public static final String SYSTEM_ID = "systemId";
- public static final String SUBSCRIPTION_ID = "subscriptionId";
- public static final String SERVICE_STATE = "serviceState";
- }
-
- public static class MessageWaitingIndicatorContainer {
- public static final String IS_MESSAGE_WAITING = "isMessageWaiting";
- }
-
- public static class VoLteServiceStateContainer {
- public static final String SRVCC_STATE = "srvccState";
- }
-
- public static class PacketKeepaliveContainer {
- public static final String ID = "id";
- public static final String PACKET_KEEPALIVE_EVENT = "packetKeepaliveEvent";
- }
-
- public static class NetworkCallbackContainer {
- public static final String ID = "id";
- public static final String NETWORK_CALLBACK_EVENT = "networkCallbackEvent";
- public static final String MAX_MS_TO_LIVE = "maxMsToLive";
- public static final String RSSI = "rssi";
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/TelephonyEvents.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/TelephonyEvents.java
deleted file mode 100644
index 2c2e621..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/TelephonyEvents.java
+++ /dev/null
@@ -1,362 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.telephony;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-import android.telephony.DataConnectionRealTimeInfo;
-import android.telephony.PreciseCallState;
-import android.telephony.ServiceState;
-import com.googlecode.android_scripting.jsonrpc.JsonSerializable;
-import com.googlecode.android_scripting.facade.telephony.TelephonyConstants;
-import com.googlecode.android_scripting.facade.telephony.TelephonyUtils;
-
-public class TelephonyEvents {
-
- public static class CallStateEvent implements JsonSerializable {
- private String mCallState;
- private String mIncomingNumber;
- private int mSubscriptionId;
-
- CallStateEvent(int state, String incomingNumber, int subscriptionId) {
- mCallState = null;
- mIncomingNumber = TelephonyUtils.formatIncomingNumber(
- incomingNumber);
- mCallState = TelephonyUtils.getTelephonyCallStateString(
- state);
- mSubscriptionId = subscriptionId;
- }
-
- public String getIncomingNumber() {
- return mIncomingNumber;
- }
-
- public int getSubscriptionId() {
- return mSubscriptionId;
- }
-
- public JSONObject toJSON() throws JSONException {
- JSONObject callState = new JSONObject();
-
- callState.put(
- TelephonyConstants.CallStateContainer.SUBSCRIPTION_ID,
- mSubscriptionId);
- callState.put(
- TelephonyConstants.CallStateContainer.INCOMING_NUMBER,
- mIncomingNumber);
- callState.put(TelephonyConstants.CallStateContainer.CALL_STATE,
- mCallState);
-
- return callState;
- }
- }
-
- public static class PreciseCallStateEvent implements JsonSerializable {
- private PreciseCallState mPreciseCallState;
- private String mPreciseCallStateString;
- private String mType;
- private int mCause;
- private int mSubscriptionId;
-
- PreciseCallStateEvent(int newState, String type,
- PreciseCallState preciseCallState, int subscriptionId) {
- mPreciseCallStateString = TelephonyUtils.getPreciseCallStateString(
- newState);
- mPreciseCallState = preciseCallState;
- mType = type;
- mSubscriptionId = subscriptionId;
- mCause = preciseCallState.getPreciseDisconnectCause();
- }
-
- public String getType() {
- return mType;
- }
-
- public int getSubscriptionId() {
- return mSubscriptionId;
- }
-
- public PreciseCallState getPreciseCallState() {
- return mPreciseCallState;
- }
-
- public int getCause() {
- return mCause;
- }
-
- public JSONObject toJSON() throws JSONException {
- JSONObject preciseCallState = new JSONObject();
-
- preciseCallState.put(
- TelephonyConstants.PreciseCallStateContainer.SUBSCRIPTION_ID,
- mSubscriptionId);
- preciseCallState.put(
- TelephonyConstants.PreciseCallStateContainer.TYPE, mType);
- preciseCallState.put(
- TelephonyConstants.PreciseCallStateContainer.PRECISE_CALL_STATE,
- mPreciseCallStateString);
- preciseCallState.put(
- TelephonyConstants.PreciseCallStateContainer.CAUSE, mCause);
-
- return preciseCallState;
- }
- }
-
- public static class DataConnectionRealTimeInfoEvent implements JsonSerializable {
- private DataConnectionRealTimeInfo mDataConnectionRealTimeInfo;
- private String mDataConnectionPowerState;
- private int mSubscriptionId;
- private long mTime;
-
- DataConnectionRealTimeInfoEvent(
- DataConnectionRealTimeInfo dataConnectionRealTimeInfo,
- int subscriptionId) {
- mTime = dataConnectionRealTimeInfo.getTime();
- mSubscriptionId = subscriptionId;
- mDataConnectionPowerState = TelephonyUtils.getDcPowerStateString(
- dataConnectionRealTimeInfo.getDcPowerState());
- mDataConnectionRealTimeInfo = dataConnectionRealTimeInfo;
- }
-
- public int getSubscriptionId() {
- return mSubscriptionId;
- }
-
- public long getTime() {
- return mTime;
- }
-
- public JSONObject toJSON() throws JSONException {
- JSONObject dataConnectionRealTimeInfo = new JSONObject();
-
- dataConnectionRealTimeInfo.put(
- TelephonyConstants.DataConnectionRealTimeInfoContainer.SUBSCRIPTION_ID,
- mSubscriptionId);
- dataConnectionRealTimeInfo.put(
- TelephonyConstants.DataConnectionRealTimeInfoContainer.TIME,
- mTime);
- dataConnectionRealTimeInfo.put(
- TelephonyConstants.DataConnectionRealTimeInfoContainer.DATA_CONNECTION_POWER_STATE,
- mDataConnectionPowerState);
-
- return dataConnectionRealTimeInfo;
- }
- }
-
- public static class DataConnectionStateEvent implements JsonSerializable {
- private String mDataConnectionState;
- private int mSubscriptionId;
- private int mState;
- private String mDataNetworkType;
-
- DataConnectionStateEvent(int state, String dataNetworkType,
- int subscriptionId) {
- mSubscriptionId = subscriptionId;
- mDataConnectionState = TelephonyUtils.getDataConnectionStateString(
- state);
- mDataNetworkType = dataNetworkType;
- mState = state;
- }
-
- public int getSubscriptionId() {
- return mSubscriptionId;
- }
-
- public int getState() {
- return mState;
- }
-
- public String getDataNetworkType() {
- return mDataNetworkType;
- }
-
- public JSONObject toJSON() throws JSONException {
- JSONObject dataConnectionState = new JSONObject();
-
- dataConnectionState.put(
- TelephonyConstants.DataConnectionStateContainer.SUBSCRIPTION_ID,
- mSubscriptionId);
- dataConnectionState.put(
- TelephonyConstants.DataConnectionStateContainer.DATA_CONNECTION_STATE,
- mDataConnectionState);
- dataConnectionState.put(
- TelephonyConstants.DataConnectionStateContainer.DATA_NETWORK_TYPE,
- mDataNetworkType);
- dataConnectionState.put(
- TelephonyConstants.DataConnectionStateContainer.STATE_CODE,
- mState);
-
- return dataConnectionState;
- }
- }
-
- public static class ServiceStateEvent implements JsonSerializable {
- private String mServiceStateString;
- private int mSubscriptionId;
- private ServiceState mServiceState;
-
- ServiceStateEvent(ServiceState serviceState, int subscriptionId) {
- mServiceState = serviceState;
- mSubscriptionId = subscriptionId;
- mServiceStateString = TelephonyUtils.getNetworkStateString(
- serviceState.getState());
- if (mServiceStateString.equals(
- TelephonyConstants.SERVICE_STATE_OUT_OF_SERVICE) &&
- serviceState.isEmergencyOnly()) {
- mServiceStateString = TelephonyConstants.SERVICE_STATE_EMERGENCY_ONLY;
- }
- }
-
- public int getSubscriptionId() {
- return mSubscriptionId;
- }
-
- public ServiceState getServiceState() {
- return mServiceState;
- }
-
- public JSONObject toJSON() throws JSONException {
- JSONObject serviceState = new JSONObject();
-
- serviceState.put(
- TelephonyConstants.ServiceStateContainer.SUBSCRIPTION_ID,
- mSubscriptionId);
- serviceState.put(
- TelephonyConstants.ServiceStateContainer.VOICE_REG_STATE,
- TelephonyUtils.getNetworkStateString(
- mServiceState.getVoiceRegState()));
- serviceState.put(
- TelephonyConstants.ServiceStateContainer.VOICE_NETWORK_TYPE,
- TelephonyUtils.getNetworkTypeString(
- mServiceState.getVoiceNetworkType()));
- serviceState.put(
- TelephonyConstants.ServiceStateContainer.DATA_REG_STATE,
- TelephonyUtils.getNetworkStateString(
- mServiceState.getDataRegState()));
- serviceState.put(
- TelephonyConstants.ServiceStateContainer.DATA_NETWORK_TYPE,
- TelephonyUtils.getNetworkTypeString(
- mServiceState.getDataNetworkType()));
- serviceState.put(
- TelephonyConstants.ServiceStateContainer.OPERATOR_NAME,
- mServiceState.getOperatorAlphaLong());
- serviceState.put(
- TelephonyConstants.ServiceStateContainer.OPERATOR_ID,
- mServiceState.getOperatorNumeric());
- serviceState.put(
- TelephonyConstants.ServiceStateContainer.IS_MANUAL_NW_SELECTION,
- mServiceState.getIsManualSelection());
- serviceState.put(
- TelephonyConstants.ServiceStateContainer.ROAMING,
- mServiceState.getRoaming());
- serviceState.put(
- TelephonyConstants.ServiceStateContainer.IS_EMERGENCY_ONLY,
- mServiceState.isEmergencyOnly());
- serviceState.put(
- TelephonyConstants.ServiceStateContainer.NETWORK_ID,
- mServiceState.getNetworkId());
- serviceState.put(
- TelephonyConstants.ServiceStateContainer.SYSTEM_ID,
- mServiceState.getSystemId());
- serviceState.put(
- TelephonyConstants.ServiceStateContainer.SERVICE_STATE,
- mServiceStateString);
-
- return serviceState;
- }
- }
-
- public static class MessageWaitingIndicatorEvent implements JsonSerializable {
- private boolean mMessageWaitingIndicator;
-
- MessageWaitingIndicatorEvent(boolean messageWaitingIndicator) {
- mMessageWaitingIndicator = messageWaitingIndicator;
- }
-
- public boolean getMessageWaitingIndicator() {
- return mMessageWaitingIndicator;
- }
-
- public JSONObject toJSON() throws JSONException {
- JSONObject messageWaitingIndicator = new JSONObject();
-
- messageWaitingIndicator.put(
- TelephonyConstants.MessageWaitingIndicatorContainer.IS_MESSAGE_WAITING,
- mMessageWaitingIndicator);
-
- return messageWaitingIndicator;
- }
- }
-
- public static class PacketKeepaliveEvent implements JsonSerializable {
- private String mId;
- private String mPacketKeepaliveEvent;
-
- public PacketKeepaliveEvent(String id, String event) {
- mId = id;
- mPacketKeepaliveEvent = event;
- }
-
- public JSONObject toJSON() throws JSONException {
- JSONObject packetKeepalive = new JSONObject();
-
- packetKeepalive.put(
- TelephonyConstants.PacketKeepaliveContainer.ID,
- mId);
- packetKeepalive.put(
- TelephonyConstants.PacketKeepaliveContainer.PACKET_KEEPALIVE_EVENT,
- mPacketKeepaliveEvent);
-
- return packetKeepalive;
- }
- }
-
- public static class NetworkCallbackEvent implements JsonSerializable {
- public static final Integer INVALID_VALUE = null;
- private String mId;
- private String mNetworkCallbackEvent;
- private Integer mRssi;
- private Integer mMaxMsToLive;
-
- public NetworkCallbackEvent(String id, String event, Integer rssi, Integer maxMsToLive) {
- mId = id;
- mNetworkCallbackEvent = event;
- mRssi = rssi;
- mMaxMsToLive = maxMsToLive;
- }
-
- public JSONObject toJSON() throws JSONException {
- JSONObject networkCallback = new JSONObject();
-
- networkCallback.put(
- TelephonyConstants.NetworkCallbackContainer.ID,
- mId);
- networkCallback.put(
- TelephonyConstants.NetworkCallbackContainer.NETWORK_CALLBACK_EVENT,
- mNetworkCallbackEvent);
- networkCallback.put(
- TelephonyConstants.NetworkCallbackContainer.MAX_MS_TO_LIVE,
- mMaxMsToLive);
- networkCallback.put(
- TelephonyConstants.NetworkCallbackContainer.RSSI,
- mRssi);
-
- return networkCallback;
- }
- }
-
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/TelephonyManagerFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/TelephonyManagerFacade.java
deleted file mode 100644
index 333274a..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/TelephonyManagerFacade.java
+++ /dev/null
@@ -1,1183 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.telephony;
-
-import android.app.Activity;
-import android.app.Service;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.RemoteException;
-import android.provider.ContactsContract;
-import android.telephony.CellInfo;
-import android.telephony.CellLocation;
-import android.telephony.ModemActivityInfo;
-import android.telephony.NeighboringCellInfo;
-import android.telephony.PhoneStateListener;
-import android.telephony.SignalStrength;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-import android.provider.Telephony;
-import android.telephony.SubscriptionInfo;
-import android.telecom.VideoProfile;
-import android.telecom.TelecomManager;
-import android.util.Base64;
-
-import com.android.internal.telephony.PhoneConstants;
-import com.android.internal.telephony.RILConstants;
-import com.android.internal.telephony.TelephonyProperties;
-import com.google.common.io.BaseEncoding;
-
-import android.content.ContentValues;
-import android.os.SystemProperties;
-
-import com.googlecode.android_scripting.facade.AndroidFacade;
-import com.googlecode.android_scripting.facade.EventFacade;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.facade.telephony.TelephonyStateListeners
- .CallStateChangeListener;
-import com.googlecode.android_scripting.facade.telephony.TelephonyStateListeners
- .CellInfoChangeListener;
-import com.googlecode.android_scripting.facade.telephony.TelephonyStateListeners
- .DataConnectionRealTimeInfoChangeListener;
-import com.googlecode.android_scripting.facade.telephony.TelephonyStateListeners
- .DataConnectionStateChangeListener;
-import com.googlecode.android_scripting.facade.telephony.TelephonyStateListeners
- .ServiceStateChangeListener;
-import com.googlecode.android_scripting.facade.telephony.TelephonyStateListeners
- .SignalStrengthChangeListener;
-import com.googlecode.android_scripting.facade.telephony.TelephonyStateListeners
- .VoiceMailStateChangeListener;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcDefault;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.MainThread;
-import com.googlecode.android_scripting.rpc.RpcOptional;
-
-import java.io.UnsupportedEncodingException;
-import java.lang.reflect.Field;
-import java.net.URLEncoder;
-import java.util.List;
-import java.util.concurrent.Callable;
-import java.util.HashMap;
-
-/**
- * Exposes TelephonyManager functionality.
- *
- * @author Damon Kohler (damonkohler@gmail.com)
- * @author Felix Arends (felix.arends@gmail.com)
- */
-public class TelephonyManagerFacade extends RpcReceiver {
-
- private final Service mService;
- private final AndroidFacade mAndroidFacade;
- private final EventFacade mEventFacade;
- private final TelephonyManager mTelephonyManager;
- private final SubscriptionManager mSubscriptionManager;
- private List<SubscriptionInfo> mSubInfos;
- private HashMap<Integer, StateChangeListener> StateChangeListeners =
- new HashMap<Integer, StateChangeListener>();
-
- private static final String[] sProjection = new String[] {
- Telephony.Carriers._ID, // 0
- Telephony.Carriers.NAME, // 1
- Telephony.Carriers.APN, // 2
- Telephony.Carriers.PROXY, // 3
- Telephony.Carriers.PORT, // 4
- Telephony.Carriers.USER, // 5
- Telephony.Carriers.SERVER, // 6
- Telephony.Carriers.PASSWORD, // 7
- Telephony.Carriers.MMSC, // 8
- Telephony.Carriers.MCC, // 9
- Telephony.Carriers.MNC, // 10
- Telephony.Carriers.NUMERIC, // 11
- Telephony.Carriers.MMSPROXY,// 12
- Telephony.Carriers.MMSPORT, // 13
- Telephony.Carriers.AUTH_TYPE, // 14
- Telephony.Carriers.TYPE, // 15
- Telephony.Carriers.PROTOCOL, // 16
- Telephony.Carriers.CARRIER_ENABLED, // 17
- Telephony.Carriers.BEARER_BITMASK, // 18
- Telephony.Carriers.ROAMING_PROTOCOL, // 19
- Telephony.Carriers.MVNO_TYPE, // 20
- Telephony.Carriers.MVNO_MATCH_DATA // 21
- };
-
- public TelephonyManagerFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mTelephonyManager =
- (TelephonyManager) mService.getSystemService(Context.TELEPHONY_SERVICE);
- mAndroidFacade = manager.getReceiver(AndroidFacade.class);
- mEventFacade = manager.getReceiver(EventFacade.class);
- mSubscriptionManager = SubscriptionManager.from(mService);
- mSubInfos = mSubscriptionManager.getAllSubscriptionInfoList();
- MainThread.run(manager.getService(), new Callable<Object>() {
- @Override
- public Object call() throws Exception {
- // Creating listeners for all subscription IDs
- for (int i = 0; i < mSubInfos.size(); i++) {
- int subId = mSubInfos.get(i).getSubscriptionId();
- StateChangeListener tempStateListener =
- new StateChangeListener();
- tempStateListener.mServiceStateChangeListener =
- new ServiceStateChangeListener(mEventFacade, subId);
- tempStateListener.mSignalStrengthChangeListener =
- new SignalStrengthChangeListener(mEventFacade, subId);
- tempStateListener.mDataConnectionStateChangeListener =
- new DataConnectionStateChangeListener(mEventFacade,
- mTelephonyManager, subId);
- tempStateListener.mCallStateChangeListener =
- new CallStateChangeListener(mEventFacade, subId);
- tempStateListener.mCellInfoChangeListener =
- new CellInfoChangeListener(mEventFacade, subId);
- tempStateListener.mDataConnectionRTInfoChangeListener =
- new DataConnectionRealTimeInfoChangeListener(mEventFacade,
- subId);
- tempStateListener.mVoiceMailStateChangeListener =
- new VoiceMailStateChangeListener(mEventFacade, subId);
-
- StateChangeListeners.put(subId, tempStateListener);
- }
- return null;
- }
- });
- }
-
- @Rpc(description = "Set network preference.")
- public boolean telephonySetPreferredNetworkTypes(
- @RpcParameter(name = "nwPreference") String nwPreference) {
- return telephonySetPreferredNetworkTypesForSubscription(nwPreference,
- SubscriptionManager.getDefaultSubscriptionId());
- }
-
- @Rpc(description = "Set network preference for subscription.")
- public boolean telephonySetPreferredNetworkTypesForSubscription(
- @RpcParameter(name = "nwPreference") String nwPreference,
- @RpcParameter(name = "subId") Integer subId) {
- int networkPreferenceInt = TelephonyUtils.getNetworkModeIntfromString(
- nwPreference);
- if (RILConstants.RIL_ERRNO_INVALID_RESPONSE != networkPreferenceInt) {
- return mTelephonyManager.setPreferredNetworkType(
- subId, networkPreferenceInt);
- } else {
- return false;
- }
- }
-
- @Rpc(description = "Get network preference.")
- public String telephonyGetPreferredNetworkTypes() {
- return telephonyGetPreferredNetworkTypesForSubscription(
- SubscriptionManager.getDefaultSubscriptionId());
- }
-
- @Rpc(description = "Get network preference for subscription.")
- public String telephonyGetPreferredNetworkTypesForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- int networkPreferenceInt = mTelephonyManager.getPreferredNetworkType(subId);
- return TelephonyUtils.getNetworkModeStringfromInt(networkPreferenceInt);
- }
-
- @Rpc(description = "Get current voice network type")
- public String telephonyGetCurrentVoiceNetworkType() {
- return telephonyGetCurrentVoiceNetworkTypeForSubscription(
- SubscriptionManager.getDefaultSubscriptionId());
- }
-
- @Rpc(description = "Get current voice network type for subscription")
- public String telephonyGetCurrentVoiceNetworkTypeForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- return TelephonyUtils.getNetworkTypeString(
- mTelephonyManager.getVoiceNetworkType(subId));
- }
-
- @Rpc(description = "Get current data network type")
- public String telephonyGetCurrentDataNetworkType() {
- return telephonyGetCurrentDataNetworkTypeForSubscription(
- SubscriptionManager.getDefaultSubscriptionId());
- }
-
- @Rpc(description = "Get current data network type for subscription")
- public String telephonyGetCurrentDataNetworkTypeForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- return TelephonyUtils.getNetworkTypeString(
- mTelephonyManager.getDataNetworkType(subId));
- }
-
- @Rpc(description = "Get if phone have voice capability")
- public boolean telephonyIsVoiceCapable() {
- return mTelephonyManager.isVoiceCapable();
- }
-
- @Rpc(description = "Get preferred network setting for " +
- "default subscription ID .Return value is integer.")
- public int telephonyGetPreferredNetworkTypeInteger() {
- return telephonyGetPreferredNetworkTypeIntegerForSubscription(
- SubscriptionManager.getDefaultSubscriptionId());
- }
-
- @Rpc(description = "Get preferred network setting for " +
- "specified subscription ID .Return value is integer.")
- public int telephonyGetPreferredNetworkTypeIntegerForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- return mTelephonyManager.getPreferredNetworkType(subId);
- }
-
- @Rpc(description = "Starts tracking call state change" +
- "for default subscription ID.")
- public Boolean telephonyStartTrackingCallState() {
- return telephonyStartTrackingCallStateForSubscription(
- SubscriptionManager.getDefaultVoiceSubscriptionId());
- }
-
- @Rpc(description = "Starts tracking call state change" +
- "for specified subscription ID.")
- public Boolean telephonyStartTrackingCallStateForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- try {
- mTelephonyManager.listen(
- StateChangeListeners.get(subId).mCallStateChangeListener,
- CallStateChangeListener.sListeningStates);
- return true;
- } catch (Exception e) {
- Log.e("Invalid subscription ID");
- return false;
- }
- }
-
- @Rpc(description = "Starts tracking cell info change" +
- "for default subscription ID.")
- public Boolean telephonyStartTrackingCellInfoChange() {
- return telephonyStartTrackingCellInfoChangeForSubscription(
- SubscriptionManager.getDefaultVoiceSubscriptionId());
- }
-
- @Rpc(description = "Starts tracking cell info change" +
- "for specified subscription ID.")
- public Boolean telephonyStartTrackingCellInfoChangeForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- try {
- mTelephonyManager.listen(
- StateChangeListeners.get(subId).mCellInfoChangeListener,
- PhoneStateListener.LISTEN_CELL_INFO);
- return true;
- } catch (Exception e) {
- Log.e("Invalid subscription ID");
- return false;
- }
- }
-
- @Rpc(description = "Turn on/off precise listening on fore/background or" +
- " ringing calls for default voice subscription ID.")
- public Boolean telephonyAdjustPreciseCallStateListenLevel(String type,
- Boolean listen) {
- return telephonyAdjustPreciseCallStateListenLevelForSubscription(type, listen,
- SubscriptionManager.getDefaultVoiceSubscriptionId());
- }
-
- @Rpc(description = "Turn on/off precise listening on fore/background or" +
- " ringing calls for specified subscription ID.")
- public Boolean telephonyAdjustPreciseCallStateListenLevelForSubscription(String type,
- Boolean listen,
- @RpcParameter(name = "subId") Integer subId) {
- try {
- if (type.equals(TelephonyConstants.PRECISE_CALL_STATE_LISTEN_LEVEL_FOREGROUND)) {
- StateChangeListeners.get(subId).mCallStateChangeListener.listenForeground = listen;
- } else if (type.equals(TelephonyConstants.PRECISE_CALL_STATE_LISTEN_LEVEL_RINGING)) {
- StateChangeListeners.get(subId).mCallStateChangeListener.listenRinging = listen;
- } else if (type.equals(TelephonyConstants.PRECISE_CALL_STATE_LISTEN_LEVEL_BACKGROUND)) {
- StateChangeListeners.get(subId).mCallStateChangeListener.listenBackground = listen;
- }
- return true;
- } catch (Exception e) {
- Log.e("Invalid subscription ID");
- return false;
- }
- }
-
- @Rpc(description = "Stops tracking cell info change " +
- "for default voice subscription ID.")
- public Boolean telephonyStopTrackingCellInfoChange() {
- return telephonyStopTrackingCellInfoChangeForSubscription(
- SubscriptionManager.getDefaultVoiceSubscriptionId());
- }
-
- @Rpc(description = "Stops tracking cell info change " +
- "for specified subscription ID.")
- public Boolean telephonyStopTrackingCellInfoChangeForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- try {
- mTelephonyManager.listen(
- StateChangeListeners.get(subId).mCellInfoChangeListener,
- PhoneStateListener.LISTEN_NONE);
- return true;
- } catch (Exception e) {
- Log.e("Invalid subscription ID");
- return false;
- }
- }
- @Rpc(description = "Stops tracking call state change " +
- "for default voice subscription ID.")
- public Boolean telephonyStopTrackingCallStateChange() {
- return telephonyStopTrackingCallStateChangeForSubscription(
- SubscriptionManager.getDefaultVoiceSubscriptionId());
- }
-
- @Rpc(description = "Stops tracking call state change " +
- "for specified subscription ID.")
- public Boolean telephonyStopTrackingCallStateChangeForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- try {
- mTelephonyManager.listen(
- StateChangeListeners.get(subId).mCallStateChangeListener,
- PhoneStateListener.LISTEN_NONE);
- return true;
- } catch (Exception e) {
- Log.e("Invalid subscription ID");
- return false;
- }
- }
-
- @Rpc(description = "Starts tracking data connection real time info change" +
- "for default subscription ID.")
- public Boolean telephonyStartTrackingDataConnectionRTInfoChange() {
- return telephonyStartTrackingDataConnectionRTInfoChangeForSubscription(
- SubscriptionManager.getDefaultDataSubscriptionId());
- }
-
- @Rpc(description = "Starts tracking data connection real time info change" +
- "for specified subscription ID.")
- public Boolean telephonyStartTrackingDataConnectionRTInfoChangeForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- try {
- mTelephonyManager.listen(
- StateChangeListeners.get(subId).mDataConnectionRTInfoChangeListener,
- DataConnectionRealTimeInfoChangeListener.sListeningStates);
- return true;
- } catch (Exception e) {
- Log.e("Invalid subscription ID");
- return false;
- }
- }
-
- @Rpc(description = "Stops tracking data connection real time info change" +
- "for default subscription ID.")
- public Boolean telephonyStopTrackingDataConnectionRTInfoChange() {
- return telephonyStopTrackingDataConnectionRTInfoChangeForSubscription(
- SubscriptionManager.getDefaultDataSubscriptionId());
- }
-
- @Rpc(description = "Stops tracking data connection real time info change" +
- "for specified subscription ID.")
- public Boolean telephonyStopTrackingDataConnectionRTInfoChangeForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- try {
- mTelephonyManager.listen(
- StateChangeListeners.get(subId).mDataConnectionRTInfoChangeListener,
- PhoneStateListener.LISTEN_NONE);
- return true;
- } catch (Exception e) {
- Log.e("Invalid subscription ID");
- return false;
- }
- }
-
- @Rpc(description = "Starts tracking data connection state change" +
- "for default subscription ID..")
- public Boolean telephonyStartTrackingDataConnectionStateChange() {
- return telephonyStartTrackingDataConnectionStateChangeForSubscription(
- SubscriptionManager.getDefaultDataSubscriptionId());
- }
-
- @Rpc(description = "Starts tracking data connection state change" +
- "for specified subscription ID.")
- public Boolean telephonyStartTrackingDataConnectionStateChangeForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- try {
- mTelephonyManager.listen(
- StateChangeListeners.get(subId).mDataConnectionStateChangeListener,
- DataConnectionStateChangeListener.sListeningStates);
- return true;
- } catch (Exception e) {
- Log.e("Invalid subscription ID");
- return false;
- }
- }
-
- @Rpc(description = "Stops tracking data connection state change " +
- "for default subscription ID..")
- public Boolean telephonyStopTrackingDataConnectionStateChange() {
- return telephonyStopTrackingDataConnectionStateChangeForSubscription(
- SubscriptionManager.getDefaultDataSubscriptionId());
- }
-
- @Rpc(description = "Stops tracking data connection state change " +
- "for specified subscription ID..")
- public Boolean telephonyStopTrackingDataConnectionStateChangeForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- try {
- mTelephonyManager.listen(
- StateChangeListeners.get(subId).mDataConnectionStateChangeListener,
- PhoneStateListener.LISTEN_NONE);
- return true;
- } catch (Exception e) {
- Log.e("Invalid subscription ID");
- return false;
- }
- }
-
- @Rpc(description = "Starts tracking service state change " +
- "for default subscription ID.")
- public Boolean telephonyStartTrackingServiceStateChange() {
- return telephonyStartTrackingServiceStateChangeForSubscription(
- SubscriptionManager.getDefaultSubscriptionId());
- }
-
- @Rpc(description = "Starts tracking service state change " +
- "for specified subscription ID.")
- public Boolean telephonyStartTrackingServiceStateChangeForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- try {
- mTelephonyManager.listen(
- StateChangeListeners.get(subId).mServiceStateChangeListener,
- ServiceStateChangeListener.sListeningStates);
- return true;
- } catch (Exception e) {
- Log.e("Invalid subscription ID");
- return false;
- }
- }
-
- @Rpc(description = "Stops tracking service state change " +
- "for default subscription ID.")
- public Boolean telephonyStopTrackingServiceStateChange() {
- return telephonyStopTrackingServiceStateChangeForSubscription(
- SubscriptionManager.getDefaultSubscriptionId());
- }
-
- @Rpc(description = "Stops tracking service state change " +
- "for specified subscription ID.")
- public Boolean telephonyStopTrackingServiceStateChangeForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- try {
- mTelephonyManager.listen(
- StateChangeListeners.get(subId).mServiceStateChangeListener,
- PhoneStateListener.LISTEN_NONE);
- return true;
- } catch (Exception e) {
- Log.e("Invalid subscription ID");
- return false;
- }
- }
-
- @Rpc(description = "Starts tracking signal strength change " +
- "for default subscription ID.")
- public Boolean telephonyStartTrackingSignalStrengthChange() {
- return telephonyStartTrackingSignalStrengthChangeForSubscription(
- SubscriptionManager.getDefaultSubscriptionId());
- }
-
- @Rpc(description = "Starts tracking signal strength change " +
- "for specified subscription ID.")
- public Boolean telephonyStartTrackingSignalStrengthChangeForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- try {
- mTelephonyManager.listen(
- StateChangeListeners.get(subId).mSignalStrengthChangeListener,
- SignalStrengthChangeListener.sListeningStates);
- return true;
- } catch (Exception e) {
- Log.e("Invalid subscription ID");
- return false;
- }
- }
-
- @Rpc(description = "Stops tracking signal strength change " +
- "for default subscription ID.")
- public Boolean telephonyStopTrackingSignalStrengthChange() {
- return telephonyStopTrackingSignalStrengthChangeForSubscription(
- SubscriptionManager.getDefaultSubscriptionId());
- }
-
- @Rpc(description = "Stops tracking signal strength change " +
- "for specified subscription ID.")
- public Boolean telephonyStopTrackingSignalStrengthChangeForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- try {
- mTelephonyManager.listen(
- StateChangeListeners.get(subId).mSignalStrengthChangeListener,
- PhoneStateListener.LISTEN_NONE);
- return true;
- } catch (Exception e) {
- Log.e("Invalid subscription ID");
- return false;
- }
- }
-
- @Rpc(description = "Starts tracking voice mail state change " +
- "for default subscription ID.")
- public Boolean telephonyStartTrackingVoiceMailStateChange() {
- return telephonyStartTrackingVoiceMailStateChangeForSubscription(
- SubscriptionManager.getDefaultSubscriptionId());
- }
-
- @Rpc(description = "Starts tracking voice mail state change " +
- "for specified subscription ID.")
- public Boolean telephonyStartTrackingVoiceMailStateChangeForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- try {
- mTelephonyManager.listen(
- StateChangeListeners.get(subId).mVoiceMailStateChangeListener,
- VoiceMailStateChangeListener.sListeningStates);
- return true;
- } catch (Exception e) {
- Log.e("Invalid subscription ID");
- return false;
- }
- }
-
- @Rpc(description = "Stops tracking voice mail state change " +
- "for default subscription ID.")
- public Boolean telephonyStopTrackingVoiceMailStateChange() {
- return telephonyStopTrackingVoiceMailStateChangeForSubscription(
- SubscriptionManager.getDefaultSubscriptionId());
- }
-
- @Rpc(description = "Stops tracking voice mail state change " +
- "for specified subscription ID.")
- public Boolean telephonyStopTrackingVoiceMailStateChangeForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- try {
- mTelephonyManager.listen(
- StateChangeListeners.get(subId).mVoiceMailStateChangeListener,
- PhoneStateListener.LISTEN_NONE);
- return true;
- } catch (Exception e) {
- Log.e("Invalid subscription ID");
- return false;
- }
- }
-
- @Rpc(description = "Answers an incoming ringing call.")
- public void telephonyAnswerCall() throws RemoteException {
- mTelephonyManager.silenceRinger();
- mTelephonyManager.answerRingingCall();
- }
-
- @Rpc(description = "Returns the current cell location.")
- public CellLocation telephonyGetCellLocation() {
- return mTelephonyManager.getCellLocation();
- }
-
- @Rpc(description = "Returns the numeric name (MCC+MNC) of registered operator." +
- "for default subscription ID")
- public String telephonyGetNetworkOperator() {
- return telephonyGetNetworkOperatorForSubscription(
- SubscriptionManager.getDefaultSubscriptionId());
- }
-
- @Rpc(description = "Returns the numeric name (MCC+MNC) of registered operator" +
- "for specified subscription ID.")
- public String telephonyGetNetworkOperatorForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- return mTelephonyManager.getNetworkOperator(subId);
- }
-
- @Rpc(description = "Returns the alphabetic name of current registered operator" +
- "for specified subscription ID.")
- public String telephonyGetNetworkOperatorName() {
- return telephonyGetNetworkOperatorNameForSubscription(
- SubscriptionManager.getDefaultSubscriptionId());
- }
-
- @Rpc(description = "Returns the alphabetic name of registered operator " +
- "for specified subscription ID.")
- public String telephonyGetNetworkOperatorNameForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- return mTelephonyManager.getNetworkOperatorName(subId);
- }
-
- @Rpc(description = "Returns the current RAT in use on the device.+" +
- "for default subscription ID")
- public String telephonyGetNetworkType() {
-
- Log.d("sl4a:getNetworkType() is deprecated!" +
- "Please use getVoiceNetworkType()" +
- " or getDataNetworkTpe()");
-
- return telephonyGetNetworkTypeForSubscription(
- SubscriptionManager.getDefaultSubscriptionId());
- }
-
- @Rpc(description = "Returns the current RAT in use on the device" +
- " for a given Subscription.")
- public String telephonyGetNetworkTypeForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
-
- Log.d("sl4a:getNetworkTypeForSubscriber() is deprecated!" +
- "Please use getVoiceNetworkType()" +
- " or getDataNetworkTpe()");
-
- return TelephonyUtils.getNetworkTypeString(
- mTelephonyManager.getNetworkType(subId));
- }
-
- @Rpc(description = "Returns the current voice RAT for" +
- " the default voice subscription.")
- public String telephonyGetVoiceNetworkType() {
- return telephonyGetVoiceNetworkTypeForSubscription(
- SubscriptionManager.getDefaultVoiceSubscriptionId());
- }
-
- @Rpc(description = "Returns the current voice RAT for" +
- " the specified voice subscription.")
- public String telephonyGetVoiceNetworkTypeForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- return TelephonyUtils.getNetworkTypeString(
- mTelephonyManager.getVoiceNetworkType(subId));
- }
-
- @Rpc(description = "Returns the current data RAT for" +
- " the defaut data subscription")
- public String telephonyGetDataNetworkType() {
- return telephonyGetDataNetworkTypeForSubscription(
- SubscriptionManager.getDefaultDataSubscriptionId());
- }
-
- @Rpc(description = "Returns the current data RAT for" +
- " the specified data subscription")
- public String telephonyGetDataNetworkTypeForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- return TelephonyUtils.getNetworkTypeString(
- mTelephonyManager.getDataNetworkType(subId));
- }
-
- @Rpc(description = "Returns the device phone type.")
- public String telephonyGetPhoneType() {
- return TelephonyUtils.getPhoneTypeString(
- mTelephonyManager.getPhoneType());
- }
-
- @Rpc(description = "Returns the MCC for default subscription ID")
- public String telephonyGetSimCountryIso() {
- return telephonyGetSimCountryIsoForSubscription(
- SubscriptionManager.getDefaultSubscriptionId());
- }
-
- @Rpc(description = "Get the latest power consumption stats from the modem")
- public ModemActivityInfo telephonyGetModemActivityInfo() {
- ModemActivityInfo info = mTelephonyManager.getModemActivityInfo();
- return info;
- }
-
- @Rpc(description = "Returns the MCC for specified subscription ID")
- public String telephonyGetSimCountryIsoForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- return mTelephonyManager.getSimCountryIso(subId);
- }
-
- @Rpc(description = "Returns the MCC+MNC for default subscription ID")
- public String telephonyGetSimOperator() {
- return telephonyGetSimOperatorForSubscription(
- SubscriptionManager.getDefaultSubscriptionId());
- }
-
- @Rpc(description = "Returns the MCC+MNC for specified subscription ID")
- public String telephonyGetSimOperatorForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- return mTelephonyManager.getSimOperator(subId);
- }
-
- @Rpc(description = "Returns the Service Provider Name (SPN)" +
- "for default subscription ID")
- public String telephonyGetSimOperatorName() {
- return telephonyGetSimOperatorNameForSubscription(
- SubscriptionManager.getDefaultSubscriptionId());
- }
-
- @Rpc(description = "Returns the Service Provider Name (SPN)" +
- " for specified subscription ID.")
- public String telephonyGetSimOperatorNameForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- return mTelephonyManager.getSimOperatorName(subId);
- }
-
- @Rpc(description = "Returns the serial number of the SIM for " +
- "default subscription ID, or Null if unavailable")
- public String telephonyGetSimSerialNumber() {
- return telephonyGetSimSerialNumberForSubscription(
- SubscriptionManager.getDefaultSubscriptionId());
- }
-
- @Rpc(description = "Returns the serial number of the SIM for " +
- "specified subscription ID, or Null if unavailable")
- public String telephonyGetSimSerialNumberForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- return mTelephonyManager.getSimSerialNumber(subId);
- }
-
- @Rpc(description = "Returns the state of the SIM card for default slot ID.")
- public String telephonyGetSimState() {
- return telephonyGetSimStateForSlotId(
- mTelephonyManager.getDefaultSim());
- }
-
- @Rpc(description = "Returns the state of the SIM card for specified slot ID.")
- public String telephonyGetSimStateForSlotId(
- @RpcParameter(name = "slotId") Integer slotId) {
- return TelephonyUtils.getSimStateString(
- mTelephonyManager.getSimState(slotId));
- }
-
- @Rpc(description = "Get Authentication Challenge Response from a " +
- "given SIM Application")
- public String telephonyGetIccSimChallengeResponse(
- @RpcParameter(name = "appType") Integer appType,
- @RpcParameter(name = "hexChallenge") String hexChallenge) {
- return telephonyGetIccSimChallengeResponseForSubscription(
- SubscriptionManager.getDefaultSubscriptionId(), appType, hexChallenge);
- }
-
- @Rpc(description = "Get Authentication Challenge Response from a " +
- "given SIM Application for a specified Subscription")
- public String telephonyGetIccSimChallengeResponseForSubscription(
- @RpcParameter(name = "subId") Integer subId,
- @RpcParameter(name = "appType") Integer appType,
- @RpcParameter(name = "hexChallenge") String hexChallenge) {
-
- try {
- String b64Data = BaseEncoding.base64().encode(BaseEncoding.base16().decode(hexChallenge));
- String b64Result = mTelephonyManager.getIccSimChallengeResponse(subId, appType, b64Data);
- return (b64Result != null)
- ? BaseEncoding.base16().encode(BaseEncoding.base64().decode(b64Result)) : null;
- } catch( Exception e) {
- Log.e("Exception in phoneGetIccSimChallengeResponseForSubscription" + e.toString());
- return null;
- }
- }
-
- @Rpc(description = "Returns the unique subscriber ID (such as IMSI) " +
- "for default subscription ID, or null if unavailable")
- public String telephonyGetSubscriberId() {
- return telephonyGetSubscriberIdForSubscription(
- SubscriptionManager.getDefaultSubscriptionId());
- }
-
- @Rpc(description = "Returns the unique subscriber ID (such as IMSI) " +
- "for specified subscription ID, or null if unavailable")
- public String telephonyGetSubscriberIdForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- return mTelephonyManager.getSubscriberId(subId);
- }
-
- @Rpc(description = "Retrieves the alphabetic id associated with the" +
- " voice mail number for default subscription ID.")
- public String telephonyGetVoiceMailAlphaTag() {
- return telephonyGetVoiceMailAlphaTagForSubscription(
- SubscriptionManager.getDefaultSubscriptionId());
- }
-
-
- @Rpc(description = "Retrieves the alphabetic id associated with the " +
- "voice mail number for specified subscription ID.")
- public String telephonyGetVoiceMailAlphaTagForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- return mTelephonyManager.getVoiceMailAlphaTag(subId);
- }
-
- @Rpc(description = "Returns the voice mail number " +
- "for default subscription ID; null if unavailable.")
- public String telephonyGetVoiceMailNumber() {
- return telephonyGetVoiceMailNumberForSubscription(
- SubscriptionManager.getDefaultSubscriptionId());
- }
-
- @Rpc(description = "Returns the voice mail number " +
- "for specified subscription ID; null if unavailable.")
- public String telephonyGetVoiceMailNumberForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- return mTelephonyManager.getVoiceMailNumber(subId);
- }
-
- @Rpc(description = "Get voice message count for specified subscription ID.")
- public Integer telephonyGetVoiceMailCountForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- return mTelephonyManager.getVoiceMessageCount(subId);
- }
-
- @Rpc(description = "Get voice message count for default subscription ID.")
- public Integer telephonyGetVoiceMailCount() {
- return mTelephonyManager.getVoiceMessageCount();
- }
-
- @Rpc(description = "Returns true if the device is in roaming state" +
- "for default subscription ID")
- public Boolean telephonyCheckNetworkRoaming() {
- return telephonyCheckNetworkRoamingForSubscription(
- SubscriptionManager.getDefaultSubscriptionId());
- }
-
- @Rpc(description = "Returns true if the device is in roaming state " +
- "for specified subscription ID")
- public Boolean telephonyCheckNetworkRoamingForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- return mTelephonyManager.isNetworkRoaming(subId);
- }
-
- @Rpc(description = "Returns the unique device ID such as MEID or IMEI " +
- "for deault sim slot ID, null if unavailable")
- public String telephonyGetDeviceId() {
- return telephonyGetDeviceIdForSlotId(mTelephonyManager.getDefaultSim());
- }
-
- @Rpc(description = "Returns the unique device ID such as MEID or IMEI for" +
- " specified slot ID, null if unavailable")
- public String telephonyGetDeviceIdForSlotId(
- @RpcParameter(name = "slotId")
- Integer slotId){
- return mTelephonyManager.getDeviceId(slotId);
- }
-
- @Rpc(description = "Returns the modem sw version, such as IMEI-SV;" +
- " null if unavailable")
- public String telephonyGetDeviceSoftwareVersion() {
- return mTelephonyManager.getDeviceSoftwareVersion();
- }
-
- @Rpc(description = "Returns phone # string \"line 1\", such as MSISDN " +
- "for default subscription ID; null if unavailable")
- public String telephonyGetLine1Number() {
- return mTelephonyManager.getLine1Number();
- }
-
- @Rpc(description = "Returns phone # string \"line 1\", such as MSISDN " +
- "for specified subscription ID; null if unavailable")
- public String telephonyGetLine1NumberForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- return mTelephonyManager.getLine1Number(subId);
- }
-
- @Rpc(description = "Returns the Alpha Tag for the default subscription " +
- "ID; null if unavailable")
- public String telephonyGetLine1AlphaTag() {
- return mTelephonyManager.getLine1AlphaTag();
- }
-
- @Rpc(description = "Returns the Alpha Tag for the specified subscription " +
- "ID; null if unavailable")
- public String telephonyGetLine1AlphaTagForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- return mTelephonyManager.getLine1AlphaTag(subId);
- }
-
- @Rpc(description = "Set the Line1-number (phone number) and Alpha Tag" +
- "for the default subscription")
- public Boolean telephonySetLine1Number(
- @RpcParameter(name = "number") String number,
- @RpcOptional
- @RpcParameter(name = "alphaTag") String alphaTag) {
- return mTelephonyManager.setLine1NumberForDisplay(alphaTag, number);
- }
-
- @Rpc(description = "Set the Line1-number (phone number) and Alpha Tag" +
- "for the specified subscription")
- public Boolean telephonySetLine1NumberForSubscription(
- @RpcParameter(name = "subId") Integer subId,
- @RpcParameter(name = "number") String number,
- @RpcOptional
- @RpcParameter(name = "alphaTag") String alphaTag) {
- return mTelephonyManager.setLine1NumberForDisplay(subId, alphaTag, number);
- }
-
- @Rpc(description = "Returns the neighboring cell information of the device.")
- public List<NeighboringCellInfo> telephonyGetNeighboringCellInfo() {
- return mTelephonyManager.getNeighboringCellInfo();
- }
-
- @Rpc(description = "Sets the minimum reporting interval for CellInfo" +
- "0-as quickly as possible, 0x7FFFFFF-off")
- public void telephonySetCellInfoListRate(
- @RpcParameter(name = "rate") Integer rate
- ) {
- mTelephonyManager.setCellInfoListRate(rate);
- }
-
- @Rpc(description = "Returns all observed cell information from all radios"+
- "on the device including the primary and neighboring cells")
- public List<CellInfo> telephonyGetAllCellInfo() {
- return mTelephonyManager.getAllCellInfo();
- }
-
- @Rpc(description = "Returns True if cellular data is enabled for" +
- "default data subscription ID.")
- public Boolean telephonyIsDataEnabled() {
- return telephonyIsDataEnabledForSubscription(
- SubscriptionManager.getDefaultDataSubscriptionId());
- }
-
- @Rpc(description = "Returns True if data connection is enabled.")
- public Boolean telephonyIsDataEnabledForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- return mTelephonyManager.getDataEnabled(subId);
- }
-
- @Rpc(description = "Toggles data connection on /off for" +
- " default data subscription ID.")
- public void telephonyToggleDataConnection(
- @RpcParameter(name = "enabled")
- @RpcOptional Boolean enabled) {
- telephonyToggleDataConnectionForSubscription(
- SubscriptionManager.getDefaultDataSubscriptionId(), enabled);
- }
-
- @Rpc(description = "Toggles data connection on/off for" +
- " specified subscription ID")
- public void telephonyToggleDataConnectionForSubscription(
- @RpcParameter(name = "subId") Integer subId,
- @RpcParameter(name = "enabled")
- @RpcOptional Boolean enabled) {
- if (enabled == null) {
- enabled = !telephonyIsDataEnabledForSubscription(subId);
- }
- mTelephonyManager.setDataEnabled(subId, enabled);
- }
-
- @Rpc(description = "Sets an APN and make that as preferred APN.")
- public void telephonySetAPN(@RpcParameter(name = "name") final String name,
- @RpcParameter(name = "apn") final String apn,
- @RpcParameter(name = "type") @RpcOptional @RpcDefault("")
- final String type,
- @RpcParameter(name = "subId") @RpcOptional Integer subId) {
- //TODO: b/26273471 Need to find out how to set APN for specific subId
- Uri uri;
- Cursor cursor;
-
- String mcc = "";
- String mnc = "";
-
- String numeric = SystemProperties.get(TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC);
- // MCC is first 3 chars and then in 2 - 3 chars of MNC
- if (numeric != null && numeric.length() > 4) {
- // Country code
- mcc = numeric.substring(0, 3);
- // Network code
- mnc = numeric.substring(3);
- }
-
- uri = mService.getContentResolver().insert(
- Telephony.Carriers.CONTENT_URI, new ContentValues());
- if (uri == null) {
- Log.w("Failed to insert new provider into " + Telephony.Carriers.CONTENT_URI);
- return;
- }
-
- cursor = mService.getContentResolver().query(uri, sProjection, null, null, null);
- cursor.moveToFirst();
-
- ContentValues values = new ContentValues();
-
- values.put(Telephony.Carriers.NAME, name);
- values.put(Telephony.Carriers.APN, apn);
- values.put(Telephony.Carriers.PROXY, "");
- values.put(Telephony.Carriers.PORT, "");
- values.put(Telephony.Carriers.MMSPROXY, "");
- values.put(Telephony.Carriers.MMSPORT, "");
- values.put(Telephony.Carriers.USER, "");
- values.put(Telephony.Carriers.SERVER, "");
- values.put(Telephony.Carriers.PASSWORD, "");
- values.put(Telephony.Carriers.MMSC, "");
- values.put(Telephony.Carriers.TYPE, type);
- values.put(Telephony.Carriers.MCC, mcc);
- values.put(Telephony.Carriers.MNC, mnc);
- values.put(Telephony.Carriers.NUMERIC, mcc + mnc);
-
- int ret = mService.getContentResolver().update(uri, values, null, null);
- Log.d("after update " + ret);
- cursor.close();
-
- // Make this APN as the preferred
- String where = "name=\"" + name + "\"";
-
- Cursor c = mService.getContentResolver().query(
- Telephony.Carriers.CONTENT_URI,
- new String[] {
- "_id", "name", "apn", "type"
- }, where, null,
- Telephony.Carriers.DEFAULT_SORT_ORDER);
- if (c != null) {
- c.moveToFirst();
- String key = c.getString(0);
- final String PREFERRED_APN_URI = "content://telephony/carriers/preferapn";
- ContentResolver resolver = mService.getContentResolver();
- ContentValues prefAPN = new ContentValues();
- prefAPN.put("apn_id", key);
- resolver.update(Uri.parse(PREFERRED_APN_URI), prefAPN, null, null);
- }
- c.close();
- }
-
- @Rpc(description = "Returns the number of APNs defined")
- public int telephonyGetNumberOfAPNs(
- @RpcParameter(name = "subId")
- @RpcOptional Integer subId) {
- //TODO: b/26273471 Need to find out how to get Number of APNs for specific subId
- int result = 0;
- String where = "numeric=\"" + android.os.SystemProperties.get(
- TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC, "") + "\"";
-
- Cursor cursor = mService.getContentResolver().query(
- Telephony.Carriers.CONTENT_URI,
- new String[] {"_id", "name", "apn", "type"}, where, null,
- Telephony.Carriers.DEFAULT_SORT_ORDER);
-
- if (cursor != null) {
- result = cursor.getCount();
- }
- cursor.close();
- return result;
- }
-
- @Rpc(description = "Returns the currently selected APN name")
- public String telephonyGetSelectedAPN(
- @RpcParameter(name = "subId")
- @RpcOptional Integer subId) {
- //TODO: b/26273471 Need to find out how to get selected APN for specific subId
- String key = null;
- int ID_INDEX = 0;
- final String PREFERRED_APN_URI = "content://telephony/carriers/preferapn";
-
- Cursor cursor = mService.getContentResolver().query(Uri.parse(PREFERRED_APN_URI),
- new String[] {"name"}, null, null, Telephony.Carriers.DEFAULT_SORT_ORDER);
-
- if (cursor.getCount() > 0) {
- cursor.moveToFirst();
- key = cursor.getString(ID_INDEX);
- }
- cursor.close();
- return key;
- }
-
- @Rpc(description = "Returns the current data connection state")
- public String telephonyGetDataConnectionState() {
- return TelephonyUtils.getDataConnectionStateString(
- mTelephonyManager.getDataState());
- }
-
- @Rpc(description = "Enables or Disables Video Calling()")
- public void telephonyEnableVideoCalling(boolean enable) {
- mTelephonyManager.enableVideoCalling(enable);
- }
-
- @Rpc(description = "Returns a boolean of whether or not " +
- "video calling setting is enabled by the user")
- public Boolean telephonyIsVideoCallingEnabled() {
- return mTelephonyManager.isVideoCallingEnabled();
- }
-
- @Rpc(description = "Returns a boolean of whether video calling is available for use")
- public Boolean telephonyIsVideoCallingAvailable() {
- return mTelephonyManager.isVideoTelephonyAvailable();
- }
-
- @Rpc(description = "Returns a boolean of whether or not the device is ims registered")
- public Boolean telephonyIsImsRegistered() {
- return mTelephonyManager.isImsRegistered();
- }
-
- @Rpc(description = "Returns a boolean of whether or not volte calling is available for use")
- public Boolean telephonyIsVolteAvailable() {
- return mTelephonyManager.isVolteAvailable();
- }
-
- @Rpc(description = "Returns a boolean of whether or not wifi calling is available for use")
- public Boolean telephonyIsWifiCallingAvailable() {
- return mTelephonyManager.isWifiCallingAvailable();
- }
-
- @Rpc(description = "Returns the service state for default subscription ID")
- public String telephonyGetServiceState() {
- //TODO: b/26273807 need to have framework API to get service state.
- return telephonyGetServiceStateForSubscription(
- SubscriptionManager.getDefaultSubscriptionId());
- }
-
- @Rpc(description = "Returns the service state for specified subscription ID")
- public String telephonyGetServiceStateForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- //TODO: b/26273807 need to have framework API to get service state.
- return null;
- }
-
- @Rpc(description = "Returns the call state for default subscription ID")
- public String telephonyGetCallState() {
- return telephonyGetCallStateForSubscription(
- SubscriptionManager.getDefaultSubscriptionId());
- }
-
- @Rpc(description = "Returns the call state for specified subscription ID")
- public String telephonyGetCallStateForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- return TelephonyUtils.getTelephonyCallStateString(
- mTelephonyManager.getCallState(subId));
- }
-
- @Rpc(description = "Returns current signal strength for default subscription ID.")
- public SignalStrength telephonyGetSignalStrength() {
- return telephonyGetSignalStrengthForSubscription(
- SubscriptionManager.getDefaultSubscriptionId());
- }
-
- @Rpc(description = "Returns current signal strength for specified subscription ID.")
- public SignalStrength telephonyGetSignalStrengthForSubscription(
- @RpcParameter(name = "subId") Integer subId) {
- return StateChangeListeners.get(subId).mSignalStrengthChangeListener.mSignalStrengths;
- }
-
- @Rpc(description = "Returns the sim count.")
- public int telephonyGetSimCount() {
- return mTelephonyManager.getSimCount();
- }
-
- private static class StateChangeListener {
- private ServiceStateChangeListener mServiceStateChangeListener;
- private SignalStrengthChangeListener mSignalStrengthChangeListener;
- private CallStateChangeListener mCallStateChangeListener;
- private CellInfoChangeListener mCellInfoChangeListener;
- private DataConnectionStateChangeListener
- mDataConnectionStateChangeListener;
- private DataConnectionRealTimeInfoChangeListener
- mDataConnectionRTInfoChangeListener;
- private VoiceMailStateChangeListener
- mVoiceMailStateChangeListener;
- }
-
- @Override
- public void shutdown() {
- for (int i = 0; i < mSubInfos.size(); i++) {
- int subId = mSubInfos.get(i).getSubscriptionId();
- telephonyStopTrackingCallStateChangeForSubscription(subId);
- telephonyStopTrackingDataConnectionRTInfoChangeForSubscription(subId);
- telephonyStopTrackingServiceStateChangeForSubscription(subId);
- telephonyStopTrackingSignalStrengthChangeForSubscription(subId);
- telephonyStopTrackingDataConnectionStateChangeForSubscription(subId);
- }
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/TelephonyStateListeners.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/TelephonyStateListeners.java
deleted file mode 100644
index cb9db74..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/TelephonyStateListeners.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.googlecode.android_scripting.facade.telephony;
-
-import com.googlecode.android_scripting.facade.EventFacade;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.facade.telephony.TelephonyEvents;
-import android.os.Bundle;
-import android.telephony.CellInfo;
-import android.telephony.DataConnectionRealTimeInfo;
-import android.telephony.PhoneStateListener;
-import android.telephony.PreciseCallState;
-import android.telephony.ServiceState;
-import android.telephony.SignalStrength;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-import android.telephony.VoLteServiceState;
-
-import java.util.List;
-
-/**
- * Store all subclasses of PhoneStateListener here.
- */
-public class TelephonyStateListeners {
-
- public static class CallStateChangeListener extends PhoneStateListener {
-
- private final EventFacade mEventFacade;
- public static final int sListeningStates = PhoneStateListener.LISTEN_CALL_STATE |
- PhoneStateListener.LISTEN_PRECISE_CALL_STATE;
-
- public boolean listenForeground = true;
- public boolean listenRinging = false;
- public boolean listenBackground = false;
- public int subscriptionId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
-
- public CallStateChangeListener(EventFacade ef) {
- super();
- mEventFacade = ef;
- subscriptionId = SubscriptionManager.getDefaultVoiceSubscriptionId();
- }
-
- public CallStateChangeListener(EventFacade ef, int subId) {
- super(subId);
- mEventFacade = ef;
- subscriptionId = subId;
- }
-
- @Override
- public void onCallStateChanged(int state, String incomingNumber) {
- mEventFacade.postEvent(TelephonyConstants.EventCallStateChanged,
- new TelephonyEvents.CallStateEvent(
- state, incomingNumber, subscriptionId));
- }
-
- @Override
- public void onPreciseCallStateChanged(PreciseCallState callState) {
- int foregroundState = callState.getForegroundCallState();
- int ringingState = callState.getRingingCallState();
- int backgroundState = callState.getBackgroundCallState();
- if (listenForeground &&
- foregroundState != PreciseCallState.PRECISE_CALL_STATE_NOT_VALID) {
- processCallState(foregroundState,
- TelephonyConstants.PRECISE_CALL_STATE_LISTEN_LEVEL_FOREGROUND,
- callState);
- }
- if (listenRinging &&
- ringingState != PreciseCallState.PRECISE_CALL_STATE_NOT_VALID) {
- processCallState(ringingState,
- TelephonyConstants.PRECISE_CALL_STATE_LISTEN_LEVEL_RINGING,
- callState);
- }
- if (listenBackground &&
- backgroundState != PreciseCallState.PRECISE_CALL_STATE_NOT_VALID) {
- processCallState(backgroundState,
- TelephonyConstants.PRECISE_CALL_STATE_LISTEN_LEVEL_BACKGROUND,
- callState);
- }
- }
-
- private void processCallState(
- int newState, String which, PreciseCallState callState) {
- mEventFacade.postEvent(TelephonyConstants.EventPreciseStateChanged,
- new TelephonyEvents.PreciseCallStateEvent(
- newState, which, callState, subscriptionId));
- }
- }
-
- public static class DataConnectionRealTimeInfoChangeListener extends PhoneStateListener {
-
- private final EventFacade mEventFacade;
- public static final int sListeningStates =
- PhoneStateListener.LISTEN_DATA_CONNECTION_REAL_TIME_INFO;
- public int subscriptionId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
-
- public DataConnectionRealTimeInfoChangeListener(EventFacade ef) {
- super();
- mEventFacade = ef;
- subscriptionId = SubscriptionManager.getDefaultDataSubscriptionId();
- }
-
- public DataConnectionRealTimeInfoChangeListener(EventFacade ef, int subId) {
- super(subId);
- mEventFacade = ef;
- subscriptionId = subId;
- }
-
- @Override
- public void onDataConnectionRealTimeInfoChanged(
- DataConnectionRealTimeInfo dcRtInfo) {
- mEventFacade.postEvent(
- TelephonyConstants.EventDataConnectionRealTimeInfoChanged,
- new TelephonyEvents.DataConnectionRealTimeInfoEvent(
- dcRtInfo, subscriptionId));
- }
- }
-
- public static class DataConnectionStateChangeListener extends PhoneStateListener {
-
- private final EventFacade mEventFacade;
- private final TelephonyManager mTelephonyManager;
- public static final int sListeningStates =
- PhoneStateListener.LISTEN_DATA_CONNECTION_STATE;
- public int subscriptionId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
-
- public DataConnectionStateChangeListener(EventFacade ef, TelephonyManager tm) {
- super();
- mEventFacade = ef;
- mTelephonyManager = tm;
- subscriptionId = SubscriptionManager.getDefaultDataSubscriptionId();
- }
-
- public DataConnectionStateChangeListener(EventFacade ef, TelephonyManager tm, int subId) {
- super(subId);
- mEventFacade = ef;
- mTelephonyManager = tm;
- subscriptionId = subId;
- }
-
- @Override
- public void onDataConnectionStateChanged(int state) {
- mEventFacade.postEvent(
- TelephonyConstants.EventDataConnectionStateChanged,
- new TelephonyEvents.DataConnectionStateEvent(state,
- TelephonyUtils.getNetworkTypeString(
- mTelephonyManager.getDataNetworkType()),
- subscriptionId));
- }
- }
-
- public static class ServiceStateChangeListener extends PhoneStateListener {
-
- private final EventFacade mEventFacade;
- public static final int sListeningStates = PhoneStateListener.LISTEN_SERVICE_STATE;
- public int subscriptionId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
-
- public ServiceStateChangeListener(EventFacade ef) {
- super();
- mEventFacade = ef;
- subscriptionId = SubscriptionManager.getDefaultDataSubscriptionId();
- }
-
- public ServiceStateChangeListener(EventFacade ef, int subId) {
- super(subId);
- mEventFacade = ef;
- subscriptionId = subId;
- }
-
- @Override
- public void onServiceStateChanged(ServiceState serviceState) {
- mEventFacade.postEvent(TelephonyConstants.EventServiceStateChanged,
- new TelephonyEvents.ServiceStateEvent(
- serviceState, subscriptionId));
- }
-
- }
-
- public static class CellInfoChangeListener
- extends PhoneStateListener {
-
- private final EventFacade mEventFacade;
-
- public CellInfoChangeListener(EventFacade ef) {
- super();
- mEventFacade = ef;
- }
-
- public CellInfoChangeListener(EventFacade ef, int subId) {
- super(subId);
- mEventFacade = ef;
- }
-
- @Override
- public void onCellInfoChanged(List<CellInfo> cellInfo) {
- mEventFacade.postEvent(
- TelephonyConstants.EventCellInfoChanged, cellInfo);
- }
- }
-
- public static class VolteServiceStateChangeListener
- extends PhoneStateListener {
-
- private final EventFacade mEventFacade;
-
- public VolteServiceStateChangeListener(EventFacade ef) {
- super();
- mEventFacade = ef;
- }
-
- public VolteServiceStateChangeListener(EventFacade ef, int subId) {
- super(subId);
- mEventFacade = ef;
- }
-
- @Override
- public void onVoLteServiceStateChanged(VoLteServiceState volteInfo) {
- mEventFacade.postEvent(
- TelephonyConstants.EventVolteServiceStateChanged,
- volteInfo);
- }
- }
-
- public static class VoiceMailStateChangeListener extends PhoneStateListener {
-
- private final EventFacade mEventFacade;
-
- public static final int sListeningStates =
- PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR;
-
- public VoiceMailStateChangeListener(EventFacade ef) {
- super();
- mEventFacade = ef;
- }
-
- public VoiceMailStateChangeListener(EventFacade ef, int subId) {
- super(subId);
- mEventFacade = ef;
- }
-
- @Override
- public void onMessageWaitingIndicatorChanged(boolean messageWaitingIndicator) {
- mEventFacade.postEvent(
- TelephonyConstants.EventMessageWaitingIndicatorChanged,
- new TelephonyEvents.MessageWaitingIndicatorEvent(
- messageWaitingIndicator));
- }
- }
-
-
- public static class SignalStrengthChangeListener extends PhoneStateListener {
-
- private final EventFacade mEventFacade;
- public SignalStrength mSignalStrengths;
- public static final int sListeningStates = PhoneStateListener.LISTEN_SIGNAL_STRENGTHS;
- public SignalStrengthChangeListener(EventFacade ef) {
- super();
- mEventFacade = ef;
- }
-
- public SignalStrengthChangeListener(EventFacade ef, int subId) {
- super(subId);
- mEventFacade = ef;
- }
-
- @Override
- public void onSignalStrengthsChanged(SignalStrength signalStrength) {
- mSignalStrengths = signalStrength;
- mEventFacade.postEvent(
- TelephonyConstants.EventSignalStrengthChanged, signalStrength);
- }
- }
-
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/TelephonyUtils.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/TelephonyUtils.java
deleted file mode 100644
index 09e161f..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/telephony/TelephonyUtils.java
+++ /dev/null
@@ -1,371 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.telephony;
-import com.android.ims.ImsConfig;
-import com.android.internal.telephony.RILConstants;
-import com.googlecode.android_scripting.Log;
-import android.telecom.TelecomManager;
-import android.telephony.DataConnectionRealTimeInfo;
-import android.telephony.PreciseCallState;
-import android.telephony.ServiceState;
-import android.telephony.TelephonyManager;
-import android.telephony.VoLteServiceState;
-
-/**
- * Telephony utility functions
- */
-public class TelephonyUtils {
-
- public static String getWfcModeString(int mode) {
- switch(mode) {
- case ImsConfig.WfcModeFeatureValueConstants.WIFI_PREFERRED:
- return TelephonyConstants.WFC_MODE_WIFI_PREFERRED;
- case ImsConfig.WfcModeFeatureValueConstants.CELLULAR_PREFERRED:
- return TelephonyConstants.WFC_MODE_CELLULAR_PREFERRED;
- case ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY:
- return TelephonyConstants.WFC_MODE_WIFI_ONLY;
- }
- Log.d("getWfcModeStringfromInt error. int: " + mode);
- return TelephonyConstants.WFC_MODE_UNKNOWN;
- }
-
- public static String getTtyModeString(int mode) {
- switch (mode) {
- case TelecomManager.TTY_MODE_FULL:
- return TelephonyConstants.TTY_MODE_FULL;
- case TelecomManager.TTY_MODE_HCO:
- return TelephonyConstants.TTY_MODE_HCO;
- case TelecomManager.TTY_MODE_OFF:
- return TelephonyConstants.TTY_MODE_OFF;
- case TelecomManager.TTY_MODE_VCO:
- return TelephonyConstants.TTY_MODE_VCO;
- }
- Log.d("getTtyModeString error. int: " + mode);
- return null;
- }
-
- public static String getPhoneTypeString(int type) {
- switch (type) {
- case TelephonyManager.PHONE_TYPE_GSM:
- return TelephonyConstants.PHONE_TYPE_GSM;
- case TelephonyManager.PHONE_TYPE_NONE:
- return TelephonyConstants.PHONE_TYPE_NONE;
- case TelephonyManager.PHONE_TYPE_CDMA:
- return TelephonyConstants.PHONE_TYPE_CDMA;
- case TelephonyManager.PHONE_TYPE_SIP:
- return TelephonyConstants.PHONE_TYPE_SIP;
- }
- Log.d("getPhoneTypeString error. int: " + type);
- return null;
- }
-
- public static String getSimStateString(int state) {
- switch (state) {
- case TelephonyManager.SIM_STATE_UNKNOWN:
- return TelephonyConstants.SIM_STATE_UNKNOWN;
- case TelephonyManager.SIM_STATE_ABSENT:
- return TelephonyConstants.SIM_STATE_ABSENT;
- case TelephonyManager.SIM_STATE_PIN_REQUIRED:
- return TelephonyConstants.SIM_STATE_PIN_REQUIRED;
- case TelephonyManager.SIM_STATE_PUK_REQUIRED:
- return TelephonyConstants.SIM_STATE_PUK_REQUIRED;
- case TelephonyManager.SIM_STATE_NETWORK_LOCKED:
- return TelephonyConstants.SIM_STATE_NETWORK_LOCKED;
- case TelephonyManager.SIM_STATE_READY:
- return TelephonyConstants.SIM_STATE_READY;
- case TelephonyManager.SIM_STATE_NOT_READY:
- return TelephonyConstants.SIM_STATE_NOT_READY;
- case TelephonyManager.SIM_STATE_PERM_DISABLED:
- return TelephonyConstants.SIM_STATE_PERM_DISABLED;
- case TelephonyManager.SIM_STATE_CARD_IO_ERROR:
- return TelephonyConstants.SIM_STATE_CARD_IO_ERROR;
- }
- Log.d("getSimStateString error. int: " + state);
- return TelephonyConstants.SIM_STATE_UNKNOWN;
- }
-
- public static String formatIncomingNumber(String incomingNumber) {
- String mIncomingNumber = null;
- int len = 0;
- if (incomingNumber != null) {
- len = incomingNumber.length();
- }
- if (len > 0) {
- /**
- * Currently this incomingNumber modification is specific for
- * US numbers.
- */
- if ((12 == len) && ('+' == incomingNumber.charAt(0))) {
- mIncomingNumber = incomingNumber.substring(1);
- } else if (10 == len) {
- mIncomingNumber = '1' + incomingNumber;
- } else {
- mIncomingNumber = incomingNumber;
- }
- }
- return mIncomingNumber;
- }
-
- public static String getTelephonyCallStateString(int callState) {
- switch (callState) {
- case TelephonyManager.CALL_STATE_IDLE:
- return TelephonyConstants.TELEPHONY_STATE_IDLE;
- case TelephonyManager.CALL_STATE_OFFHOOK:
- return TelephonyConstants.TELEPHONY_STATE_OFFHOOK;
- case TelephonyManager.CALL_STATE_RINGING:
- return TelephonyConstants.TELEPHONY_STATE_RINGING;
- }
- Log.d("getTelephonyCallStateString error. int: " + callState);
- return TelephonyConstants.TELEPHONY_STATE_UNKNOWN;
- }
-
- public static String getPreciseCallStateString(int state) {
- switch (state) {
- case PreciseCallState.PRECISE_CALL_STATE_ACTIVE:
- return TelephonyConstants.PRECISE_CALL_STATE_ACTIVE;
- case PreciseCallState.PRECISE_CALL_STATE_HOLDING:
- return TelephonyConstants.PRECISE_CALL_STATE_HOLDING;
- case PreciseCallState.PRECISE_CALL_STATE_DIALING:
- return TelephonyConstants.PRECISE_CALL_STATE_DIALING;
- case PreciseCallState.PRECISE_CALL_STATE_ALERTING:
- return TelephonyConstants.PRECISE_CALL_STATE_ALERTING;
- case PreciseCallState.PRECISE_CALL_STATE_INCOMING:
- return TelephonyConstants.PRECISE_CALL_STATE_INCOMING;
- case PreciseCallState.PRECISE_CALL_STATE_WAITING:
- return TelephonyConstants.PRECISE_CALL_STATE_WAITING;
- case PreciseCallState.PRECISE_CALL_STATE_DISCONNECTED:
- return TelephonyConstants.PRECISE_CALL_STATE_DISCONNECTED;
- case PreciseCallState.PRECISE_CALL_STATE_DISCONNECTING:
- return TelephonyConstants.PRECISE_CALL_STATE_DISCONNECTING;
- case PreciseCallState.PRECISE_CALL_STATE_IDLE:
- return TelephonyConstants.PRECISE_CALL_STATE_IDLE;
- case PreciseCallState.PRECISE_CALL_STATE_NOT_VALID:
- return TelephonyConstants.PRECISE_CALL_STATE_INVALID;
- }
- Log.d("getPreciseCallStateString error. int: " + state);
- return TelephonyConstants.PRECISE_CALL_STATE_UNKNOWN;
- }
-
- public static String getDcPowerStateString(int state) {
- if (state == DataConnectionRealTimeInfo.DC_POWER_STATE_LOW) {
- return TelephonyConstants.DC_POWER_STATE_LOW;
- } else if (state == DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH) {
- return TelephonyConstants.DC_POWER_STATE_HIGH;
- } else if (state == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM) {
- return TelephonyConstants.DC_POWER_STATE_MEDIUM;
- } else {
- return TelephonyConstants.DC_POWER_STATE_UNKNOWN;
- }
- }
-
- public static String getDataConnectionStateString(int state) {
- switch (state) {
- case TelephonyManager.DATA_DISCONNECTED:
- return TelephonyConstants.DATA_STATE_DISCONNECTED;
- case TelephonyManager.DATA_CONNECTING:
- return TelephonyConstants.DATA_STATE_CONNECTING;
- case TelephonyManager.DATA_CONNECTED:
- return TelephonyConstants.DATA_STATE_CONNECTED;
- case TelephonyManager.DATA_SUSPENDED:
- return TelephonyConstants.DATA_STATE_SUSPENDED;
- case TelephonyManager.DATA_UNKNOWN:
- return TelephonyConstants.DATA_STATE_UNKNOWN;
- }
- Log.d("getDataConnectionStateString error. int: " + state);
- return TelephonyConstants.DATA_STATE_UNKNOWN;
- }
-
- public static int getNetworkModeIntfromString(String networkMode) {
- switch (networkMode) {
- case TelephonyConstants.NETWORK_MODE_WCDMA_PREF:
- return RILConstants.NETWORK_MODE_WCDMA_PREF;
- case TelephonyConstants.NETWORK_MODE_GSM_ONLY:
- return RILConstants.NETWORK_MODE_GSM_ONLY;
- case TelephonyConstants.NETWORK_MODE_WCDMA_ONLY:
- return RILConstants.NETWORK_MODE_WCDMA_ONLY;
- case TelephonyConstants.NETWORK_MODE_GSM_UMTS:
- return RILConstants.NETWORK_MODE_GSM_UMTS;
- case TelephonyConstants.NETWORK_MODE_CDMA:
- return RILConstants.NETWORK_MODE_CDMA;
- case TelephonyConstants.NETWORK_MODE_CDMA_NO_EVDO:
- return RILConstants.NETWORK_MODE_CDMA_NO_EVDO;
- case TelephonyConstants.NETWORK_MODE_EVDO_NO_CDMA:
- return RILConstants.NETWORK_MODE_EVDO_NO_CDMA;
- case TelephonyConstants.NETWORK_MODE_GLOBAL:
- return RILConstants.NETWORK_MODE_GLOBAL;
- case TelephonyConstants.NETWORK_MODE_LTE_CDMA_EVDO:
- return RILConstants.NETWORK_MODE_LTE_CDMA_EVDO;
- case TelephonyConstants.NETWORK_MODE_LTE_GSM_WCDMA:
- return RILConstants.NETWORK_MODE_LTE_GSM_WCDMA;
- case TelephonyConstants.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA:
- return RILConstants.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA;
- case TelephonyConstants.NETWORK_MODE_LTE_ONLY:
- return RILConstants.NETWORK_MODE_LTE_ONLY;
- case TelephonyConstants.NETWORK_MODE_LTE_WCDMA:
- return RILConstants.NETWORK_MODE_LTE_WCDMA;
- case TelephonyConstants.NETWORK_MODE_TDSCDMA_ONLY:
- return RILConstants.NETWORK_MODE_TDSCDMA_ONLY;
- case TelephonyConstants.NETWORK_MODE_TDSCDMA_WCDMA:
- return RILConstants.NETWORK_MODE_TDSCDMA_WCDMA;
- case TelephonyConstants.NETWORK_MODE_LTE_TDSCDMA:
- return RILConstants.NETWORK_MODE_LTE_TDSCDMA;
- case TelephonyConstants.NETWORK_MODE_TDSCDMA_GSM:
- return RILConstants.NETWORK_MODE_TDSCDMA_GSM;
- case TelephonyConstants.NETWORK_MODE_LTE_TDSCDMA_GSM:
- return RILConstants.NETWORK_MODE_LTE_TDSCDMA_GSM;
- case TelephonyConstants.NETWORK_MODE_TDSCDMA_GSM_WCDMA:
- return RILConstants.NETWORK_MODE_TDSCDMA_GSM_WCDMA;
- case TelephonyConstants.NETWORK_MODE_LTE_TDSCDMA_WCDMA:
- return RILConstants.NETWORK_MODE_LTE_TDSCDMA_WCDMA;
- case TelephonyConstants.NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA:
- return RILConstants.NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA;
- case TelephonyConstants.NETWORK_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA:
- return RILConstants.NETWORK_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA;
- case TelephonyConstants.NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA:
- return RILConstants.NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA;
- }
- Log.d("getNetworkModeIntfromString error. String: " + networkMode);
- return RILConstants.RIL_ERRNO_INVALID_RESPONSE;
- }
-
- public static String getNetworkModeStringfromInt(int networkMode) {
- switch (networkMode) {
- case RILConstants.NETWORK_MODE_WCDMA_PREF:
- return TelephonyConstants.NETWORK_MODE_WCDMA_PREF;
- case RILConstants.NETWORK_MODE_GSM_ONLY:
- return TelephonyConstants.NETWORK_MODE_GSM_ONLY;
- case RILConstants.NETWORK_MODE_WCDMA_ONLY:
- return TelephonyConstants.NETWORK_MODE_WCDMA_ONLY;
- case RILConstants.NETWORK_MODE_GSM_UMTS:
- return TelephonyConstants.NETWORK_MODE_GSM_UMTS;
- case RILConstants.NETWORK_MODE_CDMA:
- return TelephonyConstants.NETWORK_MODE_CDMA;
- case RILConstants.NETWORK_MODE_CDMA_NO_EVDO:
- return TelephonyConstants.NETWORK_MODE_CDMA_NO_EVDO;
- case RILConstants.NETWORK_MODE_EVDO_NO_CDMA:
- return TelephonyConstants.NETWORK_MODE_EVDO_NO_CDMA;
- case RILConstants.NETWORK_MODE_GLOBAL:
- return TelephonyConstants.NETWORK_MODE_GLOBAL;
- case RILConstants.NETWORK_MODE_LTE_CDMA_EVDO:
- return TelephonyConstants.NETWORK_MODE_LTE_CDMA_EVDO;
- case RILConstants.NETWORK_MODE_LTE_GSM_WCDMA:
- return TelephonyConstants.NETWORK_MODE_LTE_GSM_WCDMA;
- case RILConstants.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA:
- return TelephonyConstants.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA;
- case RILConstants.NETWORK_MODE_LTE_ONLY:
- return TelephonyConstants.NETWORK_MODE_LTE_ONLY;
- case RILConstants.NETWORK_MODE_LTE_WCDMA:
- return TelephonyConstants.NETWORK_MODE_LTE_WCDMA;
- case RILConstants.NETWORK_MODE_TDSCDMA_ONLY:
- return TelephonyConstants.NETWORK_MODE_TDSCDMA_ONLY;
- case RILConstants.NETWORK_MODE_TDSCDMA_WCDMA:
- return TelephonyConstants.NETWORK_MODE_TDSCDMA_WCDMA;
- case RILConstants.NETWORK_MODE_LTE_TDSCDMA:
- return TelephonyConstants.NETWORK_MODE_LTE_TDSCDMA;
- case RILConstants.NETWORK_MODE_TDSCDMA_GSM:
- return TelephonyConstants.NETWORK_MODE_TDSCDMA_GSM;
- case RILConstants.NETWORK_MODE_LTE_TDSCDMA_GSM:
- return TelephonyConstants.NETWORK_MODE_LTE_TDSCDMA_GSM;
- case RILConstants.NETWORK_MODE_TDSCDMA_GSM_WCDMA:
- return TelephonyConstants.NETWORK_MODE_TDSCDMA_GSM_WCDMA;
- case RILConstants.NETWORK_MODE_LTE_TDSCDMA_WCDMA:
- return TelephonyConstants.NETWORK_MODE_LTE_TDSCDMA_WCDMA;
- case RILConstants.NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA:
- return TelephonyConstants.NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA;
- case RILConstants.NETWORK_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA:
- return TelephonyConstants.NETWORK_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA;
- case RILConstants.NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA:
- return TelephonyConstants.NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA;
- }
- Log.d("getNetworkModeStringfromInt error. Int: " + networkMode);
- return TelephonyConstants.NETWORK_MODE_INVALID;
- }
-
- public static String getNetworkTypeString(int type) {
- switch(type) {
- case TelephonyManager.NETWORK_TYPE_GPRS:
- return TelephonyConstants.RAT_GPRS;
- case TelephonyManager.NETWORK_TYPE_EDGE:
- return TelephonyConstants.RAT_EDGE;
- case TelephonyManager.NETWORK_TYPE_UMTS:
- return TelephonyConstants.RAT_UMTS;
- case TelephonyManager.NETWORK_TYPE_HSDPA:
- return TelephonyConstants.RAT_HSDPA;
- case TelephonyManager.NETWORK_TYPE_HSUPA:
- return TelephonyConstants.RAT_HSUPA;
- case TelephonyManager.NETWORK_TYPE_HSPA:
- return TelephonyConstants.RAT_HSPA;
- case TelephonyManager.NETWORK_TYPE_CDMA:
- return TelephonyConstants.RAT_CDMA;
- case TelephonyManager.NETWORK_TYPE_1xRTT:
- return TelephonyConstants.RAT_1XRTT;
- case TelephonyManager.NETWORK_TYPE_EVDO_0:
- return TelephonyConstants.RAT_EVDO_0;
- case TelephonyManager.NETWORK_TYPE_EVDO_A:
- return TelephonyConstants.RAT_EVDO_A;
- case TelephonyManager.NETWORK_TYPE_EVDO_B:
- return TelephonyConstants.RAT_EVDO_B;
- case TelephonyManager.NETWORK_TYPE_EHRPD:
- return TelephonyConstants.RAT_EHRPD;
- case TelephonyManager.NETWORK_TYPE_LTE:
- return TelephonyConstants.RAT_LTE;
- case TelephonyManager.NETWORK_TYPE_HSPAP:
- return TelephonyConstants.RAT_HSPAP;
- case TelephonyManager.NETWORK_TYPE_GSM:
- return TelephonyConstants.RAT_GSM;
- case TelephonyManager. NETWORK_TYPE_TD_SCDMA:
- return TelephonyConstants.RAT_TD_SCDMA;
- case TelephonyManager.NETWORK_TYPE_IWLAN:
- return TelephonyConstants.RAT_IWLAN;
- case TelephonyManager.NETWORK_TYPE_IDEN:
- return TelephonyConstants.RAT_IDEN;
- }
- return TelephonyConstants.RAT_UNKNOWN;
- }
-
- public static String getNetworkStateString(int state) {
- switch(state) {
- case ServiceState.STATE_EMERGENCY_ONLY:
- return TelephonyConstants.SERVICE_STATE_EMERGENCY_ONLY;
- case ServiceState.STATE_IN_SERVICE:
- return TelephonyConstants.SERVICE_STATE_IN_SERVICE;
- case ServiceState.STATE_OUT_OF_SERVICE:
- return TelephonyConstants.SERVICE_STATE_OUT_OF_SERVICE;
- case ServiceState.STATE_POWER_OFF:
- return TelephonyConstants.SERVICE_STATE_POWER_OFF;
- default:
- return TelephonyConstants.SERVICE_STATE_UNKNOWN;
- }
- }
-
- public static String getSrvccStateString(int srvccState) {
- switch (srvccState) {
- case VoLteServiceState.HANDOVER_STARTED:
- return TelephonyConstants.VOLTE_SERVICE_STATE_HANDOVER_STARTED;
- case VoLteServiceState.HANDOVER_COMPLETED:
- return TelephonyConstants.VOLTE_SERVICE_STATE_HANDOVER_COMPLETED;
- case VoLteServiceState.HANDOVER_FAILED:
- return TelephonyConstants.VOLTE_SERVICE_STATE_HANDOVER_FAILED;
- case VoLteServiceState.HANDOVER_CANCELED:
- return TelephonyConstants.VOLTE_SERVICE_STATE_HANDOVER_CANCELED;
- default:
- Log.e(String.format("getSrvccStateString():"
- + "unknown state %d", srvccState));
- return TelephonyConstants.VOLTE_SERVICE_STATE_HANDOVER_UNKNOWN;
- }
- };
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/ui/AlertDialogTask.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/ui/AlertDialogTask.java
deleted file mode 100644
index 2a1e48e..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/ui/AlertDialogTask.java
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.ui;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.AlertDialog.Builder;
-import android.content.DialogInterface;
-import android.text.method.PasswordTransformationMethod;
-import android.widget.EditText;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-
-/**
- * Wrapper class for alert dialog running in separate thread.
- *
- * @author MeanEYE.rcf (meaneye.rcf@gmail.com)
- */
-class AlertDialogTask extends DialogTask {
-
- private final String mTitle;
- private final String mMessage;
-
- private final List<String> mItems;
- private final Set<Integer> mSelectedItems;
- private final Map<String, Object> mResultMap;
- private InputType mInputType;
- private int mEditInputType = 0;
-
- private String mPositiveButtonText;
- private String mNegativeButtonText;
- private String mNeutralButtonText;
-
- private EditText mEditText;
- private String mDefaultText;
-
- private enum InputType {
- DEFAULT, MENU, SINGLE_CHOICE, MULTI_CHOICE, PLAIN_TEXT, PASSWORD;
- }
-
- public AlertDialogTask(String title, String message) {
- mTitle = title;
- mMessage = message;
- mInputType = InputType.DEFAULT;
- mItems = new ArrayList<String>();
- mSelectedItems = new TreeSet<Integer>();
- mResultMap = new HashMap<String, Object>();
- }
-
- public void setPositiveButtonText(String text) {
- mPositiveButtonText = text;
- }
-
- public void setNegativeButtonText(String text) {
- mNegativeButtonText = text;
- }
-
- public void setNeutralButtonText(String text) {
- mNeutralButtonText = text;
- }
-
- /**
- * Set list items.
- *
- * @param items
- */
- public void setItems(JSONArray items) {
- mItems.clear();
- for (int i = 0; i < items.length(); i++) {
- try {
- mItems.add(items.getString(i));
- } catch (JSONException e) {
- throw new RuntimeException(e);
- }
- }
- mInputType = InputType.MENU;
- }
-
- /**
- * Set single choice items.
- *
- * @param items
- * a list of items as {@link String}s to display
- * @param selected
- * the index of the item that is selected by default
- */
- public void setSingleChoiceItems(JSONArray items, int selected) {
- setItems(items);
- mSelectedItems.clear();
- mSelectedItems.add(selected);
- mInputType = InputType.SINGLE_CHOICE;
- }
-
- /**
- * Set multi choice items.
- *
- * @param items
- * a list of items as {@link String}s to display
- * @param selected
- * a list of indices for items that should be selected by default
- * @throws JSONException
- */
- public void setMultiChoiceItems(JSONArray items, JSONArray selected) throws JSONException {
- setItems(items);
- mSelectedItems.clear();
- if (selected != null) {
- for (int i = 0; i < selected.length(); i++) {
- mSelectedItems.add(selected.getInt(i));
- }
- }
- mInputType = InputType.MULTI_CHOICE;
- }
-
- /**
- * Returns the list of selected items.
- */
- public Set<Integer> getSelectedItems() {
- return mSelectedItems;
- }
-
- public void setTextInput(String defaultText) {
- mDefaultText = defaultText;
- mInputType = InputType.PLAIN_TEXT;
- setEditInputType("text");
- }
-
- public void setEditInputType(String editInputType) {
- String[] list = editInputType.split("\\|");
- Map<String, Integer> types = ViewInflater.getInputTypes();
- mEditInputType = 0;
- for (String flag : list) {
- Integer v = types.get(flag.trim());
- if (v != null) {
- mEditInputType |= v;
- }
- }
- if (mEditInputType == 0) {
- mEditInputType = android.text.InputType.TYPE_CLASS_TEXT;
- }
- }
-
- public void setPasswordInput() {
- mInputType = InputType.PASSWORD;
- }
-
- @Override
- public void onCreate() {
- super.onCreate();
- AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
- if (mTitle != null) {
- builder.setTitle(mTitle);
- }
- // Can't display both a message and items. We'll elect to show the items instead.
- if (mMessage != null && mItems.isEmpty()) {
- builder.setMessage(mMessage);
- }
- switch (mInputType) {
- // Add single choice menu items to dialog.
- case SINGLE_CHOICE:
- builder.setSingleChoiceItems(getItemsAsCharSequenceArray(), mSelectedItems.iterator().next(),
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int item) {
- mSelectedItems.clear();
- mSelectedItems.add(item);
- }
- });
- break;
- // Add multiple choice items to the dialog.
- case MULTI_CHOICE:
- boolean[] selectedItems = new boolean[mItems.size()];
- for (int i : mSelectedItems) {
- selectedItems[i] = true;
- }
- builder.setMultiChoiceItems(getItemsAsCharSequenceArray(), selectedItems,
- new DialogInterface.OnMultiChoiceClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int item, boolean isChecked) {
- if (isChecked) {
- mSelectedItems.add(item);
- } else {
- mSelectedItems.remove(item);
- }
- }
- });
- break;
- // Add standard, menu-like, items to dialog.
- case MENU:
- builder.setItems(getItemsAsCharSequenceArray(), new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int item) {
- Map<String, Integer> result = new HashMap<String, Integer>();
- result.put("item", item);
- dismissDialog();
- setResult(result);
- }
- });
- break;
- case PLAIN_TEXT:
- mEditText = new EditText(getActivity());
- if (mDefaultText != null) {
- mEditText.setText(mDefaultText);
- }
- mEditText.setInputType(mEditInputType);
- builder.setView(mEditText);
- break;
- case PASSWORD:
- mEditText = new EditText(getActivity());
- mEditText.setInputType(android.text.InputType.TYPE_TEXT_VARIATION_PASSWORD);
- mEditText.setTransformationMethod(new PasswordTransformationMethod());
- builder.setView(mEditText);
- break;
- default:
- // No input type specified.
- }
- configureButtons(builder, getActivity());
- addOnCancelListener(builder, getActivity());
- mDialog = builder.show();
- mShowLatch.countDown();
- }
-
- private CharSequence[] getItemsAsCharSequenceArray() {
- return mItems.toArray(new CharSequence[mItems.size()]);
- }
-
- private Builder addOnCancelListener(final AlertDialog.Builder builder, final Activity activity) {
- return builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
- @Override
- public void onCancel(DialogInterface dialog) {
- mResultMap.put("canceled", true);
- setResult();
- }
- });
- }
-
- private void configureButtons(final AlertDialog.Builder builder, final Activity activity) {
- DialogInterface.OnClickListener buttonListener = new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- switch (which) {
- case DialogInterface.BUTTON_POSITIVE:
- mResultMap.put("which", "positive");
- break;
- case DialogInterface.BUTTON_NEGATIVE:
- mResultMap.put("which", "negative");
- break;
- case DialogInterface.BUTTON_NEUTRAL:
- mResultMap.put("which", "neutral");
-
- break;
- }
- setResult();
- }
- };
- if (mNegativeButtonText != null) {
- builder.setNegativeButton(mNegativeButtonText, buttonListener);
- }
- if (mPositiveButtonText != null) {
- builder.setPositiveButton(mPositiveButtonText, buttonListener);
- }
- if (mNeutralButtonText != null) {
- builder.setNeutralButton(mNeutralButtonText, buttonListener);
- }
- }
-
- private void setResult() {
- dismissDialog();
- if (mInputType == InputType.PLAIN_TEXT || mInputType == InputType.PASSWORD) {
- mResultMap.put("value", mEditText.getText().toString());
- }
- setResult(mResultMap);
- }
-
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/ui/DatePickerDialogTask.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/ui/DatePickerDialogTask.java
deleted file mode 100644
index e80bd25..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/ui/DatePickerDialogTask.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.ui;
-
-import android.app.DatePickerDialog;
-import android.content.DialogInterface;
-import android.util.AndroidRuntimeException;
-import android.widget.DatePicker;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-/**
- * Wrapper class for date picker dialog running in separate thread.
- *
- * @author MeanEYE.rcf (meaneye.rcf@gmail.com)
- */
-public class DatePickerDialogTask extends DialogTask {
- public static int mYear;
- public static int mMonth;
- public static int mDay;
-
- public DatePickerDialogTask(int year, int month, int day) {
- mYear = year;
- mMonth = month - 1;
- mDay = day;
- }
-
- @Override
- public void onCreate() {
- super.onCreate();
- mDialog = new DatePickerDialog(getActivity(), new DatePickerDialog.OnDateSetListener() {
- @Override
- public void onDateSet(DatePicker view, int year, int month, int day) {
- JSONObject result = new JSONObject();
- try {
- result.put("which", "positive");
- result.put("year", year);
- result.put("month", month + 1);
- result.put("day", day);
- setResult(result);
- } catch (JSONException e) {
- throw new AndroidRuntimeException(e);
- }
- }
- }, mYear, mMonth, mDay);
- mDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
- @Override
- public void onCancel(DialogInterface view) {
- JSONObject result = new JSONObject();
- try {
- result.put("which", "neutral");
- result.put("year", mYear);
- result.put("month", mMonth + 1);
- result.put("day", mDay);
- setResult(result);
- } catch (JSONException e) {
- throw new AndroidRuntimeException(e);
- }
- }
- });
- mDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
- @Override
- public void onDismiss(DialogInterface dialog) {
- JSONObject result = new JSONObject();
- try {
- result.put("which", "negative");
- result.put("year", mYear);
- result.put("month", mMonth + 1);
- result.put("day", mDay);
- setResult(result);
- } catch (JSONException e) {
- throw new AndroidRuntimeException(e);
- }
- }
- });
- mDialog.show();
- mShowLatch.countDown();
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/ui/DialogTask.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/ui/DialogTask.java
deleted file mode 100644
index ba48fcb..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/ui/DialogTask.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.ui;
-
-import android.app.Dialog;
-
-import com.googlecode.android_scripting.facade.EventFacade;
-import com.googlecode.android_scripting.future.FutureActivityTask;
-
-import java.util.concurrent.CountDownLatch;
-
-abstract class DialogTask extends FutureActivityTask<Object> {
-
- protected Dialog mDialog;
- private EventFacade mEventFacade;
-
- public EventFacade getEventFacade() {
- return mEventFacade;
- }
-
- public void setEventFacade(EventFacade mEventFacade) {
- this.mEventFacade = mEventFacade;
- }
-
- @Override
- protected void setResult(Object object) {
- super.setResult(object);
- EventFacade eventFacade = getEventFacade();
- if (eventFacade != null) {
- eventFacade.postEvent("dialog", object);
- }
- }
-
- protected final CountDownLatch mShowLatch = new CountDownLatch(1);
-
- /**
- * Returns the wrapped {@link Dialog}.
- */
- public Dialog getDialog() {
- return mDialog;
- }
-
- /**
- * Dismiss the {@link Dialog} and close {@link Sl4aActivity}.
- */
- public void dismissDialog() {
- if (mDialog != null) {
- mDialog.dismiss();
- finish();
- }
- mDialog = null;
- }
-
- /**
- * Returns the {@link CountDownLatch} that is counted down when the dialog is shown.
- */
- public CountDownLatch getShowLatch() {
- return mShowLatch;
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/ui/FullScreenTask.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/ui/FullScreenTask.java
deleted file mode 100644
index a97d51d..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/ui/FullScreenTask.java
+++ /dev/null
@@ -1,330 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.ui;
-
-import android.R;
-import android.os.Handler;
-import android.view.KeyEvent;
-import android.view.Menu;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup.LayoutParams;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.Button;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import com.googlecode.android_scripting.facade.EventFacade;
-import com.googlecode.android_scripting.future.FutureActivityTask;
-
-import java.io.StringReader;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.CountDownLatch;
-
-import org.json.JSONArray;
-import org.xmlpull.v1.XmlPullParser;
-
-public class FullScreenTask extends FutureActivityTask<Object> implements OnClickListener,
- OnItemClickListener {
- private EventFacade mEventFacade;
- private UiFacade mUiFacade;
- public View mView = null;
- protected ViewInflater mInflater = new ViewInflater();
- protected String mLayout;
- protected final CountDownLatch mShowLatch = new CountDownLatch(1);
- protected Handler mHandler = null;
- private List<Integer> mOverrideKeys;
- protected String mTitle;
-
- public FullScreenTask(String layout, String title) {
- super();
- mLayout = layout;
- if (title != null) {
- mTitle = title;
- } else {
- mTitle = "SL4a";
- }
- }
-
- @Override
- public void onCreate() {
- // super.onCreate();
- if (mHandler == null) {
- mHandler = new Handler();
- }
- mInflater.getErrors().clear();
- try {
- if (mView == null) {
- StringReader sr = new StringReader(mLayout);
- XmlPullParser xml = ViewInflater.getXml(sr);
- mView = mInflater.inflate(getActivity(), xml);
- }
- } catch (Exception e) {
- mInflater.getErrors().add(e.toString());
- mView = defaultView();
- mInflater.setIdList(R.id.class);
- }
- getActivity().setContentView(mView);
- getActivity().setTitle(mTitle);
- mInflater.setClickListener(mView, this, this);
- mShowLatch.countDown();
- }
-
- @Override
- public void onDestroy() {
- mEventFacade.postEvent("screen", "destroy");
- super.onDestroy();
- }
-
- /** default view in case of errors */
- protected View defaultView() {
- LinearLayout result = new LinearLayout(getActivity());
- result.setOrientation(LinearLayout.VERTICAL);
- TextView text = new TextView(getActivity());
- text.setText("Sample Layout");
- result.addView(text, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
- Button b = new Button(getActivity());
- b.setText("OK");
- result.addView(b, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
- return result;
- }
-
- public EventFacade getEventFacade() {
- return mEventFacade;
- }
-
- public void setEventFacade(EventFacade eventFacade) {
- mEventFacade = eventFacade;
- }
-
- public void setUiFacade(UiFacade uiFacade) {
- mUiFacade = uiFacade;
- }
-
- public CountDownLatch getShowLatch() {
- return mShowLatch;
- }
-
- public Map<String, Map<String, String>> getViewAsMap() {
- return mInflater.getViewAsMap(mView);
- }
-
- private View getViewByName(String idName) {
- View result = null;
- int id = mInflater.getId(idName);
- if (id != 0) {
- result = mView.findViewById(id);
- }
- return result;
- }
-
- public Map<String, String> getViewDetail(String idName) {
- Map<String, String> result = new HashMap<String, String>();
- result.put("error", "id not found (" + idName + ")");
- View v = getViewByName(idName);
- if (v != null) {
- result = mInflater.getViewInfo(v);
- }
- return result;
- }
-
- public String setViewProperty(String idName, String property, String value) {
- View v = getViewByName(idName);
- mInflater.getErrors().clear();
- if (v != null) {
- SetProperty p = new SetProperty(v, property, value);
- mHandler.post(p);
- try {
- p.mLatch.await();
- } catch (InterruptedException e) {
- mInflater.getErrors().add(e.toString());
- }
- } else {
- return "View " + idName + " not found.";
- }
- if (mInflater.getErrors().size() == 0) {
- return "OK";
- }
- return mInflater.getErrors().get(0);
- }
-
- public String setList(String id, JSONArray items) {
- View v = getViewByName(id);
- mInflater.getErrors().clear();
- if (v != null) {
- SetList p = new SetList(v, items);
- mHandler.post(p);
- try {
- p.mLatch.await();
- } catch (InterruptedException e) {
- mInflater.getErrors().add(e.toString());
- }
- } else {
- return "View " + id + " not found.";
- }
- if (mInflater.getErrors().size() == 0) {
- return "OK";
- }
- return mInflater.getErrors().get(0);
- }
-
- @Override
- public void onClick(View view) {
- mEventFacade.postEvent("click", mInflater.getViewInfo(view));
- }
-
- public void loadLayout(String layout) {
- ViewInflater inflater = new ViewInflater();
- View view;
- StringReader sr = new StringReader(layout);
- try {
- XmlPullParser xml = ViewInflater.getXml(sr);
- view = inflater.inflate(getActivity(), xml);
- mView = view;
- mInflater = inflater;
- getActivity().setContentView(mView);
- mInflater.setClickListener(mView, this, this);
- mLayout = layout;
- mView.invalidate();
- } catch (Exception e) {
- mInflater.getErrors().add(e.toString());
- }
- }
-
- private class SetProperty implements Runnable {
- View mView;
- String mProperty;
- String mValue;
- CountDownLatch mLatch = new CountDownLatch(1);
-
- SetProperty(View view, String property, String value) {
- mView = view;
- mProperty = property;
- mValue = value;
- }
-
- @Override
- public void run() {
- // TODO Auto-generated method stub
- mInflater.setProperty(mView, mProperty, mValue);
- mView.invalidate();
- mLatch.countDown();
- }
- }
-
- private class SetList implements Runnable {
- View mView;
- JSONArray mItems;
- CountDownLatch mLatch = new CountDownLatch(1);
-
- SetList(View view, JSONArray items) {
- mView = view;
- mItems = items;
- mLatch.countDown();
- }
-
- @Override
- public void run() {
- mInflater.setListAdapter(mView, mItems);
- mView.invalidate();
- }
- }
-
- private class SetLayout implements Runnable {
- String mLayout;
- CountDownLatch mLatch = new CountDownLatch(1);
-
- SetLayout(String layout) {
- mLayout = layout;
- }
-
- @Override
- public void run() {
- loadLayout(mLayout);
- mLatch.countDown();
- }
- }
-
- private class SetTitle implements Runnable {
- String mSetTitle;
- CountDownLatch mLatch = new CountDownLatch(1);
-
- SetTitle(String title) {
- mSetTitle = title;
- }
-
- @Override
- public void run() {
- mTitle = mSetTitle;
- getActivity().setTitle(mSetTitle);
- mLatch.countDown();
- }
- }
-
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- Map<String, String> data = new HashMap<String, String>();
- data.put("key", String.valueOf(keyCode));
- data.put("action", String.valueOf(event.getAction()));
- mEventFacade.postEvent("key", data);
- boolean overrideKey =
- (keyCode == KeyEvent.KEYCODE_BACK)
- || (mOverrideKeys == null ? false : mOverrideKeys.contains(keyCode));
- return overrideKey;
- }
-
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- return mUiFacade.onPrepareOptionsMenu(menu);
- }
-
- @Override
- public void onItemClick(AdapterView<?> aview, View aitem, int position, long id) {
- Map<String, String> data = mInflater.getViewInfo(aview);
- data.put("position", String.valueOf(position));
- mEventFacade.postEvent("itemclick", data);
- }
-
- public void setOverrideKeys(List<Integer> overrideKeys) {
- mOverrideKeys = overrideKeys;
- }
-
- // Used to hot-switch screens.
- public void setLayout(String layout) {
- SetLayout p = new SetLayout(layout);
- mHandler.post(p);
- try {
- p.mLatch.await();
- } catch (InterruptedException e) {
- mInflater.getErrors().add(e.toString());
- }
- }
-
- public void setTitle(String title) {
- SetTitle p = new SetTitle(title);
- mHandler.post(p);
- try {
- p.mLatch.await();
- } catch (InterruptedException e) {
- mInflater.getErrors().add(e.toString());
- }
- }
-
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/ui/ProgressDialogTask.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/ui/ProgressDialogTask.java
deleted file mode 100644
index 2d9aabf..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/ui/ProgressDialogTask.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.ui;
-
-import android.app.ProgressDialog;
-
-/**
- * Wrapper class for progress dialog running in separate thread
- *
- * @author MeanEYE.rcf (meaneye.rcf@gmail.com)
- */
-class ProgressDialogTask extends DialogTask {
-
- private final int mStyle;
- private final int mMax;
- private final String mTitle;
- private final String mMessage;
- private final Boolean mCancelable;
-
- public ProgressDialogTask(int style, int max, String title, String message, boolean cancelable) {
- mStyle = style;
- mMax = max;
- mTitle = title;
- mMessage = message;
- mCancelable = cancelable;
- }
-
- @Override
- public void onCreate() {
- super.onCreate();
- mDialog = new ProgressDialog(getActivity());
- ((ProgressDialog) mDialog).setProgressStyle(mStyle);
- ((ProgressDialog) mDialog).setMax(mMax);
- mDialog.setCancelable(mCancelable);
- mDialog.setTitle(mTitle);
- ((ProgressDialog) mDialog).setMessage(mMessage);
- mDialog.show();
- mShowLatch.countDown();
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/ui/SeekBarDialogTask.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/ui/SeekBarDialogTask.java
deleted file mode 100644
index 3930972..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/ui/SeekBarDialogTask.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.ui;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.AlertDialog.Builder;
-import android.content.DialogInterface;
-import android.util.AndroidRuntimeException;
-import android.widget.SeekBar;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.facade.EventFacade;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-/**
- * Wrapper class for dialog box with seek bar.
- *
- * @author MeanEYE.rcf (meaneye.rcf@gmail.com)
- */
-public class SeekBarDialogTask extends DialogTask {
-
- private SeekBar mSeekBar;
- private final int mProgress;
- private final int mMax;
- private final String mTitle;
- private final String mMessage;
- private String mPositiveButtonText;
- private String mNegativeButtonText;
-
- public SeekBarDialogTask(int progress, int max, String title, String message) {
- mProgress = progress;
- mMax = max;
- mTitle = title;
- mMessage = message;
- }
-
- public void setPositiveButtonText(String text) {
- mPositiveButtonText = text;
- }
-
- public void setNegativeButtonText(String text) {
- mNegativeButtonText = text;
- }
-
- @Override
- public void onCreate() {
- super.onCreate();
- mSeekBar = new SeekBar(getActivity());
- mSeekBar.setMax(mMax);
- mSeekBar.setProgress(mProgress);
- mSeekBar.setPadding(10, 0, 10, 3);
- mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
-
- @Override
- public void onStopTrackingTouch(SeekBar arg0) {
- }
-
- @Override
- public void onStartTrackingTouch(SeekBar arg0) {
- }
-
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
- EventFacade eventFacade = getEventFacade();
- if (eventFacade != null) {
- JSONObject result = new JSONObject();
- try {
- result.put("which", "seekbar");
- result.put("progress", mSeekBar.getProgress());
- result.put("fromuser", fromUser);
- eventFacade.postEvent("dialog", result);
- } catch (JSONException e) {
- Log.e(e);
- }
- }
- }
- });
-
- AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
- if (mTitle != null) {
- builder.setTitle(mTitle);
- }
- if (mMessage != null) {
- builder.setMessage(mMessage);
- }
- builder.setView(mSeekBar);
- configureButtons(builder, getActivity());
- addOnCancelListener(builder, getActivity());
- mDialog = builder.show();
- mShowLatch.countDown();
- }
-
- private Builder addOnCancelListener(final AlertDialog.Builder builder, final Activity activity) {
- return builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
- @Override
- public void onCancel(DialogInterface dialog) {
- JSONObject result = new JSONObject();
- try {
- result.put("canceled", true);
- result.put("progress", mSeekBar.getProgress());
- } catch (JSONException e) {
- Log.e(e);
- }
- dismissDialog();
- setResult(result);
- }
- });
- }
-
- private void configureButtons(final AlertDialog.Builder builder, final Activity activity) {
- DialogInterface.OnClickListener buttonListener = new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- JSONObject result = new JSONObject();
- switch (which) {
- case DialogInterface.BUTTON_POSITIVE:
- try {
- result.put("which", "positive");
- result.put("progress", mSeekBar.getProgress());
- } catch (JSONException e) {
- throw new AndroidRuntimeException(e);
- }
- break;
- case DialogInterface.BUTTON_NEGATIVE:
- try {
- result.put("which", "negative");
- result.put("progress", mSeekBar.getProgress());
- } catch (JSONException e) {
- throw new AndroidRuntimeException(e);
- }
- break;
- }
- dismissDialog();
- setResult(result);
- }
- };
- if (mNegativeButtonText != null) {
- builder.setNegativeButton(mNegativeButtonText, buttonListener);
- }
- if (mPositiveButtonText != null) {
- builder.setPositiveButton(mPositiveButtonText, buttonListener);
- }
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/ui/TimePickerDialogTask.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/ui/TimePickerDialogTask.java
deleted file mode 100644
index ad71cd3..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/ui/TimePickerDialogTask.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.ui;
-
-import android.app.TimePickerDialog;
-import android.content.DialogInterface;
-import android.util.AndroidRuntimeException;
-import android.widget.TimePicker;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-/**
- * Wrapper class for time picker dialog running in separate thread.
- *
- * @author MeanEYE.rcf (meaneye.rcf@gmail.com)
- */
-public class TimePickerDialogTask extends DialogTask {
- private final int mHour;
- private final int mMinute;
- private final boolean mIs24Hour;
-
- public TimePickerDialogTask(int hour, int minute, boolean is24hour) {
- mHour = hour;
- mMinute = minute;
- mIs24Hour = is24hour;
- }
-
- @Override
- public void onCreate() {
- super.onCreate();
- mDialog = new TimePickerDialog(getActivity(), new TimePickerDialog.OnTimeSetListener() {
- @Override
- public void onTimeSet(TimePicker view, int hour, int minute) {
- JSONObject result = new JSONObject();
- try {
- result.put("which", "positive");
- result.put("hour", hour);
- result.put("minute", minute);
- setResult(result);
- } catch (JSONException e) {
- throw new AndroidRuntimeException(e);
- }
- }
- }, mHour, mMinute, mIs24Hour);
- mDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
- @Override
- public void onCancel(DialogInterface view) {
- JSONObject result = new JSONObject();
- try {
- result.put("which", "neutral");
- result.put("hour", mHour);
- result.put("minute", mMinute);
- setResult(result);
- } catch (JSONException e) {
- throw new AndroidRuntimeException(e);
- }
- }
- });
- mDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
- @Override
- public void onDismiss(DialogInterface dialog) {
- JSONObject result = new JSONObject();
- try {
- result.put("which", "negative");
- result.put("hour", mHour);
- result.put("minute", mMinute);
- setResult(result);
- } catch (JSONException e) {
- throw new AndroidRuntimeException(e);
- }
- }
- });
- mDialog.show();
- mShowLatch.countDown();
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/ui/UiFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/ui/UiFacade.java
deleted file mode 100644
index 7eb4e02..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/ui/UiFacade.java
+++ /dev/null
@@ -1,708 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.ui;
-
-import android.app.ProgressDialog;
-import android.app.Service;
-import android.util.AndroidRuntimeException;
-import android.view.ContextMenu;
-import android.view.ContextMenu.ContextMenuInfo;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.MotionEvent;
-import android.view.View;
-
-import com.googlecode.android_scripting.BaseApplication;
-import com.googlecode.android_scripting.FileUtils;
-import com.googlecode.android_scripting.FutureActivityTaskExecutor;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.facade.EventFacade;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcDefault;
-import com.googlecode.android_scripting.rpc.RpcOptional;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-
-/**
- * User Interface Facade. <br>
- * <br>
- * <b>Usage Notes</b><br>
- * <br>
- * The UI facade provides access to a selection of dialog boxes for general user interaction, and
- * also hosts the {@link #webViewShow} call which allows interactive use of html pages.<br>
- * The general use of the dialog functions is as follows:<br>
- * <ol>
- * <li>Create a dialog using one of the following calls:
- * <ul>
- * <li>{@link #dialogCreateInput}
- * <li>{@link #dialogCreateAlert}
- * <li>{@link #dialogCreateDatePicker}
- * <li>{@link #dialogCreateHorizontalProgress}
- * <li>{@link #dialogCreatePassword}
- * <li>{@link #dialogCreateSeekBar}
- * <li>{@link #dialogCreateSpinnerProgress}
- * </ul>
- * <li>Set additional features to your dialog
- * <ul>
- * <li>{@link #dialogSetItems} Set a list of items. Used like a menu.
- * <li>{@link #dialogSetMultiChoiceItems} Set a multichoice list of items.
- * <li>{@link #dialogSetSingleChoiceItems} Set a single choice list of items.
- * <li>{@link #dialogSetPositiveButtonText}
- * <li>{@link #dialogSetNeutralButtonText}
- * <li>{@link #dialogSetNegativeButtonText}
- * <li>{@link #dialogSetMaxProgress} Set max progress for your progress bar.
- * </ul>
- * <li>Display the dialog using {@link #dialogShow}
- * <li>Update dialog information if needed
- * <ul>
- * <li>{@link #dialogSetCurrentProgress}
- * </ul>
- * <li>Get the results
- * <ul>
- * <li>Using {@link #dialogGetResponse}, which will wait until the user performs an action to close
- * the dialog box, or
- * <li>Use eventPoll to wait for a "dialog" event.
- * <li>You can find out which list items were selected using {@link #dialogGetSelectedItems}, which
- * returns an array of numeric indices to your list. For a single choice list, there will only ever
- * be one of these.
- * </ul>
- * <li>Once done, use {@link #dialogDismiss} to remove the dialog.
- * </ol>
- * <br>
- * You can also manipulate menu options. The menu options are available for both {@link #dialogShow}
- * and {@link #fullShow}.
- * <ul>
- * <li>{@link #clearOptionsMenu}
- * <li>{@link #addOptionsMenuItem}
- * </ul>
- * <br>
- * <b>Some notes:</b><br>
- * Not every dialogSet function is relevant to every dialog type, ie, dialogSetMaxProgress obviously
- * only applies to dialogs created with a progress bar. Also, an Alert Dialog may have a message or
- * items, not both. If you set both, items will take priority.<br>
- * In addition to the above functions, {@link #dialogGetInput} and {@link #dialogGetPassword} are
- * convenience functions that create, display and return the relevant dialogs in one call.<br>
- * There is only ever one instance of a dialog. Any dialogCreate call will cause the existing dialog
- * to be destroyed.
- *
- * @author MeanEYE.rcf (meaneye.rcf@gmail.com)
- */
-public class UiFacade extends RpcReceiver {
- // This value should not be used for menu groups outside this class.
- private static final int MENU_GROUP_ID = Integer.MAX_VALUE;
- private static final String blankLayout = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
- + "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\""
- + "android:id=\"@+id/background\" android:orientation=\"vertical\""
- + "android:layout_width=\"match_parent\" android:layout_height=\"match_parent\""
- + "android:background=\"#ff000000\"></LinearLayout>";
-
- private final Service mService;
- private final FutureActivityTaskExecutor mTaskQueue;
- private DialogTask mDialogTask;
- private FullScreenTask mFullScreenTask;
-
- private final List<UiMenuItem> mContextMenuItems;
- private final List<UiMenuItem> mOptionsMenuItems;
- private final AtomicBoolean mMenuUpdated;
-
- private final EventFacade mEventFacade;
- private List<Integer> mOverrideKeys = Collections.synchronizedList(new ArrayList<Integer>());
-
- private float mLastXPosition;
-
- public UiFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mTaskQueue = ((BaseApplication) mService.getApplication()).getTaskExecutor();
- mContextMenuItems = new CopyOnWriteArrayList<UiMenuItem>();
- mOptionsMenuItems = new CopyOnWriteArrayList<UiMenuItem>();
- mEventFacade = manager.getReceiver(EventFacade.class);
- mMenuUpdated = new AtomicBoolean(false);
- }
-
- /**
- * For inputType, see <a
- * href="http://developer.android.com/reference/android/R.styleable.html#TextView_inputType"
- * >InputTypes</a>. Some useful ones are text, number, and textUri. Multiple flags can be
- * supplied, seperated by "|", ie: "textUri|textAutoComplete"
- */
- @Rpc(description = "Create a text input dialog.")
- public void dialogCreateInput(
- @RpcParameter(name = "title", description = "title of the input box") @RpcDefault("Value") final String title,
- @RpcParameter(name = "message", description = "message to display above the input box") @RpcDefault("Please enter value:") final String message,
- @RpcParameter(name = "defaultText", description = "text to insert into the input box") @RpcOptional final String text,
- @RpcParameter(name = "inputType", description = "type of input data, ie number or text") @RpcOptional final String inputType)
- throws InterruptedException {
- dialogDismiss();
- mDialogTask = new AlertDialogTask(title, message);
- ((AlertDialogTask) mDialogTask).setTextInput(text);
- if (inputType != null) {
- ((AlertDialogTask) mDialogTask).setEditInputType(inputType);
- }
- }
-
- @Rpc(description = "Create a password input dialog.")
- public void dialogCreatePassword(
- @RpcParameter(name = "title", description = "title of the input box") @RpcDefault("Password") final String title,
- @RpcParameter(name = "message", description = "message to display above the input box") @RpcDefault("Please enter password:") final String message) {
- dialogDismiss();
- mDialogTask = new AlertDialogTask(title, message);
- ((AlertDialogTask) mDialogTask).setPasswordInput();
- }
-
- /**
- * The result is the user's input, or None (null) if cancel was hit. <br>
- * Example (python)
- *
- * <pre>
- * import android
- * droid=android.Android()
- *
- * print droid.dialogGetInput("Title","Message","Default").result
- * </pre>
- *
- */
- @SuppressWarnings("unchecked")
- @Rpc(description = "Queries the user for a text input.")
- public String dialogGetInput(
- @RpcParameter(name = "title", description = "title of the input box") @RpcDefault("Value") final String title,
- @RpcParameter(name = "message", description = "message to display above the input box") @RpcDefault("Please enter value:") final String message,
- @RpcParameter(name = "defaultText", description = "text to insert into the input box") @RpcOptional final String text)
- throws InterruptedException {
- dialogCreateInput(title, message, text, "text");
- dialogSetNegativeButtonText("Cancel");
- dialogSetPositiveButtonText("Ok");
- dialogShow();
- Map<String, Object> response = (Map<String, Object>) dialogGetResponse();
- if ("positive".equals(response.get("which"))) {
- return (String) response.get("value");
- } else {
- return null;
- }
- }
-
- @SuppressWarnings("unchecked")
- @Rpc(description = "Queries the user for a password.")
- public String dialogGetPassword(
- @RpcParameter(name = "title", description = "title of the password box") @RpcDefault("Password") final String title,
- @RpcParameter(name = "message", description = "message to display above the input box") @RpcDefault("Please enter password:") final String message)
- throws InterruptedException {
- dialogCreatePassword(title, message);
- dialogSetNegativeButtonText("Cancel");
- dialogSetPositiveButtonText("Ok");
- dialogShow();
- Map<String, Object> response = (Map<String, Object>) dialogGetResponse();
- if ("positive".equals(response.get("which"))) {
- return (String) response.get("value");
- } else {
- return null;
- }
- }
-
- @Rpc(description = "Create a spinner progress dialog.")
- public void dialogCreateSpinnerProgress(@RpcParameter(name = "title") @RpcOptional String title,
- @RpcParameter(name = "message") @RpcOptional String message,
- @RpcParameter(name = "maximum progress") @RpcDefault("100") Integer max) {
- dialogDismiss(); // Dismiss any existing dialog.
- mDialogTask = new ProgressDialogTask(ProgressDialog.STYLE_SPINNER, max, title, message, true);
- }
-
- @Rpc(description = "Create a horizontal progress dialog.")
- public void dialogCreateHorizontalProgress(
- @RpcParameter(name = "title") @RpcOptional String title,
- @RpcParameter(name = "message") @RpcOptional String message,
- @RpcParameter(name = "maximum progress") @RpcDefault("100") Integer max) {
- dialogDismiss(); // Dismiss any existing dialog.
- mDialogTask =
- new ProgressDialogTask(ProgressDialog.STYLE_HORIZONTAL, max, title, message, true);
- }
-
- /**
- * <b>Example (python)</b>
- *
- * <pre>
- * import android
- * droid=android.Android()
- * droid.dialogCreateAlert("I like swords.","Do you like swords?")
- * droid.dialogSetPositiveButtonText("Yes")
- * droid.dialogSetNegativeButtonText("No")
- * droid.dialogShow()
- * response=droid.dialogGetResponse().result
- * droid.dialogDismiss()
- * if response.has_key("which"):
- * result=response["which"]
- * if result=="positive":
- * print "Yay! I like swords too!"
- * elif result=="negative":
- * print "Oh. How sad."
- * elif response.has_key("canceled"): # Yes, I know it's mispelled.
- * print "You can't even make up your mind?"
- * else:
- * print "Unknown response=",response
- *
- * print "Done"
- * </pre>
- */
- @Rpc(description = "Create alert dialog.")
- public void dialogCreateAlert(@RpcParameter(name = "title") @RpcOptional String title,
- @RpcParameter(name = "message") @RpcOptional String message) {
- dialogDismiss(); // Dismiss any existing dialog.
- mDialogTask = new AlertDialogTask(title, message);
- }
-
- /**
- * Will produce "dialog" events on change, containing:
- * <ul>
- * <li>"progress" - Position chosen, between 0 and max
- * <li>"which" = "seekbar"
- * <li>"fromuser" = true/false change is from user input
- * </ul>
- * Response will contain a "progress" element.
- */
- @Rpc(description = "Create seek bar dialog.")
- public void dialogCreateSeekBar(
- @RpcParameter(name = "starting value") @RpcDefault("50") Integer progress,
- @RpcParameter(name = "maximum value") @RpcDefault("100") Integer max,
- @RpcParameter(name = "title") String title, @RpcParameter(name = "message") String message) {
- dialogDismiss(); // Dismiss any existing dialog.
- mDialogTask = new SeekBarDialogTask(progress, max, title, message);
- }
-
- @Rpc(description = "Create time picker dialog.")
- public void dialogCreateTimePicker(
- @RpcParameter(name = "hour") @RpcDefault("0") Integer hour,
- @RpcParameter(name = "minute") @RpcDefault("0") Integer minute,
- @RpcParameter(name = "is24hour", description = "Use 24 hour clock") @RpcDefault("false") Boolean is24hour) {
- dialogDismiss(); // Dismiss any existing dialog.
- mDialogTask = new TimePickerDialogTask(hour, minute, is24hour);
- }
-
- @Rpc(description = "Create date picker dialog.")
- public void dialogCreateDatePicker(@RpcParameter(name = "year") @RpcDefault("1970") Integer year,
- @RpcParameter(name = "month") @RpcDefault("1") Integer month,
- @RpcParameter(name = "day") @RpcDefault("1") Integer day) {
- dialogDismiss(); // Dismiss any existing dialog.
- mDialogTask = new DatePickerDialogTask(year, month, day);
- }
-
- @Rpc(description = "Dismiss dialog.")
- public void dialogDismiss() {
- if (mDialogTask != null) {
- mDialogTask.dismissDialog();
- mDialogTask = null;
- }
- }
-
- @Rpc(description = "Show dialog.")
- public void dialogShow() throws InterruptedException {
- if (mDialogTask != null && mDialogTask.getDialog() == null) {
- mDialogTask.setEventFacade(mEventFacade);
- mTaskQueue.execute(mDialogTask);
- mDialogTask.getShowLatch().await();
- } else {
- throw new RuntimeException("No dialog to show.");
- }
- }
-
- @Rpc(description = "Set progress dialog current value.")
- public void dialogSetCurrentProgress(@RpcParameter(name = "current") Integer current) {
- if (mDialogTask != null && mDialogTask instanceof ProgressDialogTask) {
- ((ProgressDialog) mDialogTask.getDialog()).setProgress(current);
- } else {
- throw new RuntimeException("No valid dialog to assign value to.");
- }
- }
-
- @Rpc(description = "Set progress dialog maximum value.")
- public void dialogSetMaxProgress(@RpcParameter(name = "max") Integer max) {
- if (mDialogTask != null && mDialogTask instanceof ProgressDialogTask) {
- ((ProgressDialog) mDialogTask.getDialog()).setMax(max);
- } else {
- throw new RuntimeException("No valid dialog to set maximum value of.");
- }
- }
-
- @Rpc(description = "Set alert dialog positive button text.")
- public void dialogSetPositiveButtonText(@RpcParameter(name = "text") String text) {
- if (mDialogTask != null && mDialogTask instanceof AlertDialogTask) {
- ((AlertDialogTask) mDialogTask).setPositiveButtonText(text);
- } else if (mDialogTask != null && mDialogTask instanceof SeekBarDialogTask) {
- ((SeekBarDialogTask) mDialogTask).setPositiveButtonText(text);
- } else {
- throw new AndroidRuntimeException("No dialog to add button to.");
- }
- }
-
- @Rpc(description = "Set alert dialog button text.")
- public void dialogSetNegativeButtonText(@RpcParameter(name = "text") String text) {
- if (mDialogTask != null && mDialogTask instanceof AlertDialogTask) {
- ((AlertDialogTask) mDialogTask).setNegativeButtonText(text);
- } else if (mDialogTask != null && mDialogTask instanceof SeekBarDialogTask) {
- ((SeekBarDialogTask) mDialogTask).setNegativeButtonText(text);
- } else {
- throw new AndroidRuntimeException("No dialog to add button to.");
- }
- }
-
- @Rpc(description = "Set alert dialog button text.")
- public void dialogSetNeutralButtonText(@RpcParameter(name = "text") String text) {
- if (mDialogTask != null && mDialogTask instanceof AlertDialogTask) {
- ((AlertDialogTask) mDialogTask).setNeutralButtonText(text);
- } else {
- throw new AndroidRuntimeException("No dialog to add button to.");
- }
- }
-
- // TODO(damonkohler): Make RPC layer translate between JSONArray and List<Object>.
- /**
- * This effectively creates list of options. Clicking on an item will immediately return an "item"
- * element, which is the index of the selected item.
- */
- @Rpc(description = "Set alert dialog list items.")
- public void dialogSetItems(@RpcParameter(name = "items") JSONArray items) {
- if (mDialogTask != null && mDialogTask instanceof AlertDialogTask) {
- ((AlertDialogTask) mDialogTask).setItems(items);
- } else {
- throw new AndroidRuntimeException("No dialog to add list to.");
- }
- }
-
- /**
- * This creates a list of radio buttons. You can select one item out of the list. A response will
- * not be returned until the dialog is closed, either with the Cancel key or a button
- * (positive/negative/neutral). Use {@link #dialogGetSelectedItems()} to find out what was
- * selected.
- */
- @Rpc(description = "Set dialog single choice items and selected item.")
- public void dialogSetSingleChoiceItems(
- @RpcParameter(name = "items") JSONArray items,
- @RpcParameter(name = "selected", description = "selected item index") @RpcDefault("0") Integer selected) {
- if (mDialogTask != null && mDialogTask instanceof AlertDialogTask) {
- ((AlertDialogTask) mDialogTask).setSingleChoiceItems(items, selected);
- } else {
- throw new AndroidRuntimeException("No dialog to add list to.");
- }
- }
-
- /**
- * This creates a list of check boxes. You can select multiple items out of the list. A response
- * will not be returned until the dialog is closed, either with the Cancel key or a button
- * (positive/negative/neutral). Use {@link #dialogGetSelectedItems()} to find out what was
- * selected.
- */
-
- @Rpc(description = "Set dialog multiple choice items and selection.")
- public void dialogSetMultiChoiceItems(
- @RpcParameter(name = "items") JSONArray items,
- @RpcParameter(name = "selected", description = "list of selected items") @RpcOptional JSONArray selected)
- throws JSONException {
- if (mDialogTask != null && mDialogTask instanceof AlertDialogTask) {
- ((AlertDialogTask) mDialogTask).setMultiChoiceItems(items, selected);
- } else {
- throw new AndroidRuntimeException("No dialog to add list to.");
- }
- }
-
- @Rpc(description = "Returns dialog response.")
- public Object dialogGetResponse() {
- try {
- return mDialogTask.getResult();
- } catch (Exception e) {
- throw new AndroidRuntimeException(e);
- }
- }
-
- @Rpc(description = "This method provides list of items user selected.", returns = "Selected items")
- public Set<Integer> dialogGetSelectedItems() {
- if (mDialogTask != null && mDialogTask instanceof AlertDialogTask) {
- return ((AlertDialogTask) mDialogTask).getSelectedItems();
- } else {
- throw new AndroidRuntimeException("No dialog to add list to.");
- }
- }
-
- @Rpc(description = "Adds a new item to context menu.")
- public void addContextMenuItem(
- @RpcParameter(name = "label", description = "label for this menu item") String label,
- @RpcParameter(name = "event", description = "event that will be generated on menu item click") String event,
- @RpcParameter(name = "eventData") @RpcOptional Object data) {
- mContextMenuItems.add(new UiMenuItem(label, event, data, null));
- }
-
- /**
- * <b>Example (python)</b>
- *
- * <pre>
- * import android
- * droid=android.Android()
- *
- * droid.addOptionsMenuItem("Silly","silly",None,"star_on")
- * droid.addOptionsMenuItem("Sensible","sensible","I bet.","star_off")
- * droid.addOptionsMenuItem("Off","off",None,"ic_menu_revert")
- *
- * print "Hit menu to see extra options."
- * print "Will timeout in 10 seconds if you hit nothing."
- *
- * while True: # Wait for events from the menu.
- * response=droid.eventWait(10000).result
- * if response==None:
- * break
- * print response
- * if response["name"]=="off":
- * break
- * print "And done."
- *
- * </pre>
- */
- @Rpc(description = "Adds a new item to options menu.")
- public void addOptionsMenuItem(
- @RpcParameter(name = "label", description = "label for this menu item") String label,
- @RpcParameter(name = "event", description = "event that will be generated on menu item click") String event,
- @RpcParameter(name = "eventData") @RpcOptional Object data,
- @RpcParameter(name = "iconName", description = "Android system menu icon, see http://developer.android.com/reference/android/R.drawable.html") @RpcOptional String iconName) {
- mOptionsMenuItems.add(new UiMenuItem(label, event, data, iconName));
- mMenuUpdated.set(true);
- }
-
- @Rpc(description = "Removes all items previously added to context menu.")
- public void clearContextMenu() {
- mContextMenuItems.clear();
- }
-
- @Rpc(description = "Removes all items previously added to options menu.")
- public void clearOptionsMenu() {
- mOptionsMenuItems.clear();
- mMenuUpdated.set(true);
- }
-
- public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
- for (UiMenuItem item : mContextMenuItems) {
- MenuItem menuItem = menu.add(item.mmTitle);
- menuItem.setOnMenuItemClickListener(item.mmListener);
- }
- }
-
- public boolean onPrepareOptionsMenu(Menu menu) {
- if (mMenuUpdated.getAndSet(false)) {
- menu.removeGroup(MENU_GROUP_ID);
- for (UiMenuItem item : mOptionsMenuItems) {
- MenuItem menuItem = menu.add(MENU_GROUP_ID, Menu.NONE, Menu.NONE, item.mmTitle);
- if (item.mmIcon != null) {
- menuItem.setIcon(mService.getResources()
- .getIdentifier(item.mmIcon, "drawable", "android"));
- }
- menuItem.setOnMenuItemClickListener(item.mmListener);
- }
- return true;
- }
- return true;
- }
-
- /**
- * See <a href=http://code.google.com/p/android-scripting/wiki/FullScreenUI>wiki page</a> for more
- * detail.
- */
- @Rpc(description = "Show Full Screen.")
- public List<String> fullShow(
- @RpcParameter(name = "layout", description = "String containing View layout") String layout,
- @RpcParameter(name = "title", description = "Activity Title") @RpcOptional String title)
- throws InterruptedException {
- if (mFullScreenTask != null) {
- // fullDismiss();
- mFullScreenTask.setLayout(layout);
- if (title != null) {
- mFullScreenTask.setTitle(title);
- }
- } else {
- mFullScreenTask = new FullScreenTask(layout, title);
- mFullScreenTask.setEventFacade(mEventFacade);
- mFullScreenTask.setUiFacade(this);
- mFullScreenTask.setOverrideKeys(mOverrideKeys);
- mTaskQueue.execute(mFullScreenTask);
- mFullScreenTask.getShowLatch().await();
- }
- return mFullScreenTask.mInflater.getErrors();
- }
-
- @Rpc(description = "Dismiss Full Screen.")
- public void fullDismiss() {
- if (mFullScreenTask != null) {
- mFullScreenTask.finish();
- mFullScreenTask = null;
- }
- }
-
- class MouseMotionListener implements View.OnGenericMotionListener {
-
- @Override
- public boolean onGenericMotion(View v, MotionEvent event) {
- Log.d("Generic motion triggered.");
- if (event.getToolType(0) == MotionEvent.TOOL_TYPE_MOUSE) {
- mLastXPosition = event.getAxisValue(MotionEvent.AXIS_X);
- Log.d("New mouse x coord: " + mLastXPosition);
-// Bundle msg = new Bundle();
-// msg.putFloat("value", mLastXPosition);
-// mEventFacade.postEvent("MouseXPositionUpdate", msg);
- return true;
- }
- return false;
- }
- }
-
- @Rpc(description = "Get Fullscreen Properties")
- public Map<String, Map<String, String>> fullQuery() {
- if (mFullScreenTask == null) {
- throw new RuntimeException("No screen displayed.");
- }
- return mFullScreenTask.getViewAsMap();
- }
-
- @Rpc(description = "Get fullscreen properties for a specific widget")
- public Map<String, String> fullQueryDetail(
- @RpcParameter(name = "id", description = "id of layout widget") String id) {
- if (mFullScreenTask == null) {
- throw new RuntimeException("No screen displayed.");
- }
- return mFullScreenTask.getViewDetail(id);
- }
-
- @Rpc(description = "Set fullscreen widget property")
- public String fullSetProperty(
- @RpcParameter(name = "id", description = "id of layout widget") String id,
- @RpcParameter(name = "property", description = "name of property to set") String property,
- @RpcParameter(name = "value", description = "value to set property to") String value) {
- if (mFullScreenTask == null) {
- throw new RuntimeException("No screen displayed.");
- }
- return mFullScreenTask.setViewProperty(id, property, value);
- }
-
- @Rpc(description = "Attach a list to a fullscreen widget")
- public String fullSetList(
- @RpcParameter(name = "id", description = "id of layout widget") String id,
- @RpcParameter(name = "list", description = "List to set") JSONArray items) {
- if (mFullScreenTask == null) {
- throw new RuntimeException("No screen displayed.");
- }
- return mFullScreenTask.setList(id, items);
- }
-
- @Rpc(description = "Set the Full Screen Activity Title")
- public void fullSetTitle(
- @RpcParameter(name = "title", description = "Activity Title") String title) {
- if (mFullScreenTask == null) {
- throw new RuntimeException("No screen displayed.");
- }
- mFullScreenTask.setTitle(title);
- }
-
- /**
- * This will override the default behaviour of keys while in the fullscreen mode. ie:
- *
- * <pre>
- * droid.fullKeyOverride([24,25],True)
- * </pre>
- *
- * This will override the default behaviour of the volume keys (codes 24 and 25) so that they do
- * not actually adjust the volume. <br>
- * Returns a list of currently overridden keycodes.
- */
- @Rpc(description = "Override default key actions")
- public JSONArray fullKeyOverride(
- @RpcParameter(name = "keycodes", description = "List of keycodes to override") JSONArray keycodes,
- @RpcParameter(name = "enable", description = "Turn overriding or off") @RpcDefault(value = "true") Boolean enable)
- throws JSONException {
- for (int i = 0; i < keycodes.length(); i++) {
- int value = (int) keycodes.getLong(i);
- if (value > 0) {
- if (enable) {
- if (!mOverrideKeys.contains(value)) {
- mOverrideKeys.add(value);
- }
- } else {
- int index = mOverrideKeys.indexOf(value);
- if (index >= 0) {
- mOverrideKeys.remove(index);
- }
- }
- }
- }
- if (mFullScreenTask != null) {
- mFullScreenTask.setOverrideKeys(mOverrideKeys);
- }
- return new JSONArray(mOverrideKeys);
- }
-
- @Rpc(description = "Start tracking mouse cursor x coordinate.")
- public void startTrackingMouseXCoord() throws InterruptedException {
- View.OnGenericMotionListener l = new MouseMotionListener();
- fullShow(blankLayout, "Blank");
- mFullScreenTask.mView.setOnGenericMotionListener(l);
- }
-
- @Rpc(description = "Stop tracking mouse cursor x coordinate.")
- public void stopTrackingMouseXCoord() throws InterruptedException {
- fullDismiss();
- }
-
- @Rpc(description = "Return the latest X position of mouse cursor.")
- public float getLatestMouseXCoord() {
- return mLastXPosition;
- }
-
-@Override
- public void shutdown() {
- fullDismiss();
- }
-
- private class UiMenuItem {
-
- private final String mmTitle;
- private final String mmEvent;
- private final Object mmEventData;
- private final String mmIcon;
- private final MenuItem.OnMenuItemClickListener mmListener;
-
- public UiMenuItem(String title, String event, Object data, String icon) {
- mmTitle = title;
- mmEvent = event;
- mmEventData = data;
- mmIcon = icon;
- mmListener = new MenuItem.OnMenuItemClickListener() {
- @Override
- public boolean onMenuItemClick(MenuItem item) {
- // TODO(damonkohler): Does mmEventData need to be cloned somehow?
- mEventFacade.postEvent(mmEvent, mmEventData);
- return true;
- }
- };
- }
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/ui/ViewInflater.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/ui/ViewInflater.java
deleted file mode 100644
index 871c562..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/ui/ViewInflater.java
+++ /dev/null
@@ -1,1023 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.ui;
-
-import android.app.Activity;
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Typeface;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-import android.text.InputType;
-import android.text.method.DigitsKeyListener;
-import android.util.DisplayMetrics;
-import android.view.Gravity;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewGroup.LayoutParams;
-import android.view.ViewGroup.MarginLayoutParams;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.ArrayAdapter;
-import android.widget.ListAdapter;
-import android.widget.RelativeLayout;
-import android.widget.Spinner;
-import android.widget.SpinnerAdapter;
-import android.widget.TableLayout;
-import android.widget.TextView;
-
-import com.googlecode.android_scripting.Log;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.json.JSONArray;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlPullParserFactory;
-
-public class ViewInflater {
- private static XmlPullParserFactory mFactory;
- public static final String ANDROID = "http://schemas.android.com/apk/res/android";
- public static final int BASESEQ = 0x7f0f0000;
- private int mNextSeq = BASESEQ;
- private final Map<String, Integer> mIdList = new HashMap<String, Integer>();
- private final List<String> mErrors = new ArrayList<String>();
- private Context mContext;
- private DisplayMetrics mMetrics;
- private static final Map<String, Integer> mInputTypes = new HashMap<String, Integer>();
- public static final Map<String, String> mColorNames = new HashMap<String, String>();
- public static final Map<String, Integer> mRelative = new HashMap<String, Integer>();
- static {
- mColorNames.put("aliceblue", "#f0f8ff");
- mColorNames.put("antiquewhite", "#faebd7");
- mColorNames.put("aqua", "#00ffff");
- mColorNames.put("aquamarine", "#7fffd4");
- mColorNames.put("azure", "#f0ffff");
- mColorNames.put("beige", "#f5f5dc");
- mColorNames.put("bisque", "#ffe4c4");
- mColorNames.put("black", "#000000");
- mColorNames.put("blanchedalmond", "#ffebcd");
- mColorNames.put("blue", "#0000ff");
- mColorNames.put("blueviolet", "#8a2be2");
- mColorNames.put("brown", "#a52a2a");
- mColorNames.put("burlywood", "#deb887");
- mColorNames.put("cadetblue", "#5f9ea0");
- mColorNames.put("chartreuse", "#7fff00");
- mColorNames.put("chocolate", "#d2691e");
- mColorNames.put("coral", "#ff7f50");
- mColorNames.put("cornflowerblue", "#6495ed");
- mColorNames.put("cornsilk", "#fff8dc");
- mColorNames.put("crimson", "#dc143c");
- mColorNames.put("cyan", "#00ffff");
- mColorNames.put("darkblue", "#00008b");
- mColorNames.put("darkcyan", "#008b8b");
- mColorNames.put("darkgoldenrod", "#b8860b");
- mColorNames.put("darkgray", "#a9a9a9");
- mColorNames.put("darkgrey", "#a9a9a9");
- mColorNames.put("darkgreen", "#006400");
- mColorNames.put("darkkhaki", "#bdb76b");
- mColorNames.put("darkmagenta", "#8b008b");
- mColorNames.put("darkolivegreen", "#556b2f");
- mColorNames.put("darkorange", "#ff8c00");
- mColorNames.put("darkorchid", "#9932cc");
- mColorNames.put("darkred", "#8b0000");
- mColorNames.put("darksalmon", "#e9967a");
- mColorNames.put("darkseagreen", "#8fbc8f");
- mColorNames.put("darkslateblue", "#483d8b");
- mColorNames.put("darkslategray", "#2f4f4f");
- mColorNames.put("darkslategrey", "#2f4f4f");
- mColorNames.put("darkturquoise", "#00ced1");
- mColorNames.put("darkviolet", "#9400d3");
- mColorNames.put("deeppink", "#ff1493");
- mColorNames.put("deepskyblue", "#00bfff");
- mColorNames.put("dimgray", "#696969");
- mColorNames.put("dimgrey", "#696969");
- mColorNames.put("dodgerblue", "#1e90ff");
- mColorNames.put("firebrick", "#b22222");
- mColorNames.put("floralwhite", "#fffaf0");
- mColorNames.put("forestgreen", "#228b22");
- mColorNames.put("fuchsia", "#ff00ff");
- mColorNames.put("gainsboro", "#dcdcdc");
- mColorNames.put("ghostwhite", "#f8f8ff");
- mColorNames.put("gold", "#ffd700");
- mColorNames.put("goldenrod", "#daa520");
- mColorNames.put("gray", "#808080");
- mColorNames.put("grey", "#808080");
- mColorNames.put("green", "#008000");
- mColorNames.put("greenyellow", "#adff2f");
- mColorNames.put("honeydew", "#f0fff0");
- mColorNames.put("hotpink", "#ff69b4");
- mColorNames.put("indianred ", "#cd5c5c");
- mColorNames.put("indigo ", "#4b0082");
- mColorNames.put("ivory", "#fffff0");
- mColorNames.put("khaki", "#f0e68c");
- mColorNames.put("lavender", "#e6e6fa");
- mColorNames.put("lavenderblush", "#fff0f5");
- mColorNames.put("lawngreen", "#7cfc00");
- mColorNames.put("lemonchiffon", "#fffacd");
- mColorNames.put("lightblue", "#add8e6");
- mColorNames.put("lightcoral", "#f08080");
- mColorNames.put("lightcyan", "#e0ffff");
- mColorNames.put("lightgoldenrodyellow", "#fafad2");
- mColorNames.put("lightgray", "#d3d3d3");
- mColorNames.put("lightgrey", "#d3d3d3");
- mColorNames.put("lightgreen", "#90ee90");
- mColorNames.put("lightpink", "#ffb6c1");
- mColorNames.put("lightsalmon", "#ffa07a");
- mColorNames.put("lightseagreen", "#20b2aa");
- mColorNames.put("lightskyblue", "#87cefa");
- mColorNames.put("lightslategray", "#778899");
- mColorNames.put("lightslategrey", "#778899");
- mColorNames.put("lightsteelblue", "#b0c4de");
- mColorNames.put("lightyellow", "#ffffe0");
- mColorNames.put("lime", "#00ff00");
- mColorNames.put("limegreen", "#32cd32");
- mColorNames.put("linen", "#faf0e6");
- mColorNames.put("magenta", "#ff00ff");
- mColorNames.put("maroon", "#800000");
- mColorNames.put("mediumaquamarine", "#66cdaa");
- mColorNames.put("mediumblue", "#0000cd");
- mColorNames.put("mediumorchid", "#ba55d3");
- mColorNames.put("mediumpurple", "#9370d8");
- mColorNames.put("mediumseagreen", "#3cb371");
- mColorNames.put("mediumslateblue", "#7b68ee");
- mColorNames.put("mediumspringgreen", "#00fa9a");
- mColorNames.put("mediumturquoise", "#48d1cc");
- mColorNames.put("mediumvioletred", "#c71585");
- mColorNames.put("midnightblue", "#191970");
- mColorNames.put("mintcream", "#f5fffa");
- mColorNames.put("mistyrose", "#ffe4e1");
- mColorNames.put("moccasin", "#ffe4b5");
- mColorNames.put("navajowhite", "#ffdead");
- mColorNames.put("navy", "#000080");
- mColorNames.put("oldlace", "#fdf5e6");
- mColorNames.put("olive", "#808000");
- mColorNames.put("olivedrab", "#6b8e23");
- mColorNames.put("orange", "#ffa500");
- mColorNames.put("orangered", "#ff4500");
- mColorNames.put("orchid", "#da70d6");
- mColorNames.put("palegoldenrod", "#eee8aa");
- mColorNames.put("palegreen", "#98fb98");
- mColorNames.put("paleturquoise", "#afeeee");
- mColorNames.put("palevioletred", "#d87093");
- mColorNames.put("papayawhip", "#ffefd5");
- mColorNames.put("peachpuff", "#ffdab9");
- mColorNames.put("peru", "#cd853f");
- mColorNames.put("pink", "#ffc0cb");
- mColorNames.put("plum", "#dda0dd");
- mColorNames.put("powderblue", "#b0e0e6");
- mColorNames.put("purple", "#800080");
- mColorNames.put("red", "#ff0000");
- mColorNames.put("rosybrown", "#bc8f8f");
- mColorNames.put("royalblue", "#4169e1");
- mColorNames.put("saddlebrown", "#8b4513");
- mColorNames.put("salmon", "#fa8072");
- mColorNames.put("sandybrown", "#f4a460");
- mColorNames.put("seagreen", "#2e8b57");
- mColorNames.put("seashell", "#fff5ee");
- mColorNames.put("sienna", "#a0522d");
- mColorNames.put("silver", "#c0c0c0");
- mColorNames.put("skyblue", "#87ceeb");
- mColorNames.put("slateblue", "#6a5acd");
- mColorNames.put("slategray", "#708090");
- mColorNames.put("slategrey", "#708090");
- mColorNames.put("snow", "#fffafa");
- mColorNames.put("springgreen", "#00ff7f");
- mColorNames.put("steelblue", "#4682b4");
- mColorNames.put("tan", "#d2b48c");
- mColorNames.put("teal", "#008080");
- mColorNames.put("thistle", "#d8bfd8");
- mColorNames.put("tomato", "#ff6347");
- mColorNames.put("turquoise", "#40e0d0");
- mColorNames.put("violet", "#ee82ee");
- mColorNames.put("wheat", "#f5deb3");
- mColorNames.put("white", "#ffffff");
- mColorNames.put("whitesmoke", "#f5f5f5");
- mColorNames.put("yellow", "#ffff00");
- mColorNames.put("yellowgreen", "#9acd32");
-
- mRelative.put("above", RelativeLayout.ABOVE);
- mRelative.put("alignBaseline", RelativeLayout.ALIGN_BASELINE);
- mRelative.put("alignBottom", RelativeLayout.ALIGN_BOTTOM);
- mRelative.put("alignLeft", RelativeLayout.ALIGN_LEFT);
- mRelative.put("alignParentBottom", RelativeLayout.ALIGN_PARENT_BOTTOM);
- mRelative.put("alignParentLeft", RelativeLayout.ALIGN_PARENT_LEFT);
- mRelative.put("alignParentRight", RelativeLayout.ALIGN_PARENT_RIGHT);
- mRelative.put("alignParentTop", RelativeLayout.ALIGN_PARENT_TOP);
- mRelative.put("alignRight", RelativeLayout.ALIGN_PARENT_RIGHT);
- mRelative.put("alignTop", RelativeLayout.ALIGN_TOP);
- // mRelative.put("alignWithParentIfMissing",RelativeLayout.); // No idea what this translates
- // to.
- mRelative.put("below", RelativeLayout.BELOW);
- mRelative.put("centerHorizontal", RelativeLayout.CENTER_HORIZONTAL);
- mRelative.put("centerInParent", RelativeLayout.CENTER_IN_PARENT);
- mRelative.put("centerVertical", RelativeLayout.CENTER_VERTICAL);
- mRelative.put("toLeftOf", RelativeLayout.LEFT_OF);
- mRelative.put("toRightOf", RelativeLayout.RIGHT_OF);
- }
-
- public static XmlPullParserFactory getFactory() throws XmlPullParserException {
- if (mFactory == null) {
- mFactory = XmlPullParserFactory.newInstance();
- mFactory.setNamespaceAware(true);
- }
- return mFactory;
- }
-
- public static XmlPullParser getXml() throws XmlPullParserException {
- return getFactory().newPullParser();
- }
-
- public static XmlPullParser getXml(InputStream is) throws XmlPullParserException {
- XmlPullParser xml = getXml();
- xml.setInput(is, null);
- return xml;
- }
-
- public static XmlPullParser getXml(Reader ir) throws XmlPullParserException {
- XmlPullParser xml = getXml();
- xml.setInput(ir);
- return xml;
- }
-
- public View inflate(Activity context, XmlPullParser xml) throws XmlPullParserException,
- IOException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
- int event;
- mContext = context;
- mErrors.clear();
- mMetrics = new DisplayMetrics();
- context.getWindowManager().getDefaultDisplay().getMetrics(mMetrics);
- do {
- event = xml.next();
- if (event == XmlPullParser.END_DOCUMENT) {
- return null;
- }
- } while (event != XmlPullParser.START_TAG);
- View view = inflateView(context, xml, null);
- return view;
- }
-
- private void addln(Object msg) {
- Log.d(msg.toString());
- }
-
- @SuppressWarnings("rawtypes")
- public void setClickListener(View v, android.view.View.OnClickListener listener,
- OnItemClickListener itemListener) {
- if (v.isClickable()) {
-
- if (v instanceof AdapterView) {
- try {
- ((AdapterView) v).setOnItemClickListener(itemListener);
- } catch (RuntimeException e) {
- // Ignore this, not all controls support OnItemClickListener
- }
- }
- try {
- v.setOnClickListener(listener);
- } catch (RuntimeException e) {
- // And not all controls support OnClickListener.
- }
- }
- if (v instanceof ViewGroup) {
- ViewGroup vg = (ViewGroup) v;
- for (int i = 0; i < vg.getChildCount(); i++) {
- setClickListener(vg.getChildAt(i), listener, itemListener);
- }
- }
- }
-
- private View inflateView(Context context, XmlPullParser xml, ViewGroup root)
- throws IllegalArgumentException, IllegalAccessException, InvocationTargetException,
- XmlPullParserException, IOException {
- View view = buildView(context, xml, root);
- if (view == null) {
- return view;
- }
- int event;
- while ((event = xml.next()) != XmlPullParser.END_DOCUMENT) {
- switch (event) {
- case XmlPullParser.START_TAG:
- if (view == null || view instanceof ViewGroup) {
- inflateView(context, xml, (ViewGroup) view);
- } else {
- skipTag(xml); // Not really a view, probably, skip it.
- }
- break;
- case XmlPullParser.END_TAG:
- return view;
- }
- }
- return view;
- }
-
- private void skipTag(XmlPullParser xml) throws XmlPullParserException, IOException {
- int depth = xml.getDepth();
- int event;
- while ((event = xml.next()) != XmlPullParser.END_DOCUMENT) {
- if (event == XmlPullParser.END_TAG && xml.getDepth() <= depth) {
- break;
- }
- }
- }
-
- private View buildView(Context context, XmlPullParser xml, ViewGroup root)
- throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
- View view = viewClass(context, xml.getName());
- if (view != null) {
- getLayoutParams(view, root); // Make quite sure every view has a layout param.
- for (int i = 0; i < xml.getAttributeCount(); i++) {
- String ns = xml.getAttributeNamespace(i);
- String attr = xml.getAttributeName(i);
- if (ANDROID.equals(ns)) {
- setProperty(view, root, attr, xml.getAttributeValue(i));
- }
- }
- if (root != null) {
- root.addView(view);
- }
- }
-
- return view;
- }
-
- private int getLayoutValue(String value) {
- if (value == null) {
- return 0;
- }
- if (value.equals("match_parent")) {
- return LayoutParams.MATCH_PARENT;
- }
- if (value.equals("wrap_content")) {
- return LayoutParams.WRAP_CONTENT;
- }
- if (value.equals("fill_parent")) {
- return LayoutParams.MATCH_PARENT;
- }
- return (int) getFontSize(value);
- }
-
- private float getFontSize(String value) {
- int i;
- float size;
- String unit = "px";
- for (i = 0; i < value.length(); i++) {
- char c = value.charAt(i);
- if (!(Character.isDigit(c) || c == '.')) {
- break;
- }
- }
- size = Float.parseFloat(value.substring(0, i));
- if (i < value.length()) {
- unit = value.substring(i).trim();
- }
- if (unit.equals("px")) {
- return size;
- }
- if (unit.equals("sp")) {
- return mMetrics.scaledDensity * size;
- }
- if (unit.equals("dp") || unit.equals("dip")) {
- return mMetrics.density * size;
- }
- float inches = mMetrics.ydpi * size;
- if (unit.equals("in")) {
- return inches;
- }
- if (unit.equals("pt")) {
- return inches / 72;
- }
- if (unit.equals("mm")) {
- return (float) (inches / 2.54);
- }
- return 0;
- }
-
- private int calcId(String value) {
- if (value == null) {
- return 0;
- }
- if (value.startsWith("@+id/")) {
- return tryGetId(value.substring(5));
- }
- if (value.startsWith("@id/")) {
- return tryGetId(value.substring(4));
- }
- try {
- return Integer.parseInt(value);
- } catch (NumberFormatException e) {
- return 0;
- }
- }
-
- private int tryGetId(String value) {
- Integer id = mIdList.get(value);
- if (id == null) {
- id = new Integer(mNextSeq++);
- mIdList.put(value, id);
- }
- return id;
- }
-
- private LayoutParams getLayoutParams(View view, ViewGroup root) {
- LayoutParams result = view.getLayoutParams();
- if (result == null) {
- result = createLayoutParams(root);
- view.setLayoutParams(result);
- }
- return result;
- }
-
- private LayoutParams createLayoutParams(ViewGroup root) {
- LayoutParams result = null;
- if (root != null) {
- try {
- String lookfor = root.getClass().getName() + "$LayoutParams";
- addln(lookfor);
- Class<? extends LayoutParams> clazz = Class.forName(lookfor).asSubclass(LayoutParams.class);
- if (clazz != null) {
- Constructor<? extends LayoutParams> ct = clazz.getConstructor(int.class, int.class);
- result = ct.newInstance(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
- }
- } catch (Exception e) {
- result = null;
- }
- }
- if (result == null) {
- result = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
- }
- return result;
- }
-
- public void setProperty(View view, String attr, String value) {
- try {
- setProperty(view, (ViewGroup) view.getParent(), attr, value);
- } catch (Exception e) {
- mErrors.add(e.toString());
- }
- }
-
- private void setProperty(View view, ViewGroup root, String attr, String value)
- throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
- addln(attr + ":" + value);
- if (attr.startsWith("layout_")) {
- setLayoutProperty(view, root, attr, value);
- } else if (attr.equals("id")) {
- view.setId(calcId(value));
- } else if (attr.equals("gravity")) {
- setInteger(view, attr, getInteger(Gravity.class, value));
- } else if (attr.equals("width") || attr.equals("height")) {
- setInteger(view, attr, (int) getFontSize(value));
- } else if (attr.equals("inputType")) {
- setInteger(view, attr, getInteger(InputType.class, value));
- } else if (attr.equals("background")) {
- setBackground(view, value);
- } else if (attr.equals("digits") && view instanceof TextView) {
- ((TextView) view).setKeyListener(DigitsKeyListener.getInstance(value));
- } else if (attr.startsWith("nextFocus")) {
- setInteger(view, attr + "Id", calcId(value));
- } else if (attr.equals("padding")) {
- int size = (int) getFontSize(value);
- view.setPadding(size, size, size, size);
- } else if (attr.equals("stretchColumns")) {
- setStretchColumns(view, value);
- } else if (attr.equals("textSize")) {
- setFloat(view, attr, getFontSize(value));
- } else if (attr.equals("textColor")) {
- setInteger(view, attr, getColor(value));
- } else if (attr.equals("textHighlightColor")) {
- setInteger(view, "HighlightColor", getColor(value));
- } else if (attr.equals("textColorHint")) {
- setInteger(view, "LinkTextColor", getColor(value));
- } else if (attr.equals("textStyle")) {
- TextView textview = (TextView) view;
- int style = getInteger(Typeface.class, value);
- if (style == 0) {
- textview.setTypeface(Typeface.DEFAULT);
- } else {
- textview.setTypeface(textview.getTypeface(), style);
- }
- } else if (attr.equals("typeface")) {
- TextView textview = (TextView) view;
- Typeface typeface = textview.getTypeface();
- int style = typeface == null ? 0 : typeface.getStyle();
- textview.setTypeface(Typeface.create(value, style));
- } else if (attr.equals("src")) {
- setImage(view, value);
- } else {
- setDynamicProperty(view, attr, value);
- }
- }
-
- private void setStretchColumns(View view, String value) {
- TableLayout table = (TableLayout) view;
- String[] values = value.split(",");
- for (String column : values) {
- table.setColumnStretchable(Integer.parseInt(column), true);
- }
- }
-
- private void setLayoutProperty(View view, ViewGroup root, String attr, String value) {
- LayoutParams layout = getLayoutParams(view, root);
- String layoutAttr = attr.substring(7);
- if (layoutAttr.equals("width")) {
- layout.width = getLayoutValue(value);
- } else if (layoutAttr.equals("height")) {
- layout.height = getLayoutValue(value);
- } else if (layoutAttr.equals("gravity")) {
- setIntegerField(layout, "gravity", getInteger(Gravity.class, value));
- } else {
- if (layoutAttr.startsWith("margin") && layout instanceof MarginLayoutParams) {
- int size = (int) getFontSize(value);
- MarginLayoutParams margins = (MarginLayoutParams) layout;
- if (layoutAttr.equals("marginBottom")) {
- margins.bottomMargin = size;
- } else if (layoutAttr.equals("marginTop")) {
- margins.topMargin = size;
- } else if (layoutAttr.equals("marginLeft")) {
- margins.leftMargin = size;
- } else if (layoutAttr.equals("marginRight")) {
- margins.rightMargin = size;
- }
- } else if (layout instanceof RelativeLayout.LayoutParams) {
- int anchor = calcId(value);
- if (anchor == 0) {
- anchor = getInteger(RelativeLayout.class, value);
- }
- int rule = mRelative.get(layoutAttr);
- ((RelativeLayout.LayoutParams) layout).addRule(rule, anchor);
- } else {
- setIntegerField(layout, layoutAttr, getInteger(layout.getClass(), value));
- }
- }
- }
-
- private void setBackground(View view, String value) {
- if (value.startsWith("#")) {
- view.setBackgroundColor(getColor(value));
- } else if (value.startsWith("@")) {
- setInteger(view, "backgroundResource", getInteger(view, value));
- } else {
- view.setBackground(getDrawable(value));
- }
- }
-
- private Drawable getDrawable(String value) {
- try {
- Uri uri = Uri.parse(value);
- if ("file".equals(uri.getScheme())) {
- BitmapDrawable bd = new BitmapDrawable(mContext.getResources(), uri.getPath());
- return bd;
- }
- } catch (Exception e) {
- mErrors.add("failed to load drawable " + value);
- }
- return null;
- }
-
- private void setImage(View view, String value) {
- if (value.startsWith("@")) {
- setInteger(view, "imageResource", getInteger(view, value));
- } else {
- try {
- Uri uri = Uri.parse(value);
- if ("file".equals(uri.getScheme())) {
- Bitmap bm = BitmapFactory.decodeFile(uri.getPath());
- Method method = view.getClass().getMethod("setImageBitmap", Bitmap.class);
- method.invoke(view, bm);
- } else {
- mErrors.add("Only 'file' currently supported for images");
- }
- } catch (Exception e) {
- mErrors.add("failed to set image " + value);
- }
- }
- }
-
- private void setIntegerField(Object target, String fieldName, int value) {
- try {
- Field f = target.getClass().getField(fieldName);
- f.setInt(target, value);
- } catch (Exception e) {
- mErrors.add("set field)" + fieldName + " failed. " + e.toString());
- }
- }
-
- /** Expand single digit color to 2 digits. */
- private int expandColor(String colorValue) {
- return Integer.parseInt(colorValue + colorValue, 16);
- }
-
- private int getColor(String value) {
- int a = 0xff, r = 0, g = 0, b = 0;
- if (value.startsWith("#")) {
- try {
- value = value.substring(1);
- if (value.length() == 4) {
- a = expandColor(value.substring(0, 1));
- value = value.substring(1);
- }
- if (value.length() == 3) {
- r = expandColor(value.substring(0, 1));
- g = expandColor(value.substring(1, 2));
- b = expandColor(value.substring(2, 3));
- } else {
- if (value.length() == 8) {
- a = Integer.parseInt(value.substring(0, 2), 16);
- value = value.substring(2);
- }
- if (value.length() == 6) {
- r = Integer.parseInt(value.substring(0, 2), 16);
- g = Integer.parseInt(value.substring(2, 4), 16);
- b = Integer.parseInt(value.substring(4, 6), 16);
- }
- }
- long result = (a << 24) | (r << 16) | (g << 8) | b;
- return (int) result;
- } catch (Exception e) {
- }
- } else if (mColorNames.containsKey(value.toLowerCase())) {
- return getColor(mColorNames.get(value.toLowerCase()));
- }
- mErrors.add("Unknown color " + value);
- return 0;
- }
-
- private int getInputType(String value) {
- int result = 0;
- Integer v = getInputTypes().get(value);
- if (v == null) {
- mErrors.add("Unkown input type " + value);
- } else {
- result = v;
- }
- return result;
- }
-
- private void setInteger(View view, String attr, int value) {
- String name = "set" + PCase(attr);
- Method m;
- try {
- if ((m = tryMethod(view, name, Context.class, int.class)) != null) {
- m.invoke(view, mContext, value);
- } else if ((m = tryMethod(view, name, int.class)) != null) {
- m.invoke(view, value);
- }
- } catch (Exception e) {
- addln(name + ":" + value + ":" + e.toString());
- }
-
- }
-
- private void setFloat(View view, String attr, float value) {
- String name = "set" + PCase(attr);
- Method m;
- try {
- if ((m = tryMethod(view, name, Context.class, float.class)) != null) {
- m.invoke(view, mContext, value);
- } else if ((m = tryMethod(view, name, float.class)) != null) {
- m.invoke(view, value);
- }
- } catch (Exception e) {
- addln(name + ":" + value + ":" + e.toString());
- }
-
- }
-
- private void setDynamicProperty(View view, String attr, String value)
- throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
- String name = "set" + PCase(attr);
- try {
- Method m = tryMethod(view, name, CharSequence.class);
- if (m != null) {
- m.invoke(view, value);
- } else if ((m = tryMethod(view, name, Context.class, int.class)) != null) {
- m.invoke(view, mContext, getInteger(view, value));
- } else if ((m = tryMethod(view, name, int.class)) != null) {
- m.invoke(view, getInteger(view, value));
- } else if ((m = tryMethod(view, name, float.class)) != null) {
- m.invoke(view, Float.parseFloat(value));
- } else if ((m = tryMethod(view, name, boolean.class)) != null) {
- m.invoke(view, Boolean.parseBoolean(value));
- } else if ((m = tryMethod(view, name, Object.class)) != null) {
- m.invoke(view, value);
- } else {
- mErrors.add(view.getClass().getSimpleName() + ":" + attr + " Property not found.");
- }
- } catch (Exception e) {
- addln(name + ":" + value + ":" + e.toString());
- mErrors.add(name + ":" + value + ":" + e.toString());
- }
- }
-
- private String PCase(String s) {
- if (s == null) {
- return null;
- }
- if (s.length() > 0) {
- return s.substring(0, 1).toUpperCase() + s.substring(1);
- }
- return "";
- }
-
- private Method tryMethod(Object o, String name, Class<?>... parameters) {
- Method result;
- try {
- result = o.getClass().getMethod(name, parameters);
- } catch (Exception e) {
- result = null;
- }
- return result;
- }
-
- public String camelCase(String s) {
- if (s == null) {
- return "";
- } else if (s.length() < 2) {
- return s.toUpperCase();
- } else {
- return s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase();
- }
- }
-
- private Integer getInteger(Class<?> clazz, String value) {
- Integer result = null;
- if (value.contains("|")) {
- int work = 0;
- for (String s : value.split("\\|")) {
- work |= getInteger(clazz, s);
- }
- result = work;
- } else {
- if (value.startsWith("?")) {
- result = parseTheme(value);
- } else if (value.startsWith("@")) {
- result = parseTheme(value);
- } else if (value.startsWith("0x")) {
- try {
- result = (int) Long.parseLong(value.substring(2), 16);
- } catch (NumberFormatException e) {
- result = 0;
- }
- } else {
- try {
- result = Integer.parseInt(value);
- } catch (NumberFormatException e) {
- if (clazz == InputType.class) {
- return getInputType(value);
- }
- try {
- Field f = clazz.getField(value.toUpperCase());
- result = f.getInt(null);
- } catch (Exception ex) {
- mErrors.add("Unknown value: " + value);
- result = 0;
- }
- }
- }
- }
- return result;
- }
-
- private Integer getInteger(View view, String value) {
- return getInteger(view.getClass(), value);
- }
-
- private Integer parseTheme(String value) {
- int result;
- try {
- String query = "";
- int i;
- value = value.substring(1); // skip past "?"
- i = value.indexOf(":");
- if (i >= 0) {
- query = value.substring(0, i) + ".";
- value = value.substring(i + 1);
- }
- query += "R";
- i = value.indexOf("/");
- if (i >= 0) {
- query += "$" + value.substring(0, i);
- value = value.substring(i + 1);
- }
- Class<?> clazz = Class.forName(query);
- Field f = clazz.getField(value);
- result = f.getInt(null);
- } catch (Exception e) {
- result = 0;
- }
- return result;
- }
-
- private View viewClass(Context context, String name) {
- View result = null;
- result = viewClassTry(context, "android.view." + name);
- if (result == null) {
- result = viewClassTry(context, "android.widget." + name);
- }
- if (result == null) {
- result = viewClassTry(context, name);
- }
- return result;
- }
-
- private View viewClassTry(Context context, String name) {
- View result = null;
- try {
- Class<? extends View> viewclass = Class.forName(name).asSubclass(View.class);
- if (viewclass != null) {
- Constructor<? extends View> ct = viewclass.getConstructor(Context.class);
- result = ct.newInstance(context);
- }
- } catch (Exception e) {
- }
- return result;
-
- }
-
- public Map<String, Integer> getIdList() {
- return mIdList;
- }
-
- public List<String> getErrors() {
- return mErrors;
- }
-
- public String getIdName(int id) {
- for (String key : mIdList.keySet()) {
- if (mIdList.get(key) == id) {
- return key;
- }
- }
- return null;
- }
-
- public int getId(String name) {
- return mIdList.get(name);
- }
-
- public Map<String, Map<String, String>> getViewAsMap(View v) {
- Map<String, Map<String, String>> result = new HashMap<String, Map<String, String>>();
- for (Entry<String, Integer> entry : mIdList.entrySet()) {
- View tmp = v.findViewById(entry.getValue());
- if (tmp != null) {
- result.put(entry.getKey(), getViewInfo(tmp));
- }
- }
- return result;
- }
-
- public Map<String, String> getViewInfo(View v) {
- Map<String, String> result = new HashMap<String, String>();
- if (v.getId() != 0) {
- result.put("id", getIdName(v.getId()));
- }
- result.put("type", v.getClass().getSimpleName());
- addProperty(v, "text", result);
- addProperty(v, "visibility", result);
- addProperty(v, "checked", result);
- addProperty(v, "tag", result);
- addProperty(v, "selectedItemPosition", result);
- addProperty(v, "progress", result);
- return result;
- }
-
- private void addProperty(View v, String attr, Map<String, String> dest) {
- String result = getProperty(v, attr);
- if (result != null) {
- dest.put(attr, result);
- }
- }
-
- private String getProperty(View v, String attr) {
- String name = PCase(attr);
- Method m = tryMethod(v, "get" + name);
- if (m == null) {
- m = tryMethod(v, "is" + name);
- }
- String result = null;
- if (m != null) {
- try {
- Object o = m.invoke(v);
- if (o != null) {
- result = o.toString();
- }
- } catch (Exception e) {
- result = null;
- }
- }
- return result;
- }
-
- public static Map<String, Integer> getInputTypes() {
- if (mInputTypes.size() == 0) {
- mInputTypes.put("none", 0x00000000);
- mInputTypes.put("text", 0x00000001);
- mInputTypes.put("textCapCharacters", 0x00001001);
- mInputTypes.put("textCapWords", 0x00002001);
- mInputTypes.put("textCapSentences", 0x00004001);
- mInputTypes.put("textAutoCorrect", 0x00008001);
- mInputTypes.put("textAutoComplete", 0x00010001);
- mInputTypes.put("textMultiLine", 0x00020001);
- mInputTypes.put("textImeMultiLine", 0x00040001);
- mInputTypes.put("textNoSuggestions", 0x00080001);
- mInputTypes.put("textUri", 0x00000011);
- mInputTypes.put("textEmailAddress", 0x00000021);
- mInputTypes.put("textEmailSubject", 0x00000031);
- mInputTypes.put("textShortMessage", 0x00000041);
- mInputTypes.put("textLongMessage", 0x00000051);
- mInputTypes.put("textPersonName", 0x00000061);
- mInputTypes.put("textPostalAddress", 0x00000071);
- mInputTypes.put("textPassword", 0x00000081);
- mInputTypes.put("textVisiblePassword", 0x00000091);
- mInputTypes.put("textWebEditText", 0x000000a1);
- mInputTypes.put("textFilter", 0x000000b1);
- mInputTypes.put("textPhonetic", 0x000000c1);
- mInputTypes.put("textWebEmailAddress", 0x000000d1);
- mInputTypes.put("textWebPassword", 0x000000e1);
- mInputTypes.put("number", 0x00000002);
- mInputTypes.put("numberSigned", 0x00001002);
- mInputTypes.put("numberDecimal", 0x00002002);
- mInputTypes.put("numberPassword", 0x00000012);
- mInputTypes.put("phone", 0x00000003);
- mInputTypes.put("datetime", 0x00000004);
- mInputTypes.put("date", 0x00000014);
- mInputTypes.put("time", 0x00000024);
- }
- return mInputTypes;
- }
-
- /** Query class (typically R.id) to extract id names */
- public void setIdList(Class<?> idClass) {
- mIdList.clear();
- for (Field f : idClass.getDeclaredFields()) {
- try {
- String name = f.getName();
- int value = f.getInt(null);
- mIdList.put(name, value);
- } catch (Exception e) {
- // Ignore
- }
- }
- }
-
- public void setListAdapter(View view, JSONArray items) {
- List<String> list = new ArrayList<String>();
- try {
- for (int i = 0; i < items.length(); i++) {
- list.add(items.get(i).toString());
- }
- ArrayAdapter<String> adapter;
- if (view instanceof Spinner) {
- adapter =
- new ArrayAdapter<String>(mContext, android.R.layout.simple_spinner_item,
- android.R.id.text1, list);
- } else {
- adapter =
- new ArrayAdapter<String>(mContext, android.R.layout.simple_list_item_1,
- android.R.id.text1, list);
- }
- adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- Method m = tryMethod(view, "setAdapter", SpinnerAdapter.class);
- if (m == null) {
- m = view.getClass().getMethod("setAdapter", ListAdapter.class);
- }
- m.invoke(view, adapter);
- } catch (Exception e) {
- mErrors.add("failed to load list " + e.getMessage());
- }
- }
-
- public void clearAll() {
- getErrors().clear();
- mIdList.clear();
- mNextSeq = BASESEQ;
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/wifi/HttpFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/wifi/HttpFacade.java
deleted file mode 100644
index 75bf888..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/wifi/HttpFacade.java
+++ /dev/null
@@ -1,216 +0,0 @@
-
-package com.googlecode.android_scripting.facade.wifi;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.net.HttpURLConnection;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.net.SocketException;
-import java.net.URL;
-import java.net.UnknownHostException;
-import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-import com.googlecode.android_scripting.rpc.RpcOptional;
-
-/**
- * Basic http operations.
- */
-public class HttpFacade extends RpcReceiver {
-
- private ServerSocket mServerSocket = null;
- private int mServerTimeout = -1;
- private HashMap<Integer, Socket> mSockets = null;
- private int socketCnt = 0;
-
- public HttpFacade(FacadeManager manager) throws IOException {
- super(manager);
- mSockets = new HashMap<Integer, Socket>();
- }
-
- private void inputStreamToOutputStream(InputStream in, OutputStream out) throws IOException {
- if (in == null) {
- Log.e("InputStream is null.");
- return;
- }
- if (out == null) {
- Log.e("OutputStream is null.");
- return;
- }
- try {
- int read = 0;
- byte[] bytes = new byte[1024];
- while ((read = in.read(bytes)) != -1) {
- out.write(bytes, 0, read);
- }
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- in.close();
- out.close();
- }
-
- }
-
- private String inputStreamToString(InputStream in) throws IOException {
- BufferedReader r = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));
- StringBuilder sb = new StringBuilder();
- String str = null;
- while ((str = r.readLine()) != null) {
- sb.append(str);
- }
- return sb.toString();
- }
-
- /**
- * Send an http request and get the response.
- *
- * @param url The url to send request to.
- * @return The HttpURLConnection object.
- */
- private HttpURLConnection httpRequest(String url) throws IOException {
- URL targetURL = new URL(url);
- HttpURLConnection urlConnection = null;
- try {
- urlConnection = (HttpURLConnection) targetURL.openConnection();
- urlConnection.connect();
- int respCode = urlConnection.getResponseCode();
- String respMsg = urlConnection.getResponseMessage();
- Log.d("Got response code: " + respCode + " and response msg: " + respMsg);
- } catch (IOException e) {
- Log.e("Failed to open a connection to " + url);
- Log.e(e.toString());
- } finally {
- if (urlConnection != null) {
- urlConnection.disconnect();
- }
- }
- return urlConnection;
- }
-
- @Rpc(description = "Start waiting for a connection request on a specified port.",
- returns = "The index of the connection.")
- public Integer httpAcceptConnection(Integer port) throws IOException {
- mServerSocket = new ServerSocket(port);
- if (mServerTimeout > 0) {
- mServerSocket.setSoTimeout(mServerTimeout);
- }
- Socket sock = mServerSocket.accept();
- socketCnt += 1;
- mSockets.put(socketCnt, sock);
- return socketCnt;
- }
-
- @Rpc(description = "Download a file from specified url.")
- public void httpDownloadFile(String url) throws IOException {
- HttpURLConnection urlConnection = httpRequest(url);
- String filename = null;
- String contentDisposition = urlConnection.getHeaderField("Content-Disposition");
- // Try to figure out the name of the file being downloaded.
- // If the server returned a filename, use it.
- if (contentDisposition != null) {
- int idx = contentDisposition.toLowerCase().indexOf("filename");
- if (idx != -1) {
- filename = contentDisposition.substring(idx + 9);
- Log.d("Using name returned by server: " + filename);
- }
- }
- // If the server did not provide a filename to us, use the last part of url.
- if (filename == null) {
- int lastIdx = url.lastIndexOf('/');
- filename = url.substring(lastIdx + 1);
- Log.d("Using name from url: " + filename);
- }
- InputStream in = new BufferedInputStream(urlConnection.getInputStream());
- String outPath = "/sdcard/Download/" + filename;
- OutputStream output = new FileOutputStream(new File(outPath));
- inputStreamToOutputStream(in, output);
- Log.d("Downloaded file at " + outPath);
- }
-
- @Rpc(description = "Make an http request and return the response message.")
- public HttpURLConnection httpPing(@RpcParameter(name = "url") String url) throws IOException {
- try {
- HttpURLConnection urlConnection = null;
- urlConnection = httpRequest(url);
- return urlConnection;
- } catch (UnknownHostException e) {
- return null;
- }
- }
-
- @Rpc(description = "Make an http request and return the response content as a string.")
- public String httpRequestString(@RpcParameter(name = "url") String url) throws IOException {
- HttpURLConnection urlConnection = httpRequest(url);
- InputStream in = new BufferedInputStream(urlConnection.getInputStream());
- String result = inputStreamToString(in);
- Log.d("Fetched: " + result);
- return result;
- }
-
- @Rpc(description = "Set how many milliseconds to wait for an incoming connection.")
- public void httpSetServerTimeout(@RpcParameter(name = "timeout") Integer timeout)
- throws SocketException {
- mServerSocket.setSoTimeout(timeout);
- mServerTimeout = timeout;
- }
-
- @Rpc(description = "Ping to host(URL or IP), return success (true) or fail (false).")
- // The optional timeout parameter is in unit of second.
- public Boolean pingHost(@RpcParameter(name = "host") String hostString,
- @RpcParameter(name = "timeout") @RpcOptional Integer timeout) {
- try {
- String host;
- try {
- URL url = new URL(hostString);
- host = url.getHost();
- } catch (java.net.MalformedURLException e) {
- Log.d("hostString is not URL, it may be IP address.");
- host = hostString;
- }
-
- Log.d("Host:" + host);
- String pingCmdString = "ping -c 1 ";
- if (timeout != null) {
- pingCmdString = pingCmdString + "-W " + timeout + " ";
- }
- pingCmdString = pingCmdString + host;
- Log.d("Execute command: " + pingCmdString);
- Process p1 = java.lang.Runtime.getRuntime().exec(pingCmdString);
- int returnVal = p1.waitFor();
- boolean reachable = (returnVal == 0);
- Log.d("Ping return Value:" + returnVal);
- return reachable;
- } catch (Exception e){
- e.printStackTrace();
- return false;
- }
- /*TODO see b/18899134 for more information.
- */
- }
-
- @Override
- public void shutdown() {
- for (int key : mSockets.keySet()) {
- Socket sock = mSockets.get(key);
- try {
- sock.close();
- } catch (IOException e) {
- Log.e("Failed to close socket " + key + " on port " + sock.getLocalPort());
- e.printStackTrace();
- }
- }
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiManagerFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiManagerFacade.java
deleted file mode 100755
index c0efe0f..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiManagerFacade.java
+++ /dev/null
@@ -1,887 +0,0 @@
-
-package com.googlecode.android_scripting.facade.wifi;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.ObjectOutput;
-import java.io.ObjectOutputStream;
-import java.net.ConnectException;
-import java.security.GeneralSecurityException;
-import java.security.KeyFactory;
-import java.security.NoSuchAlgorithmException;
-import java.security.PrivateKey;
-import java.security.PublicKey;
-import java.security.cert.CertificateException;
-import java.security.cert.CertificateFactory;
-import java.security.cert.X509Certificate;
-import java.security.spec.InvalidKeySpecException;
-import java.security.spec.PKCS8EncodedKeySpec;
-import java.security.spec.X509EncodedKeySpec;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.facade.EventFacade;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcOptional;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-import android.app.Service;
-import android.content.BroadcastReceiver;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.ConnectivityManager;
-import android.net.DhcpInfo;
-import android.net.Network;
-import android.net.NetworkInfo;
-import android.net.NetworkInfo.DetailedState;
-import android.net.wifi.ScanResult;
-import android.net.wifi.WifiActivityEnergyInfo;
-import android.net.wifi.WifiConfiguration;
-import android.net.wifi.WifiConfiguration.AuthAlgorithm;
-import android.net.wifi.WifiConfiguration.KeyMgmt;
-import android.net.wifi.WifiEnterpriseConfig;
-import android.net.wifi.WifiInfo;
-import android.net.wifi.WifiManager;
-import android.net.wifi.WifiManager.WifiLock;
-import android.net.wifi.WpsInfo;
-import android.os.Bundle;
-import android.provider.Settings.Global;
-import android.provider.Settings.SettingNotFoundException;
-import android.util.Base64;
-
-/**
- * WifiManager functions.
- */
-// TODO: make methods handle various wifi states properly
-// e.g. wifi connection result will be null when flight mode is on
-public class WifiManagerFacade extends RpcReceiver {
- private final static String mEventType = "WifiManager";
- private final Service mService;
- private final WifiManager mWifi;
- private final EventFacade mEventFacade;
-
- private final IntentFilter mScanFilter;
- private final IntentFilter mStateChangeFilter;
- private final IntentFilter mTetherFilter;
- private final WifiScanReceiver mScanResultsAvailableReceiver;
- private final WifiStateChangeReceiver mStateChangeReceiver;
- private boolean mTrackingWifiStateChange;
-
- private final BroadcastReceiver mTetherStateReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (WifiManager.WIFI_AP_STATE_CHANGED_ACTION.equals(action)) {
- Log.d("Wifi AP state changed.");
- int state = intent.getIntExtra(WifiManager.EXTRA_WIFI_AP_STATE,
- WifiManager.WIFI_AP_STATE_FAILED);
- if (state == WifiManager.WIFI_AP_STATE_ENABLED) {
- mEventFacade.postEvent("WifiManagerApEnabled", null);
- } else if (state == WifiManager.WIFI_AP_STATE_DISABLED) {
- mEventFacade.postEvent("WifiManagerApDisabled", null);
- }
- } else if (ConnectivityManager.ACTION_TETHER_STATE_CHANGED.equals(action)) {
- Log.d("Tether state changed.");
- ArrayList<String> available = intent.getStringArrayListExtra(
- ConnectivityManager.EXTRA_AVAILABLE_TETHER);
- ArrayList<String> active = intent.getStringArrayListExtra(
- ConnectivityManager.EXTRA_ACTIVE_TETHER);
- ArrayList<String> errored = intent.getStringArrayListExtra(
- ConnectivityManager.EXTRA_ERRORED_TETHER);
- Bundle msg = new Bundle();
- msg.putStringArrayList("AVAILABLE_TETHER", available);
- msg.putStringArrayList("ACTIVE_TETHER", active);
- msg.putStringArrayList("ERRORED_TETHER", errored);
- mEventFacade.postEvent("TetherStateChanged", msg);
- }
- }
- };
-
- private WifiLock mLock = null;
- private boolean mIsConnected = false;
-
- public WifiManagerFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mWifi = (WifiManager) mService.getSystemService(Context.WIFI_SERVICE);
- mEventFacade = manager.getReceiver(EventFacade.class);
-
- mScanFilter = new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
- mStateChangeFilter = new IntentFilter(WifiManager.NETWORK_STATE_CHANGED_ACTION);
- mStateChangeFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
- mStateChangeFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
- mStateChangeFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY - 1);
-
- mTetherFilter = new IntentFilter(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
- mTetherFilter.addAction(ConnectivityManager.ACTION_TETHER_STATE_CHANGED);
-
- mScanResultsAvailableReceiver = new WifiScanReceiver(mEventFacade);
- mStateChangeReceiver = new WifiStateChangeReceiver();
- mTrackingWifiStateChange = false;
- }
-
- private void makeLock(int wifiMode) {
- if (mLock == null) {
- mLock = mWifi.createWifiLock(wifiMode, "sl4a");
- mLock.acquire();
- }
- }
-
- /**
- * Handle Broadcast receiver for Scan Result
- *
- * @parm eventFacade Object of EventFacade
- */
- class WifiScanReceiver extends BroadcastReceiver {
- private final EventFacade mEventFacade;
-
- WifiScanReceiver(EventFacade eventFacade) {
- mEventFacade = eventFacade;
- }
-
- @Override
- public void onReceive(Context c, Intent intent) {
- String action = intent.getAction();
- if (action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
- Bundle mResults = new Bundle();
- Log.d("Wifi connection scan finished, results available.");
- mResults.putLong("Timestamp", System.currentTimeMillis() / 1000);
- mEventFacade.postEvent(mEventType + "ScanResultsAvailable", mResults);
- mService.unregisterReceiver(mScanResultsAvailableReceiver);
- }
- }
- }
-
- class WifiActionListener implements WifiManager.ActionListener {
- private final EventFacade mEventFacade;
- private final String TAG;
-
- public WifiActionListener(EventFacade eventFacade, String tag) {
- mEventFacade = eventFacade;
- this.TAG = tag;
- }
-
- @Override
- public void onSuccess() {
- Log.d("WifiActionListener onSuccess called for " + mEventType + TAG + "OnSuccess");
- mEventFacade.postEvent(mEventType + TAG + "OnSuccess", null);
- }
-
- @Override
- public void onFailure(int reason) {
- Log.d("WifiActionListener onFailure called for" + mEventType);
- Bundle msg = new Bundle();
- msg.putInt("reason", reason);
- mEventFacade.postEvent(mEventType + TAG + "OnFailure", msg);
- }
- }
-
- public class WifiStateChangeReceiver extends BroadcastReceiver {
- String mCachedWifiInfo = "";
-
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
- Log.d("Wifi network state changed.");
- NetworkInfo nInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
- WifiInfo wInfo = intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO);
- Log.d("NetworkInfo " + nInfo);
- Log.d("WifiInfo " + wInfo);
- // If network info is of type wifi, send wifi events.
- if (nInfo.getType() == ConnectivityManager.TYPE_WIFI) {
- if (wInfo != null && nInfo.getDetailedState().equals(DetailedState.CONNECTED)) {
- String bssid = wInfo.getBSSID();
- if (bssid != null && !mCachedWifiInfo.equals(wInfo.toString())) {
- Log.d("WifiNetworkConnected");
- mEventFacade.postEvent("WifiNetworkConnected", wInfo);
- }
- mCachedWifiInfo = wInfo.toString();
- } else {
- if (nInfo.getDetailedState().equals(DetailedState.DISCONNECTED)) {
- if (!mCachedWifiInfo.equals("")) {
- mCachedWifiInfo = "";
- mEventFacade.postEvent("WifiNetworkDisconnected", null);
- }
- }
- }
- }
- } else if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) {
- Log.d("Supplicant connection state changed.");
- mIsConnected = intent
- .getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false);
- Bundle msg = new Bundle();
- msg.putBoolean("Connected", mIsConnected);
- mEventFacade.postEvent("SupplicantConnectionChanged", msg);
- }
- }
- }
-
- public class WifiWpsCallback extends WifiManager.WpsCallback {
- private static final String tag = "WifiWps";
-
- @Override
- public void onStarted(String pin) {
- Bundle msg = new Bundle();
- msg.putString("pin", pin);
- mEventFacade.postEvent(tag + "OnStarted", msg);
- }
-
- @Override
- public void onSucceeded() {
- Log.d("Wps op succeeded");
- mEventFacade.postEvent(tag + "OnSucceeded", null);
- }
-
- @Override
- public void onFailed(int reason) {
- Bundle msg = new Bundle();
- msg.putInt("reason", reason);
- mEventFacade.postEvent(tag + "OnFailed", msg);
- }
- }
-
- private void applyingkeyMgmt(WifiConfiguration config, ScanResult result) {
- if (result.capabilities.contains("WEP")) {
- config.allowedKeyManagement.set(KeyMgmt.NONE);
- config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN);
- config.allowedAuthAlgorithms.set(AuthAlgorithm.SHARED);
- } else if (result.capabilities.contains("PSK")) {
- config.allowedKeyManagement.set(KeyMgmt.WPA_PSK);
- } else if (result.capabilities.contains("EAP")) {
- // this is probably wrong, as we don't have a way to enter the enterprise config
- config.allowedKeyManagement.set(KeyMgmt.WPA_EAP);
- config.allowedKeyManagement.set(KeyMgmt.IEEE8021X);
- } else {
- config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
- }
- }
-
- private WifiConfiguration genWifiConfig(JSONObject j) throws JSONException {
- if (j == null) {
- return null;
- }
- WifiConfiguration config = new WifiConfiguration();
- if (j.has("SSID")) {
- config.SSID = "\"" + j.getString("SSID") + "\"";
- } else if (j.has("ssid")) {
- config.SSID = "\"" + j.getString("ssid") + "\"";
- }
- if (j.has("password")) {
- config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
- config.preSharedKey = "\"" + j.getString("password") + "\"";
- } else {
- config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
- }
- if (j.has("BSSID")) {
- config.BSSID = j.getString("BSSID");
- }
- if (j.has("hiddenSSID")) {
- config.hiddenSSID = j.getBoolean("hiddenSSID");
- }
- if (j.has("priority")) {
- config.priority = j.getInt("priority");
- }
- if (j.has("apBand")) {
- config.apBand = j.getInt("apBand");
- }
- if (j.has("preSharedKey")) {
- config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
- config.preSharedKey = j.getString("preSharedKey");
- }
- if (j.has("wepKeys")) {
- // Looks like we only support static WEP.
- config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
- config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN);
- config.allowedAuthAlgorithms.set(AuthAlgorithm.SHARED);
- JSONArray keys = j.getJSONArray("wepKeys");
- String[] wepKeys = new String[keys.length()];
- for (int i = 0; i < keys.length(); i++) {
- wepKeys[i] = keys.getString(i);
- }
- config.wepKeys = wepKeys;
- }
- if (j.has("wepTxKeyIndex")) {
- config.wepTxKeyIndex = j.getInt("wepTxKeyIndex");
- }
- return config;
- }
-
- private WifiConfiguration genWifiEnterpriseConfig(JSONObject j) throws JSONException,
- GeneralSecurityException {
- if (j == null) {
- return null;
- }
- WifiConfiguration config = new WifiConfiguration();
- config.allowedKeyManagement.set(KeyMgmt.WPA_EAP);
- config.allowedKeyManagement.set(KeyMgmt.IEEE8021X);
- if (j.has("SSID")) {
- config.SSID = j.getString("SSID");
- }
- if (j.has("FQDN")) {
- config.FQDN = j.getString("FQDN");
- }
- if (j.has("providerFriendlyName")) {
- config.providerFriendlyName = j.getString("providerFriendlyName");
- }
- if (j.has("roamingConsortiumIds")) {
- JSONArray ids = j.getJSONArray("roamingConsortiumIds");
- long[] rIds = new long[ids.length()];
- for (int i = 0; i < ids.length(); i++) {
- rIds[i] = ids.getLong(i);
- }
- config.roamingConsortiumIds = rIds;
- }
- WifiEnterpriseConfig eConfig = new WifiEnterpriseConfig();
- if (j.has(WifiEnterpriseConfig.EAP_KEY)) {
- int eap = j.getInt(WifiEnterpriseConfig.EAP_KEY);
- eConfig.setEapMethod(eap);
- }
- if (j.has(WifiEnterpriseConfig.PHASE2_KEY)) {
- int p2Method = j.getInt(WifiEnterpriseConfig.PHASE2_KEY);
- eConfig.setPhase2Method(p2Method);
- }
- if (j.has(WifiEnterpriseConfig.CA_CERT_KEY)) {
- String certStr = j.getString(WifiEnterpriseConfig.CA_CERT_KEY);
- Log.v("CA Cert String is " + certStr);
- eConfig.setCaCertificate(strToX509Cert(certStr));
- }
- if (j.has(WifiEnterpriseConfig.CLIENT_CERT_KEY)
- && j.has(WifiEnterpriseConfig.PRIVATE_KEY_ID_KEY)) {
- String certStr = j.getString(WifiEnterpriseConfig.CLIENT_CERT_KEY);
- String keyStr = j.getString(WifiEnterpriseConfig.PRIVATE_KEY_ID_KEY);
- Log.v("Client Cert String is " + certStr);
- Log.v("Client Key String is " + keyStr);
- X509Certificate cert = strToX509Cert(certStr);
- PrivateKey privKey = strToPrivateKey(keyStr);
- Log.v("Cert is " + cert);
- Log.v("Private Key is " + privKey);
- eConfig.setClientKeyEntry(privKey, cert);
- }
- if (j.has(WifiEnterpriseConfig.IDENTITY_KEY)) {
- String identity = j.getString(WifiEnterpriseConfig.IDENTITY_KEY);
- Log.v("Setting identity to " + identity);
- eConfig.setIdentity(identity);
- }
- if (j.has(WifiEnterpriseConfig.PASSWORD_KEY)) {
- String pwd = j.getString(WifiEnterpriseConfig.PASSWORD_KEY);
- Log.v("Setting password to " + pwd);
- eConfig.setPassword(pwd);
- }
- if (j.has(WifiEnterpriseConfig.ALTSUBJECT_MATCH_KEY)) {
- String altSub = j.getString(WifiEnterpriseConfig.ALTSUBJECT_MATCH_KEY);
- Log.v("Setting Alt Subject to " + altSub);
- eConfig.setAltSubjectMatch(altSub);
- }
- if (j.has(WifiEnterpriseConfig.DOM_SUFFIX_MATCH_KEY)) {
- String domSuffix = j.getString(WifiEnterpriseConfig.DOM_SUFFIX_MATCH_KEY);
- Log.v("Setting Domain Suffix Match to " + domSuffix);
- eConfig.setDomainSuffixMatch(domSuffix);
- }
- if (j.has(WifiEnterpriseConfig.REALM_KEY)) {
- String realm = j.getString(WifiEnterpriseConfig.REALM_KEY);
- Log.v("Setting Domain Suffix Match to " + realm);
- eConfig.setRealm(realm);
- }
- config.enterpriseConfig = eConfig;
- return config;
- }
-
- private boolean matchScanResult(ScanResult result, String id) {
- if (result.BSSID.equals(id) || result.SSID.equals(id)) {
- return true;
- }
- return false;
- }
-
- private WpsInfo parseWpsInfo(String infoStr) throws JSONException {
- if (infoStr == null) {
- return null;
- }
- JSONObject j = new JSONObject(infoStr);
- WpsInfo info = new WpsInfo();
- if (j.has("setup")) {
- info.setup = j.getInt("setup");
- }
- if (j.has("BSSID")) {
- info.BSSID = j.getString("BSSID");
- }
- if (j.has("pin")) {
- info.pin = j.getString("pin");
- }
- return info;
- }
-
- private byte[] base64StrToBytes(String input) {
- return Base64.decode(input, Base64.DEFAULT);
- }
-
- private X509Certificate strToX509Cert(String certStr) throws CertificateException {
- byte[] certBytes = base64StrToBytes(certStr);
- InputStream certStream = new ByteArrayInputStream(certBytes);
- CertificateFactory cf = CertificateFactory.getInstance("X509");
- return (X509Certificate) cf.generateCertificate(certStream);
- }
-
- private PrivateKey strToPrivateKey(String key) throws NoSuchAlgorithmException,
- InvalidKeySpecException {
- byte[] keyBytes = base64StrToBytes(key);
- PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
- KeyFactory fact = KeyFactory.getInstance("RSA");
- PrivateKey priv = fact.generatePrivate(keySpec);
- return priv;
- }
-
- private PublicKey strToPublicKey(String key) throws NoSuchAlgorithmException,
- InvalidKeySpecException {
- byte[] keyBytes = base64StrToBytes(key);
- X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
- KeyFactory fact = KeyFactory.getInstance("RSA");
- PublicKey pub = fact.generatePublic(keySpec);
- return pub;
- }
-
- private WifiConfiguration wifiConfigurationFromScanResult(ScanResult result) {
- if (result == null)
- return null;
- WifiConfiguration config = new WifiConfiguration();
- config.SSID = "\"" + result.SSID + "\"";
- applyingkeyMgmt(config, result);
- config.BSSID = result.BSSID;
- return config;
- }
-
- @Rpc(description = "test.")
- public String wifiTest(String certString) throws CertificateException, IOException {
- // TODO(angli): Make this work. Convert a X509Certificate back to a string.
- X509Certificate caCert = strToX509Cert(certString);
- caCert.getEncoded();
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- ObjectOutput out = new ObjectOutputStream(bos);
- out.writeObject(caCert);
- byte[] data = bos.toByteArray();
- bos.close();
- return Base64.encodeToString(data, Base64.DEFAULT);
- }
-
- @Rpc(description = "Add a network.")
- public Integer wifiAddNetwork(@RpcParameter(name = "wifiConfig") JSONObject wifiConfig)
- throws JSONException {
- return mWifi.addNetwork(genWifiConfig(wifiConfig));
- }
-
- @Rpc(description = "Builds a WifiConfiguration from Hotspot 2.0 MIME file.")
- public WifiConfiguration wifiBuildConfig(
- @RpcParameter(name = "uriString") String uriString,
- @RpcParameter(name = "mimeType") String mimeType,
- String dataString)
- throws JSONException {
- byte[] data = base64StrToBytes(dataString);
- return mWifi.buildWifiConfig(uriString, mimeType, data);
- }
-
- @Rpc(description = "Cancel Wi-fi Protected Setup.")
- public void wifiCancelWps() throws JSONException {
- WifiWpsCallback listener = new WifiWpsCallback();
- mWifi.cancelWps(listener);
- }
-
- @Rpc(description = "Checks Wifi state.", returns = "True if Wifi is enabled.")
- public Boolean wifiCheckState() {
- return mWifi.getWifiState() == WifiManager.WIFI_STATE_ENABLED;
- }
-
- /**
- * Connects to a WPA protected wifi network
- *
- * @param wifiSSID SSID of the wifi network
- * @param wifiPassword password for the wifi network
- * @return true on success
- * @throws ConnectException
- * @throws JSONException
- */
- @Rpc(description = "Connects a wifi network by ssid", returns = "True if the operation succeeded.")
- public Boolean wifiConnect(@RpcParameter(name = "config") JSONObject config)
- throws ConnectException, JSONException {
- WifiConfiguration wifiConfig = genWifiConfig(config);
- int nId = mWifi.addNetwork(wifiConfig);
- if (nId < 0) {
- Log.e("Got negative network Id.");
- return false;
- }
- mWifi.disconnect();
- mWifi.enableNetwork(nId, true);
- return mWifi.reconnect();
- }
-
- @Rpc(description = "Disconnects from the currently active access point.", returns = "True if the operation succeeded.")
- public Boolean wifiDisconnect() {
- return mWifi.disconnect();
- }
-
- @Rpc(description = "Enable/disable autojoin scan and switch network when connected.")
- public Boolean wifiEnableAutoJoinWhenAssociated(@RpcParameter(name = "enable") Boolean enable) {
- return mWifi.enableAutoJoinWhenAssociated(enable);
- }
-
- @Rpc(description = "Enable a configured network. Initiate a connection if disableOthers is true", returns = "True if the operation succeeded.")
- public Boolean wifiEnableNetwork(@RpcParameter(name = "netId") Integer netId,
- @RpcParameter(name = "disableOthers") Boolean disableOthers) {
- return mWifi.enableNetwork(netId, disableOthers);
- }
-
- @Rpc(description = "Enable WiFi verbose logging.")
- public void wifiEnableVerboseLogging(@RpcParameter(name = "level") Integer level) {
- mWifi.enableVerboseLogging(level);
- }
-
- @Rpc(description = "Connect to a wifi network that uses Enterprise authentication methods.")
- public void wifiEnterpriseConnect(@RpcParameter(name = "config") JSONObject config)
- throws JSONException, GeneralSecurityException {
- // Create Certificate
- WifiActionListener listener = new WifiActionListener(mEventFacade, "EnterpriseConnect");
- WifiConfiguration wifiConfig = genWifiEnterpriseConfig(config);
- if (wifiConfig.isPasspoint()) {
- Log.d("Got a passpoint config, add it and save config.");
- mWifi.addNetwork(wifiConfig);
- mWifi.saveConfiguration();
- } else {
- Log.d("Got a non-passpoint enterprise config, connect directly.");
- mWifi.connect(wifiConfig, listener);
- }
- }
-
- @Rpc(description = "Resets all WifiManager settings.")
- public void wifiFactoryReset() {
- mWifi.factoryReset();
- }
-
- /**
- * Forget a wifi network with priority
- *
- * @param networkID Id of wifi network
- */
- @Rpc(description = "Forget a wifi network with priority")
- public void wifiForgetNetwork(@RpcParameter(name = "wifiSSID") Integer newtorkId) {
- WifiActionListener listener = new WifiActionListener(mEventFacade, "ForgetNetwork");
- mWifi.forget(newtorkId, listener);
- }
-
- @Rpc(description = "Gets the Wi-Fi AP Configuration.")
- public WifiConfiguration wifiGetApConfiguration() {
- return mWifi.getWifiApConfiguration();
- }
-
- @Rpc(description = "Returns the file in which IP and proxy configuration data is stored.")
- public String wifiGetConfigFile() {
- return mWifi.getConfigFile();
- }
-
- @Rpc(description = "Return a list of all the configured wifi networks.")
- public List<WifiConfiguration> wifiGetConfiguredNetworks() {
- return mWifi.getConfiguredNetworks();
- }
-
- @Rpc(description = "Returns information about the currently active access point.")
- public WifiInfo wifiGetConnectionInfo() {
- return mWifi.getConnectionInfo();
- }
-
- @Rpc(description = "Returns wifi activity and energy usage info.")
- public WifiActivityEnergyInfo wifiGetControllerActivityEnergyInfo() {
- return mWifi.getControllerActivityEnergyInfo(0);
- }
-
- @Rpc(description = "Get the country code used by WiFi.")
- public String wifiGetCountryCode() {
- return mWifi.getCountryCode();
- }
-
- @Rpc(description = "Get the current network.")
- public Network wifiGetCurrentNetwork() {
- return mWifi.getCurrentNetwork();
- }
-
- @Rpc(description = "Get the info from last successful DHCP request.")
- public DhcpInfo wifiGetDhcpInfo() {
- return mWifi.getDhcpInfo();
- }
-
- @Rpc(description = "Get setting for Framework layer autojoin enable status.")
- public Boolean wifiGetEnableAutoJoinWhenAssociated() {
- return mWifi.getEnableAutoJoinWhenAssociated();
- }
-
- @Rpc(description = "Returns 1 if autojoin offload thru Wifi HAL layer is enabled, 0 otherwise.")
- public Integer wifiGetHalBasedAutojoinOffload() {
- return mWifi.getHalBasedAutojoinOffload();
- }
-
- @Rpc(description = "Get privileged configured networks.")
- public List<WifiConfiguration> wifiGetPrivilegedConfiguredNetworks() {
- return mWifi.getPrivilegedConfiguredNetworks();
- }
-
- @Rpc(description = "Returns the list of access points found during the most recent Wifi scan.")
- public List<ScanResult> wifiGetScanResults() {
- return mWifi.getScanResults();
- }
-
- @Rpc(description = "Get the current level of WiFi verbose logging.")
- public Integer wifiGetVerboseLoggingLevel() {
- return mWifi.getVerboseLoggingLevel();
- }
-
- @Rpc(description = "true if this adapter supports 5 GHz band.")
- public Boolean wifiIs5GHzBandSupported() {
- return mWifi.is5GHzBandSupported();
- }
-
- @Rpc(description = "true if this adapter supports multiple simultaneous connections.")
- public Boolean wifiIsAdditionalStaSupported() {
- return mWifi.isAdditionalStaSupported();
- }
-
- @Rpc(description = "Return whether Wi-Fi AP is enabled or disabled.")
- public Boolean wifiIsApEnabled() {
- return mWifi.isWifiApEnabled();
- }
-
- @Rpc(description = "Check if Device-to-AP RTT is supported.")
- public Boolean wifiIsDeviceToApRttSupported() {
- return mWifi.isDeviceToApRttSupported();
- }
-
- @Rpc(description = "Check if Device-to-device RTT is supported.")
- public Boolean wifiIsDeviceToDeviceRttSupported() {
- return mWifi.isDeviceToDeviceRttSupported();
- }
-
- @Rpc(description = "Check if the chipset supports dual frequency band (2.4 GHz and 5 GHz).")
- public Boolean wifiIsDualBandSupported() {
- return mWifi.isDualBandSupported();
- }
-
- @Rpc(description = "Check if this adapter supports advanced power/performance counters.")
- public Boolean wifiIsEnhancedPowerReportingSupported() {
- return mWifi.isEnhancedPowerReportingSupported();
- }
-
- @Rpc(description = "Check if multicast is enabled.")
- public Boolean wifiIsMulticastEnabled() {
- return mWifi.isMulticastEnabled();
- }
-
- @Rpc(description = "true if this adapter supports Neighbour Awareness Network APIs.")
- public Boolean wifiIsNanSupported() {
- return mWifi.isNanSupported();
- }
-
- @Rpc(description = "true if this adapter supports Off Channel Tunnel Directed Link Setup.")
- public Boolean wifiIsOffChannelTdlsSupported() {
- return mWifi.isOffChannelTdlsSupported();
- }
-
- @Rpc(description = "true if this adapter supports WifiP2pManager (Wi-Fi Direct).")
- public Boolean wifiIsP2pSupported() {
- return mWifi.isP2pSupported();
- }
-
- @Rpc(description = "true if this adapter supports passpoint.")
- public Boolean wifiIsPasspointSupported() {
- return mWifi.isPasspointSupported();
- }
-
- @Rpc(description = "true if this adapter supports portable Wi-Fi hotspot.")
- public Boolean wifiIsPortableHotspotSupported() {
- return mWifi.isPortableHotspotSupported();
- }
-
- @Rpc(description = "true if this adapter supports offloaded connectivity scan.")
- public Boolean wifiIsPreferredNetworkOffloadSupported() {
- return mWifi.isPreferredNetworkOffloadSupported();
- }
-
- @Rpc(description = "Check if wifi scanner is supported on this device.")
- public Boolean wifiIsScannerSupported() {
- return mWifi.isWifiScannerSupported();
- }
-
- @Rpc(description = "Check if tdls is supported on this device.")
- public Boolean wifiIsTdlsSupported() {
- return mWifi.isTdlsSupported();
- }
-
- @Rpc(description = "Acquires a full Wifi lock.")
- public void wifiLockAcquireFull() {
- makeLock(WifiManager.WIFI_MODE_FULL);
- }
-
- @Rpc(description = "Acquires a scan only Wifi lock.")
- public void wifiLockAcquireScanOnly() {
- makeLock(WifiManager.WIFI_MODE_SCAN_ONLY);
- }
-
- @Rpc(description = "Releases a previously acquired Wifi lock.")
- public void wifiLockRelease() {
- if (mLock != null) {
- mLock.release();
- mLock = null;
- }
- }
-
- /**
- * Connects to a wifi network with priority
- *
- * @param wifiSSID SSID of the wifi network
- * @param wifiPassword password for the wifi network
- * @throws JSONException
- */
- @Rpc(description = "Connects a wifi network as priority by pasing ssid")
- public void wifiPriorityConnect(@RpcParameter(name = "config") JSONObject config)
- throws JSONException {
- WifiConfiguration wifiConfig = genWifiConfig(config);
- WifiActionListener listener = new WifiActionListener(mEventFacade, "PriorityConnect");
- mWifi.connect(wifiConfig, listener);
- }
-
- @Rpc(description = "Reassociates with the currently active access point.", returns = "True if the operation succeeded.")
- public Boolean wifiReassociate() {
- return mWifi.reassociate();
- }
-
- @Rpc(description = "Reconnects to the currently active access point.", returns = "True if the operation succeeded.")
- public Boolean wifiReconnect() {
- return mWifi.reconnect();
- }
-
- @Rpc(description = "Remove a configured network.", returns = "True if the operation succeeded.")
- public Boolean wifiRemoveNetwork(@RpcParameter(name = "netId") Integer netId) {
- return mWifi.removeNetwork(netId);
- }
-
- @Rpc(description = "Start/stop wifi soft AP.")
- public Boolean wifiSetApEnabled(
- @RpcParameter(name = "enable") Boolean enable,
- @RpcParameter(name = "configJson") JSONObject configJson) throws JSONException {
- int wifiState = mWifi.getWifiState();
- if (enable) {
- if ((wifiState == WifiManager.WIFI_STATE_ENABLING) ||
- (wifiState == WifiManager.WIFI_STATE_ENABLED)) {
- mWifi.setWifiEnabled(false);
- }
- WifiConfiguration config = genWifiConfig(configJson);
- // Need to strip of extra quotation marks for SSID and password.
- String ssid = config.SSID;
- if (ssid != null) {
- config.SSID = ssid.substring(1, ssid.length() - 1);
- }
- String pwd = config.preSharedKey;
- if (pwd != null) {
- config.preSharedKey = pwd.substring(1, pwd.length() - 1);
- }
- return mWifi.setWifiApEnabled(config, enable);
- } else {
- return mWifi.setWifiApEnabled(null, false);
- }
- }
-
- @Rpc(description = "Set the country code used by WiFi.")
- public void wifiSetCountryCode(
- @RpcParameter(name = "country") String country,
- @RpcParameter(name = "persist") Boolean persist) {
- mWifi.setCountryCode(country, persist);
- }
-
- @Rpc(description = "Enable/disable autojoin offload through Wifi HAL layer.")
- public void wifiSetHalBasedAutojoinOffload(
- @RpcParameter(name = "enable") Integer enable) {
- mWifi.setHalBasedAutojoinOffload(enable);
- }
-
- @Rpc(description = "Enable/disable tdls with a mac address.")
- public void wifiSetTdlsEnabledWithMacAddress(
- @RpcParameter(name = "remoteMacAddress") String remoteMacAddress,
- @RpcParameter(name = "enable") Boolean enable) {
- mWifi.setTdlsEnabledWithMacAddress(remoteMacAddress, enable);
- }
-
- @Rpc(description = "Starts a scan for Wifi access points.", returns = "True if the scan was initiated successfully.")
- public Boolean wifiStartScan() {
- mService.registerReceiver(mScanResultsAvailableReceiver, mScanFilter);
- return mWifi.startScan();
- }
-
- @Rpc(description = "Start Wi-fi Protected Setup.")
- public void wifiStartWps(
- @RpcParameter(name = "config", description = "A json string with fields \"setup\", \"BSSID\", and \"pin\"") String config)
- throws JSONException {
- WpsInfo info = parseWpsInfo(config);
- WifiWpsCallback listener = new WifiWpsCallback();
- Log.d("Starting wps with: " + info);
- mWifi.startWps(info, listener);
- }
-
- @Rpc(description = "Start listening for wifi state change related broadcasts.")
- public void wifiStartTrackingStateChange() {
- mService.registerReceiver(mStateChangeReceiver, mStateChangeFilter);
- mService.registerReceiver(mTetherStateReceiver, mTetherFilter);
- mTrackingWifiStateChange = true;
- }
-
- @Rpc(description = "Stop listening for wifi state change related broadcasts.")
- public void wifiStopTrackingStateChange() {
- if (mTrackingWifiStateChange == true) {
- mService.unregisterReceiver(mTetherStateReceiver);
- mService.unregisterReceiver(mStateChangeReceiver);
- mTrackingWifiStateChange = false;
- }
- }
-
- @Rpc(description = "Toggle Wifi on and off.", returns = "True if Wifi is enabled.")
- public Boolean wifiToggleState(@RpcParameter(name = "enabled") @RpcOptional Boolean enabled) {
- if (enabled == null) {
- enabled = !wifiCheckState();
- }
- mWifi.setWifiEnabled(enabled);
- return enabled;
- }
-
- @Rpc(description = "Toggle Wifi scan always available on and off.", returns = "True if Wifi scan is always available.")
- public Boolean wifiToggleScanAlwaysAvailable(
- @RpcParameter(name = "enabled") @RpcOptional Boolean enabled)
- throws SettingNotFoundException {
- ContentResolver cr = mService.getContentResolver();
- int isSet = 0;
- if (enabled == null) {
- isSet = Global.getInt(cr, Global.WIFI_SCAN_ALWAYS_AVAILABLE);
- isSet ^= 1;
- } else if (enabled == true) {
- isSet = 1;
- }
- Global.putInt(cr, Global.WIFI_SCAN_ALWAYS_AVAILABLE, isSet);
- if (isSet == 1) {
- return true;
- }
- return false;
- }
-
- @Override
- public void shutdown() {
- wifiLockRelease();
- if (mTrackingWifiStateChange == true) {
- wifiStopTrackingStateChange();
- }
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiNanManagerFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiNanManagerFacade.java
deleted file mode 100644
index 5863e8d..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiNanManagerFacade.java
+++ /dev/null
@@ -1,403 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.googlecode.android_scripting.facade.wifi;
-
-import android.app.Service;
-import android.content.Context;
-import android.net.ConnectivityManager;
-import android.net.wifi.nan.ConfigRequest;
-import android.net.wifi.nan.PublishData;
-import android.net.wifi.nan.PublishSettings;
-import android.net.wifi.nan.SubscribeData;
-import android.net.wifi.nan.SubscribeSettings;
-import android.net.wifi.nan.TlvBufferUtils;
-import android.net.wifi.nan.WifiNanEventListener;
-import android.net.wifi.nan.WifiNanManager;
-import android.net.wifi.nan.WifiNanSession;
-import android.net.wifi.nan.WifiNanSessionListener;
-import android.os.Bundle;
-import android.os.HandlerThread;
-import android.os.Looper;
-import android.os.RemoteException;
-
-import com.googlecode.android_scripting.facade.EventFacade;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-/**
- * WifiNanManager functions.
- */
-public class WifiNanManagerFacade extends RpcReceiver {
- private final Service mService;
- private final EventFacade mEventFacade;
-
- private WifiNanManager mMgr;
- private WifiNanSession mSession;
- private HandlerThread mNanFacadeThread;
- private ConnectivityManager mConnMgr;
-
- private static TlvBufferUtils.TlvConstructor getFilterData(JSONObject j) throws JSONException {
- if (j == null) {
- return null;
- }
-
- TlvBufferUtils.TlvConstructor constructor = new TlvBufferUtils.TlvConstructor(0, 1);
- constructor.allocate(255);
-
- if (j.has("int0")) {
- constructor.putShort(0, (short) j.getInt("int0"));
- }
-
- if (j.has("int1")) {
- constructor.putShort(0, (short) j.getInt("int1"));
- }
-
- if (j.has("data0")) {
- constructor.putString(0, j.getString("data0"));
- }
-
- if (j.has("data1")) {
- constructor.putString(0, j.getString("data1"));
- }
-
- return constructor;
- }
-
- private static ConfigRequest getConfigRequest(JSONObject j) throws JSONException {
- if (j == null) {
- return null;
- }
-
- ConfigRequest.Builder builder = new ConfigRequest.Builder();
-
- if (j.has("Support5gBand")) {
- builder.setSupport5gBand(j.getBoolean("Support5gBand"));
- }
- if (j.has("MasterPreference")) {
- builder.setMasterPreference(j.getInt("MasterPreference"));
- }
- if (j.has("ClusterLow")) {
- builder.setClusterLow(j.getInt("ClusterLow"));
- }
- if (j.has("ClusterHigh")) {
- builder.setClusterHigh(j.getInt("ClusterHigh"));
- }
-
- return builder.build();
- }
-
- private static PublishData getPublishData(JSONObject j) throws JSONException {
- if (j == null) {
- return null;
- }
-
- PublishData.Builder builder = new PublishData.Builder();
-
- if (j.has("ServiceName")) {
- builder.setServiceName(j.getString("ServiceName"));
- }
-
- if (j.has("ServiceSpecificInfo")) {
- String ssi = j.getString("ServiceSpecificInfo");
- builder.setServiceSpecificInfo(ssi.getBytes(), ssi.length());
- }
-
- if (j.has("TxFilter")) {
- TlvBufferUtils.TlvConstructor constructor = getFilterData(j.getJSONObject("TxFilter"));
- builder.setTxFilter(constructor.getArray(), constructor.getActualLength());
- }
-
- if (j.has("RxFilter")) {
- TlvBufferUtils.TlvConstructor constructor = getFilterData(j.getJSONObject("RxFilter"));
- builder.setRxFilter(constructor.getArray(), constructor.getActualLength());
- }
-
- return builder.build();
- }
-
- private static PublishSettings getPublishSettings(JSONObject j) throws JSONException {
- if (j == null) {
- return null;
- }
-
- PublishSettings.Builder builder = new PublishSettings.Builder();
-
- if (j.has("PublishType")) {
- builder.setPublishType(j.getInt("PublishType"));
- }
- if (j.has("PublishCount")) {
- builder.setPublishCount(j.getInt("PublishCount"));
- }
- if (j.has("TtlSec")) {
- builder.setTtlSec(j.getInt("TtlSec"));
- }
-
- return builder.build();
- }
-
- private static SubscribeData getSubscribeData(JSONObject j) throws JSONException {
- if (j == null) {
- return null;
- }
-
- SubscribeData.Builder builder = new SubscribeData.Builder();
-
- if (j.has("ServiceName")) {
- builder.setServiceName(j.getString("ServiceName"));
- }
-
- if (j.has("ServiceSpecificInfo")) {
- String ssi = j.getString("ServiceSpecificInfo");
- builder.setServiceSpecificInfo(ssi);
- }
-
- if (j.has("TxFilter")) {
- TlvBufferUtils.TlvConstructor constructor = getFilterData(j.getJSONObject("TxFilter"));
- builder.setTxFilter(constructor.getArray(), constructor.getActualLength());
- }
-
- if (j.has("RxFilter")) {
- TlvBufferUtils.TlvConstructor constructor = getFilterData(j.getJSONObject("RxFilter"));
- builder.setRxFilter(constructor.getArray(), constructor.getActualLength());
- }
-
- return builder.build();
- }
-
- private static SubscribeSettings getSubscribeSettings(JSONObject j) throws JSONException {
- if (j == null) {
- return null;
- }
-
- SubscribeSettings.Builder builder = new SubscribeSettings.Builder();
-
- if (j.has("SubscribeType")) {
- builder.setSubscribeType(j.getInt("SubscribeType"));
- }
- if (j.has("SubscribeCount")) {
- builder.setSubscribeCount(j.getInt("SubscribeCount"));
- }
- if (j.has("TtlSec")) {
- builder.setTtlSec(j.getInt("TtlSec"));
- }
-
- return builder.build();
- }
-
- public WifiNanManagerFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
-
- mNanFacadeThread = new HandlerThread("nanFacadeThread");
- mNanFacadeThread.start();
-
- mMgr = (WifiNanManager) mService.getSystemService(Context.WIFI_NAN_SERVICE);
- mMgr.connect(new NanEventListenerPostsEvents(mNanFacadeThread.getLooper()),
- WifiNanEventListener.LISTEN_CONFIG_COMPLETED
- | WifiNanEventListener.LISTEN_CONFIG_FAILED
- | WifiNanEventListener.LISTEN_NAN_DOWN
- | WifiNanEventListener.LISTEN_IDENTITY_CHANGED);
-
- mConnMgr = (ConnectivityManager) mService.getSystemService(Context.CONNECTIVITY_SERVICE);
-
- mEventFacade = manager.getReceiver(EventFacade.class);
- }
-
- @Override
- public void shutdown() {
- }
-
- @Rpc(description = "Start NAN.")
- public void wifiNanEnable(@RpcParameter(name = "nanConfig") JSONObject nanConfig)
- throws RemoteException, JSONException {
- mMgr.requestConfig(getConfigRequest(nanConfig));
- }
-
- @Rpc(description = "Stop NAN.")
- public void wifiNanDisable() throws RemoteException, JSONException {
- mMgr.disconnect();
- }
-
- @Rpc(description = "Publish.")
- public void wifiNanPublish(@RpcParameter(name = "publishData") JSONObject publishData,
- @RpcParameter(name = "publishSettings") JSONObject publishSettings,
- @RpcParameter(name = "listenerId") Integer listenerId)
- throws RemoteException, JSONException {
- mSession = mMgr.publish(getPublishData(publishData), getPublishSettings(publishSettings),
- new NanSessionListenerPostsEvents(mNanFacadeThread.getLooper(), listenerId),
- WifiNanSessionListener.LISTEN_PUBLISH_FAIL
- | WifiNanSessionListener.LISTEN_PUBLISH_TERMINATED
- | WifiNanSessionListener.LISTEN_SUBSCRIBE_FAIL
- | WifiNanSessionListener.LISTEN_SUBSCRIBE_TERMINATED
- | WifiNanSessionListener.LISTEN_MATCH
- | WifiNanSessionListener.LISTEN_MESSAGE_SEND_SUCCESS
- | WifiNanSessionListener.LISTEN_MESSAGE_SEND_FAIL
- | WifiNanSessionListener.LISTEN_MESSAGE_RECEIVED);
- }
-
- @Rpc(description = "Subscribe.")
- public void wifiNanSubscribe(@RpcParameter(name = "subscribeData") JSONObject subscribeData,
- @RpcParameter(name = "subscribeSettings") JSONObject subscribeSettings,
- @RpcParameter(name = "listenerId") Integer listenerId)
- throws RemoteException, JSONException {
-
- mSession = mMgr.subscribe(getSubscribeData(subscribeData),
- getSubscribeSettings(subscribeSettings),
- new NanSessionListenerPostsEvents(mNanFacadeThread.getLooper(), listenerId),
- WifiNanSessionListener.LISTEN_PUBLISH_FAIL
- | WifiNanSessionListener.LISTEN_PUBLISH_TERMINATED
- | WifiNanSessionListener.LISTEN_SUBSCRIBE_FAIL
- | WifiNanSessionListener.LISTEN_SUBSCRIBE_TERMINATED
- | WifiNanSessionListener.LISTEN_MATCH
- | WifiNanSessionListener.LISTEN_MESSAGE_SEND_SUCCESS
- | WifiNanSessionListener.LISTEN_MESSAGE_SEND_FAIL
- | WifiNanSessionListener.LISTEN_MESSAGE_RECEIVED);
- }
-
- @Rpc(description = "Send peer-to-peer NAN message")
- public void wifiNanSendMessage(
- @RpcParameter(name = "peerId", description = "The ID of the peer being communicated "
- + "with. Obtained from a previous message or match session.") Integer peerId,
- @RpcParameter(name = "message") String message,
- @RpcParameter(name = "messageId", description = "Arbitrary handle used for "
- + "identification of the message in the message status callbacks")
- Integer messageId)
- throws RemoteException {
- mSession.sendMessage(peerId, message.getBytes(), message.length(), messageId);
- }
-
- private class NanEventListenerPostsEvents extends WifiNanEventListener {
- public NanEventListenerPostsEvents(Looper looper) {
- super(looper);
- }
-
- @Override
- public void onConfigCompleted(ConfigRequest configRequest) {
- Bundle mResults = new Bundle();
- mResults.putParcelable("configRequest", configRequest);
- mEventFacade.postEvent("WifiNanOnConfigCompleted", mResults);
- }
-
- @Override
- public void onConfigFailed(ConfigRequest failedConfig, int reason) {
- Bundle mResults = new Bundle();
- mResults.putParcelable("failedConfig", failedConfig);
- mResults.putInt("reason", reason);
- mEventFacade.postEvent("WifiNanOnConfigFailed", mResults);
- }
-
- @Override
- public void onNanDown(int reason) {
- Bundle mResults = new Bundle();
- mResults.putInt("reason", reason);
- mEventFacade.postEvent("WifiNanOnNanDown", mResults);
- }
-
- @Override
- public void onIdentityChanged() {
- Bundle mResults = new Bundle();
- mEventFacade.postEvent("WifiNanOnIdentityChanged", mResults);
- }
- }
-
- private class NanSessionListenerPostsEvents extends WifiNanSessionListener {
- private int mListenerId;
-
- public NanSessionListenerPostsEvents(Looper looper, int listenerId) {
- super(looper);
- mListenerId = listenerId;
- }
-
- @Override
- public void onPublishFail(int reason) {
- Bundle mResults = new Bundle();
- mResults.putInt("listenerId", mListenerId);
- mResults.putInt("reason", reason);
- mEventFacade.postEvent("WifiNanSessionOnPublishFail", mResults);
- }
-
- @Override
- public void onPublishTerminated(int reason) {
- Bundle mResults = new Bundle();
- mResults.putInt("listenerId", mListenerId);
- mResults.putInt("reason", reason);
- mEventFacade.postEvent("WifiNanSessionOnPublishTerminated", mResults);
- }
-
- @Override
- public void onSubscribeFail(int reason) {
- Bundle mResults = new Bundle();
- mResults.putInt("listenerId", mListenerId);
- mResults.putInt("reason", reason);
- mEventFacade.postEvent("WifiNanSessionOnSubscribeFail", mResults);
- }
-
- @Override
- public void onSubscribeTerminated(int reason) {
- Bundle mResults = new Bundle();
- mResults.putInt("listenerId", mListenerId);
- mResults.putInt("reason", reason);
- mEventFacade.postEvent("WifiNanSessionOnSubscribeTerminated", mResults);
- }
-
- @Override
- public void onMatch(int peerId, byte[] serviceSpecificInfo,
- int serviceSpecificInfoLength, byte[] matchFilter, int matchFilterLength) {
- Bundle mResults = new Bundle();
- mResults.putInt("listenerId", mListenerId);
- mResults.putInt("peerId", peerId);
- mResults.putInt("serviceSpecificInfoLength", serviceSpecificInfoLength);
- mResults.putByteArray("serviceSpecificInfo", serviceSpecificInfo); // TODO: base64
- mResults.putInt("matchFilterLength", matchFilterLength);
- mResults.putByteArray("matchFilter", matchFilter); // TODO: base64
- mEventFacade.postEvent("WifiNanSessionOnMatch", mResults);
- }
-
- @Override
- public void onMessageSendSuccess(int messageId) {
- Bundle mResults = new Bundle();
- mResults.putInt("listenerId", mListenerId);
- mResults.putInt("messageId", messageId);
- mEventFacade.postEvent("WifiNanSessionOnMessageSendSuccess", mResults);
- }
-
- @Override
- public void onMessageSendFail(int messageId, int reason) {
- Bundle mResults = new Bundle();
- mResults.putInt("listenerId", mListenerId);
- mResults.putInt("messageId", messageId);
- mResults.putInt("reason", reason);
- mEventFacade.postEvent("WifiNanSessionOnMessageSendFail", mResults);
- }
-
- @Override
- public void onMessageReceived(int peerId, byte[] message, int messageLength) {
- Bundle mResults = new Bundle();
- mResults.putInt("listenerId", mListenerId);
- mResults.putInt("peerId", peerId);
- mResults.putInt("messageLength", messageLength);
- mResults.putByteArray("message", message); // TODO: base64
- mResults.putString("messageAsString", new String(message, 0, messageLength));
- mEventFacade.postEvent("WifiNanSessionOnMessageReceived", mResults);
- }
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiP2pManagerFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiP2pManagerFacade.java
deleted file mode 100644
index d0514b9..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiP2pManagerFacade.java
+++ /dev/null
@@ -1,506 +0,0 @@
-
-package com.googlecode.android_scripting.facade.wifi;
-
-import android.app.Service;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.NetworkInfo;
-import android.net.wifi.WpsInfo;
-import android.net.wifi.p2p.WifiP2pConfig;
-import android.net.wifi.p2p.WifiP2pDevice;
-import android.net.wifi.p2p.WifiP2pDeviceList;
-import android.net.wifi.p2p.WifiP2pGroup;
-import android.net.wifi.p2p.WifiP2pGroupList;
-import android.net.wifi.p2p.WifiP2pInfo;
-import android.net.wifi.p2p.WifiP2pManager;
-import android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceInfo;
-import android.net.wifi.p2p.nsd.WifiP2pServiceInfo;
-import android.net.wifi.p2p.nsd.WifiP2pServiceRequest;
-import android.net.wifi.p2p.nsd.WifiP2pUpnpServiceInfo;
-import android.os.Bundle;
-import android.os.Message;
-import android.os.Messenger;
-import android.os.RemoteException;
-
-import com.android.internal.util.Protocol;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.facade.EventFacade;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-import java.net.InetAddress;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-/**
- * WifiP2pManager functions.
- */
-public class WifiP2pManagerFacade extends RpcReceiver {
-
- class WifiP2pActionListener implements WifiP2pManager.ActionListener {
- private final EventFacade mEventFacade;
- private final String mEventType;
- private final String TAG;
-
- public WifiP2pActionListener(EventFacade eventFacade, String tag) {
- mEventType = "WifiP2p";
- mEventFacade = eventFacade;
- TAG = tag;
- }
-
- @Override
- public void onSuccess() {
- mEventFacade.postEvent(mEventType + TAG + "OnSuccess", null);
- }
-
- @Override
- public void onFailure(int reason) {
- Log.d("WifiActionListener " + mEventType);
- Bundle msg = new Bundle();
- if (reason == WifiP2pManager.P2P_UNSUPPORTED) {
- msg.putString("reason", "P2P_UNSUPPORTED");
- } else if (reason == WifiP2pManager.ERROR) {
- msg.putString("reason", "ERROR");
- } else if (reason == WifiP2pManager.BUSY) {
- msg.putString("reason", "BUSY");
- } else if (reason == WifiP2pManager.NO_SERVICE_REQUESTS) {
- msg.putString("reason", "NO_SERVICE_REQUESTS");
- } else {
- msg.putInt("reason", reason);
- }
- mEventFacade.postEvent(mEventType + TAG + "OnFailure", msg);
- }
- }
-
- class WifiP2pConnectionInfoListener implements WifiP2pManager.ConnectionInfoListener {
- private final EventFacade mEventFacade;
- private final String mEventType;
-
- public WifiP2pConnectionInfoListener(EventFacade eventFacade) {
- mEventType = "WifiP2p";
- mEventFacade = eventFacade;
- }
-
- @Override
- public void onConnectionInfoAvailable(WifiP2pInfo info) {
- Bundle msg = new Bundle();
- msg.putBoolean("groupFormed", info.groupFormed);
- msg.putBoolean("isGroupOwner", info.isGroupOwner);
- InetAddress addr = info.groupOwnerAddress;
- String hostName = null;
- String hostAddress = null;
- if (addr != null) {
- hostName = addr.getHostName();
- hostAddress = addr.getHostAddress();
- }
- msg.putString("groupOwnerHostName", hostName);
- msg.putString("groupOwnerHostAddress", hostAddress);
- mEventFacade.postEvent(mEventType + "OnConnectionInfoAvailable", msg);
- }
- }
-
- class WifiP2pDnsSdServiceResponseListener implements
- WifiP2pManager.DnsSdServiceResponseListener {
- private final EventFacade mEventFacade;
- private final String mEventType;
-
- public WifiP2pDnsSdServiceResponseListener(EventFacade eventFacade) {
- mEventType = "WifiP2p";
- mEventFacade = eventFacade;
- }
-
- @Override
- public void onDnsSdServiceAvailable(String instanceName, String registrationType,
- WifiP2pDevice srcDevice) {
- Bundle msg = new Bundle();
- msg.putString("InstanceName", instanceName);
- msg.putString("RegistrationType", registrationType);
- msg.putString("SourceDeviceName", srcDevice.deviceName);
- msg.putString("SourceDeviceAddress", srcDevice.deviceAddress);
- mEventFacade.postEvent(mEventType + "OnDnsSdServiceAvailable", msg);
- }
- }
-
- class WifiP2pDnsSdTxtRecordListener implements WifiP2pManager.DnsSdTxtRecordListener {
- private final EventFacade mEventFacade;
- private final String mEventType;
-
- public WifiP2pDnsSdTxtRecordListener(EventFacade eventFacade) {
- mEventType = "WifiP2p";
- mEventFacade = eventFacade;
- }
-
- @Override
- public void onDnsSdTxtRecordAvailable(String fullDomainName,
- Map<String, String> txtRecordMap, WifiP2pDevice srcDevice) {
- Bundle msg = new Bundle();
- msg.putString("FullDomainName", fullDomainName);
- Bundle txtMap = new Bundle();
- for (String key : txtRecordMap.keySet()) {
- txtMap.putString(key, txtRecordMap.get(key));
- }
- msg.putBundle("TxtRecordMap", txtMap);
- msg.putString("SourceDeviceName", srcDevice.deviceName);
- msg.putString("SourceDeviceAddress", srcDevice.deviceAddress);
- mEventFacade.postEvent(mEventType + "OnDnsSdTxtRecordAvailable", msg);
- }
-
- }
-
- class WifiP2pGroupInfoListener implements WifiP2pManager.GroupInfoListener {
- private final EventFacade mEventFacade;
- private final String mEventType;
-
- public WifiP2pGroupInfoListener(EventFacade eventFacade) {
- mEventType = "WifiP2p";
- mEventFacade = eventFacade;
- }
-
- @Override
- public void onGroupInfoAvailable(WifiP2pGroup group) {
- mEventFacade.postEvent(mEventType + "OnGroupInfoAvailable", parseGroupInfo(group));
- }
- }
-
- class WifiP2pPeerListListener implements WifiP2pManager.PeerListListener {
- private final EventFacade mEventFacade;
-
- public WifiP2pPeerListListener(EventFacade eventFacade) {
- mEventFacade = eventFacade;
- }
-
- @Override
- public void onPeersAvailable(WifiP2pDeviceList newPeers) {
- Collection<WifiP2pDevice> devices = newPeers.getDeviceList();
- Log.d(devices.toString());
- if (devices.size() > 0) {
- mP2pPeers.clear();
- mP2pPeers.addAll(devices);
- Bundle msg = new Bundle();
- msg.putParcelableList("Peers", mP2pPeers);
- mEventFacade.postEvent(mEventType + "OnPeersAvailable", msg);
- }
- }
- }
-
- class WifiP2pPersistentGroupInfoListener implements WifiP2pManager.PersistentGroupInfoListener {
- private final EventFacade mEventFacade;
- private final String mEventType;
-
- public WifiP2pPersistentGroupInfoListener(EventFacade eventFacade) {
- mEventType = "WifiP2p";
- mEventFacade = eventFacade;
- }
-
- @Override
- public void onPersistentGroupInfoAvailable(WifiP2pGroupList groups) {
- ArrayList<Bundle> gs = new ArrayList<Bundle>();
- for (WifiP2pGroup g : groups.getGroupList()) {
- gs.add(parseGroupInfo(g));
- }
- mEventFacade.postEvent(mEventType + "OnPersistentGroupInfoAvailable", gs);
- }
-
- }
-
- class WifiP2pStateChangedReceiver extends BroadcastReceiver {
- private final EventFacade mEventFacade;
- private final Bundle mResults;
-
- WifiP2pStateChangedReceiver(EventFacade eventFacade) {
- mEventFacade = eventFacade;
- mResults = new Bundle();
- }
-
- @Override
- public void onReceive(Context c, Intent intent) {
- String action = intent.getAction();
- if (action.equals(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION)) {
- Log.d("Wifi P2p State Changed.");
- int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, 0);
- if (state == WifiP2pManager.WIFI_P2P_STATE_DISABLED) {
- Log.d("Disabled");
- isP2pEnabled = false;
- } else if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {
- Log.d("Enabled");
- isP2pEnabled = true;
- }
- } else if (action.equals(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION)) {
- Log.d("Wifi P2p Peers Changed. Requesting peers.");
- WifiP2pDeviceList peers = intent
- .getParcelableExtra(WifiP2pManager.EXTRA_P2P_DEVICE_LIST);
- Log.d(peers.toString());
- wifiP2pRequestPeers();
- } else if (action.equals(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION)) {
- Log.d("Wifi P2p Connection Changed.");
- WifiP2pInfo p2pInfo = intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_INFO);
- NetworkInfo networkInfo = intent
- .getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);
- WifiP2pGroup group = intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_GROUP);
- if (networkInfo.isConnected()) {
- Log.d("Wifi P2p Connected.");
- mResults.putParcelable("P2pInfo", p2pInfo);
- mResults.putParcelable("Group", group);
- mEventFacade.postEvent(mEventType + "Connected", mResults);
- mResults.clear();
- } else {
- mEventFacade.postEvent(mEventType + "Disconnected", null);
- }
- } else if (action.equals(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION)) {
- Log.d("Wifi P2p This Device Changed.");
- WifiP2pDevice device = intent
- .getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_DEVICE);
- mResults.putParcelable("Device", device);
- mEventFacade.postEvent(mEventType + "ThisDeviceChanged", mResults);
- mResults.clear();
- } else if (action.equals(WifiP2pManager.WIFI_P2P_DISCOVERY_CHANGED_ACTION)) {
- Log.d("Wifi P2p Discovery Changed.");
- int state = intent.getIntExtra(WifiP2pManager.EXTRA_DISCOVERY_STATE, 0);
- if (state == WifiP2pManager.WIFI_P2P_DISCOVERY_STARTED) {
- Log.d("discovery started.");
- } else if (state == WifiP2pManager.WIFI_P2P_DISCOVERY_STOPPED) {
- Log.d("discovery stoped.");
- }
- }
- }
- }
-
- private final static String mEventType = "WifiP2p";
-
- private WifiP2pManager.Channel mChannel;
- private final EventFacade mEventFacade;
- private final WifiP2pManager mP2p;
- private final WifiP2pStateChangedReceiver mP2pStateChangedReceiver;
- private final Service mService;
- private final IntentFilter mStateChangeFilter;
- private final Map<Integer, WifiP2pServiceRequest> mServiceRequests;
-
- private boolean isP2pEnabled;
- private int mServiceRequestCnt = 0;
- private WifiP2pServiceInfo mServiceInfo = null;
- private List<WifiP2pDevice> mP2pPeers = new ArrayList<WifiP2pDevice>();
-
- public WifiP2pManagerFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mP2p = (WifiP2pManager) mService.getSystemService(Context.WIFI_P2P_SERVICE);
- mEventFacade = manager.getReceiver(EventFacade.class);
-
- mStateChangeFilter = new IntentFilter(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
- mStateChangeFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
- mStateChangeFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
- mStateChangeFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
- mStateChangeFilter.setPriority(999);
-
- mP2pStateChangedReceiver = new WifiP2pStateChangedReceiver(mEventFacade);
- mServiceRequests = new HashMap<Integer, WifiP2pServiceRequest>();
- }
-
- public Bundle parseGroupInfo(WifiP2pGroup group) {
- Bundle msg = new Bundle();
- msg.putString("Interface", group.getInterface());
- msg.putString("NetworkName", group.getNetworkName());
- msg.putString("Passphrase", group.getPassphrase());
- msg.putInt("NetworkId", group.getNetworkId());
- msg.putString("OwnerName", group.getOwner().deviceName);
- msg.putString("OwnerAddress", group.getOwner().deviceAddress);
- return msg;
- }
-
- @Override
- public void shutdown() {
- mService.unregisterReceiver(mP2pStateChangedReceiver);
- }
-
- @Rpc(description = "Accept p2p connection invitation.")
- public void wifiP2pAcceptConnection() throws RemoteException {
- Log.d("Accepting p2p connection.");
- Messenger m = mP2p.getP2pStateMachineMessenger();
- int user_accept = Protocol.BASE_WIFI_P2P_SERVICE + 2;
- Message msg = Message.obtain();
- msg.what = user_accept;
- m.send(msg);
- }
-
- @Rpc(description = "Reject p2p connection invitation.")
- public void wifiP2pRejectConnection() throws RemoteException {
- Log.d("Rejecting p2p connection.");
- Messenger m = mP2p.getP2pStateMachineMessenger();
- int user_accept = Protocol.BASE_WIFI_P2P_SERVICE + 3;
- Message msg = Message.obtain();
- msg.what = user_accept;
- m.send(msg);
- }
-
- @Rpc(description = "Register a local service for service discovery. One of the \"CreateXxxServiceInfo functions needs to be called first.\"")
- public void wifiP2pAddLocalService() {
- mP2p.addLocalService(mChannel, mServiceInfo,
- new WifiP2pActionListener(mEventFacade, "AddLocalService"));
- }
-
- @Rpc(description = "Add a service discovery request.")
- public Integer wifiP2pAddServiceRequest(
- @RpcParameter(name = "protocolType") Integer protocolType) {
- WifiP2pServiceRequest request = WifiP2pServiceRequest.newInstance(protocolType);
- mServiceRequestCnt += 1;
- mServiceRequests.put(mServiceRequestCnt, request);
- mP2p.addServiceRequest(mChannel, request, new WifiP2pActionListener(mEventFacade,
- "AddServiceRequest"));
- return mServiceRequestCnt;
- }
-
- @Rpc(description = "Cancel any ongoing connect negotiation.")
- public void wifiP2pCancelConnect() {
- mP2p.cancelConnect(mChannel, new WifiP2pActionListener(mEventFacade, "CancelConnect"));
- }
-
- @Rpc(description = "Clear all registered local services of service discovery.")
- public void wifiP2pClearLocalServices() {
- mP2p.clearLocalServices(mChannel,
- new WifiP2pActionListener(mEventFacade, "ClearLocalServices"));
- }
-
- @Rpc(description = "Clear all registered service discovery requests.")
- public void wifiP2pClearServiceRequests() {
- mP2p.clearServiceRequests(mChannel,
- new WifiP2pActionListener(mEventFacade, "ClearServiceRequests"));
- }
-
- @Rpc(description = "Connects to a discovered wifi p2p device.")
- public void wifiP2pConnect(@RpcParameter(name = "deviceId") String deviceId) {
- for (WifiP2pDevice d : mP2pPeers) {
- if (wifiP2pDeviceMatches(d, deviceId)) {
- WifiP2pConfig config = new WifiP2pConfig();
- config.deviceAddress = d.deviceAddress;
- config.wps.setup = WpsInfo.PBC;
- mP2p.connect(mChannel, config,
- new WifiP2pActionListener(mEventFacade, "Connect"));
- }
- }
- }
-
- @Rpc(description = "Create a Bonjour service info object to be used for wifiP2pAddLocalService.")
- public void wifiP2pCreateBonjourServiceInfo(
- @RpcParameter(name = "instanceName") String instanceName,
- @RpcParameter(name = "serviceType") String serviceType,
- @RpcParameter(name = "txtMap") JSONObject txtMap) throws JSONException {
- Map<String, String> map = new HashMap<String, String>();
- for (String key : txtMap.keySet()) {
- map.put(key, txtMap.getString(key));
- }
- mServiceInfo = WifiP2pDnsSdServiceInfo.newInstance(instanceName, serviceType, map);
- }
-
- @Rpc(description = "Create a wifi p2p group.")
- public void wifiP2pCreateGroup() {
- mP2p.createGroup(mChannel, new WifiP2pActionListener(mEventFacade, "CreatGroup"));
- }
-
- @Rpc(description = "Create a Upnp service info object to be used for wifiP2pAddLocalService.")
- public void wifiP2pCreateUpnpServiceInfo(
- @RpcParameter(name = "uuid") String uuid,
- @RpcParameter(name = "device") String device,
- @RpcParameter(name = "services") List<String> services) {
- mServiceInfo = WifiP2pUpnpServiceInfo.newInstance(uuid, device, services);
- }
-
- @Rpc(description = "Delete a stored persistent group from the system settings.")
- public void wifiP2pDeletePersistentGroup(@RpcParameter(name = "netId") Integer netId) {
- mP2p.deletePersistentGroup(mChannel, netId,
- new WifiP2pActionListener(mEventFacade, "DeletePersistentGroup"));
- }
-
- private boolean wifiP2pDeviceMatches(WifiP2pDevice d, String deviceId) {
- return d.deviceName.equals(deviceId) || d.deviceAddress.equals(deviceId);
- }
-
- @Rpc(description = "Start peers discovery for wifi p2p.")
- public void wifiP2pDiscoverPeers() {
- mP2p.discoverPeers(mChannel, new WifiP2pActionListener(mEventFacade, "DiscoverPeers"));
- }
-
- @Rpc(description = "Initiate service discovery.")
- public void wifiP2pDiscoverServices() {
- mP2p.discoverServices(mChannel,
- new WifiP2pActionListener(mEventFacade, "DiscoverServices"));
- }
-
- @Rpc(description = "Initialize wifi p2p. Must be called before any other p2p functions.")
- public void wifiP2pInitialize() {
- mService.registerReceiver(mP2pStateChangedReceiver, mStateChangeFilter);
- mChannel = mP2p.initialize(mService, mService.getMainLooper(), null);
- }
-
- @Rpc(description = "Returns true if wifi p2p is enabled, false otherwise.")
- public Boolean wifiP2pIsEnabled() {
- return isP2pEnabled;
- }
-
- @Rpc(description = "Remove the current p2p group.")
- public void wifiP2pRemoveGroup() {
- mP2p.removeGroup(mChannel, new WifiP2pActionListener(mEventFacade, "RemoveGroup"));
- }
-
- @Rpc(description = "Remove a registered local service added with wifiP2pAddLocalService.")
- public void wifiP2pRemoveLocalService() {
- mP2p.removeLocalService(mChannel, mServiceInfo,
- new WifiP2pActionListener(mEventFacade, "RemoveLocalService"));
- }
-
- @Rpc(description = "Remove a service discovery request.")
- public void wifiP2pRemoveServiceRequest(@RpcParameter(name = "index") Integer index) {
- mP2p.removeServiceRequest(mChannel, mServiceRequests.remove(index),
- new WifiP2pActionListener(mEventFacade, "RemoveServiceRequest"));
- }
-
- @Rpc(description = "Request device connection info.")
- public void wifiP2pRequestConnectionInfo() {
- mP2p.requestConnectionInfo(mChannel, new WifiP2pConnectionInfoListener(mEventFacade));
- }
-
- @Rpc(description = "Create a wifi p2p group.")
- public void wifiP2pRequestGroupInfo() {
- mP2p.requestGroupInfo(mChannel, new WifiP2pGroupInfoListener(mEventFacade));
- }
-
- @Rpc(description = "Request peers that are discovered for wifi p2p.")
- public void wifiP2pRequestPeers() {
- mP2p.requestPeers(mChannel, new WifiP2pPeerListListener(mEventFacade));
- }
-
- @Rpc(description = "Request a list of all the persistent p2p groups stored in system.")
- public void wifiP2pRequestPersistentGroupInfo() {
- mP2p.requestPersistentGroupInfo(mChannel,
- new WifiP2pPersistentGroupInfoListener(mEventFacade));
- }
-
- @Rpc(description = "Set p2p device name.")
- public void wifiP2pSetDeviceName(@RpcParameter(name = "devName") String devName) {
- mP2p.setDeviceName(mChannel, devName,
- new WifiP2pActionListener(mEventFacade, "SetDeviceName"));
- }
-
- @Rpc(description = "Register a callback to be invoked on receiving Bonjour service discovery response.")
- public void wifiP2pSetDnsSdResponseListeners() {
- mP2p.setDnsSdResponseListeners(mChannel,
- new WifiP2pDnsSdServiceResponseListener(mEventFacade),
- new WifiP2pDnsSdTxtRecordListener(mEventFacade));
- }
-
- @Rpc(description = "Stop an ongoing peer discovery.")
- public void wifiP2pStopPeerDiscovery() {
- mP2p.stopPeerDiscovery(mChannel,
- new WifiP2pActionListener(mEventFacade, "StopPeerDiscovery"));
- }
-
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiRttManagerFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiRttManagerFacade.java
deleted file mode 100644
index b4bf1e1..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiRttManagerFacade.java
+++ /dev/null
@@ -1,210 +0,0 @@
-
-package com.googlecode.android_scripting.facade.wifi;
-
-import java.util.ArrayList;
-import java.util.Hashtable;
-import java.util.Map;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import android.app.Service;
-import android.content.Context;
-import android.net.wifi.RttManager;
-import android.net.wifi.RttManager.RttCapabilities;
-import android.net.wifi.RttManager.RttListener;
-import android.net.wifi.RttManager.RttParams;
-import android.net.wifi.RttManager.RttResult;
-import android.os.Bundle;
-import android.os.Parcelable;
-
-import com.googlecode.android_scripting.facade.EventFacade;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-/**
- * WifiRttManager functions.
- */
-public class WifiRttManagerFacade extends RpcReceiver {
- private final Service mService;
- private final RttManager mRtt;
- private final EventFacade mEventFacade;
- private final Map<Integer, RttListener> mRangingListeners;
-
- public WifiRttManagerFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mRtt = (RttManager) mService.getSystemService(Context.WIFI_RTT_SERVICE);
- mEventFacade = manager.getReceiver(EventFacade.class);
- mRangingListeners = new Hashtable<Integer, RttListener>();
- }
-
- public static class RangingListener implements RttListener {
- private static final String TAG = "WifiRttRanging";
- private static int sCount = 0;
- private final EventFacade mEventFacade;
- public final int mId;
-
- public RangingListener(EventFacade eventFacade) {
- sCount += 1;
- mId = sCount;
- mEventFacade = eventFacade;
- }
-
- private Bundle packRttResult(RttResult result) {
- Bundle rttResult = new Bundle();
- rttResult.putString("BSSID", result.bssid);
- rttResult.putInt("txRate", result.txRate);
- rttResult.putInt("rxRate", result.rxRate);
- rttResult.putInt("distance", result.distance);
- rttResult.putInt("distanceStandardDeviation",
- result.distanceStandardDeviation);
- rttResult.putInt("distanceSpread", result.distanceSpread);
- rttResult.putInt("burstDuration", result.burstDuration);
- rttResult.putLong("rtt", result.rtt);
- rttResult.putLong("rttStandardDeviation",
- result.rttStandardDeviation);
- rttResult.putLong("rttSpread", result.rttSpread);
- rttResult.putLong("ts", result.ts);
- rttResult.putInt("rssi", result.rssi);
- rttResult.putInt("rssiSpread", result.rssiSpread);
- rttResult.putInt("retryAfterDuration", result.retryAfterDuration);
- rttResult.putInt("measurementType", result.measurementType);
- rttResult.putInt("status", result.status);
- rttResult.putInt("frameNumberPerBurstPeer",
- result.frameNumberPerBurstPeer);
- rttResult.putInt("successMeasurementFrameNumber",
- result.successMeasurementFrameNumber);
- rttResult.putInt("measurementFrameNumber",
- result.measurementFrameNumber);
- rttResult.putInt("burstNumber", result.burstNumber);
- rttResult.putInt("status", result.status);
- return rttResult;
- }
-
- @Override
- public void onSuccess(RttResult[] results) {
- if (results == null) {
- mEventFacade
- .postEvent(RangingListener.TAG + mId + "onSuccess", null);
- return;
- }
- Bundle msg = new Bundle();
- Parcelable[] resultBundles = new Parcelable[results.length];
- for (int i = 0; i < results.length; i++) {
- resultBundles[i] = packRttResult(results[i]);
- }
- msg.putParcelableArray("Results", resultBundles);
- mEventFacade
- .postEvent(RangingListener.TAG + mId + "onSuccess", msg);
- }
-
- @Override
- public void onFailure(int reason, String description) {
- Bundle msg = new Bundle();
- msg.putInt("Reason", reason);
- msg.putString("Description", description);
- mEventFacade
- .postEvent(RangingListener.TAG + mId + "onFailure", msg);
- }
-
- @Override
- public void onAborted() {
- mEventFacade.postEvent(RangingListener.TAG + mId + "onAborted",
- new Bundle());
- }
- }
-
- @Rpc(description = "Get wifi Rtt capabilities.")
- public RttCapabilities wifiRttGetCapabilities() {
- return mRtt.getRttCapabilities();
- }
-
- private RttParams parseRttParam(JSONObject j) throws JSONException {
- RttParams result = new RttParams();
- if (j.has("deviceType")) {
- result.deviceType = j.getInt("deviceType");
- }
- if (j.has("requestType")) {
- result.requestType = j.getInt("requestType");
- }
- if (j.has("bssid")) {
- result.bssid = j.getString("bssid");
- }
- if (j.has("frequency")) {
- result.frequency = j.getInt("frequency");
- }
- if (j.has("channelWidth")) {
- result.channelWidth = j.getInt("channelWidth");
- }
- if (j.has("centerFreq0")) {
- result.centerFreq0 = j.getInt("centerFreq0");
- }
- if (j.has("centerFreq1")) {
- result.centerFreq1 = j.getInt("centerFreq1");
- }
- if (j.has("numberBurst")) {
- result.numberBurst = j.getInt("numberBurst");
- }
- if (j.has("burstTimeout")) {
- result.burstTimeout = j.getInt("burstTimeout");
- }
- if (j.has("interval")) {
- result.interval = j.getInt("interval");
- }
- if (j.has("numSamplesPerBurst")) {
- result.numSamplesPerBurst = j.getInt("numSamplesPerBurst");
- }
- if (j.has("numRetriesPerMeasurementFrame")) {
- result.numRetriesPerMeasurementFrame = j
- .getInt("numRetriesPerMeasurementFrame");
- }
- if (j.has("numRetriesPerFTMR")) {
- result.numRetriesPerFTMR = j.getInt("numRetriesPerFTMR");
- }
- if (j.has("LCIRequest")) {
- result.LCIRequest = j.getBoolean("LCIRequest");
- }
- if (j.has("LCRRequest")) {
- result.LCRRequest = j.getBoolean("LCRRequest");
- }
- if (j.has("preamble")) {
- result.preamble = j.getInt("preamble");
- }
- if (j.has("bandwidth")) {
- result.bandwidth = j.getInt("bandwidth");
- }
- return result;
- }
-
- @Rpc(description = "Start ranging.", returns = "Id of the listener associated with the started ranging.")
- public Integer wifiRttStartRanging(
- @RpcParameter(name = "params") JSONArray params)
- throws JSONException {
- RttParams[] rParams = new RttParams[params.length()];
- for (int i = 0; i < params.length(); i++) {
- rParams[i] = parseRttParam(params.getJSONObject(i));
- }
- RangingListener listener = new RangingListener(mEventFacade);
- mRangingListeners.put(listener.mId, listener);
- mRtt.startRanging(rParams, listener);
- return listener.mId;
- }
-
- @Rpc(description = "Stop ranging.")
- public void wifiRttStopRanging(@RpcParameter(name = "index") Integer index) {
- mRtt.stopRanging(mRangingListeners.remove(index));
- }
-
- @Override
- public void shutdown() {
- ArrayList<Integer> keys = new ArrayList<Integer>(
- mRangingListeners.keySet());
- for (int k : keys) {
- wifiRttStopRanging(k);
- }
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiScannerFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiScannerFacade.java
deleted file mode 100644
index f718b90..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiScannerFacade.java
+++ /dev/null
@@ -1,649 +0,0 @@
-/*
- * Copyright (C) 2014 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.wifi;
-
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.MainThread;
-import com.googlecode.android_scripting.facade.EventFacade;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcOptional;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-import android.app.Service;
-import android.content.Context;
-import android.net.wifi.ScanResult;
-import android.net.wifi.WifiScanner;
-import android.net.wifi.WifiScanner.BssidInfo;
-import android.net.wifi.WifiScanner.ChannelSpec;
-import android.net.wifi.WifiScanner.ScanData;
-import android.net.wifi.WifiScanner.ScanSettings;
-import android.os.Bundle;
-import android.os.SystemClock;
-import android.provider.Settings.Global;
-import android.provider.Settings.SettingNotFoundException;
-
-/**
- * WifiScanner functions.
- */
-public class WifiScannerFacade extends RpcReceiver {
- private final Service mService;
- private final EventFacade mEventFacade;
- private final WifiScanner mScan;
- // These counters are just for indexing;
- // they do not represent the total number of listeners
- private static int WifiScanListenerCnt;
- private static int WifiChangeListenerCnt;
- private static int WifiBssidListenerCnt;
- private final ConcurrentHashMap<Integer, WifiScanListener> scanListeners;
- private final ConcurrentHashMap<Integer, WifiScanListener> scanBackgroundListeners;
- private final ConcurrentHashMap<Integer, ChangeListener> trackChangeListeners;
- private final ConcurrentHashMap<Integer, WifiBssidListener> trackBssidListeners;
- private static ConcurrentHashMap<Integer, ScanResult[]> wifiScannerResultList;
- private static ConcurrentHashMap<Integer, ScanData[]> wifiScannerDataList;
-
- public WifiScannerFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mScan = (WifiScanner) mService.getSystemService(Context.WIFI_SCANNING_SERVICE);
- mEventFacade = manager.getReceiver(EventFacade.class);
- scanListeners = new ConcurrentHashMap<Integer, WifiScanListener>();
- scanBackgroundListeners = new ConcurrentHashMap<Integer, WifiScanListener>();
- trackChangeListeners = new ConcurrentHashMap<Integer, ChangeListener>();
- trackBssidListeners = new ConcurrentHashMap<Integer, WifiBssidListener>();
- wifiScannerResultList = new ConcurrentHashMap<Integer, ScanResult[]>();
- wifiScannerDataList = new ConcurrentHashMap<Integer, ScanData[]>();
- }
-
- public static List<ScanResult> getWifiScanResult(Integer listenerIndex) {
- ScanResult[] sr = wifiScannerResultList.get(listenerIndex);
- return Arrays.asList(sr);
- }
-
- private class WifiActionListener implements WifiScanner.ActionListener {
- private final Bundle mResults;
- public int mIndex;
- protected String mEventType;
- private long startScanElapsedRealTime;
-
- public WifiActionListener(String type, int idx, Bundle resultBundle, long startScanERT) {
- this.mIndex = idx;
- this.mEventType = type;
- this.mResults = resultBundle;
- this.startScanElapsedRealTime = startScanERT;
- }
-
- @Override
- public void onSuccess() {
- Log.d("onSuccess " + mEventType + " " + mIndex);
- mResults.putString("Type", "onSuccess");
- mResults.putInt("Index", mIndex);
- mResults.putLong("ScanElapsedRealtime", startScanElapsedRealTime);
- mEventFacade.postEvent(mEventType + mIndex + "onSuccess", mResults.clone());
- mResults.clear();
- }
-
- @Override
- public void onFailure(int reason, String description) {
- Log.d("onFailure " + mEventType + " " + mIndex);
- mResults.putString("Type", "onFailure");
- mResults.putInt("Index", mIndex);
- mResults.putInt("Reason", reason);
- mResults.putString("Description", description);
- mEventFacade.postEvent(mEventType + mIndex + "onFailure", mResults.clone());
- mResults.clear();
- }
-
- public void reportResult(ScanResult[] results, String type) {
- Log.d("reportResult " + mEventType + " " + mIndex);
- mResults.putInt("Index", mIndex);
- mResults.putLong("ResultElapsedRealtime", SystemClock.elapsedRealtime());
- mResults.putString("Type", type);
- mResults.putParcelableArray("Results", results);
- mEventFacade.postEvent(mEventType + mIndex + type, mResults.clone());
- mResults.clear();
- }
- }
-
- /**
- * Constructs a wifiScanListener obj and returns it
- *
- * @return WifiScanListener
- */
- private WifiScanListener genWifiScanListener() {
- WifiScanListener mWifiScannerListener = MainThread.run(mService,
- new Callable<WifiScanListener>() {
- @Override
- public WifiScanListener call() throws Exception {
- return new WifiScanListener();
- }
- });
- scanListeners.put(mWifiScannerListener.mIndex, mWifiScannerListener);
- return mWifiScannerListener;
- }
-
- /**
- * Constructs a wifiScanListener obj for background scan and returns it
- *
- * @return WifiScanListener
- */
- private WifiScanListener genBackgroundWifiScanListener() {
- WifiScanListener mWifiScannerListener = MainThread.run(mService,
- new Callable<WifiScanListener>() {
- @Override
- public WifiScanListener call() throws Exception {
- return new WifiScanListener();
- }
- });
- scanBackgroundListeners.put(mWifiScannerListener.mIndex, mWifiScannerListener);
- return mWifiScannerListener;
- }
-
- private class WifiScanListener implements WifiScanner.ScanListener {
- private static final String mEventType = "WifiScannerScan";
- protected final Bundle mScanResults;
- protected final Bundle mScanData;
- private final WifiActionListener mWAL;
- public int mIndex;
-
- public WifiScanListener() {
- mScanResults = new Bundle();
- mScanData = new Bundle();
- WifiScanListenerCnt += 1;
- mIndex = WifiScanListenerCnt;
- mWAL = new WifiActionListener(mEventType, mIndex, mScanResults,
- SystemClock.elapsedRealtime());
- }
-
- @Override
- public void onSuccess() {
- mWAL.onSuccess();
- }
-
- @Override
- public void onFailure(int reason, String description) {
- scanListeners.remove(mIndex);
- mWAL.onFailure(reason, description);
- }
-
- @Override
- public void onPeriodChanged(int periodInMs) {
- Log.d("onPeriodChanged " + mEventType + " " + mIndex);
- mScanResults.putString("Type", "onPeriodChanged");
- mScanResults.putInt("NewPeriod", periodInMs);
- mEventFacade.postEvent(mEventType + mIndex, mScanResults.clone());
- mScanResults.clear();
- }
-
- @Override
- public void onFullResult(ScanResult fullScanResult) {
- Log.d("onFullResult WifiScanListener " + mIndex);
- mWAL.reportResult(new ScanResult[] {
- fullScanResult
- }, "onFullResult");
- }
-
- public void onResults(ScanData[] results) {
- Log.d("onResult WifiScanListener " + mIndex);
- wifiScannerDataList.put(mIndex, results);
- mScanData.putInt("Index", mIndex);
- mScanData.putLong("ResultElapsedRealtime", SystemClock.elapsedRealtime());
- mScanData.putString("Type", "onResults");
- mScanData.putParcelableArray("Results", results);
- mEventFacade.postEvent(mEventType + mIndex + "onResults", mScanData.clone());
- mScanData.clear();
- }
- }
-
- /**
- * Constructs a ChangeListener obj and returns it
- *
- * @return ChangeListener
- */
- private ChangeListener genWifiChangeListener() {
- ChangeListener mWifiChangeListener = MainThread.run(mService,
- new Callable<ChangeListener>() {
- @Override
- public ChangeListener call() throws Exception {
- return new ChangeListener();
- }
- });
- trackChangeListeners.put(mWifiChangeListener.mIndex, mWifiChangeListener);
- return mWifiChangeListener;
- }
-
- private class ChangeListener implements WifiScanner.WifiChangeListener {
- private static final String mEventType = "WifiScannerChange";
- protected final Bundle mResults;
- private final WifiActionListener mWAL;
- public int mIndex;
-
- public ChangeListener() {
- mResults = new Bundle();
- WifiChangeListenerCnt += 1;
- mIndex = WifiChangeListenerCnt;
- mWAL = new WifiActionListener(mEventType, mIndex, mResults,
- SystemClock.elapsedRealtime());
- }
-
- @Override
- public void onSuccess() {
- mWAL.onSuccess();
- }
-
- @Override
- public void onFailure(int reason, String description) {
- trackChangeListeners.remove(mIndex);
- mWAL.onFailure(reason, description);
- }
-
- /**
- * indicates that changes were detected in wifi environment
- *
- * @param results indicate the access points that exhibited change
- */
- @Override
- public void onChanging(ScanResult[] results) { /* changes are found */
- mWAL.reportResult(results, "onChanging");
- }
-
- /**
- * indicates that no wifi changes are being detected for a while
- *
- * @param results indicate the access points that are bing monitored for change
- */
- @Override
- public void onQuiescence(ScanResult[] results) { /* changes settled down */
- mWAL.reportResult(results, "onQuiescence");
- }
- }
-
- private WifiBssidListener genWifiBssidListener() {
- WifiBssidListener mWifiBssidListener = MainThread.run(mService,
- new Callable<WifiBssidListener>() {
- @Override
- public WifiBssidListener call() throws Exception {
- return new WifiBssidListener();
- }
- });
- trackBssidListeners.put(mWifiBssidListener.mIndex, mWifiBssidListener);
- return mWifiBssidListener;
- }
-
- private class WifiBssidListener implements WifiScanner.BssidListener {
- private static final String mEventType = "WifiScannerBssid";
- protected final Bundle mResults;
- private final WifiActionListener mWAL;
- public int mIndex;
-
- public WifiBssidListener() {
- mResults = new Bundle();
- WifiBssidListenerCnt += 1;
- mIndex = WifiBssidListenerCnt;
- mWAL = new WifiActionListener(mEventType, mIndex, mResults,
- SystemClock.elapsedRealtime());
- }
-
- @Override
- public void onSuccess() {
- mWAL.onSuccess();
- }
-
- @Override
- public void onFailure(int reason, String description) {
- trackBssidListeners.remove(mIndex);
- mWAL.onFailure(reason, description);
- }
-
- @Override
- public void onFound(ScanResult[] results) {
- mWAL.reportResult(results, "onFound");
- }
-
- @Override
- public void onLost(ScanResult[] results) {
- mWAL.reportResult(results, "onLost");
- }
- }
-
- private ScanSettings parseScanSettings(JSONObject j) throws JSONException {
- if (j == null) {
- return null;
- }
- ScanSettings result = new ScanSettings();
- if (j.has("band")) {
- result.band = j.optInt("band");
- }
- if (j.has("channels")) {
- JSONArray chs = j.getJSONArray("channels");
- ChannelSpec[] channels = new ChannelSpec[chs.length()];
- for (int i = 0; i < channels.length; i++) {
- channels[i] = new ChannelSpec(chs.getInt(i));
- }
- result.channels = channels;
- }
- if (j.has("maxScansToCache")) {
- result.maxScansToCache = j.getInt("maxScansToCache");
- }
- /* periodInMs and reportEvents are required */
- result.periodInMs = j.getInt("periodInMs");
- if (j.has("maxPeriodInMs")) {
- result.maxPeriodInMs = j.getInt("maxPeriodInMs");
- }
- if (j.has("stepCount")) {
- result.stepCount = j.getInt("stepCount");
- }
- result.reportEvents = j.getInt("reportEvents");
- if (j.has("numBssidsPerScan")) {
- result.numBssidsPerScan = j.getInt("numBssidsPerScan");
- }
- return result;
- }
-
- private BssidInfo[] parseBssidInfo(JSONArray jBssids) throws JSONException {
- BssidInfo[] bssids = new BssidInfo[jBssids.length()];
- for (int i = 0; i < bssids.length; i++) {
- JSONObject bi = (JSONObject) jBssids.get(i);
- BssidInfo bssidInfo = new BssidInfo();
- bssidInfo.bssid = bi.getString("BSSID");
- bssidInfo.high = bi.getInt("high");
- bssidInfo.low = bi.getInt("low");
- if (bi.has("frequencyHint")) {
- bssidInfo.frequencyHint = bi.getInt("frequencyHint");
- }
- bssids[i] = bssidInfo;
- }
- return bssids;
- }
-
- /**
- * Starts periodic WifiScanner scan
- *
- * @param scanSettings
- * @return the id of the scan listener associated with this scan
- * @throws JSONException
- */
- @Rpc(description = "Starts a WifiScanner Background scan")
- public Integer wifiScannerStartBackgroundScan(
- @RpcParameter(name = "scanSettings") JSONObject scanSettings)
- throws JSONException {
- ScanSettings ss = parseScanSettings(scanSettings);
- Log.d("startWifiScannerScan with " + ss.channels);
- WifiScanListener listener = genBackgroundWifiScanListener();
- mScan.startBackgroundScan(ss, listener);
- return listener.mIndex;
- }
-
- /**
- * Get currently available scan results on appropriate listeners
- *
- * @return true if all scan results were reported correctly
- * @throws JSONException
- */
- @Rpc(description = "Get currently available scan results on appropriate listeners")
- public Boolean wifiScannerGetScanResults() throws JSONException {
- mScan.getScanResults();
- return true;
- }
-
- /**
- * Stops a WifiScanner scan
- *
- * @param listenerIndex the id of the scan listener whose scan to stop
- * @throws Exception
- */
- @Rpc(description = "Stops an ongoing WifiScanner Background scan")
- public void wifiScannerStopBackgroundScan(
- @RpcParameter(name = "listener") Integer listenerIndex)
- throws Exception {
- if (!scanBackgroundListeners.containsKey(listenerIndex)) {
- throw new Exception("Background scan session " + listenerIndex + " does not exist");
- }
- WifiScanListener listener = scanBackgroundListeners.get(listenerIndex);
- Log.d("stopWifiScannerScan listener " + listener.mIndex);
- mScan.stopBackgroundScan(listener);
- wifiScannerResultList.remove(listenerIndex);
- scanBackgroundListeners.remove(listenerIndex);
- }
-
- /**
- * Starts periodic WifiScanner scan
- *
- * @param scanSettings
- * @return the id of the scan listener associated with this scan
- * @throws JSONException
- */
- @Rpc(description = "Starts a WifiScanner single scan")
- public Integer wifiScannerStartScan(
- @RpcParameter(name = "scanSettings") JSONObject scanSettings)
- throws JSONException {
- ScanSettings ss = parseScanSettings(scanSettings);
- Log.d("startWifiScannerScan with " + ss.channels);
- WifiScanListener listener = genWifiScanListener();
- mScan.startScan(ss, listener);
- return listener.mIndex;
- }
-
- /**
- * Stops a WifiScanner scan
- *
- * @param listenerIndex the id of the scan listener whose scan to stop
- * @throws Exception
- */
- @Rpc(description = "Stops an ongoing WifiScanner Single scan")
- public void wifiScannerStopScan(@RpcParameter(name = "listener") Integer listenerIndex)
- throws Exception {
- if (!scanListeners.containsKey(listenerIndex)) {
- throw new Exception("Single scan session " + listenerIndex + " does not exist");
- }
- WifiScanListener listener = scanListeners.get(listenerIndex);
- Log.d("stopWifiScannerScan listener " + listener.mIndex);
- mScan.stopScan(listener);
- wifiScannerResultList.remove(listener.mIndex);
- scanListeners.remove(listenerIndex);
- }
-
- /** RPC Methods */
- @Rpc(description = "Returns the channels covered by the specified band number.")
- public List<Integer> wifiScannerGetAvailableChannels(
- @RpcParameter(name = "band") Integer band) {
- return mScan.getAvailableChannels(band);
- }
-
- /**
- * Starts tracking wifi changes
- *
- * @return the id of the change listener associated with this track
- * @throws Exception
- */
- @Rpc(description = "Starts tracking wifi changes")
- public Integer wifiScannerStartTrackingChange() throws Exception {
- ChangeListener listener = genWifiChangeListener();
- mScan.startTrackingWifiChange(listener);
- return listener.mIndex;
- }
-
- /**
- * Stops tracking wifi changes
- *
- * @param listenerIndex the id of the change listener whose track to stop
- * @throws Exception
- */
- @Rpc(description = "Stops tracking wifi changes")
- public void wifiScannerStopTrackingChange(
- @RpcParameter(name = "listener") Integer listenerIndex) throws Exception {
- if (!trackChangeListeners.containsKey(listenerIndex)) {
- throw new Exception("Wifi change tracking session " + listenerIndex
- + " does not exist");
- }
- ChangeListener listener = trackChangeListeners.get(listenerIndex);
- mScan.stopTrackingWifiChange(listener);
- trackChangeListeners.remove(listenerIndex);
- }
-
- /**
- * Starts tracking changes of the specified bssids.
- *
- * @param bssidInfos An array of json strings, each representing a BssidInfo object.
- * @param apLostThreshold
- * @return The index of the listener used to start the tracking.
- * @throws JSONException
- */
- @Rpc(description = "Starts tracking changes of the specified bssids.")
- public Integer wifiScannerStartTrackingBssids(
- @RpcParameter(name = "bssidInfos") JSONArray bssidInfos,
- @RpcParameter(name = "apLostThreshold") Integer apLostThreshold) throws JSONException {
- BssidInfo[] bssids = parseBssidInfo(bssidInfos);
- WifiBssidListener listener = genWifiBssidListener();
- mScan.startTrackingBssids(bssids, apLostThreshold, listener);
- return listener.mIndex;
- }
-
- /**
- * Stops tracking the list of APs associated with the input listener
- *
- * @param listenerIndex the id of the bssid listener whose track to stop
- * @throws Exception
- */
- @Rpc(description = "Stops tracking changes in the APs on the list")
- public void wifiScannerStopTrackingBssids(
- @RpcParameter(name = "listener") Integer listenerIndex) throws Exception {
- if (!trackBssidListeners.containsKey(listenerIndex)) {
- throw new Exception("Bssid tracking session " + listenerIndex + " does not exist");
- }
- WifiBssidListener listener = trackBssidListeners.get(listenerIndex);
- mScan.stopTrackingBssids(listener);
- trackBssidListeners.remove(listenerIndex);
- }
-
- @Rpc(description = "Toggle the 'WiFi scan always available' option. If an input is given, the "
- + "option is set to what the input boolean indicates.")
- public void wifiScannerToggleAlwaysAvailable(
- @RpcParameter(name = "alwaysAvailable") @RpcOptional Boolean alwaysAvailable)
- throws SettingNotFoundException {
- int new_state = 0;
- if (alwaysAvailable == null) {
- int current_state = Global.getInt(mService.getContentResolver(),
- Global.WIFI_SCAN_ALWAYS_AVAILABLE);
- new_state = current_state ^ 0x1;
- } else {
- new_state = alwaysAvailable ? 1 : 0;
- }
- Global.putInt(mService.getContentResolver(), Global.WIFI_SCAN_ALWAYS_AVAILABLE, new_state);
- }
-
- @Rpc(description = "Returns true if WiFi scan is always available, false otherwise.")
- public Boolean wifiScannerIsAlwaysAvailable() throws SettingNotFoundException {
- int current_state = Global.getInt(mService.getContentResolver(),
- Global.WIFI_SCAN_ALWAYS_AVAILABLE);
- if (current_state == 1) {
- return true;
- }
- return false;
- }
-
- @Rpc(description = "Returns a list of mIndexes of existing listeners")
- public Set<Integer> wifiGetCurrentScanIndexes() {
- return scanListeners.keySet();
- }
-
- /**
- * Starts tracking wifi changes
- *
- * @return the id of the change listener associated with this track
- * @throws Exception
- */
- @Rpc(description = "Starts tracking wifi changes with track settings")
- public Integer wifiScannerStartTrackingChangeWithSetting(
- @RpcParameter(name = "trackSettings") JSONArray bssidSettings,
- @RpcParameter(name = "rssiSS") Integer rssiSS,
- @RpcParameter(name = "lostApSS") Integer lostApSS,
- @RpcParameter(name = "unchangedSS") Integer unchangedSS,
- @RpcParameter(name = "minApsBreachingThreshold") Integer minApsBreachingThreshold,
- @RpcParameter(name = "periodInMs") Integer periodInMs) throws Exception {
- Log.d("starting change track with track settings");
- BssidInfo[] bssids = parseBssidInfo(bssidSettings);
- mScan.configureWifiChange(rssiSS, lostApSS, unchangedSS, minApsBreachingThreshold,
- periodInMs, bssids);
- ChangeListener listener = genWifiChangeListener();
- mScan.startTrackingWifiChange(listener);
- return listener.mIndex;
- }
-
- /**
- * Shuts down all activities associated with WifiScanner
- */
- @Rpc(description = "Shuts down all WifiScanner activities and remove listeners.")
- public void wifiScannerShutdown() {
- this.shutdown();
- }
-
- /**
- * Stops all activity
- */
- @Override
- public void shutdown() {
- try {
- if (!scanListeners.isEmpty()) {
- Iterator<ConcurrentHashMap.Entry<Integer, WifiScanListener>> iter = scanListeners
- .entrySet().iterator();
- while (iter.hasNext()) {
- ConcurrentHashMap.Entry<Integer, WifiScanListener> entry = iter.next();
- this.wifiScannerStopScan(entry.getKey());
- }
- }
- if (!scanBackgroundListeners.isEmpty()) {
- Iterator<ConcurrentHashMap.Entry<Integer, WifiScanListener>> iter = scanBackgroundListeners
- .entrySet().iterator();
- while (iter.hasNext()) {
- ConcurrentHashMap.Entry<Integer, WifiScanListener> entry = iter.next();
- this.wifiScannerStopBackgroundScan(entry.getKey());
- }
- }
- if (!trackChangeListeners.isEmpty()) {
- Iterator<ConcurrentHashMap.Entry<Integer, ChangeListener>> iter = trackChangeListeners
- .entrySet().iterator();
- while (iter.hasNext()) {
- ConcurrentHashMap.Entry<Integer, ChangeListener> entry = iter.next();
- this.wifiScannerStopTrackingChange(entry.getKey());
- }
- }
- if (!trackBssidListeners.isEmpty()) {
- Iterator<ConcurrentHashMap.Entry<Integer, WifiBssidListener>> iter = trackBssidListeners
- .entrySet().iterator();
- while (iter.hasNext()) {
- ConcurrentHashMap.Entry<Integer, WifiBssidListener> entry = iter.next();
- this.wifiScannerStopTrackingBssids(entry.getKey());
- }
- }
- } catch (Exception e) {
- Log.e("Shutdown failed: " + e.toString());
- }
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/future/FutureActivityTask.java b/sl4a/Common/src/com/googlecode/android_scripting/future/FutureActivityTask.java
deleted file mode 100644
index b474736..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/future/FutureActivityTask.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.future;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.view.ContextMenu;
-import android.view.ContextMenu.ContextMenuInfo;
-import android.view.KeyEvent;
-import android.view.Menu;
-import android.view.View;
-import android.view.Window;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Encapsulates an {@link Activity} and a {@link FutureObject}.
- *
- * @author Damon Kohler (damonkohler@gmail.com)
- */
-public abstract class FutureActivityTask<T> {
-
- private final FutureResult<T> mResult = new FutureResult<T>();
- private Activity mActivity;
-
- public void setActivity(Activity activity) {
- mActivity = activity;
- }
-
- public Activity getActivity() {
- return mActivity;
- }
-
- public void onCreate() {
- mActivity.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
- }
-
- public void onStart() {
- }
-
- public void onResume() {
- }
-
- public void onPause() {
- }
-
- public void onStop() {
- }
-
- public void onDestroy() {
- }
-
- public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
- }
-
- public boolean onPrepareOptionsMenu(Menu menu) {
- return false;
- }
-
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
- }
-
- protected void setResult(T result) {
- mResult.set(result);
- }
-
- public T getResult() throws InterruptedException {
- return mResult.get();
- }
-
- public T getResult(long timeout, TimeUnit unit) throws InterruptedException {
- return mResult.get(timeout, unit);
- }
-
- public void finish() {
- mActivity.finish();
- }
-
- public void startActivity(Intent intent) {
- mActivity.startActivity(intent);
- }
-
- public void startActivityForResult(Intent intent, int requestCode) {
- mActivity.startActivityForResult(intent, requestCode);
- }
-
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- // Placeholder.
- return false;
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/interpreter/InProcessInterpreter.java b/sl4a/Common/src/com/googlecode/android_scripting/interpreter/InProcessInterpreter.java
deleted file mode 100644
index 48de556..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/interpreter/InProcessInterpreter.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.interpreter;
-
-import java.io.FileDescriptor;
-
-public interface InProcessInterpreter {
- public FileDescriptor getStdOut();
-
- public FileDescriptor getStdIn();
-
- public boolean runInteractive();
-
- public void runScript(String filename);
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/interpreter/Interpreter.java b/sl4a/Common/src/com/googlecode/android_scripting/interpreter/Interpreter.java
deleted file mode 100644
index 7a69032..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/interpreter/Interpreter.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.interpreter;
-
-import com.googlecode.android_scripting.language.Language;
-import com.googlecode.android_scripting.language.SupportedLanguages;
-import com.googlecode.android_scripting.rpc.MethodDescriptor;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Combines all the execution-related specs of a particular interpreter installed in the system.
- * This class is instantiated through a map received from a concrete InterpreterProfider.
- *
- * @author Damon Kohler (damonkohler@gmail.com)
- * @author Alexey Reznichenko (alexey.reznichenko@gmail.com)
- */
-public class Interpreter implements InterpreterPropertyNames {
-
- private String mExtension;
- private String mName;
- private String mNiceName;
- private String mInteractiveCommand;
- private String mScriptExecutionCommand;
- private File mBinary;
- private boolean mHasInteractiveMode;
- private final List<String> mArguments;
- private final Map<String, String> mEnvironment;
- private Language mLanguage;
-
- public Interpreter() {
- mArguments = new ArrayList<String>();
- mEnvironment = new HashMap<String, String>();
- }
-
- public static Interpreter buildFromMaps(Map<String, String> data,
- Map<String, String> environment_variables, Map<String, String> arguments) {
- String extension = data.get(EXTENSION);
- String name = data.get(NAME);
- String niceName = data.get(NICE_NAME);
- String binary = data.get(BINARY);
- String interactiveCommand = data.get(INTERACTIVE_COMMAND);
- String scriptCommand = data.get(SCRIPT_COMMAND);
- Boolean hasInteractiveMode;
- if (data.containsKey(HAS_INTERACTIVE_MODE)) {
- hasInteractiveMode = Boolean.parseBoolean(data.get(HAS_INTERACTIVE_MODE));
- } else {
- // Default to true so that older interpreter APKs that don't have this value define still
- // work.
- hasInteractiveMode = true;
- }
- Interpreter interpreter = new Interpreter();
- interpreter.setName(name);
- interpreter.setNiceName(niceName);
- interpreter.setExtension(extension);
- interpreter.setBinary(new File(binary));
- interpreter.setInteractiveCommand(interactiveCommand);
- interpreter.setScriptCommand(scriptCommand);
- interpreter.setHasInteractiveMode(hasInteractiveMode);
- interpreter.setLanguage(SupportedLanguages.getLanguageByExtension(extension));
- interpreter.putAllEnvironmentVariables(environment_variables);
- interpreter.addAllArguments(arguments.values());
- return interpreter;
- }
-
- // TODO(damonkohler): This should take a List<String> since order is important.
- private void addAllArguments(Collection<String> arguments) {
- mArguments.addAll(arguments);
- }
-
- List<String> getArguments() {
- return mArguments;
- }
-
- private void putAllEnvironmentVariables(Map<String, String> environmentVariables) {
- mEnvironment.putAll(environmentVariables);
- }
-
- public Map<String, String> getEnvironmentVariables() {
- return mEnvironment;
- }
-
- protected void setScriptCommand(String executeParameters) {
- mScriptExecutionCommand = executeParameters;
- }
-
- public String getScriptCommand() {
- return mScriptExecutionCommand;
- }
-
- protected void setInteractiveCommand(String interactiveCommand) {
- mInteractiveCommand = interactiveCommand;
- }
-
- public String getInteractiveCommand() {
- return mInteractiveCommand;
- }
-
- protected void setBinary(File binary) {
- if (!binary.exists()) {
- throw new RuntimeException("Binary " + binary + " does not exist!");
- }
- mBinary = binary;
- }
-
- public File getBinary() {
- return mBinary;
- }
-
- protected void setExtension(String extension) {
- mExtension = extension;
- }
-
- protected void setHasInteractiveMode(boolean hasInteractiveMode) {
- mHasInteractiveMode = hasInteractiveMode;
- }
-
- public boolean hasInteractiveMode() {
- return mHasInteractiveMode;
- }
-
- public String getExtension() {
- return mExtension;
- }
-
- protected void setName(String name) {
- mName = name;
- }
-
- public String getName() {
- return mName;
- }
-
- protected void setNiceName(String niceName) {
- mNiceName = niceName;
- }
-
- public String getNiceName() {
- return mNiceName;
- }
-
- public String getContentTemplate() {
- return mLanguage.getContentTemplate();
- }
-
- protected void setLanguage(Language language) {
- mLanguage = language;
- }
-
- public Language getLanguage() {
- return mLanguage;
- }
-
- public String getRpcText(String content, MethodDescriptor rpc, String[] values) {
- return mLanguage.getRpcText(content, rpc, values);
- }
-
- public boolean isInstalled() {
- return mBinary.exists();
- }
-
- public boolean isUninstallable() {
- return true;
- }
-} \ No newline at end of file
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/interpreter/InterpreterConfiguration.java b/sl4a/Common/src/com/googlecode/android_scripting/interpreter/InterpreterConfiguration.java
deleted file mode 100644
index 27f9b7a..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/interpreter/InterpreterConfiguration.java
+++ /dev/null
@@ -1,316 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.interpreter;
-
-import android.content.BroadcastReceiver;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ProviderInfo;
-import android.content.pm.ResolveInfo;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.database.Cursor;
-import android.net.Uri;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.SingleThreadExecutor;
-import com.googlecode.android_scripting.interpreter.shell.ShellInterpreter;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.CopyOnWriteArraySet;
-import java.util.concurrent.ExecutorService;
-
-/**
- * Manages and provides access to the set of available interpreters.
- *
- * @author Damon Kohler (damonkohler@gmail.com)
- */
-public class InterpreterConfiguration {
-
- private final InterpreterListener mListener;
- private final Set<Interpreter> mInterpreterSet;
- private final Set<ConfigurationObserver> mObserverSet;
- private final Context mContext;
- private volatile boolean mIsDiscoveryComplete = false;
-
- public interface ConfigurationObserver {
- public void onConfigurationChanged();
- }
-
- private class InterpreterListener extends BroadcastReceiver {
- private final PackageManager mmPackageManager;
- private final ContentResolver mmResolver;
- private final ExecutorService mmExecutor;
- private final Map<String, Interpreter> mmDiscoveredInterpreters;
-
- private InterpreterListener(Context context) {
- mmPackageManager = context.getPackageManager();
- mmResolver = context.getContentResolver();
- mmExecutor = new SingleThreadExecutor();
- mmDiscoveredInterpreters = new HashMap<String, Interpreter>();
- }
-
- private void discoverForType(final String mime) {
- mmExecutor.execute(new Runnable() {
- @Override
- public void run() {
- Intent intent = new Intent(InterpreterConstants.ACTION_DISCOVER_INTERPRETERS);
- intent.addCategory(Intent.CATEGORY_LAUNCHER);
- intent.setType(mime);
- List<ResolveInfo> resolveInfos = mmPackageManager.queryIntentActivities(intent, 0);
- for (ResolveInfo info : resolveInfos) {
- addInterpreter(info.activityInfo.packageName);
- }
- mIsDiscoveryComplete = true;
- notifyConfigurationObservers();
- }
- });
- }
-
- private void discoverAll() {
- mmExecutor.execute(new Runnable() {
- @Override
- public void run() {
- Intent intent = new Intent(InterpreterConstants.ACTION_DISCOVER_INTERPRETERS);
- intent.addCategory(Intent.CATEGORY_LAUNCHER);
- intent.setType(InterpreterConstants.MIME + "*");
- List<ResolveInfo> resolveInfos = mmPackageManager.queryIntentActivities(intent, 0);
- for (ResolveInfo info : resolveInfos) {
- addInterpreter(info.activityInfo.packageName);
- }
- mIsDiscoveryComplete = true;
- notifyConfigurationObservers();
- }
- });
- }
-
- private void notifyConfigurationObservers() {
- for (ConfigurationObserver observer : mObserverSet) {
- observer.onConfigurationChanged();
- }
- }
-
- private void addInterpreter(final String packageName) {
- if (mmDiscoveredInterpreters.containsKey(packageName)) {
- return;
- }
- Interpreter discoveredInterpreter = buildInterpreter(packageName);
- if (discoveredInterpreter == null) {
- return;
- }
- mmDiscoveredInterpreters.put(packageName, discoveredInterpreter);
- mInterpreterSet.add(discoveredInterpreter);
- Log.v("Interpreter discovered: " + packageName + "\nBinary: "
- + discoveredInterpreter.getBinary());
- }
-
- private void remove(final String packageName) {
- if (!mmDiscoveredInterpreters.containsKey(packageName)) {
- return;
- }
- mmExecutor.execute(new Runnable() {
- @Override
- public void run() {
- Interpreter interpreter = mmDiscoveredInterpreters.get(packageName);
- if (interpreter == null) {
- Log.v("Interpreter for " + packageName + " not installed.");
- return;
- }
- mInterpreterSet.remove(interpreter);
- mmDiscoveredInterpreters.remove(packageName);
- notifyConfigurationObservers();
- }
- });
- }
-
- // We require that there's only one interpreter provider per APK.
- private Interpreter buildInterpreter(String packageName) {
- PackageInfo packInfo;
- try {
- packInfo = mmPackageManager.getPackageInfo(packageName, PackageManager.GET_PROVIDERS);
- } catch (NameNotFoundException e) {
- throw new RuntimeException("Package '" + packageName + "' not found.");
- }
- ProviderInfo provider = packInfo.providers[0];
-
- Map<String, String> interpreterMap =
- getMap(provider, InterpreterConstants.PROVIDER_PROPERTIES);
- if (interpreterMap == null) {
- Log.e("Null interpreter map for: " + packageName);
- return null;
- }
- Map<String, String> environmentMap =
- getMap(provider, InterpreterConstants.PROVIDER_ENVIRONMENT_VARIABLES);
- if (environmentMap == null) {
- throw new RuntimeException("Null environment map for: " + packageName);
- }
- Map<String, String> argumentsMap = getMap(provider, InterpreterConstants.PROVIDER_ARGUMENTS);
- if (argumentsMap == null) {
- throw new RuntimeException("Null arguments map for: " + packageName);
- }
- return Interpreter.buildFromMaps(interpreterMap, environmentMap, argumentsMap);
- }
-
- private Map<String, String> getMap(ProviderInfo provider, String name) {
- Uri uri = Uri.parse("content://" + provider.authority + "/" + name);
- Cursor cursor = mmResolver.query(uri, null, null, null, null);
- if (cursor == null) {
- return null;
- }
- cursor.moveToFirst();
- // Use LinkedHashMap so that order is maintained (important for position CLI arguments).
- Map<String, String> map = new LinkedHashMap<String, String>();
- for (int i = 0; i < cursor.getColumnCount(); i++) {
- map.put(cursor.getColumnName(i), cursor.getString(i));
- }
- return map;
- }
-
- @Override
- public void onReceive(Context context, Intent intent) {
- final String action = intent.getAction();
- final String packageName = intent.getData().getSchemeSpecificPart();
- if (action.equals(InterpreterConstants.ACTION_INTERPRETER_ADDED)) {
- mmExecutor.execute(new Runnable() {
- @Override
- public void run() {
- addInterpreter(packageName);
- notifyConfigurationObservers();
- }
- });
- } else if (action.equals(InterpreterConstants.ACTION_INTERPRETER_REMOVED)
- || action.equals(Intent.ACTION_PACKAGE_REMOVED)
- || action.equals(Intent.ACTION_PACKAGE_REPLACED)
- || action.equals(Intent.ACTION_PACKAGE_DATA_CLEARED)) {
- remove(packageName);
- }
- }
-
- }
-
- public InterpreterConfiguration(Context context) {
- mContext = context;
- mInterpreterSet = new CopyOnWriteArraySet<Interpreter>();
- mInterpreterSet.add(new ShellInterpreter());
- mObserverSet = new CopyOnWriteArraySet<ConfigurationObserver>();
- IntentFilter filter = new IntentFilter();
- filter.addAction(InterpreterConstants.ACTION_INTERPRETER_ADDED);
- filter.addAction(InterpreterConstants.ACTION_INTERPRETER_REMOVED);
- filter.addAction(Intent.ACTION_PACKAGE_DATA_CLEARED);
- filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
- filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
- filter.addDataScheme("package");
- mListener = new InterpreterListener(mContext);
- mContext.registerReceiver(mListener, filter);
- }
-
- public void startDiscovering() {
- mListener.discoverAll();
- }
-
- public void startDiscovering(String mime) {
- mListener.discoverForType(mime);
- }
-
- public boolean isDiscoveryComplete() {
- return mIsDiscoveryComplete;
- }
-
- public void registerObserver(ConfigurationObserver observer) {
- if (observer != null) {
- mObserverSet.add(observer);
- }
- }
-
- public void unregisterObserver(ConfigurationObserver observer) {
- if (observer != null) {
- mObserverSet.remove(observer);
- }
- }
-
- /**
- * Returns the list of all known interpreters.
- */
- public List<? extends Interpreter> getSupportedInterpreters() {
- return new ArrayList<Interpreter>(mInterpreterSet);
- }
-
- /**
- * Returns the list of all installed interpreters.
- */
- public List<Interpreter> getInstalledInterpreters() {
- List<Interpreter> interpreters = new ArrayList<Interpreter>();
- for (Interpreter i : mInterpreterSet) {
- if (i.isInstalled()) {
- interpreters.add(i);
- }
- }
- return interpreters;
- }
-
- /**
- * Returns the list of interpreters that support interactive mode execution.
- */
- public List<Interpreter> getInteractiveInterpreters() {
- List<Interpreter> interpreters = new ArrayList<Interpreter>();
- for (Interpreter i : mInterpreterSet) {
- if (i.isInstalled() && i.hasInteractiveMode()) {
- interpreters.add(i);
- }
- }
- return interpreters;
- }
-
- /**
- * Returns the interpreter matching the provided name or null if no interpreter was found.
- */
- public Interpreter getInterpreterByName(String interpreterName) {
- for (Interpreter i : mInterpreterSet) {
- if (i.getName().equals(interpreterName)) {
- return i;
- }
- }
- return null;
- }
-
- /**
- * Returns the correct interpreter for the provided script name based on the script's extension or
- * null if no interpreter was found.
- */
- public Interpreter getInterpreterForScript(String scriptName) {
- int dotIndex = scriptName.lastIndexOf('.');
- if (dotIndex == -1) {
- return null;
- }
- String ext = scriptName.substring(dotIndex);
- for (Interpreter i : mInterpreterSet) {
- if (i.getExtension().equals(ext)) {
- return i;
- }
- }
- return null;
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/interpreter/html/HtmlActivityTask.java b/sl4a/Common/src/com/googlecode/android_scripting/interpreter/html/HtmlActivityTask.java
deleted file mode 100644
index fa5d768..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/interpreter/html/HtmlActivityTask.java
+++ /dev/null
@@ -1,385 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.interpreter.html;
-
-import android.app.Activity;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.drawable.BitmapDrawable;
-import android.net.Uri;
-import android.view.ContextMenu;
-import android.view.ContextMenu.ContextMenuInfo;
-import android.view.Menu;
-import android.view.View;
-import android.view.Window;
-import android.webkit.JsPromptResult;
-import android.webkit.JsResult;
-import android.webkit.WebChromeClient;
-import android.webkit.WebView;
-import android.webkit.WebViewClient;
-
-import com.googlecode.android_scripting.FileUtils;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.SingleThreadExecutor;
-import com.googlecode.android_scripting.event.Event;
-import com.googlecode.android_scripting.event.EventObserver;
-import com.googlecode.android_scripting.facade.EventFacade;
-import com.googlecode.android_scripting.facade.ui.UiFacade;
-import com.googlecode.android_scripting.future.FutureActivityTask;
-import com.googlecode.android_scripting.interpreter.InterpreterConstants;
-import com.googlecode.android_scripting.jsonrpc.JsonBuilder;
-import com.googlecode.android_scripting.jsonrpc.JsonRpcResult;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiverManager;
-import com.googlecode.android_scripting.rpc.MethodDescriptor;
-import com.googlecode.android_scripting.rpc.RpcError;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ExecutorService;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-/**
- * @author Alexey Reznichenko (alexey.reznichenko@gmail.com)
- */
-public class HtmlActivityTask extends FutureActivityTask<Void> {
-
- private static final String HTTP = "http";
- private static final String ANDROID_PROTOTYPE_JS =
- "Android.prototype.%1$s = function(var_args) { "
- + "return this._call(\"%1$s\", Array.prototype.slice.call(arguments)); };";
-
- private static final String PREFIX = "file://";
- private static final String BASE_URL = PREFIX + InterpreterConstants.SCRIPTS_ROOT;
-
- private final RpcReceiverManager mReceiverManager;
- private final String mJsonSource;
- private final String mAndroidJsSource;
- private final String mAPIWrapperSource;
- private final String mUrl;
- private final JavaScriptWrapper mWrapper;
- private final HtmlEventObserver mObserver;
- private final UiFacade mUiFacade;
- private ChromeClient mChromeClient;
- private WebView mView;
- private MyWebViewClient mWebViewClient;
- private static HtmlActivityTask reference;
- private boolean mDestroyManager;
-
- public HtmlActivityTask(RpcReceiverManager manager, String androidJsSource, String jsonSource,
- String url, boolean destroyManager) {
- reference = this;
- mReceiverManager = manager;
- mJsonSource = jsonSource;
- mAndroidJsSource = androidJsSource;
- mAPIWrapperSource = generateAPIWrapper();
- mWrapper = new JavaScriptWrapper();
- mObserver = new HtmlEventObserver();
- mReceiverManager.getReceiver(EventFacade.class).addGlobalEventObserver(mObserver);
- mUiFacade = mReceiverManager.getReceiver(UiFacade.class);
- mUrl = url;
- mDestroyManager = destroyManager;
- }
-
- public RpcReceiverManager getRpcReceiverManager() {
- return mReceiverManager;
- }
-
- /*
- * New WebviewClient
- */
- private class MyWebViewClient extends WebViewClient {
- @Override
- public boolean shouldOverrideUrlLoading(WebView view, String url) {
- /*
- * if (Uri.parse(url).getHost().equals("www.example.com")) {
- * // This is my web site, so do not
- * override; let my WebView load the page return false; }
- * // Otherwise, the link is not for a
- * page on my site, so launch another Activity that handles URLs Intent intent = new
- * Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent);
- */
- if (!HTTP.equals(Uri.parse(url).getScheme())) {
- String source = null;
- try {
- source = FileUtils.readToString(new File(Uri.parse(url).getPath()));
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- source =
- "<script>" + mJsonSource + "</script>" + "<script>" + mAndroidJsSource + "</script>"
- + "<script>" + mAPIWrapperSource + "</script>" + source;
- mView.loadDataWithBaseURL(BASE_URL, source, "text/html", "utf-8", null);
- } else {
- mView.loadUrl(url);
- }
- return true;
- }
- }
-
- @Override
- public void onCreate() {
- mView = new WebView(getActivity());
- mView.setId(1);
- mView.getSettings().setJavaScriptEnabled(true);
- mView.addJavascriptInterface(mWrapper, "_rpc_wrapper");
- mView.addJavascriptInterface(new Object() {
-
- @SuppressWarnings("unused")
- public void register(String event, int id) {
- mObserver.register(event, id);
- }
- }, "_callback_wrapper");
-
- getActivity().setContentView(mView);
- mView.setOnCreateContextMenuListener(getActivity());
- mChromeClient = new ChromeClient(getActivity());
- mWebViewClient = new MyWebViewClient();
- mView.setWebChromeClient(mChromeClient);
- mView.setWebViewClient(mWebViewClient);
- mView.loadUrl("javascript:" + mJsonSource);
- mView.loadUrl("javascript:" + mAndroidJsSource);
- mView.loadUrl("javascript:" + mAPIWrapperSource);
- load();
- }
-
- private void load() {
- if (!HTTP.equals(Uri.parse(mUrl).getScheme())) {
- String source = null;
- try {
- source = FileUtils.readToString(new File(Uri.parse(mUrl).getPath()));
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- mView.loadDataWithBaseURL(BASE_URL, source, "text/html", "utf-8", null);
- } else {
- mView.loadUrl(mUrl);
- }
- }
-
- @Override
- public void onDestroy() {
- mReceiverManager.getReceiver(EventFacade.class).removeEventObserver(mObserver);
- if (mDestroyManager) {
- mReceiverManager.shutdown();
- }
- mView.destroy();
- mView = null;
- reference = null;
- setResult(null);
- }
-
- public static void shutdown() {
- if (HtmlActivityTask.reference != null) {
- HtmlActivityTask.reference.finish();
- }
- }
-
- @Override
- public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
- mUiFacade.onCreateContextMenu(menu, v, menuInfo);
- }
-
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- return mUiFacade.onPrepareOptionsMenu(menu);
- }
-
- private String generateAPIWrapper() {
- StringBuilder wrapper = new StringBuilder();
- for (Class<? extends RpcReceiver> clazz : mReceiverManager.getRpcReceiverClasses()) {
- for (MethodDescriptor rpc : MethodDescriptor.collectFrom(clazz)) {
- wrapper.append(String.format(ANDROID_PROTOTYPE_JS, rpc.getName()));
- }
- }
- return wrapper.toString();
- }
-
- private class JavaScriptWrapper {
- @SuppressWarnings("unused")
- public String call(String data) throws JSONException {
- Log.v("Received: " + data);
- JSONObject request = new JSONObject(data);
- int id = request.getInt("id");
- String method = request.getString("method");
- JSONArray params = request.getJSONArray("params");
- MethodDescriptor rpc = mReceiverManager.getMethodDescriptor(method);
- if (rpc == null) {
- return JsonRpcResult.error(id, new RpcError("Unknown RPC.")).toString();
- }
- try {
- return JsonRpcResult.result(id, rpc.invoke(mReceiverManager, params)).toString();
- } catch (Throwable t) {
- Log.e("Invocation error.", t);
- return JsonRpcResult.error(id, t).toString();
- }
- }
-
- @SuppressWarnings("unused")
- public void dismiss() {
- Activity parent = getActivity();
- parent.finish();
- }
- }
-
- private class HtmlEventObserver implements EventObserver {
- private Map<String, Set<Integer>> mEventMap = new HashMap<String, Set<Integer>>();
-
- public void register(String eventName, Integer id) {
- if (mEventMap.containsKey(eventName)) {
- mEventMap.get(eventName).add(id);
- } else {
- Set<Integer> idSet = new HashSet<Integer>();
- idSet.add(id);
- mEventMap.put(eventName, idSet);
- }
- }
-
- @Override
- public void onEventReceived(Event event) {
- final JSONObject json = new JSONObject();
- try {
- json.put("data", JsonBuilder.build(event.getData()));
- } catch (JSONException e) {
- Log.e(e);
- }
- if (mEventMap.containsKey(event.getName())) {
- for (final Integer id : mEventMap.get(event.getName())) {
- getActivity().runOnUiThread(new Runnable() {
- @Override
- public void run() {
- mView.loadUrl(String.format("javascript:droid._callback(%d, %s);", id, json));
- }
- });
- }
- }
- }
-
- @SuppressWarnings("unused")
- public void dismiss() {
- Activity parent = getActivity();
- parent.finish();
- }
- }
-
- private class ChromeClient extends WebChromeClient {
- private final static String JS_TITLE = "JavaScript Dialog";
-
- private final Activity mActivity;
- private final Resources mResources;
- private final ExecutorService mmExecutor;
-
- public ChromeClient(Activity activity) {
- mActivity = activity;
- mResources = mActivity.getResources();
- mmExecutor = new SingleThreadExecutor();
- }
-
- @Override
- public void onReceivedTitle(WebView view, String title) {
- mActivity.setTitle(title);
- }
-
- @Override
- public void onReceivedIcon(WebView view, Bitmap icon) {
- mActivity.getWindow().requestFeature(Window.FEATURE_RIGHT_ICON);
- mActivity.getWindow().setFeatureDrawable(Window.FEATURE_RIGHT_ICON,
- new BitmapDrawable(mActivity.getResources(), icon));
- }
-
- @Override
- public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
- final UiFacade uiFacade = mReceiverManager.getReceiver(UiFacade.class);
- uiFacade.dialogCreateAlert(JS_TITLE, message);
- uiFacade.dialogSetPositiveButtonText(mResources.getString(android.R.string.ok));
-
- mmExecutor.execute(new Runnable() {
-
- @Override
- public void run() {
- try {
- uiFacade.dialogShow();
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- uiFacade.dialogGetResponse();
- result.confirm();
- }
- });
- return true;
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {
- final UiFacade uiFacade = mReceiverManager.getReceiver(UiFacade.class);
- uiFacade.dialogCreateAlert(JS_TITLE, message);
- uiFacade.dialogSetPositiveButtonText(mResources.getString(android.R.string.ok));
- uiFacade.dialogSetNegativeButtonText(mResources.getString(android.R.string.cancel));
-
- mmExecutor.execute(new Runnable() {
-
- @Override
- public void run() {
- try {
- uiFacade.dialogShow();
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- Map<String, Object> mResultMap = (Map<String, Object>) uiFacade.dialogGetResponse();
- if ("positive".equals(mResultMap.get("which"))) {
- result.confirm();
- } else {
- result.cancel();
- }
- }
- });
-
- return true;
- }
-
- @Override
- public boolean onJsPrompt(WebView view, String url, final String message,
- final String defaultValue, final JsPromptResult result) {
- final UiFacade uiFacade = mReceiverManager.getReceiver(UiFacade.class);
- mmExecutor.execute(new Runnable() {
- @Override
- public void run() {
- String value = null;
- try {
- value = uiFacade.dialogGetInput(JS_TITLE, message, defaultValue);
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- if (value != null) {
- result.confirm(value);
- } else {
- result.cancel();
- }
- }
- });
- return true;
- }
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/interpreter/shell/ShellInterpreter.java b/sl4a/Common/src/com/googlecode/android_scripting/interpreter/shell/ShellInterpreter.java
deleted file mode 100644
index a1f11ff..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/interpreter/shell/ShellInterpreter.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.interpreter.shell;
-
-import com.googlecode.android_scripting.interpreter.Interpreter;
-import com.googlecode.android_scripting.language.ShellLanguage;
-
-import java.io.File;
-
-/**
- * Represents the shell.
- *
- * @author Damon Kohler (damonkohler@gmail.com)
- */
-public class ShellInterpreter extends Interpreter {
- private final static String SHELL_BIN = "/system/bin/sh";
-
- public ShellInterpreter() {
- setExtension(".sh");
- setName("sh");
- setNiceName("Shell");
- setBinary(new File(SHELL_BIN));
- setInteractiveCommand("");
- setScriptCommand("%s");
- setLanguage(new ShellLanguage());
- setHasInteractiveMode(true);
- }
-
- public boolean hasInterpreterArchive() {
- return false;
- }
-
- public boolean hasExtrasArchive() {
- return false;
- }
-
- public boolean hasScriptsArchive() {
- return false;
- }
-
- public int getVersion() {
- return 0;
- }
-
- @Override
- public boolean isUninstallable() {
- return false;
- }
-
- @Override
- public boolean isInstalled() {
- return true;
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonBuilder.java b/sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonBuilder.java
deleted file mode 100644
index 24428a4..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonBuilder.java
+++ /dev/null
@@ -1,1188 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.jsonrpc;
-
-import java.io.IOException;
-import java.net.HttpURLConnection;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.URL;
-import java.security.PrivateKey;
-import java.security.cert.CertificateEncodingException;
-import java.security.cert.X509Certificate;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-import org.apache.commons.codec.binary.Base64Codec;
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothGattCharacteristic;
-import android.bluetooth.BluetoothGattDescriptor;
-import android.bluetooth.BluetoothGattService;
-import android.bluetooth.le.AdvertiseSettings;
-import android.content.ComponentName;
-import android.content.Intent;
-import android.graphics.Point;
-import android.location.Address;
-import android.location.Location;
-import android.net.DhcpInfo;
-import android.net.Network;
-import android.net.NetworkInfo;
-import android.net.Uri;
-import android.net.wifi.RttManager.RttCapabilities;
-import android.net.wifi.ScanResult;
-import android.net.wifi.WifiActivityEnergyInfo;
-import android.net.wifi.WifiChannel;
-import android.net.wifi.WifiConfiguration;
-import android.net.wifi.WifiEnterpriseConfig;
-import android.net.wifi.WifiInfo;
-import android.net.wifi.WifiScanner.ScanData;
-import android.net.wifi.p2p.WifiP2pDevice;
-import android.net.wifi.p2p.WifiP2pGroup;
-import android.net.wifi.p2p.WifiP2pInfo;
-import android.os.Bundle;
-import android.os.ParcelUuid;
-import android.telecom.Call;
-import android.telecom.CallAudioState;
-import android.telecom.PhoneAccount;
-import android.telecom.PhoneAccountHandle;
-import android.telecom.VideoProfile;
-import android.telecom.VideoProfile.CameraCapabilities;
-import android.telephony.CellIdentityCdma;
-import android.telephony.CellIdentityGsm;
-import android.telephony.CellIdentityLte;
-import android.telephony.CellIdentityWcdma;
-import android.telephony.CellInfoCdma;
-import android.telephony.CellInfoGsm;
-import android.telephony.CellInfoLte;
-import android.telephony.CellInfoWcdma;
-import android.telephony.CellLocation;
-import android.telephony.CellSignalStrengthCdma;
-import android.telephony.CellSignalStrengthGsm;
-import android.telephony.CellSignalStrengthLte;
-import android.telephony.CellSignalStrengthWcdma;
-import android.telephony.ModemActivityInfo;
-import android.telephony.NeighboringCellInfo;
-import android.telephony.SmsMessage;
-import android.telephony.SignalStrength;
-import android.telephony.SubscriptionInfo;
-import android.telephony.gsm.GsmCellLocation;
-import android.telephony.VoLteServiceState;
-import android.util.Base64;
-import android.util.DisplayMetrics;
-import android.util.SparseArray;
-
-import com.googlecode.android_scripting.ConvertUtils;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.event.Event;
-//FIXME: Refactor classes, constants and conversions out of here
-import com.googlecode.android_scripting.facade.telephony.InCallServiceImpl;
-import com.googlecode.android_scripting.facade.telephony.TelephonyUtils;
-import com.googlecode.android_scripting.facade.telephony.TelephonyConstants;
-
-public class JsonBuilder {
-
- @SuppressWarnings("unchecked")
- public static Object build(Object data) throws JSONException {
- if (data == null) {
- return JSONObject.NULL;
- }
- if (data instanceof Integer) {
- return data;
- }
- if (data instanceof Float) {
- return data;
- }
- if (data instanceof Double) {
- return data;
- }
- if (data instanceof Long) {
- return data;
- }
- if (data instanceof String) {
- return data;
- }
- if (data instanceof Boolean) {
- return data;
- }
- if (data instanceof JsonSerializable) {
- return ((JsonSerializable)data).toJSON();
- }
- if (data instanceof JSONObject) {
- return data;
- }
- if (data instanceof JSONArray) {
- return data;
- }
- if (data instanceof Set<?>) {
- List<Object> items = new ArrayList<Object>((Set<?>) data);
- return buildJsonList(items);
- }
- if (data instanceof Collection<?>) {
- List<Object> items = new ArrayList<Object>((Collection<?>) data);
- return buildJsonList(items);
- }
- if (data instanceof List<?>) {
- return buildJsonList((List<?>) data);
- }
- if (data instanceof Address) {
- return buildJsonAddress((Address) data);
- }
- if (data instanceof CallAudioState) {
- return buildJsonAudioState((CallAudioState) data);
- }
- if (data instanceof Location) {
- return buildJsonLocation((Location) data);
- }
- if (data instanceof Bundle) {
- return buildJsonBundle((Bundle) data);
- }
- if (data instanceof Intent) {
- return buildJsonIntent((Intent) data);
- }
- if (data instanceof Event) {
- return buildJsonEvent((Event) data);
- }
- if (data instanceof Map<?, ?>) {
- // TODO(damonkohler): I would like to make this a checked cast if
- // possible.
- return buildJsonMap((Map<String, ?>) data);
- }
- if (data instanceof ParcelUuid) {
- return data.toString();
- }
- if (data instanceof ScanResult) {
- return buildJsonScanResult((ScanResult) data);
- }
- if (data instanceof ScanData) {
- return buildJsonScanData((ScanData) data);
- }
- if (data instanceof android.bluetooth.le.ScanResult) {
- return buildJsonBleScanResult((android.bluetooth.le.ScanResult) data);
- }
- if (data instanceof AdvertiseSettings) {
- return buildJsonBleAdvertiseSettings((AdvertiseSettings) data);
- }
- if (data instanceof BluetoothGattService) {
- return buildJsonBluetoothGattService((BluetoothGattService) data);
- }
- if (data instanceof BluetoothGattCharacteristic) {
- return buildJsonBluetoothGattCharacteristic((BluetoothGattCharacteristic) data);
- }
- if (data instanceof BluetoothGattDescriptor) {
- return buildJsonBluetoothGattDescriptor((BluetoothGattDescriptor) data);
- }
- if (data instanceof BluetoothDevice) {
- return buildJsonBluetoothDevice((BluetoothDevice) data);
- }
- if (data instanceof CellLocation) {
- return buildJsonCellLocation((CellLocation) data);
- }
- if (data instanceof WifiInfo) {
- return buildJsonWifiInfo((WifiInfo) data);
- }
- if (data instanceof NeighboringCellInfo) {
- return buildNeighboringCellInfo((NeighboringCellInfo) data);
- }
- if (data instanceof Network) {
- return buildNetwork((Network) data);
- }
- if (data instanceof NetworkInfo) {
- return buildNetworkInfo((NetworkInfo) data);
- }
- if (data instanceof HttpURLConnection) {
- return buildHttpURLConnection((HttpURLConnection) data);
- }
- if (data instanceof InetSocketAddress) {
- return buildInetSocketAddress((InetSocketAddress) data);
- }
- if (data instanceof InetAddress) {
- return buildInetAddress((InetAddress) data);
- }
- if (data instanceof URL) {
- return buildURL((URL) data);
- }
- if (data instanceof Point) {
- return buildPoint((Point) data);
- }
- if (data instanceof SmsMessage) {
- return buildSmsMessage((SmsMessage) data);
- }
- if (data instanceof PhoneAccount) {
- return buildPhoneAccount((PhoneAccount) data);
- }
- if (data instanceof PhoneAccountHandle) {
- return buildPhoneAccountHandle((PhoneAccountHandle) data);
- }
- if (data instanceof SubscriptionInfo) {
- return buildSubscriptionInfoRecord((SubscriptionInfo) data);
- }
- if (data instanceof DhcpInfo) {
- return buildDhcpInfo((DhcpInfo) data);
- }
- if (data instanceof DisplayMetrics) {
- return buildDisplayMetrics((DisplayMetrics) data);
- }
- if (data instanceof RttCapabilities) {
- return buildRttCapabilities((RttCapabilities) data);
- }
- if (data instanceof WifiActivityEnergyInfo) {
- return buildWifiActivityEnergyInfo((WifiActivityEnergyInfo) data);
- }
- if (data instanceof WifiChannel) {
- return buildWifiChannel((WifiChannel) data);
- }
- if (data instanceof WifiConfiguration) {
- return buildWifiConfiguration((WifiConfiguration) data);
- }
- if (data instanceof WifiP2pDevice) {
- return buildWifiP2pDevice((WifiP2pDevice) data);
- }
- if (data instanceof WifiP2pInfo) {
- return buildWifiP2pInfo((WifiP2pInfo) data);
- }
- if (data instanceof WifiP2pGroup) {
- return buildWifiP2pGroup((WifiP2pGroup) data);
- }
- if (data instanceof byte[]) {
- return Base64Codec.encodeBase64((byte[]) data);
- }
- if (data instanceof Object[]) {
- return buildJSONArray((Object[]) data);
- }
- if (data instanceof CellInfoLte) {
- return buildCellInfoLte((CellInfoLte) data);
- }
- if (data instanceof CellInfoWcdma) {
- return buildCellInfoWcdma((CellInfoWcdma) data);
- }
- if (data instanceof CellInfoGsm) {
- return buildCellInfoGsm((CellInfoGsm) data);
- }
- if (data instanceof CellInfoCdma) {
- return buildCellInfoCdma((CellInfoCdma) data);
- }
- if (data instanceof Call) {
- return buildCall((Call) data);
- }
- if (data instanceof Call.Details) {
- return buildCallDetails((Call.Details) data);
- }
- if (data instanceof InCallServiceImpl.CallEvent<?>) {
- return buildCallEvent((InCallServiceImpl.CallEvent<?>) data);
- }
- if (data instanceof VideoProfile) {
- return buildVideoProfile((VideoProfile) data);
- }
- if (data instanceof CameraCapabilities) {
- return buildCameraCapabilities((CameraCapabilities) data);
- }
- if (data instanceof VoLteServiceState) {
- return buildVoLteServiceStateEvent((VoLteServiceState) data);
- }
- if (data instanceof ModemActivityInfo) {
- return buildModemActivityInfo((ModemActivityInfo) data);
- }
- if (data instanceof SignalStrength) {
- return buildSignalStrength((SignalStrength) data);
- }
-
-
- return data.toString();
- // throw new JSONException("Failed to build JSON result. " +
- // data.getClass().getName());
- }
-
- private static JSONObject buildJsonAudioState(CallAudioState data)
- throws JSONException {
- JSONObject state = new JSONObject();
- state.put("isMuted", data.isMuted());
- state.put("AudioRoute", InCallServiceImpl.getAudioRouteString(data.getRoute()));
- return state;
- }
-
- private static Object buildDisplayMetrics(DisplayMetrics data)
- throws JSONException {
- JSONObject dm = new JSONObject();
- dm.put("widthPixels", data.widthPixels);
- dm.put("heightPixels", data.heightPixels);
- dm.put("noncompatHeightPixels", data.noncompatHeightPixels);
- dm.put("noncompatWidthPixels", data.noncompatWidthPixels);
- return dm;
- }
-
- private static Object buildInetAddress(InetAddress data) {
- JSONArray address = new JSONArray();
- address.put(data.getHostName());
- address.put(data.getHostAddress());
- return address;
- }
-
- private static Object buildInetSocketAddress(InetSocketAddress data) {
- JSONArray address = new JSONArray();
- address.put(data.getHostName());
- address.put(data.getPort());
- return address;
- }
-
- private static JSONObject buildJsonAddress(Address address)
- throws JSONException {
- JSONObject result = new JSONObject();
- result.put("admin_area", address.getAdminArea());
- result.put("country_code", address.getCountryCode());
- result.put("country_name", address.getCountryName());
- result.put("feature_name", address.getFeatureName());
- result.put("phone", address.getPhone());
- result.put("locality", address.getLocality());
- result.put("postal_code", address.getPostalCode());
- result.put("sub_admin_area", address.getSubAdminArea());
- result.put("thoroughfare", address.getThoroughfare());
- result.put("url", address.getUrl());
- return result;
- }
-
- private static JSONArray buildJSONArray(Object[] data) throws JSONException {
- JSONArray result = new JSONArray();
- for (Object o : data) {
- result.put(build(o));
- }
- return result;
- }
-
- private static JSONObject buildJsonBleAdvertiseSettings(
- AdvertiseSettings advertiseSettings) throws JSONException {
- JSONObject result = new JSONObject();
- result.put("mode", advertiseSettings.getMode());
- result.put("txPowerLevel", advertiseSettings.getTxPowerLevel());
- result.put("isConnectable", advertiseSettings.isConnectable());
- return result;
- }
-
- private static JSONObject buildJsonBleScanResult(
- android.bluetooth.le.ScanResult scanResult) throws JSONException {
- JSONObject result = new JSONObject();
- result.put("rssi", scanResult.getRssi());
- result.put("timestampNanos", scanResult.getTimestampNanos());
- result.put("deviceName", scanResult.getScanRecord().getDeviceName());
- result.put("txPowerLevel", scanResult.getScanRecord().getTxPowerLevel());
- result.put("advertiseFlags", scanResult.getScanRecord()
- .getAdvertiseFlags());
- ArrayList<String> manufacturerDataList = new ArrayList<String>();
- ArrayList<Integer> idList = new ArrayList<Integer>();
- if (scanResult.getScanRecord().getManufacturerSpecificData() != null) {
- SparseArray<byte[]> manufacturerSpecificData = scanResult
- .getScanRecord().getManufacturerSpecificData();
- for (int i = 0; i < manufacturerSpecificData.size(); i++) {
- manufacturerDataList.add(ConvertUtils
- .convertByteArrayToString(manufacturerSpecificData
- .valueAt(i)));
- idList.add(manufacturerSpecificData.keyAt(i));
- }
- }
- result.put("manufacturerSpecificDataList", manufacturerDataList);
- result.put("manufacturereIdList", idList);
- ArrayList<String> serviceUuidList = new ArrayList<String>();
- ArrayList<String> serviceDataList = new ArrayList<String>();
- if (scanResult.getScanRecord().getServiceData() != null) {
- Map<ParcelUuid, byte[]> serviceDataMap = scanResult.getScanRecord()
- .getServiceData();
- for (ParcelUuid serviceUuid : serviceDataMap.keySet()) {
- serviceUuidList.add(serviceUuid.toString());
- serviceDataList.add(ConvertUtils
- .convertByteArrayToString(serviceDataMap
- .get(serviceUuid)));
- }
- }
- result.put("serviceUuidList", serviceUuidList);
- result.put("serviceDataList", serviceDataList);
- List<ParcelUuid> serviceUuids = scanResult.getScanRecord()
- .getServiceUuids();
- String serviceUuidsString = "";
- if (serviceUuids != null && serviceUuids.size() > 0) {
- for (ParcelUuid uuid : serviceUuids) {
- serviceUuidsString = serviceUuidsString + "," + uuid;
- }
- }
- result.put("serviceUuids", serviceUuidsString);
- result.put("scanRecord",
- build(ConvertUtils.convertByteArrayToString(scanResult
- .getScanRecord().getBytes())));
- result.put("deviceInfo", build(scanResult.getDevice()));
- return result;
- }
-
- private static JSONObject buildJsonBluetoothDevice(BluetoothDevice data)
- throws JSONException {
- JSONObject deviceInfo = new JSONObject();
- deviceInfo.put("address", data.getAddress());
- deviceInfo.put("state", data.getBondState());
- deviceInfo.put("name", data.getName());
- deviceInfo.put("type", data.getType());
- return deviceInfo;
- }
-
- private static Object buildJsonBluetoothGattCharacteristic(
- BluetoothGattCharacteristic data) throws JSONException {
- JSONObject result = new JSONObject();
- result.put("instanceId", data.getInstanceId());
- result.put("permissions", data.getPermissions());
- result.put("properties", data.getProperties());
- result.put("writeType", data.getWriteType());
- result.put("descriptorsList", build(data.getDescriptors()));
- result.put("uuid", data.getUuid().toString());
- result.put("value", build(data.getValue()));
-
- return result;
- }
-
- private static Object buildJsonBluetoothGattDescriptor(
- BluetoothGattDescriptor data) throws JSONException {
- JSONObject result = new JSONObject();
- result.put("instanceId", data.getInstanceId());
- result.put("permissions", data.getPermissions());
- result.put("characteristic", data.getCharacteristic());
- result.put("uuid", data.getUuid().toString());
- result.put("value", build(data.getValue()));
- return result;
- }
-
- private static Object buildJsonBluetoothGattService(
- BluetoothGattService data) throws JSONException {
- JSONObject result = new JSONObject();
- result.put("instanceId", data.getInstanceId());
- result.put("type", data.getType());
- result.put("gattCharacteristicList", build(data.getCharacteristics()));
- result.put("includedServices", build(data.getIncludedServices()));
- result.put("uuid", data.getUuid().toString());
- return result;
- }
-
- private static JSONObject buildJsonBundle(Bundle bundle)
- throws JSONException {
- JSONObject result = new JSONObject();
- for (String key : bundle.keySet()) {
- result.put(key, build(bundle.get(key)));
- }
- return result;
- }
-
- private static JSONObject buildJsonCellLocation(CellLocation cellLocation)
- throws JSONException {
- JSONObject result = new JSONObject();
- if (cellLocation instanceof GsmCellLocation) {
- GsmCellLocation location = (GsmCellLocation) cellLocation;
- result.put("lac", location.getLac());
- result.put("cid", location.getCid());
- }
- // TODO(damonkohler): Add support for CdmaCellLocation. Not supported
- // until API level 5.
- return result;
- }
-
- private static JSONObject buildDhcpInfo(DhcpInfo data) throws JSONException {
- JSONObject result = new JSONObject();
- result.put("ipAddress", data.ipAddress);
- result.put("dns1", data.dns1);
- result.put("dns2", data.dns2);
- result.put("gateway", data.gateway);
- result.put("serverAddress", data.serverAddress);
- result.put("leaseDuration", data.leaseDuration);
- return result;
- }
-
- private static JSONObject buildJsonEvent(Event event) throws JSONException {
- JSONObject result = new JSONObject();
- result.put("name", event.getName());
- result.put("data", build(event.getData()));
- result.put("time", event.getCreationTime());
- return result;
- }
-
- private static JSONObject buildJsonIntent(Intent data) throws JSONException {
- JSONObject result = new JSONObject();
- result.put("data", data.getDataString());
- result.put("type", data.getType());
- result.put("extras", build(data.getExtras()));
- result.put("categories", build(data.getCategories()));
- result.put("action", data.getAction());
- ComponentName component = data.getComponent();
- if (component != null) {
- result.put("packagename", component.getPackageName());
- result.put("classname", component.getClassName());
- }
- result.put("flags", data.getFlags());
- return result;
- }
-
- private static <T> JSONArray buildJsonList(final List<T> list)
- throws JSONException {
- JSONArray result = new JSONArray();
- for (T item : list) {
- result.put(build(item));
- }
- return result;
- }
-
- private static JSONObject buildJsonLocation(Location location)
- throws JSONException {
- JSONObject result = new JSONObject();
- result.put("altitude", location.getAltitude());
- result.put("latitude", location.getLatitude());
- result.put("longitude", location.getLongitude());
- result.put("time", location.getTime());
- result.put("accuracy", location.getAccuracy());
- result.put("speed", location.getSpeed());
- result.put("provider", location.getProvider());
- result.put("bearing", location.getBearing());
- return result;
- }
-
- private static JSONObject buildJsonMap(Map<String, ?> map)
- throws JSONException {
- JSONObject result = new JSONObject();
- for (Entry<String, ?> entry : map.entrySet()) {
- String key = entry.getKey();
- if (key == null) {
- key = "";
- }
- result.put(key, build(entry.getValue()));
- }
- return result;
- }
-
- private static JSONObject buildJsonScanResult(ScanResult scanResult)
- throws JSONException {
- JSONObject result = new JSONObject();
- result.put("BSSID", scanResult.BSSID);
- result.put("SSID", scanResult.SSID);
- result.put("frequency", scanResult.frequency);
- result.put("level", scanResult.level);
- result.put("capabilities", scanResult.capabilities);
- result.put("timestamp", scanResult.timestamp);
- result.put("autoJoinStatus", scanResult.autoJoinStatus);
- result.put("blackListTimestamp", scanResult.blackListTimestamp);
- result.put("centerFreq0", scanResult.centerFreq0);
- result.put("centerFreq1", scanResult.centerFreq1);
- result.put("channelWidth", scanResult.channelWidth);
- result.put("distanceCm", scanResult.distanceCm);
- result.put("distanceSdCm", scanResult.distanceSdCm);
- result.put("is80211McRTTResponder", scanResult.is80211mcResponder());
- result.put("isAutoJoinCandidate", scanResult.isAutoJoinCandidate);
- result.put("numConnection", scanResult.numConnection);
- result.put("passpointNetwork", scanResult.isPasspointNetwork());
- result.put("numIpConfigFailures", scanResult.numIpConfigFailures);
- result.put("numUsage", scanResult.numUsage);
- result.put("seen", scanResult.seen);
- result.put("untrusted", scanResult.untrusted);
- result.put("operatorFriendlyName", scanResult.operatorFriendlyName);
- result.put("venueName", scanResult.venueName);
- if (scanResult.informationElements != null) {
- JSONArray infoEles = new JSONArray();
- for (ScanResult.InformationElement ie : scanResult.informationElements) {
- JSONObject infoEle = new JSONObject();
- infoEle.put("id", ie.id);
- infoEle.put("bytes", Base64Codec.encodeBase64(ie.bytes).toString());
- infoEles.put(infoEle);
- }
- result.put("InfomationElements", infoEles);
- } else {
- result.put("InfomationElements", null);
- }
- return result;
- }
-
- private static JSONObject buildJsonScanData(ScanData scanData)
- throws JSONException {
- JSONObject result = new JSONObject();
- result.put("Id", scanData.getId());
- result.put("Flags", scanData.getFlags());
- JSONArray scanResults = new JSONArray();
- for (ScanResult sr : scanData.getResults()) {
- scanResults.put(buildJsonScanResult(sr));
- }
- result.put("ScanResults", scanResults);
- return result;
- }
-
- private static JSONObject buildJsonWifiInfo(WifiInfo data)
- throws JSONException {
- JSONObject result = new JSONObject();
- result.put("hidden_ssid", data.getHiddenSSID());
- result.put("ip_address", data.getIpAddress());
- result.put("link_speed", data.getLinkSpeed());
- result.put("network_id", data.getNetworkId());
- result.put("rssi", data.getRssi());
- result.put("BSSID", data.getBSSID());
- result.put("mac_address", data.getMacAddress());
- // Trim the double quotes if exist
- String ssid = data.getSSID();
- if (ssid.charAt(0) == '"'
- && ssid.charAt(ssid.length() - 1) == '"') {
- result.put("SSID", ssid.substring(1, ssid.length() - 1));
- } else {
- result.put("SSID", ssid);
- }
- String supplicantState = "";
- switch (data.getSupplicantState()) {
- case ASSOCIATED:
- supplicantState = "associated";
- break;
- case ASSOCIATING:
- supplicantState = "associating";
- break;
- case COMPLETED:
- supplicantState = "completed";
- break;
- case DISCONNECTED:
- supplicantState = "disconnected";
- break;
- case DORMANT:
- supplicantState = "dormant";
- break;
- case FOUR_WAY_HANDSHAKE:
- supplicantState = "four_way_handshake";
- break;
- case GROUP_HANDSHAKE:
- supplicantState = "group_handshake";
- break;
- case INACTIVE:
- supplicantState = "inactive";
- break;
- case INVALID:
- supplicantState = "invalid";
- break;
- case SCANNING:
- supplicantState = "scanning";
- break;
- case UNINITIALIZED:
- supplicantState = "uninitialized";
- break;
- default:
- supplicantState = null;
- }
- result.put("supplicant_state", build(supplicantState));
- result.put("is_5ghz", data.is5GHz());
- result.put("is_24ghz", data.is24GHz());
- return result;
- }
-
- private static JSONObject buildNeighboringCellInfo(NeighboringCellInfo data)
- throws JSONException {
- JSONObject result = new JSONObject();
- result.put("cid", data.getCid());
- result.put("rssi", data.getRssi());
- result.put("lac", data.getLac());
- result.put("psc", data.getPsc());
- String networkType =
- TelephonyUtils.getNetworkTypeString(data.getNetworkType());
- result.put("network_type", build(networkType));
- return result;
- }
-
- private static JSONObject buildCellInfoLte(CellInfoLte data)
- throws JSONException {
- JSONObject result = new JSONObject();
- result.put("rat", "lte");
- result.put("registered", data.isRegistered());
- CellIdentityLte cellidentity =
- ((CellInfoLte) data).getCellIdentity();
- CellSignalStrengthLte signalstrength =
- ((CellInfoLte) data).getCellSignalStrength();
- result.put("mcc", cellidentity.getMcc());
- result.put("mnc", cellidentity.getMnc());
- result.put("cid", cellidentity.getCi());
- result.put("pcid", cellidentity.getPci());
- result.put("tac", cellidentity.getTac());
- result.put("rsrp", signalstrength.getDbm());
- result.put("asulevel", signalstrength.getAsuLevel());
- result.put("timing_advance", signalstrength.getTimingAdvance());
- return result;
- }
-
- private static JSONObject buildCellInfoGsm(CellInfoGsm data)
- throws JSONException {
- JSONObject result = new JSONObject();
- result.put("rat", "gsm");
- result.put("registered", data.isRegistered());
- CellIdentityGsm cellidentity =
- ((CellInfoGsm) data).getCellIdentity();
- CellSignalStrengthGsm signalstrength =
- ((CellInfoGsm) data).getCellSignalStrength();
- result.put("mcc", cellidentity.getMcc());
- result.put("mnc", cellidentity.getMnc());
- result.put("cid", cellidentity.getCid());
- result.put("lac", cellidentity.getLac());
- result.put("signal_strength", signalstrength.getDbm());
- result.put("asulevel", signalstrength.getAsuLevel());
- return result;
- }
-
- private static JSONObject buildCellInfoWcdma(CellInfoWcdma data)
- throws JSONException {
- JSONObject result = new JSONObject();
- result.put("rat", "wcdma");
- result.put("registered", data.isRegistered());
- CellIdentityWcdma cellidentity =
- ((CellInfoWcdma) data).getCellIdentity();
- CellSignalStrengthWcdma signalstrength =
- ((CellInfoWcdma) data).getCellSignalStrength();
- result.put("mcc", cellidentity.getMcc());
- result.put("mnc", cellidentity.getMnc());
- result.put("cid", cellidentity.getCid());
- result.put("lac", cellidentity.getLac());
- result.put("psc", cellidentity.getPsc());
- result.put("signal_strength", signalstrength.getDbm());
- result.put("asulevel", signalstrength.getAsuLevel());
- return result;
- }
-
- private static JSONObject buildCellInfoCdma(CellInfoCdma data)
- throws JSONException {
- JSONObject result = new JSONObject();
- result.put("rat", "cdma");
- result.put("registered", data.isRegistered());
- CellIdentityCdma cellidentity =
- ((CellInfoCdma) data).getCellIdentity();
- CellSignalStrengthCdma signalstrength =
- ((CellInfoCdma) data).getCellSignalStrength();
- result.put("network_id", cellidentity.getNetworkId());
- result.put("system_id", cellidentity.getSystemId());
- result.put("basestation_id", cellidentity.getBasestationId());
- result.put("longitude", cellidentity.getLongitude());
- result.put("latitude", cellidentity.getLatitude());
- result.put("cdma_dbm", signalstrength.getCdmaDbm());
- result.put("cdma_ecio", signalstrength.getCdmaEcio());
- result.put("evdo_dbm", signalstrength.getEvdoDbm());
- result.put("evdo_ecio", signalstrength.getEvdoEcio());
- result.put("evdo_snr", signalstrength.getEvdoSnr());
- return result;
- }
-
- private static Object buildHttpURLConnection(HttpURLConnection data)
- throws JSONException {
- JSONObject con = new JSONObject();
- try {
- con.put("ResponseCode", data.getResponseCode());
- con.put("ResponseMessage", data.getResponseMessage());
- } catch (IOException e) {
- e.printStackTrace();
- return con;
- }
- con.put("ContentLength", data.getContentLength());
- con.put("ContentEncoding", data.getContentEncoding());
- con.put("ContentType", data.getContentType());
- con.put("Date", data.getDate());
- con.put("ReadTimeout", data.getReadTimeout());
- con.put("HeaderFields", buildJsonMap(data.getHeaderFields()));
- con.put("URL", buildURL(data.getURL()));
- return con;
- }
-
- private static Object buildNetwork(Network data) throws JSONException {
- JSONObject nw = new JSONObject();
- nw.put("netId", data.netId);
- return nw;
- }
-
- private static Object buildNetworkInfo(NetworkInfo data)
- throws JSONException {
- JSONObject info = new JSONObject();
- info.put("isAvailable", data.isAvailable());
- info.put("isConnected", data.isConnected());
- info.put("isFailover", data.isFailover());
- info.put("isRoaming", data.isRoaming());
- info.put("ExtraInfo", data.getExtraInfo());
- info.put("FailedReason", data.getReason());
- info.put("TypeName", data.getTypeName());
- info.put("SubtypeName", data.getSubtypeName());
- info.put("State", data.getState().name().toString());
- return info;
- }
-
- private static Object buildURL(URL data) throws JSONException {
- JSONObject url = new JSONObject();
- url.put("Authority", data.getAuthority());
- url.put("Host", data.getHost());
- url.put("Path", data.getPath());
- url.put("Port", data.getPort());
- url.put("Protocol", data.getProtocol());
- return url;
- }
-
- private static JSONObject buildPhoneAccount(PhoneAccount data)
- throws JSONException {
- JSONObject acct = new JSONObject();
- acct.put("Address", data.getAddress().toSafeString());
- acct.put("SubscriptionAddress", data.getSubscriptionAddress()
- .toSafeString());
- acct.put("Label", ((data.getLabel() != null) ? data.getLabel().toString() : ""));
- acct.put("ShortDescription", ((data.getShortDescription() != null) ? data
- .getShortDescription().toString() : ""));
- return acct;
- }
-
- private static Object buildPhoneAccountHandle(PhoneAccountHandle data)
- throws JSONException {
- JSONObject msg = new JSONObject();
- msg.put("id", data.getId());
- msg.put("ComponentName", data.getComponentName().flattenToString());
- return msg;
- }
-
- private static Object buildSubscriptionInfoRecord(SubscriptionInfo data)
- throws JSONException {
- JSONObject msg = new JSONObject();
- msg.put("subscriptionId", data.getSubscriptionId());
- msg.put("iccId", data.getIccId());
- msg.put("simSlotIndex", data.getSimSlotIndex());
- msg.put("displayName", data.getDisplayName());
- msg.put("nameSource", data.getNameSource());
- msg.put("iconTint", data.getIconTint());
- msg.put("number", data.getNumber());
- msg.put("dataRoaming", data.getDataRoaming());
- msg.put("mcc", data.getMcc());
- msg.put("mnc", data.getMnc());
- return msg;
- }
-
- private static Object buildPoint(Point data) throws JSONException {
- JSONObject point = new JSONObject();
- point.put("x", data.x);
- point.put("y", data.y);
- return point;
- }
-
- private static Object buildRttCapabilities(RttCapabilities data)
- throws JSONException {
- JSONObject cap = new JSONObject();
- cap.put("bwSupported", data.bwSupported);
- cap.put("lciSupported", data.lciSupported);
- cap.put("lcrSupported", data.lcrSupported);
- cap.put("oneSidedRttSupported", data.oneSidedRttSupported);
- cap.put("preambleSupported", data.preambleSupported);
- cap.put("twoSided11McRttSupported", data.twoSided11McRttSupported);
- return cap;
- }
-
- private static Object buildSmsMessage(SmsMessage data) throws JSONException {
- JSONObject msg = new JSONObject();
- msg.put("originatingAddress", data.getOriginatingAddress());
- msg.put("messageBody", data.getMessageBody());
- return msg;
- }
-
- private static JSONObject buildWifiActivityEnergyInfo(
- WifiActivityEnergyInfo data) throws JSONException {
- JSONObject result = new JSONObject();
- result.put("ControllerEnergyUsed", data.getControllerEnergyUsed());
- result.put("ControllerIdleTimeMillis",
- data.getControllerIdleTimeMillis());
- result.put("ControllerRxTimeMillis", data.getControllerRxTimeMillis());
- result.put("ControllerTxTimeMillis", data.getControllerTxTimeMillis());
- result.put("StackState", data.getStackState());
- result.put("TimeStamp", data.getTimeStamp());
- return result;
- }
-
- private static Object buildWifiChannel(WifiChannel data) throws JSONException {
- JSONObject channel = new JSONObject();
- channel.put("channelNum", data.channelNum);
- channel.put("freqMHz", data.freqMHz);
- channel.put("isDFS", data.isDFS);
- channel.put("isValid", data.isValid());
- return channel;
- }
-
- private static Object buildWifiConfiguration(WifiConfiguration data)
- throws JSONException {
- JSONObject config = new JSONObject();
- config.put("networkId", data.networkId);
- // Trim the double quotes if exist
- if (data.SSID.charAt(0) == '"'
- && data.SSID.charAt(data.SSID.length() - 1) == '"') {
- config.put("SSID", data.SSID.substring(1, data.SSID.length() - 1));
- } else {
- config.put("SSID", data.SSID);
- }
- config.put("BSSID", data.BSSID);
- config.put("priority", data.priority);
- config.put("hiddenSSID", data.hiddenSSID);
- config.put("FQDN", data.FQDN);
- config.put("providerFriendlyName", data.providerFriendlyName);
- config.put("isPasspoint", data.isPasspoint());
- config.put("hiddenSSID", data.hiddenSSID);
- if (data.status == WifiConfiguration.Status.CURRENT) {
- config.put("status", "CURRENT");
- } else if (data.status == WifiConfiguration.Status.DISABLED) {
- config.put("status", "DISABLED");
- } else if (data.status == WifiConfiguration.Status.ENABLED) {
- config.put("status", "ENABLED");
- } else {
- config.put("status", "UNKNOWN");
- }
- // config.put("enterpriseConfig", buildWifiEnterpriseConfig(data.enterpriseConfig));
- return config;
- }
-
- private static Object buildWifiEnterpriseConfig(WifiEnterpriseConfig data)
- throws JSONException, CertificateEncodingException {
- JSONObject config = new JSONObject();
- config.put(WifiEnterpriseConfig.PLMN_KEY, data.getPlmn());
- config.put(WifiEnterpriseConfig.REALM_KEY, data.getRealm());
- config.put(WifiEnterpriseConfig.EAP_KEY, data.getEapMethod());
- config.put(WifiEnterpriseConfig.PHASE2_KEY, data.getPhase2Method());
- config.put(WifiEnterpriseConfig.ALTSUBJECT_MATCH_KEY, data.getAltSubjectMatch());
- X509Certificate caCert = data.getCaCertificate();
- String caCertString = Base64.encodeToString(caCert.getEncoded(), Base64.DEFAULT);
- config.put(WifiEnterpriseConfig.CA_CERT_KEY, caCertString);
- X509Certificate clientCert = data.getClientCertificate();
- String clientCertString = Base64.encodeToString(clientCert.getEncoded(), Base64.DEFAULT);
- config.put(WifiEnterpriseConfig.CLIENT_CERT_KEY, clientCertString);
- PrivateKey pk = data.getClientPrivateKey();
- String privateKeyString = Base64.encodeToString(pk.getEncoded(), Base64.DEFAULT);
- config.put(WifiEnterpriseConfig.PRIVATE_KEY_ID_KEY, privateKeyString);
- config.put(WifiEnterpriseConfig.PASSWORD_KEY, data.getPassword());
- return config;
- }
-
- private static JSONObject buildWifiP2pDevice(WifiP2pDevice data)
- throws JSONException {
- JSONObject deviceInfo = new JSONObject();
- deviceInfo.put("Name", data.deviceName);
- deviceInfo.put("Address", data.deviceAddress);
- return deviceInfo;
- }
-
- private static JSONObject buildWifiP2pGroup(WifiP2pGroup data)
- throws JSONException {
- JSONObject group = new JSONObject();
- Log.d("build p2p group.");
- group.put("ClientList", build(data.getClientList()));
- group.put("Interface", data.getInterface());
- group.put("Networkname", data.getNetworkName());
- group.put("Owner", data.getOwner());
- group.put("Passphrase", data.getPassphrase());
- group.put("NetworkId", data.getNetworkId());
- return group;
- }
-
- private static JSONObject buildWifiP2pInfo(WifiP2pInfo data)
- throws JSONException {
- JSONObject info = new JSONObject();
- Log.d("build p2p info.");
- info.put("groupFormed", data.groupFormed);
- info.put("isGroupOwner", data.isGroupOwner);
- info.put("groupOwnerAddress", data.groupOwnerAddress);
- return info;
- }
-
- private static <T> JSONObject buildCallEvent(InCallServiceImpl.CallEvent<T> callEvent)
- throws JSONException {
- JSONObject jsonEvent = new JSONObject();
- jsonEvent.put("CallId", callEvent.getCallId());
- jsonEvent.put("Event", build(callEvent.getEvent()));
- return jsonEvent;
- }
-
- private static JSONObject buildUri(Uri uri) throws JSONException {
- return new JSONObject().put("Uri", build((uri != null) ? uri.toString() : ""));
- }
-
- private static JSONObject buildCallDetails(Call.Details details) throws JSONException {
-
- JSONObject callDetails = new JSONObject();
-
- callDetails.put("Handle", buildUri(details.getHandle()));
- callDetails.put("HandlePresentation",
- build(InCallServiceImpl.getCallPresentationInfoString(
- details.getHandlePresentation())));
- callDetails.put("CallerDisplayName", build(details.getCallerDisplayName()));
-
- // TODO AccountHandle
- // callDetails.put("AccountHandle", build(""));
-
- callDetails.put("Capabilities",
- build(InCallServiceImpl.getCallCapabilitiesString(details.getCallCapabilities())));
-
- callDetails.put("Properties",
- build(InCallServiceImpl.getCallPropertiesString(details.getCallProperties())));
-
- // TODO Parse fields in Disconnect Cause
- callDetails.put("DisconnectCause", build((details.getDisconnectCause() != null) ? details
- .getDisconnectCause().toString() : ""));
- callDetails.put("ConnectTimeMillis", build(details.getConnectTimeMillis()));
-
- // TODO: GatewayInfo
- // callDetails.put("GatewayInfo", build(""));
-
- callDetails.put("VideoState",
- build(InCallServiceImpl.getVideoCallStateString(details.getVideoState())));
-
- // TODO: StatusHints
- // callDetails.put("StatusHints", build(""));
-
- callDetails.put("Extras", build(details.getExtras()));
-
- return callDetails;
- }
-
- private static JSONObject buildCall(Call call) throws JSONException {
-
- JSONObject callInfo = new JSONObject();
-
- callInfo.put("Parent", build(InCallServiceImpl.getCallId(call)));
-
- // TODO:Make a function out of this for consistency
- ArrayList<String> children = new ArrayList<String>();
- for (Call child : call.getChildren()) {
- children.add(InCallServiceImpl.getCallId(child));
- }
- callInfo.put("Children", build(children));
-
- // TODO:Make a function out of this for consistency
- ArrayList<String> conferenceables = new ArrayList<String>();
- for (Call conferenceable : call.getChildren()) {
- children.add(InCallServiceImpl.getCallId(conferenceable));
- }
- callInfo.put("ConferenceableCalls", build(conferenceables));
-
- callInfo.put("State", build(InCallServiceImpl.getCallStateString(call.getState())));
- callInfo.put("CannedTextResponses", build(call.getCannedTextResponses()));
- callInfo.put("VideoCall", InCallServiceImpl.getVideoCallId(call.getVideoCall()));
- callInfo.put("Details", build(call.getDetails()));
-
- return callInfo;
- }
-
- private static JSONObject buildVideoProfile(VideoProfile videoProfile) throws JSONException {
- JSONObject profile = new JSONObject();
-
- profile.put("VideoState",
- InCallServiceImpl.getVideoCallStateString(videoProfile.getVideoState()));
- profile.put("VideoQuality",
- InCallServiceImpl.getVideoCallQualityString(videoProfile.getQuality()));
-
- return profile;
- }
-
- private static JSONObject buildCameraCapabilities(CameraCapabilities cameraCapabilities)
- throws JSONException {
- JSONObject capabilities = new JSONObject();
-
- capabilities.put("Height", build(cameraCapabilities.getHeight()));
- capabilities.put("Width", build(cameraCapabilities.getWidth()));
- capabilities.put("ZoomSupported", build(cameraCapabilities.isZoomSupported()));
- capabilities.put("MaxZoom", build(cameraCapabilities.getMaxZoom()));
-
- return capabilities;
- }
-
- private static JSONObject buildVoLteServiceStateEvent(
- VoLteServiceState volteInfo)
- throws JSONException {
- JSONObject info = new JSONObject();
- info.put(TelephonyConstants.VoLteServiceStateContainer.SRVCC_STATE,
- TelephonyUtils.getSrvccStateString(volteInfo.getSrvccState()));
- return info;
- }
-
- private static JSONObject buildModemActivityInfo(ModemActivityInfo modemInfo)
- throws JSONException {
- JSONObject info = new JSONObject();
-
- info.put("Timestamp", modemInfo.getTimestamp());
- info.put("SleepTimeMs", modemInfo.getSleepTimeMillis());
- info.put("IdleTimeMs", modemInfo.getIdleTimeMillis());
- //convert from int[] to List<Integer> for proper JSON translation
- int[] txTimes = modemInfo.getTxTimeMillis();
- List<Integer> tmp = new ArrayList<Integer>(txTimes.length);
- for(int val : txTimes) {
- tmp.add(val);
- }
- info.put("TxTimeMs", build(tmp));
- info.put("RxTimeMs", modemInfo.getRxTimeMillis());
- info.put("EnergyUsedMw", modemInfo.getEnergyUsed());
- return info;
- }
- private static JSONObject buildSignalStrength(SignalStrength signalStrength)
- throws JSONException {
- JSONObject info = new JSONObject();
- info.put(TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_GSM,
- signalStrength.getGsmSignalStrength());
- info.put(
- TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_GSM_DBM,
- signalStrength.getGsmDbm());
- info.put(
- TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_GSM_LEVEL,
- signalStrength.getGsmLevel());
- info.put(
- TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_GSM_ASU_LEVEL,
- signalStrength.getGsmAsuLevel());
- info.put(
- TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_GSM_BIT_ERROR_RATE,
- signalStrength.getGsmBitErrorRate());
- info.put(
- TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_CDMA_DBM,
- signalStrength.getCdmaDbm());
- info.put(
- TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_CDMA_LEVEL,
- signalStrength.getCdmaLevel());
- info.put(
- TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_CDMA_ASU_LEVEL,
- signalStrength.getCdmaAsuLevel());
- info.put(
- TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_CDMA_ECIO,
- signalStrength.getCdmaEcio());
- info.put(
- TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_EVDO_DBM,
- signalStrength.getEvdoDbm());
- info.put(
- TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_EVDO_ECIO,
- signalStrength.getEvdoEcio());
- info.put(TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_LTE,
- signalStrength.getLteSignalStrength());
- info.put(
- TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_LTE_DBM,
- signalStrength.getLteDbm());
- info.put(
- TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_LTE_LEVEL,
- signalStrength.getLteLevel());
- info.put(
- TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_LTE_ASU_LEVEL,
- signalStrength.getLteAsuLevel());
- info.put(
- TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_LEVEL,
- signalStrength.getLevel());
- info.put(
- TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_ASU_LEVEL,
- signalStrength.getAsuLevel());
- info.put(TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_DBM,
- signalStrength.getDbm());
- return info;
- }
-
- private JsonBuilder() {
- // This is a utility class.
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonDeserializable.java b/sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonDeserializable.java
deleted file mode 100644
index a577fdc..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonDeserializable.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.jsonrpc;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-public interface JsonDeserializable {
- public JSONObject fromJSON() throws JSONException;
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonRpcResult.java b/sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonRpcResult.java
deleted file mode 100644
index b9f3d67..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonRpcResult.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.jsonrpc;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-/**
- * Represents a JSON RPC result.
- *
- * @see http://json-rpc.org/wiki/specification
- *
- * @author Damon Kohler (damonkohler@gmail.com)
- */
-public class JsonRpcResult {
-
- private JsonRpcResult() {
- // Utility class.
- }
-
- public static JSONObject empty(int id) throws JSONException {
- JSONObject json = new JSONObject();
- json.put("id", id);
- json.put("result", JSONObject.NULL);
- json.put("error", JSONObject.NULL);
- return json;
- }
-
- public static JSONObject result(int id, Object data) throws JSONException {
- JSONObject json = new JSONObject();
- json.put("id", id);
- json.put("result", JsonBuilder.build(data));
- json.put("error", JSONObject.NULL);
- return json;
- }
-
- public static JSONObject error(int id, Throwable t) throws JSONException {
- JSONObject json = new JSONObject();
- json.put("id", id);
- json.put("result", JSONObject.NULL);
- json.put("error", t.toString());
- return json;
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonRpcServer.java b/sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonRpcServer.java
deleted file mode 100644
index 5bdd99a..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonRpcServer.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.jsonrpc;
-
-import java.io.BufferedReader;
-import java.io.PrintWriter;
-import java.net.Socket;
-import java.util.Map;
-
-import org.json.JSONArray;
-import org.json.JSONObject;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.SimpleServer;
-import com.googlecode.android_scripting.rpc.MethodDescriptor;
-import com.googlecode.android_scripting.rpc.RpcError;
-
-/**
- * A JSON RPC server that forwards RPC calls to a specified receiver object.
- *
- * @author Damon Kohler (damonkohler@gmail.com)
- */
-public class JsonRpcServer extends SimpleServer {
-
- private static final String CMD_CLOSE_SESSION = "closeSl4aSession";
-
- private final RpcReceiverManagerFactory mRpcReceiverManagerFactory;
-
- // private final String mHandshake;
-
- /**
- * Construct a {@link JsonRpcServer} connected to the provided {@link RpcReceiverManager}.
- *
- * @param managerFactory the {@link RpcReceiverManager} to register with the server
- * @param handshake the secret handshake required for authorization to use this server
- */
- public JsonRpcServer(RpcReceiverManagerFactory managerFactory, String handshake) {
- // mHandshake = handshake;
- mRpcReceiverManagerFactory = managerFactory;
- }
-
- @Override
- public void shutdown() {
- super.shutdown();
- // Notify all RPC receiving objects. They may have to clean up some of their state.
- for (RpcReceiverManager manager : mRpcReceiverManagerFactory.getRpcReceiverManagers()
- .values()) {
- manager.shutdown();
- }
- }
-
- @Override
- protected void handleRPCConnection(Socket sock, Integer UID, BufferedReader reader,
- PrintWriter writer) throws Exception {
- RpcReceiverManager receiverManager = null;
- Map<Integer, RpcReceiverManager> mgrs = mRpcReceiverManagerFactory.getRpcReceiverManagers();
- synchronized (mgrs) {
- Log.d("UID " + UID);
- Log.d("manager map keys: "
- + mRpcReceiverManagerFactory.getRpcReceiverManagers().keySet());
- if (mgrs.containsKey(UID)) {
- Log.d("Look up existing session");
- receiverManager = mgrs.get(UID);
- } else {
- Log.d("Create a new session");
- receiverManager = mRpcReceiverManagerFactory.create(UID);
- }
- }
- // boolean passedAuthentication = false;
- String data;
- while ((data = reader.readLine()) != null) {
- Log.v("Session " + UID + " Received: " + data);
- JSONObject request = new JSONObject(data);
- int id = request.getInt("id");
- String method = request.getString("method");
- JSONArray params = request.getJSONArray("params");
-
- MethodDescriptor rpc = receiverManager.getMethodDescriptor(method);
- if (rpc == null) {
- send(writer, JsonRpcResult.error(id, new RpcError("Unknown RPC: " + method)), UID);
- continue;
- }
- try {
- send(writer, JsonRpcResult.result(id, rpc.invoke(receiverManager, params)), UID);
- } catch (Throwable t) {
- Log.e("Invocation error.", t);
- send(writer, JsonRpcResult.error(id, t), UID);
- }
- if (method.equals(CMD_CLOSE_SESSION)) {
- Log.d("Got shutdown signal");
- synchronized (writer) {
- receiverManager.shutdown();
- reader.close();
- writer.close();
- sock.close();
- shutdown();
- mgrs.remove(UID);
- }
- return;
- }
- }
- }
-
- private void send(PrintWriter writer, JSONObject result, int UID) {
- writer.write(result + "\n");
- writer.flush();
- Log.v("Session " + UID + " Sent: " + result);
- }
-
- @Override
- protected void handleConnection(Socket socket) throws Exception {
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonSerializable.java b/sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonSerializable.java
deleted file mode 100644
index 5f05d40..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonSerializable.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.jsonrpc;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-public interface JsonSerializable {
- public JSONObject toJSON() throws JSONException;
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/RpcReceiver.java b/sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/RpcReceiver.java
deleted file mode 100644
index e885422..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/RpcReceiver.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.jsonrpc;
-
-public abstract class RpcReceiver {
-
- protected final RpcReceiverManager mManager;
-
- public RpcReceiver(RpcReceiverManager manager) {
- // To make reflection easier, we ensures that all the subclasses agree on this common
- // constructor.
- mManager = manager;
- }
-
- /** Invoked when the receiver is shut down. */
- public abstract void shutdown();
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/RpcReceiverManager.java b/sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/RpcReceiverManager.java
deleted file mode 100644
index 3f6b105..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/RpcReceiverManager.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.jsonrpc;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.rpc.MethodDescriptor;
-
-public abstract class RpcReceiverManager {
-
- private final Map<Class<? extends RpcReceiver>, RpcReceiver> mReceivers;
-
- /**
- * A map of strings to known RPCs.
- */
- private final Map<String, MethodDescriptor> mKnownRpcs = new HashMap<String, MethodDescriptor>();
-
- public RpcReceiverManager(Collection<Class<? extends RpcReceiver>> classList) {
- mReceivers = new HashMap<Class<? extends RpcReceiver>, RpcReceiver>();
- for (Class<? extends RpcReceiver> receiverClass : classList) {
- mReceivers.put(receiverClass, null);
- Collection<MethodDescriptor> methodList = MethodDescriptor.collectFrom(receiverClass);
- for (MethodDescriptor m : methodList) {
- if (mKnownRpcs.containsKey(m.getName())) {
- // We already know an RPC of the same name. We don't catch this anywhere because
- // this is a programming error.
- throw new RuntimeException("An RPC with the name " + m.getName()
- + " is already known.");
- }
- mKnownRpcs.put(m.getName(), m);
- }
- }
- }
-
- public Collection<Class<? extends RpcReceiver>> getRpcReceiverClasses() {
- return mReceivers.keySet();
- }
-
- private RpcReceiver get(Class<? extends RpcReceiver> clazz) {
- RpcReceiver object = mReceivers.get(clazz);
- if (object != null) {
- return object;
- }
-
- Constructor<? extends RpcReceiver> constructor;
- try {
- constructor = clazz.getConstructor(FacadeManager.class);
- object = constructor.newInstance(this);
- mReceivers.put(clazz, object);
- } catch (Exception e) {
- Log.e(e);
- }
-
- return object;
- }
-
- public <T extends RpcReceiver> T getReceiver(Class<T> clazz) {
- RpcReceiver receiver = get(clazz);
- return clazz.cast(receiver);
- }
-
- public MethodDescriptor getMethodDescriptor(String methodName) {
- return mKnownRpcs.get(methodName);
- }
-
- public Object invoke(Class<? extends RpcReceiver> clazz, Method method, Object[] args)
- throws Exception {
- RpcReceiver object = get(clazz);
- return method.invoke(object, args);
- }
-
- public void shutdown() {
- for (RpcReceiver receiver : mReceivers.values()) {
- try {
- if (receiver != null) {
- receiver.shutdown();
- }
- } catch (Exception e) {
- Log.e("Failed to shut down an RpcReceiver", e);
- }
- }
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/RpcReceiverManagerFactory.java b/sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/RpcReceiverManagerFactory.java
deleted file mode 100644
index defec5f..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/jsonrpc/RpcReceiverManagerFactory.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.jsonrpc;
-
-import java.util.Map;
-
-public interface RpcReceiverManagerFactory {
- public RpcReceiverManager create(Integer UID);
-
- public Map<Integer, RpcReceiverManager> getRpcReceiverManagers();
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/language/BeanShellLanguage.java b/sl4a/Common/src/com/googlecode/android_scripting/language/BeanShellLanguage.java
deleted file mode 100644
index b92d502..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/language/BeanShellLanguage.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.language;
-
-import com.googlecode.android_scripting.rpc.ParameterDescriptor;
-
-/**
- * Represents the BeanShell programming language.
- *
- * @author igor.v.karp@gmail.com (Igor Karp)
- */
-public class BeanShellLanguage extends Language {
-
- @Override
- protected String getImportStatement() {
- // FIXME(igor.v.karp): this is interpreter specific
- return "source(\"/sdcard/com.googlecode.bshforandroid/extras/bsh/android.bsh\");\n";
- }
-
- @Override
- protected String getRpcReceiverDeclaration(String rpcReceiver) {
- return rpcReceiver + " = Android();\n";
- }
-
- @Override
- protected String getMethodCallText(String receiver, String method,
- ParameterDescriptor[] parameters) {
- StringBuilder result =
- new StringBuilder().append(getApplyReceiverText(receiver)).append(getApplyOperatorText())
- .append(method);
- if (parameters.length > 0) {
- result.append(getLeftParametersText());
- } else {
- result.append(getQuote());
- }
- String separator = "";
- for (ParameterDescriptor parameter : parameters) {
- result.append(separator).append(getValueText(parameter));
- separator = getParameterSeparator();
- }
- result.append(getRightParametersText());
-
- return result.toString();
- }
-
- @Override
- protected String getApplyOperatorText() {
- return ".call(\"";
- }
-
- @Override
- protected String getLeftParametersText() {
- return "\", ";
- }
-
- @Override
- protected String getRightParametersText() {
- return ")";
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/language/HtmlLanguage.java b/sl4a/Common/src/com/googlecode/android_scripting/language/HtmlLanguage.java
deleted file mode 100644
index e7abf33..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/language/HtmlLanguage.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.language;
-
-import com.googlecode.android_scripting.rpc.ParameterDescriptor;
-
-public class HtmlLanguage extends Language {
-
- /** Returns the Android package import statement. */
- @Override
- protected String getImportStatement() {
- return "<html>\n<head>\n<script>";
- }
-
- @Override
- protected String getRpcReceiverDeclaration(String rpcReceiver) {
- return String.format("var %s = new Android();\n</script>\n</head>\n<body>\n\n</body>\n</html>",
- rpcReceiver);
- }
-
- @Override
- protected String getMethodCallText(String receiver, String method,
- ParameterDescriptor[] parameters) {
- StringBuilder result =
- new StringBuilder().append(getApplyReceiverText(receiver)).append(getApplyOperatorText())
- .append(method);
- if (parameters.length > 0) {
- result.append(getLeftParametersText());
- } else {
- result.append(getQuote());
- }
- String separator = "";
- for (ParameterDescriptor parameter : parameters) {
- result.append(separator).append(getValueText(parameter));
- separator = getParameterSeparator();
- }
- result.append(getRightParametersText());
-
- return result.toString();
- }
-
- @Override
- protected String getApplyOperatorText() {
- return ".call('";
- }
-
- @Override
- protected String getLeftParametersText() {
- return "', ";
- }
-
- @Override
- protected String getRightParametersText() {
- return ")";
- }
-
- @Override
- protected String getQuote() {
- return "'";
- }
-
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/language/JavaScriptLanguage.java b/sl4a/Common/src/com/googlecode/android_scripting/language/JavaScriptLanguage.java
deleted file mode 100644
index 7e88d3c..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/language/JavaScriptLanguage.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.language;
-
-/**
- * Represents the JavaScript programming language.
- *
- * @author igor.v.karp@gmail.com (Igor Karp)
- */
-public class JavaScriptLanguage extends Language {
-
- @Override
- protected String getImportStatement() {
- // FIXME(igor.v.karp): this is interpreter specific
- return "load(\"/sdcard/com.googlecode.rhinoforandroid/extras/rhino/android.js\");\n";
- }
-
- @Override
- protected String getRpcReceiverDeclaration(String rpcReceiver) {
- return "var " + rpcReceiver + " = Android();\n";
- }
-
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/language/Language.java b/sl4a/Common/src/com/googlecode/android_scripting/language/Language.java
deleted file mode 100644
index 0a8d487..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/language/Language.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.language;
-
-import com.googlecode.android_scripting.rpc.MethodDescriptor;
-import com.googlecode.android_scripting.rpc.ParameterDescriptor;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Represents the programming language supported by the SL4A.
- *
- * @author igor.v.karp@gmail.com (Igor Karp)
- */
-public class Language {
-
- private final static Map<Character, String> AUTO_CLOSE_MAP = buildAutoCloseMap('[', "[]", '{',
- "{}", '(', "()", '\'', "''", '"', "\"\"");
-
- /** Returns the initial template for newly created script. */
- public String getContentTemplate() {
- StringBuilder content = new StringBuilder(getImportStatement());
- if (content.length() != 0) {
- content.append('\n');
- }
- content.append(getRpcReceiverDeclaration(getDefaultRpcReceiver()));
- return content.toString();
- }
-
- /** Returns the Android package import statement. */
- protected String getImportStatement() {
- return "";
- }
-
- /** Returns the RPC receiver declaration. */
- protected String getRpcReceiverDeclaration(String rpcReceiver) {
- return "";
- }
-
- /** Returns the default RPC receiver name. */
- protected String getDefaultRpcReceiver() {
- return "droid";
- }
-
- /**
- * Returns the string containing opening and closing tokens if the input is an opening token.
- * Returns {@code null} otherwise.
- */
- public String autoClose(char token) {
- return AUTO_CLOSE_MAP.get(token);
- }
-
- /** Returns the RPC call text with given parameter values. */
- public final String getRpcText(String content, MethodDescriptor rpc, String[] values) {
- return getMethodCallText(getRpcReceiverName(content), rpc.getName(),
- rpc.getParameterValues(values));
- }
-
- /** Returns the RPC receiver found in the given script. */
- protected String getRpcReceiverName(String content) {
- return getDefaultRpcReceiver();
- }
-
- /** Returns the method call text in the language. */
- protected String getMethodCallText(String receiver, String method,
- ParameterDescriptor[] parameters) {
- StringBuilder result =
- new StringBuilder().append(getApplyReceiverText(receiver)).append(getApplyOperatorText())
- .append(method).append(getLeftParametersText());
- String separator = "";
- for (ParameterDescriptor parameter : parameters) {
- result.append(separator).append(getValueText(parameter));
- separator = getParameterSeparator();
- }
- result.append(getRightParametersText());
-
- return result.toString();
- }
-
- /** Returns the apply receiver text. */
- protected String getApplyReceiverText(String receiver) {
- return receiver;
- }
-
- /** Returns the apply operator text. */
- protected String getApplyOperatorText() {
- return ".";
- }
-
- /** Returns the text to the left of the parameters. */
- protected String getLeftParametersText() {
- return "(";
- }
-
- /** Returns the text to the right of the parameters. */
- protected String getRightParametersText() {
- return ")";
- }
-
- /** Returns the parameter separator text. */
- protected String getParameterSeparator() {
- return ", ";
- }
-
- /** Returns the text of the quotation. */
- protected String getQuote() {
- return "\"";
- }
-
- /** Returns the text of the {@code null} value. */
- protected String getNull() {
- return "null";
- }
-
- /** Returns the text of the {{@code true} value. */
- protected String getTrue() {
- return "true";
- }
-
- /** Returns the text of the false value. */
- protected String getFalse() {
- return "false";
- }
-
- /** Returns the parameter value suitable for code generation. */
- protected String getValueText(ParameterDescriptor parameter) {
- if (parameter.getValue() == null) {
- return getNullValueText();
- } else if (parameter.getType().equals(String.class)) {
- return getStringValueText(parameter.getValue());
- } else if (parameter.getType().equals(Boolean.class)) {
- return getBooleanValueText(parameter.getValue());
- } else {
- return parameter.getValue();
- }
- }
-
- /** Returns the null value suitable for code generation. */
- private String getNullValueText() {
- return getNull();
- }
-
- /** Returns the string parameter value suitable for code generation. */
- protected String getStringValueText(String value) {
- // TODO(igorkarp): do not quote expressions once they could be detected.
- return getQuote() + value + getQuote();
- }
-
- /** Returns the boolean parameter value suitable for code generation. */
- protected String getBooleanValueText(String value) {
- if (value.equals(Boolean.TRUE.toString())) {
- return getTrue();
- } else if (value.equals(Boolean.FALSE.toString())) {
- return getFalse();
- } else {
- // If it is neither true nor false it is must be an expression.
- return value;
- }
- }
-
- private static Map<Character, String> buildAutoCloseMap(char c1, String s1, char c2, String s2,
- char c3, String s3, char c4, String s4, char c5, String s5) {
- Map<Character, String> map = new HashMap<Character, String>(5);
- map.put(c1, s1);
- map.put(c2, s2);
- map.put(c3, s3);
- map.put(c4, s4);
- map.put(c5, s5);
- return map;
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/language/LuaLanguage.java b/sl4a/Common/src/com/googlecode/android_scripting/language/LuaLanguage.java
deleted file mode 100644
index a279434..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/language/LuaLanguage.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.language;
-
-/**
- * Represents the Lua programming language.
- *
- * @author igor.v.karp@gmail.com (Igor Karp)
- */
-public class LuaLanguage extends Language {
-
- @Override
- protected String getImportStatement() {
- return "require \"android\"\n";
- }
-
- @Override
- protected String getDefaultRpcReceiver() {
- return "android";
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/language/PerlLanguage.java b/sl4a/Common/src/com/googlecode/android_scripting/language/PerlLanguage.java
deleted file mode 100644
index c5cca0b..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/language/PerlLanguage.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.language;
-
-/**
- * Represents the Perl programming language.
- *
- * @author igor.v.karp@gmail.com (Igor Karp)
- */
-public class PerlLanguage extends Language {
-
- @Override
- protected String getImportStatement() {
- return "use Android;\n";
- }
-
- @Override
- protected String getRpcReceiverDeclaration(String rpcReceiver) {
- return "my " + rpcReceiver + " = Android->new();\n";
- }
-
- @Override
- protected String getDefaultRpcReceiver() {
- return "$droid";
- }
-
- @Override
- protected String getApplyOperatorText() {
- return "->";
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/language/PhpLanguage.java b/sl4a/Common/src/com/googlecode/android_scripting/language/PhpLanguage.java
deleted file mode 100644
index a141a3c..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/language/PhpLanguage.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.language;
-
-/**
- * Represents the PHP programming language.
- *
- * @author ivan@irontec.com (Ivan Mosquera Paulo)
- */
-public class PhpLanguage extends Language {
-
- @Override
- protected String getImportStatement() {
- return "<?php\n\nrequire_once(\"Android.php\");";
-
- }
-
- @Override
- protected String getRpcReceiverDeclaration(String rpcReceiver) {
- return rpcReceiver + " = new Android();\n";
- }
-
- @Override
- protected String getDefaultRpcReceiver() {
- return "$droid";
- }
-
- @Override
- protected String getApplyOperatorText() {
- return "->";
- }
-
- @Override
- protected String getQuote() {
- return "'";
- }
-
-} \ No newline at end of file
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/language/PythonLanguage.java b/sl4a/Common/src/com/googlecode/android_scripting/language/PythonLanguage.java
deleted file mode 100644
index beb59ae..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/language/PythonLanguage.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.language;
-
-/**
- * Represents the Python programming language.
- *
- * @author igor.v.karp@gmail.com (Igor Karp)
- */
-public class PythonLanguage extends Language {
-
- @Override
- protected String getImportStatement() {
- return "import android\n";
- }
-
- @Override
- protected String getRpcReceiverDeclaration(String rpcReceiver) {
- return rpcReceiver + " = android.Android()\n";
- }
-
- @Override
- protected String getQuote() {
- return "'";
- }
-
- @Override
- protected String getNull() {
- return "None";
- }
-
- @Override
- protected String getTrue() {
- return "True";
- }
-
- @Override
- protected String getFalse() {
- return "False";
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/language/RubyLanguage.java b/sl4a/Common/src/com/googlecode/android_scripting/language/RubyLanguage.java
deleted file mode 100644
index d6cd189..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/language/RubyLanguage.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.language;
-
-/**
- * Represents the Ruby programming language.
- *
- * @author igor.v.karp@gmail.com (Igor Karp)
- */
-public class RubyLanguage extends Language {
-
- @Override
- protected String getImportStatement() {
- return "require \"android\";\n";
- }
-
- @Override
- protected String getRpcReceiverDeclaration(String rpcReceiver) {
- return rpcReceiver + " = Droid.new\n";
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/language/ShellLanguage.java b/sl4a/Common/src/com/googlecode/android_scripting/language/ShellLanguage.java
deleted file mode 100644
index d7bc5a2..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/language/ShellLanguage.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.language;
-
-/**
- * Represents the Shell programming language.
- *
- * @author igor.v.karp@gmail.com (Igor Karp)
- */
-public class ShellLanguage extends Language {
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/language/SleepLanguage.java b/sl4a/Common/src/com/googlecode/android_scripting/language/SleepLanguage.java
deleted file mode 100644
index 1b623ab..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/language/SleepLanguage.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.language;
-
-/**
- * Represents the Sleep programming language.
- *
- * @author tomcatalbino@gmail.com
- */
-public class SleepLanguage extends Language {
-
- @Override
- protected String getImportStatement() {
- return "import com.googlecode.rpc.*;\n";
- }
-
- @Override
- protected String getRpcReceiverDeclaration(String rpcReceiver) {
- return rpcReceiver + " = [new Android];\n";
- }
-
- @Override
- protected String getDefaultRpcReceiver() {
- return "$droid";
- }
-
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/language/SquirrelLanguage.java b/sl4a/Common/src/com/googlecode/android_scripting/language/SquirrelLanguage.java
deleted file mode 100644
index f9b25bf..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/language/SquirrelLanguage.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.language;
-
-/**
- * Represents the Squirrel programming language, by Alberto Demichelis
- * this file adapted by Andy Tai, atai@atai.org
- * based on the Python version by
- * @author igor.v.karp@gmail.com (Igor Karp)
- */
-public class SquirrelLanguage extends Language {
-
- @Override
- protected String getImportStatement() {
- /* initialization code */
- return "";
- }
-
- @Override
- protected String getRpcReceiverDeclaration(String rpcReceiver) {
- return rpcReceiver + " <- Android();\n";
- }
-
- @Override
- protected String getQuote() {
- return "\"";
- }
-
- @Override
- protected String getNull() {
- return "null";
- }
-
- @Override
- protected String getTrue() {
- return "true";
- }
-
- @Override
- protected String getFalse() {
- return "false";
- }
-}
-
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/language/SupportedLanguages.java b/sl4a/Common/src/com/googlecode/android_scripting/language/SupportedLanguages.java
deleted file mode 100644
index e496378..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/language/SupportedLanguages.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.language;
-
-import com.googlecode.android_scripting.Log;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class SupportedLanguages {
-
- private static enum KnownLanguage {
- // SHELL(".sh", ShellLanguage.class), // We don't really support Shell language
- HTML(".html", HtmlLanguage.class), BEANSHELL(".bsh", BeanShellLanguage.class), JAVASCRIPT(
- ".js", JavaScriptLanguage.class), LUA(".lua", LuaLanguage.class), PERL(".pl",
- PerlLanguage.class), PYTHON(".py", PythonLanguage.class), RUBY(".rb", RubyLanguage.class),
- TCL(".tcl", TclLanguage.class), PHP(".php", PhpLanguage.class), SLEEP(".sl",
- SleepLanguage.class), SQUIRREL(".nut", SquirrelLanguage.class);
-
- private final String mmExtension;
- private final Class<? extends Language> mmClass;
-
- private KnownLanguage(String ext, Class<? extends Language> clazz) {
- mmExtension = ext;
- mmClass = clazz;
- }
-
- private String getExtension() {
- return mmExtension;
- }
-
- private Class<? extends Language> getLanguageClass() {
- return mmClass;
- }
- }
-
- private static Map<String, Class<? extends Language>> sSupportedLanguages;
-
- static {
- sSupportedLanguages = new HashMap<String, Class<? extends Language>>();
- for (KnownLanguage language : KnownLanguage.values()) {
- sSupportedLanguages.put(language.getExtension(), language.getLanguageClass());
- }
- }
-
- public static Language getLanguageByExtension(String extension) {
- extension = extension.toLowerCase();
- if (!extension.startsWith(".")) {
- throw new RuntimeException("Extension does not start with a dot: " + extension);
- }
- Language lang = null;
-
- Class<? extends Language> clazz = sSupportedLanguages.get(extension);
- if (clazz == null) {
- clazz = Language.class; // revert to default language.
- }
- if (clazz != null) {
- try {
- lang = clazz.newInstance();
- } catch (IllegalAccessException e) {
- Log.e(e);
- } catch (InstantiationException e) {
- Log.e(e);
- }
- }
- return lang;
- }
-
- public static boolean checkLanguageSupported(String name) {
- String extension = name.toLowerCase();
- int index = extension.lastIndexOf('.');
- if (index < 0) {
- extension = "." + extension;
- } else if (index > 0) {
- extension = extension.substring(index);
- }
- return sSupportedLanguages.containsKey(extension);
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/language/TclLanguage.java b/sl4a/Common/src/com/googlecode/android_scripting/language/TclLanguage.java
deleted file mode 100644
index 52b8532..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/language/TclLanguage.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.language;
-
-/**
- * Represents the Tcl programming language.
- *
- * @author igor.v.karp@gmail.com (Igor Karp)
- */
-public class TclLanguage extends Language {
-
- @Override
- protected String getImportStatement() {
- return "package require android\n";
- }
-
- @Override
- protected String getRpcReceiverDeclaration(String rpcReceiver) {
- return "set " + rpcReceiver + " [android new]\n";
- }
-
- @Override
- protected String getApplyReceiverText(String receiver) {
- return "$" + receiver;
- }
-
- @Override
- protected String getApplyOperatorText() {
- return " ";
- }
-
- @Override
- protected String getLeftParametersText() {
- return " ";
- }
-
- @Override
- protected String getRightParametersText() {
- return "";
- }
-
- @Override
- protected String getParameterSeparator() {
- return " ";
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/rpc/Converter.java b/sl4a/Common/src/com/googlecode/android_scripting/rpc/Converter.java
deleted file mode 100644
index 274d838..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/rpc/Converter.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.rpc;
-
-/**
- * A converter can take a String and turn it into an instance of type T (the type parameter to the
- * converter).
- *
- * @author igor.v.karp@gmail.com (Igor Karp)
- */
-public interface Converter<T> {
-
- /** Convert a string into type T. */
- T convert(String value);
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/rpc/MethodDescriptor.java b/sl4a/Common/src/com/googlecode/android_scripting/rpc/MethodDescriptor.java
deleted file mode 100644
index 5c31c34..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/rpc/MethodDescriptor.java
+++ /dev/null
@@ -1,593 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.rpc;
-
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Parcelable;
-
-import com.googlecode.android_scripting.facade.AndroidFacade;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiverManager;
-import com.googlecode.android_scripting.util.VisibleForTesting;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-/**
- * An adapter that wraps {@code Method}.
- *
- * @author igor.v.karp@gmail.com (Igor Karp)
- */
-public final class MethodDescriptor {
- private static final Map<Class<?>, Converter<?>> sConverters = populateConverters();
-
- private final Method mMethod;
- private final Class<? extends RpcReceiver> mClass;
-
- public MethodDescriptor(Class<? extends RpcReceiver> clazz, Method method) {
- mClass = clazz;
- mMethod = method;
- }
-
- @Override
- public String toString() {
- return mMethod.getDeclaringClass().getCanonicalName() + "." + mMethod.getName();
- }
-
- /** Collects all methods with {@code RPC} annotation from given class. */
- public static Collection<MethodDescriptor> collectFrom(Class<? extends RpcReceiver> clazz) {
- List<MethodDescriptor> descriptors = new ArrayList<MethodDescriptor>();
- for (Method method : clazz.getMethods()) {
- if (method.isAnnotationPresent(Rpc.class)) {
- descriptors.add(new MethodDescriptor(clazz, method));
- }
- }
- return descriptors;
- }
-
- /**
- * Invokes the call that belongs to this object with the given parameters. Wraps the response
- * (possibly an exception) in a JSONObject.
- *
- * @param parameters
- * {@code JSONArray} containing the parameters
- * @return result
- * @throws Throwable
- */
- public Object invoke(RpcReceiverManager manager, final JSONArray parameters) throws Throwable {
-
- final Type[] parameterTypes = getGenericParameterTypes();
- final Object[] args = new Object[parameterTypes.length];
- final Annotation annotations[][] = getParameterAnnotations();
-
- if (parameters.length() > args.length) {
- throw new RpcError("Too many parameters specified.");
- }
-
- for (int i = 0; i < args.length; i++) {
- final Type parameterType = parameterTypes[i];
- if (i < parameters.length()) {
- args[i] = convertParameter(parameters, i, parameterType);
- } else if (MethodDescriptor.hasDefaultValue(annotations[i])) {
- args[i] = MethodDescriptor.getDefaultValue(parameterType, annotations[i]);
- } else {
- throw new RpcError("Argument " + (i + 1) + " is not present");
- }
- }
-
- return invoke(manager, args);
- }
-
- /**
- * Invokes the call that belongs to this object with the given parameters. Wraps the response
- * (possibly an exception) in a JSONObject.
- *
- * @param parameters {@code Bundle} containing the parameters
- * @return result
- * @throws Throwable
- */
- public Object invoke(RpcReceiverManager manager, final Bundle parameters) throws Throwable {
- final Annotation annotations[][] = getParameterAnnotations();
- final Class<?>[] parameterTypes = getMethod().getParameterTypes();
- final Object[] args = new Object[parameterTypes.length];
-
- for (int i = 0; i < parameterTypes.length; i++) {
- Class<?> parameterType = parameterTypes[i];
- String parameterName = getName(annotations[i]);
- if (i < parameterTypes.length) {
- args[i] = convertParameter(parameters, parameterType, parameterName);
- } else if (MethodDescriptor.hasDefaultValue(annotations[i])) {
- args[i] = MethodDescriptor.getDefaultValue(parameterType, annotations[i]);
- } else {
- throw new RpcError("Argument " + (i + 1) + " is not present");
- }
- }
- return invoke(manager, args);
- }
-
- private Object invoke(RpcReceiverManager manager, Object[] args) throws Throwable{
- Object result = null;
- try {
- result = manager.invoke(mClass, mMethod, args);
- } catch (Throwable t) {
- throw t.getCause();
- }
- return result;
- }
-
- /**
- * Converts a parameter from JSON into a Java Object.
- *
- * @return TODO
- */
- // TODO(damonkohler): This signature is a bit weird (auto-refactored). The obvious alternative
- // would be to work on one supplied parameter and return the converted parameter. However, that's
- // problematic because you lose the ability to call the getXXX methods on the JSON array.
- @VisibleForTesting
- static Object convertParameter(final JSONArray parameters, int index, Type type)
- throws JSONException, RpcError {
- try {
- // Log.d("sl4a", parameters.toString());
- // Log.d("sl4a", type.toString());
- // We must handle null and numbers explicitly because we cannot magically cast them. We
- // also need to convert implicitly from numbers to bools.
- if (parameters.isNull(index)) {
- return null;
- } else if (type == Boolean.class) {
- try {
- return parameters.getBoolean(index);
- } catch (JSONException e) {
- return new Boolean(parameters.getInt(index) != 0);
- }
- } else if (type == Long.class) {
- return parameters.getLong(index);
- } else if (type == Double.class) {
- return parameters.getDouble(index);
- } else if (type == Integer.class) {
- return parameters.getInt(index);
- } else if (type == Intent.class) {
- return buildIntent(parameters.getJSONObject(index));
- } else if (type == Integer[].class) {
- JSONArray list = parameters.getJSONArray(index);
- Integer[] result = new Integer[list.length()];
- for (int i = 0; i < list.length(); i++) {
- result[i] = list.getInt(i);
- }
- return result;
- } else if (type == String[].class) {
- JSONArray list = parameters.getJSONArray(index);
- String[] result = new String[list.length()];
- for (int i = 0; i < list.length(); i++) {
- result[i] = list.getString(i);
- }
- return result;
- } else if (type == JSONObject.class) {
- return parameters.getJSONObject(index);
- } else {
- // Magically cast the parameter to the right Java type.
- return ((Class<?>) type).cast(parameters.get(index));
- }
- } catch (ClassCastException e) {
- throw new RpcError("Argument " + (index + 1) + " should be of type "
- + ((Class<?>) type).getSimpleName() + ".");
- }
- }
-
- private Object convertParameter(Bundle bundle, Class<?> type, String name) {
- Object param = null;
- if (type.isAssignableFrom(Boolean.class)) {
- param = bundle.getBoolean(name, false);
- }
- if (type.isAssignableFrom(Boolean[].class)) {
- param = bundle.getBooleanArray(name);
- }
- if (type.isAssignableFrom(String.class)) {
- param = bundle.getString(name);
- }
- if (type.isAssignableFrom(String[].class)) {
- param = bundle.getStringArray(name);
- }
- if (type.isAssignableFrom(Integer.class)) {
- param = bundle.getInt(name, 0);
- }
- if (type.isAssignableFrom(Integer[].class)) {
- param = bundle.getIntArray(name);
- }
- if (type.isAssignableFrom(Bundle.class)) {
- param = bundle.getBundle(name);
- }
- if (type.isAssignableFrom(Parcelable.class)) {
- param = bundle.getParcelable(name);
- }
- if (type.isAssignableFrom(Parcelable[].class)) {
- param = bundle.getParcelableArray(name);
- }
- if (type.isAssignableFrom(Intent.class)) {
- param = bundle.getParcelable(name);
- }
- return param;
- }
-
- public static Object buildIntent(JSONObject jsonObject) throws JSONException {
- Intent intent = new Intent();
- if (jsonObject.has("action")) {
- intent.setAction(jsonObject.getString("action"));
- }
- if (jsonObject.has("data") && jsonObject.has("type")) {
- intent.setDataAndType(Uri.parse(jsonObject.optString("data", null)),
- jsonObject.optString("type", null));
- } else if (jsonObject.has("data")) {
- intent.setData(Uri.parse(jsonObject.optString("data", null)));
- } else if (jsonObject.has("type")) {
- intent.setType(jsonObject.optString("type", null));
- }
- if (jsonObject.has("packagename") && jsonObject.has("classname")) {
- intent.setClassName(jsonObject.getString("packagename"), jsonObject.getString("classname"));
- }
- if (jsonObject.has("flags")) {
- intent.setFlags(jsonObject.getInt("flags"));
- }
- if (!jsonObject.isNull("extras")) {
- AndroidFacade.putExtrasFromJsonObject(jsonObject.getJSONObject("extras"), intent);
- }
- if (!jsonObject.isNull("categories")) {
- JSONArray categories = jsonObject.getJSONArray("categories");
- for (int i = 0; i < categories.length(); i++) {
- intent.addCategory(categories.getString(i));
- }
- }
- return intent;
- }
-
- public Method getMethod() {
- return mMethod;
- }
-
- public Class<? extends RpcReceiver> getDeclaringClass() {
- return mClass;
- }
-
- public String getName() {
- if (mMethod.isAnnotationPresent(RpcName.class)) {
- return mMethod.getAnnotation(RpcName.class).name();
- }
- return mMethod.getName();
- }
-
- public Type[] getGenericParameterTypes() {
- return mMethod.getGenericParameterTypes();
- }
-
- public Annotation[][] getParameterAnnotations() {
- return mMethod.getParameterAnnotations();
- }
-
- /**
- * Returns a human-readable help text for this RPC, based on annotations in the source code.
- *
- * @return derived help string
- */
- public String getHelp() {
- StringBuilder helpBuilder = new StringBuilder();
- Rpc rpcAnnotation = mMethod.getAnnotation(Rpc.class);
-
- helpBuilder.append(mMethod.getName());
- helpBuilder.append("(");
- final Class<?>[] parameterTypes = mMethod.getParameterTypes();
- final Type[] genericParameterTypes = mMethod.getGenericParameterTypes();
- final Annotation[][] annotations = mMethod.getParameterAnnotations();
- for (int i = 0; i < parameterTypes.length; i++) {
- if (i == 0) {
- helpBuilder.append("\n ");
- } else {
- helpBuilder.append(",\n ");
- }
-
- helpBuilder.append(getHelpForParameter(genericParameterTypes[i], annotations[i]));
- }
- helpBuilder.append(")\n\n");
- helpBuilder.append(rpcAnnotation.description());
- if (!rpcAnnotation.returns().equals("")) {
- helpBuilder.append("\n");
- helpBuilder.append("\nReturns:\n ");
- helpBuilder.append(rpcAnnotation.returns());
- }
-
- if (mMethod.isAnnotationPresent(RpcStartEvent.class)) {
- String eventName = mMethod.getAnnotation(RpcStartEvent.class).value();
- helpBuilder.append(String.format("\n\nGenerates \"%s\" events.", eventName));
- }
-
- if (mMethod.isAnnotationPresent(RpcDeprecated.class)) {
- String replacedBy = mMethod.getAnnotation(RpcDeprecated.class).value();
- String release = mMethod.getAnnotation(RpcDeprecated.class).release();
- helpBuilder.append(String.format("\n\nDeprecated in %s! Please use %s instead.", release,
- replacedBy));
- }
-
- return helpBuilder.toString();
- }
-
- /**
- * Returns the help string for one particular parameter. This respects optional parameters.
- *
- * @param parameterType
- * (generic) type of the parameter
- * @param annotations
- * annotations of the parameter, may be null
- * @return string describing the parameter based on source code annotations
- */
- private static String getHelpForParameter(Type parameterType, Annotation[] annotations) {
- StringBuilder result = new StringBuilder();
-
- appendTypeName(result, parameterType);
- result.append(" ");
- result.append(getName(annotations));
- if (hasDefaultValue(annotations)) {
- result.append("[optional");
- if (hasExplicitDefaultValue(annotations)) {
- result.append(", default " + getDefaultValue(parameterType, annotations));
- }
- result.append("]");
- }
-
- String description = getDescription(annotations);
- if (description.length() > 0) {
- result.append(": ");
- result.append(description);
- }
-
- return result.toString();
- }
-
- /**
- * Appends the name of the given type to the {@link StringBuilder}.
- *
- * @param builder
- * string builder to append to
- * @param type
- * type whose name to append
- */
- private static void appendTypeName(final StringBuilder builder, final Type type) {
- if (type instanceof Class<?>) {
- builder.append(((Class<?>) type).getSimpleName());
- } else {
- ParameterizedType parametrizedType = (ParameterizedType) type;
- builder.append(((Class<?>) parametrizedType.getRawType()).getSimpleName());
- builder.append("<");
-
- Type[] arguments = parametrizedType.getActualTypeArguments();
- for (int i = 0; i < arguments.length; i++) {
- if (i > 0) {
- builder.append(", ");
- }
- appendTypeName(builder, arguments[i]);
- }
- builder.append(">");
- }
- }
-
- /**
- * Returns parameter descriptors suitable for the RPC call text representation.
- *
- * <p>
- * Uses parameter value, default value or name, whatever is available first.
- *
- * @return an array of parameter descriptors
- */
- public ParameterDescriptor[] getParameterValues(String[] values) {
- Type[] parameterTypes = mMethod.getGenericParameterTypes();
- Annotation[][] parametersAnnotations = mMethod.getParameterAnnotations();
- ParameterDescriptor[] parameters = new ParameterDescriptor[parametersAnnotations.length];
- for (int index = 0; index < parameters.length; index++) {
- String value;
- if (index < values.length) {
- value = values[index];
- } else if (hasDefaultValue(parametersAnnotations[index])) {
- Object defaultValue = getDefaultValue(parameterTypes[index], parametersAnnotations[index]);
- if (defaultValue == null) {
- value = null;
- } else {
- value = String.valueOf(defaultValue);
- }
- } else {
- value = getName(parametersAnnotations[index]);
- }
- parameters[index] = new ParameterDescriptor(value, parameterTypes[index]);
- }
- return parameters;
- }
-
- /**
- * Returns parameter hints.
- *
- * @return an array of parameter hints
- */
- public String[] getParameterHints() {
- Annotation[][] parametersAnnotations = mMethod.getParameterAnnotations();
- String[] hints = new String[parametersAnnotations.length];
- for (int index = 0; index < hints.length; index++) {
- String name = getName(parametersAnnotations[index]);
- String description = getDescription(parametersAnnotations[index]);
- String hint = "No paramenter description.";
- if (!name.equals("") && !description.equals("")) {
- hint = name + ": " + description;
- } else if (!name.equals("")) {
- hint = name;
- } else if (!description.equals("")) {
- hint = description;
- }
- hints[index] = hint;
- }
- return hints;
- }
-
- /**
- * Extracts the formal parameter name from an annotation.
- *
- * @param annotations
- * the annotations of the parameter
- * @return the formal name of the parameter
- */
- private static String getName(Annotation[] annotations) {
- for (Annotation a : annotations) {
- if (a instanceof RpcParameter) {
- return ((RpcParameter) a).name();
- }
- }
- throw new IllegalStateException("No parameter name");
- }
-
- /**
- * Extracts the parameter description from its annotations.
- *
- * @param annotations
- * the annotations of the parameter
- * @return the description of the parameter
- */
- private static String getDescription(Annotation[] annotations) {
- for (Annotation a : annotations) {
- if (a instanceof RpcParameter) {
- return ((RpcParameter) a).description();
- }
- }
- throw new IllegalStateException("No parameter description");
- }
-
- /**
- * Returns the default value for a specific parameter.
- *
- * @param parameterType
- * parameterType
- * @param annotations
- * annotations of the parameter
- */
- public static Object getDefaultValue(Type parameterType, Annotation[] annotations) {
- for (Annotation a : annotations) {
- if (a instanceof RpcDefault) {
- RpcDefault defaultAnnotation = (RpcDefault) a;
- Converter<?> converter = converterFor(parameterType, defaultAnnotation.converter());
- return converter.convert(defaultAnnotation.value());
- } else if (a instanceof RpcOptional) {
- return null;
- }
- }
- throw new IllegalStateException("No default value for " + parameterType);
- }
-
- @SuppressWarnings("rawtypes")
- private static Converter<?> converterFor(Type parameterType,
- Class<? extends Converter> converterClass) {
- if (converterClass == Converter.class) {
- Converter<?> converter = sConverters.get(parameterType);
- if (converter == null) {
- throw new IllegalArgumentException("No predefined converter found for " + parameterType);
- }
- return converter;
- }
- try {
- Constructor<?> constructor = converterClass.getConstructor(new Class<?>[0]);
- return (Converter<?>) constructor.newInstance(new Object[0]);
- } catch (Exception e) {
- throw new IllegalArgumentException("Cannot create converter from "
- + converterClass.getCanonicalName());
- }
- }
-
- /**
- * Determines whether or not this parameter has default value.
- *
- * @param annotations
- * annotations of the parameter
- */
- public static boolean hasDefaultValue(Annotation[] annotations) {
- for (Annotation a : annotations) {
- if (a instanceof RpcDefault || a instanceof RpcOptional) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Returns whether the default value is specified for a specific parameter.
- *
- * @param annotations
- * annotations of the parameter
- */
- @VisibleForTesting
- static boolean hasExplicitDefaultValue(Annotation[] annotations) {
- for (Annotation a : annotations) {
- if (a instanceof RpcDefault) {
- return true;
- }
- }
- return false;
- }
-
- /** Returns the converters for {@code String}, {@code Integer} and {@code Boolean}. */
- private static Map<Class<?>, Converter<?>> populateConverters() {
- Map<Class<?>, Converter<?>> converters = new HashMap<Class<?>, Converter<?>>();
- converters.put(String.class, new Converter<String>() {
- @Override
- public String convert(String value) {
- return value;
- }
- });
- converters.put(Integer.class, new Converter<Integer>() {
- @Override
- public Integer convert(String input) {
- try {
- return Integer.decode(input);
- } catch (NumberFormatException e) {
- throw new IllegalArgumentException("'" + input + "' is not an integer");
- }
- }
- });
- converters.put(Boolean.class, new Converter<Boolean>() {
- @Override
- public Boolean convert(String input) {
- if (input == null) {
- return null;
- }
- input = input.toLowerCase();
- if (input.equals("true")) {
- return Boolean.TRUE;
- }
- if (input.equals("false")) {
- return Boolean.FALSE;
- }
- throw new IllegalArgumentException("'" + input + "' is not a boolean");
- }
- });
- return converters;
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/rpc/ParameterDescriptor.java b/sl4a/Common/src/com/googlecode/android_scripting/rpc/ParameterDescriptor.java
deleted file mode 100644
index 021373c..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/rpc/ParameterDescriptor.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.rpc;
-
-import java.lang.reflect.Type;
-
-/**
- * RPC parameter description.
- *
- * @author igor.v.karp@gmail.com (Igor Karp)
- */
-public final class ParameterDescriptor {
- private final String value;
- private final Type type;
-
- public ParameterDescriptor(String value, Type type) {
- this.value = value;
- this.type = type;
- }
-
- public String getValue() {
- return value;
- }
-
- public Type getType() {
- return type;
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/rpc/Rpc.java b/sl4a/Common/src/com/googlecode/android_scripting/rpc/Rpc.java
deleted file mode 100644
index 8fc932e..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/rpc/Rpc.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.rpc;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * The {@link Rpc} annotation is used to annotate server-side implementations of RPCs. It describes
- * meta-information (currently a brief documentation of the function), and marks a function as the
- * implementation of an RPC.
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.METHOD)
-@Documented
-public @interface Rpc {
- /**
- * Returns brief description of the function. Should be limited to one or two sentences.
- */
- String description();
-
- /**
- * Gives a brief description of the functions return value (and the underlying data structure).
- */
- String returns() default "";
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcDefault.java b/sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcDefault.java
deleted file mode 100644
index b27bccc..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcDefault.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.rpc;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Use this annotation to mark an RPC parameter that have a default value.
- *
- * @author igor.v.karp@gmail.com (Igor Karp)
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.PARAMETER)
-@Documented
-public @interface RpcDefault {
- /** The default value of the RPC parameter. */
- public String value();
-
- @SuppressWarnings("rawtypes")
- public Class<? extends Converter> converter() default Converter.class;
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcDeprecated.java b/sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcDeprecated.java
deleted file mode 100644
index c717e5d..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcDeprecated.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.rpc;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Use this annotation to mark RPC method as deprecated.
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.METHOD)
-@Documented
-public @interface RpcDeprecated {
- /** The method that replaced this one. */
- public String value();
-
- /** Release of SL4A when deprecation occurred. */
- public String release() default "r4";
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcError.java b/sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcError.java
deleted file mode 100644
index c4591c7..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcError.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.rpc;
-
-@SuppressWarnings("serial")
-public class RpcError extends Exception {
-
- public RpcError(String message) {
- super(message);
- }
-
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcMinSdk.java b/sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcMinSdk.java
deleted file mode 100644
index 00b49ec..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcMinSdk.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.rpc;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Use this annotation to specify minimum SDK level (if higher than 3).
- *
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Documented
-public @interface RpcMinSdk {
- /** Minimum SDK Level. */
- public int value();
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcName.java b/sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcName.java
deleted file mode 100644
index b0992e6..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcName.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.rpc;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Use this annotation to mark an RPC parameter that have a default value.
- *
- * @author igor.v.karp@gmail.com (Igor Karp)
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.METHOD)
-@Documented
-public @interface RpcName {
- /** The default value of the RPC parameter. */
- public String name();
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcOptional.java b/sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcOptional.java
deleted file mode 100644
index 53ac650..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcOptional.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.rpc;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Use this annotation to mark RPC parameter as optional.
- *
- * <p>
- * The parameter marked as optional has no explicit default value. {@code null} is used as default
- * value.
- *
- * @author igor.v.karp@gmail.com (Igor Karp)
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.PARAMETER)
-@Documented
-public @interface RpcOptional {
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcParameter.java b/sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcParameter.java
deleted file mode 100644
index eb84879..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcParameter.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.rpc;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * An annotation that is used to document the parameters of an RPC.
- *
- * @author Felix Arends (felix.arends@gmail.com)
- *
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.PARAMETER)
-@Documented
-public @interface RpcParameter {
- /**
- * The name of the formal parameter. This should be in agreement with the java code.
- */
- public String name();
-
- /**
- * Description of the RPC. This should be a short descriptive statement without a full stop, such
- * as 'disables the WiFi mode'.
- */
- public String description() default "";
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcStartEvent.java b/sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcStartEvent.java
deleted file mode 100644
index 68a5af3..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcStartEvent.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.rpc;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Use this annotation to mark an RPC as one that starts generating events.
- *
- * @author damonkohler@gmail.com (Damon Kohler)
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.METHOD)
-@Documented
-public @interface RpcStartEvent {
- /** The name of the event that is generated. */
- public String value();
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcStopEvent.java b/sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcStopEvent.java
deleted file mode 100644
index fce25f9..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/rpc/RpcStopEvent.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.rpc;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Use this annotation to mark an RPC as one that stops generating events.
- *
- * @author damonkohler@gmail.com (Damon Kohler)
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.METHOD)
-@Documented
-public @interface RpcStopEvent {
- /** The name of the event that stops being generated. */
- public String value();
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/trigger/ScriptTrigger.java b/sl4a/Common/src/com/googlecode/android_scripting/trigger/ScriptTrigger.java
deleted file mode 100644
index 76640fe..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/trigger/ScriptTrigger.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.trigger;
-
-import android.content.Context;
-import android.content.Intent;
-
-import com.googlecode.android_scripting.IntentBuilders;
-import com.googlecode.android_scripting.event.Event;
-
-import java.io.File;
-
-/**
- * A trigger implementation that launches a given script when the event occurs.
- *
- * @author Felix Arends (felix.arends@gmail.com)
- */
-public class ScriptTrigger implements Trigger {
- private static final long serialVersionUID = 1804599219214041409L;
- private final File mScript;
- private final String mEventName;
-
- public ScriptTrigger(String eventName, File script) {
- mEventName = eventName;
- mScript = script;
- }
-
- @Override
- public void handleEvent(Event event, Context context) {
- Intent intent = IntentBuilders.buildStartInBackgroundIntent(mScript);
- // This is required since the script is being started from the TriggerService.
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(intent);
- }
-
- @Override
- public String getEventName() {
- return mEventName;
- }
-
- public File getScript() {
- return mScript;
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/trigger/Trigger.java b/sl4a/Common/src/com/googlecode/android_scripting/trigger/Trigger.java
deleted file mode 100644
index e06a973..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/trigger/Trigger.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.trigger;
-
-import android.content.Context;
-
-import com.googlecode.android_scripting.event.Event;
-
-import java.io.Serializable;
-
-/**
- * Interface implemented by objects listening to events on the event queue inside of the
- * {@link SerivceManager}.
- *
- * @author Felix Arends (felix.arends@gmail.com)
- */
-public interface Trigger extends Serializable {
- /**
- * Handles an event from the event queue.
- *
- * @param event
- * Event to handle
- * @param context
- * TODO
- */
- void handleEvent(Event event, Context context);
-
- /**
- * Returns the event name that this {@link Trigger} is interested in.
- */
- // TODO(damonkohler): This could be removed by maintaining a reverse mapping from Trigger to event
- // name in the TriggerRespository.
- String getEventName();
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/trigger/TriggerRepository.java b/sl4a/Common/src/com/googlecode/android_scripting/trigger/TriggerRepository.java
deleted file mode 100644
index 4e42bfc..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/trigger/TriggerRepository.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.trigger;
-
-import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.preference.PreferenceManager;
-
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.Multimap;
-import com.google.common.collect.Multimaps;
-import com.googlecode.android_scripting.IntentBuilders;
-import com.googlecode.android_scripting.Log;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.util.Map.Entry;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-import org.apache.commons.codec.binary.Base64Codec;
-
-/**
- * A repository maintaining all currently scheduled triggers. This includes, for example, alarms or
- * observers of arriving text messages etc. This class is responsible for serializing the list of
- * triggers to the shared preferences store, and retrieving it from there.
- *
- * @author Felix Arends (felix.arends@gmail.com)
- * @author Damon Kohler (damonkohler@gmail.com)
- */
-public class TriggerRepository {
- /**
- * The list of triggers is serialized to the shared preferences entry with this name.
- */
- private static final String TRIGGERS_PREF_KEY = "TRIGGERS";
-
- private final SharedPreferences mPreferences;
- private final Context mContext;
-
- /**
- * An interface for objects that are notified when a trigger is added to the repository.
- */
- public interface TriggerRepositoryObserver {
- /**
- * Invoked just before the trigger is added to the repository.
- *
- * @param trigger
- * The trigger about to be added to the repository.
- */
- void onPut(Trigger trigger);
-
- /**
- * Invoked just after the trigger has been removed from the repository.
- *
- * @param trigger
- * The trigger that has just been removed from the repository.
- */
- void onRemove(Trigger trigger);
- }
-
- private final Multimap<String, Trigger> mTriggers;
- private final CopyOnWriteArrayList<TriggerRepositoryObserver> mTriggerObservers =
- new CopyOnWriteArrayList<TriggerRepositoryObserver>();
-
- public TriggerRepository(Context context) {
- mContext = context;
- mPreferences = PreferenceManager.getDefaultSharedPreferences(context);
- String triggers = mPreferences.getString(TRIGGERS_PREF_KEY, null);
- mTriggers = deserializeTriggersFromString(triggers);
- }
-
- /** Returns a list of all triggers. The list is unmodifiable. */
- public synchronized Multimap<String, Trigger> getAllTriggers() {
- return Multimaps.unmodifiableMultimap(mTriggers);
- }
-
- /**
- * Adds a new trigger to the repository.
- *
- * @param trigger
- * the {@link Trigger} to add
- */
- public synchronized void put(Trigger trigger) {
- notifyOnAdd(trigger);
- mTriggers.put(trigger.getEventName(), trigger);
- storeTriggers();
- ensureTriggerServiceRunning();
- }
-
- /** Removes a specific {@link Trigger}. */
- public synchronized void remove(final Trigger trigger) {
- mTriggers.get(trigger.getEventName()).remove(trigger);
- storeTriggers();
- notifyOnRemove(trigger);
- }
-
- /** Ensures that the {@link TriggerService} is running */
- private void ensureTriggerServiceRunning() {
- Intent startTriggerServiceIntent = IntentBuilders.buildTriggerServiceIntent();
- mContext.startService(startTriggerServiceIntent);
- }
-
- /** Notify all {@link TriggerRepositoryObserver}s that a {@link Trigger} was added. */
- private void notifyOnAdd(Trigger trigger) {
- for (TriggerRepositoryObserver observer : mTriggerObservers) {
- observer.onPut(trigger);
- }
- }
-
- /** Notify all {@link TriggerRepositoryObserver}s that a {@link Trigger} was removed. */
- private void notifyOnRemove(Trigger trigger) {
- for (TriggerRepositoryObserver observer : mTriggerObservers) {
- observer.onRemove(trigger);
- }
- }
-
- /** Writes the list of triggers to the shared preferences. */
- private synchronized void storeTriggers() {
- SharedPreferences.Editor editor = mPreferences.edit();
- final String triggerValue = serializeTriggersToString(mTriggers);
- if (triggerValue != null) {
- editor.putString(TRIGGERS_PREF_KEY, triggerValue);
- }
- editor.commit();
- }
-
- /** Deserializes the {@link Multimap} of {@link Trigger}s from a base 64 encoded string. */
- @SuppressWarnings("unchecked")
- private Multimap<String, Trigger> deserializeTriggersFromString(String triggers) {
- if (triggers == null) {
- return ArrayListMultimap.<String, Trigger> create();
- }
- try {
- final ByteArrayInputStream inputStream =
- new ByteArrayInputStream(Base64Codec.decodeBase64(triggers.getBytes()));
- final ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
- return (Multimap<String, Trigger>) objectInputStream.readObject();
- } catch (Exception e) {
- Log.e(e);
- }
- return ArrayListMultimap.<String, Trigger> create();
- }
-
- /** Serializes the list of triggers to a Base64 encoded string. */
- private String serializeTriggersToString(Multimap<String, Trigger> triggers) {
- try {
- final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
- final ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
- objectOutputStream.writeObject(triggers);
- return new String(Base64Codec.encodeBase64(outputStream.toByteArray()));
- } catch (IOException e) {
- Log.e(e);
- return null;
- }
- }
-
- /** Returns {@code true} iff the list of triggers is empty. */
- public synchronized boolean isEmpty() {
- return mTriggers.isEmpty();
- }
-
- /** Adds a {@link TriggerRepositoryObserver}. */
- public void addObserver(TriggerRepositoryObserver observer) {
- mTriggerObservers.add(observer);
- }
-
- /**
- * Adds the given {@link TriggerRepositoryObserver} and invokes
- * {@link TriggerRepositoryObserver#onPut} for all existing triggers.
- *
- * @param observer
- * The observer to add.
- */
- public synchronized void bootstrapObserver(TriggerRepositoryObserver observer) {
- addObserver(observer);
- for (Entry<String, Trigger> trigger : mTriggers.entries()) {
- observer.onPut(trigger.getValue());
- }
- }
-
- /**
- * Removes a {@link TriggerRepositoryObserver}.
- */
- public void removeObserver(TriggerRepositoryObserver observer) {
- mTriggerObservers.remove(observer);
- }
-} \ No newline at end of file
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/util/VisibleForTesting.java b/sl4a/Common/src/com/googlecode/android_scripting/util/VisibleForTesting.java
deleted file mode 100644
index cc8f92a..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/util/VisibleForTesting.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.util;
-
-/**
- * An annotation that indicates that the visibility of a type or member has been relaxed from
- * private to package to make the code testable.
- *
- * @author igor.v.karp@gmail.com (Igor Karp)
- */
-// TODO(igor.v.karp): Consider replacing this annotation by one from Guava or GCL
-public @interface VisibleForTesting {
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/webcam/JpegProvider.java b/sl4a/Common/src/com/googlecode/android_scripting/webcam/JpegProvider.java
deleted file mode 100644
index d258882..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/webcam/JpegProvider.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.webcam;
-
-interface JpegProvider {
- public byte[] getJpeg();
-} \ No newline at end of file
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/webcam/MjpegServer.java b/sl4a/Common/src/com/googlecode/android_scripting/webcam/MjpegServer.java
deleted file mode 100644
index c2b3ac5..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/webcam/MjpegServer.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.webcam;
-
-import java.io.BufferedReader;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.net.Socket;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.SimpleServer;
-
-class MjpegServer extends SimpleServer {
-
- private final JpegProvider mProvider;
-
- public MjpegServer(JpegProvider provider) {
- mProvider = provider;
- }
-
- @Override
- protected void handleConnection(Socket socket) throws Exception {
- Log.d("handle Mjpeg connection");
- byte[] data = mProvider.getJpeg();
- if (data == null) {
- return;
- }
- OutputStream outputStream = socket.getOutputStream();
- outputStream.write((
- "HTTP/1.0 200 OK\r\n" +
- "Server: SL4A\r\n" +
- "Connection: close\r\n" +
- "Max-Age: 0\r\n" +
- "Expires: 0\r\n" +
- "Cache-Control: no-cache, private\r\n" +
- "Pragma: no-cache\r\n" +
- "Content-Type: multipart/x-mixed-replace; boundary=--BoundaryString\r\n\r\n").getBytes());
- while (true) {
- data = mProvider.getJpeg();
- if (data == null) {
- return;
- }
- outputStream.write("--BoundaryString\r\n".getBytes());
- outputStream.write("Content-type: image/jpg\r\n".getBytes());
- outputStream.write(("Content-Length: " + data.length + "\r\n\r\n").getBytes());
- outputStream.write(data);
- outputStream.write("\r\n\r\n".getBytes());
- outputStream.flush();
- }
- }
-
- @Override
- protected void handleRPCConnection(Socket sock, Integer UID, BufferedReader reader, PrintWriter writer)
- throws Exception {
- }
-}
diff --git a/sl4a/Common/src/com/googlecode/android_scripting/webcam/WebCamFacade.java b/sl4a/Common/src/com/googlecode/android_scripting/webcam/WebCamFacade.java
deleted file mode 100644
index b984828..0000000
--- a/sl4a/Common/src/com/googlecode/android_scripting/webcam/WebCamFacade.java
+++ /dev/null
@@ -1,385 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.webcam;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.net.InetSocketAddress;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.Executor;
-
-import android.app.Service;
-import android.graphics.ImageFormat;
-import android.graphics.Rect;
-import android.graphics.YuvImage;
-import android.hardware.Camera;
-import android.hardware.Camera.Parameters;
-import android.hardware.Camera.PreviewCallback;
-import android.hardware.Camera.Size;
-import android.util.Base64;
-import android.view.SurfaceHolder;
-import android.view.SurfaceView;
-import android.view.WindowManager;
-import android.view.SurfaceHolder.Callback;
-
-import com.googlecode.android_scripting.BaseApplication;
-import com.googlecode.android_scripting.FutureActivityTaskExecutor;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.SingleThreadExecutor;
-import com.googlecode.android_scripting.SimpleServer.SimpleServerObserver;
-import com.googlecode.android_scripting.facade.EventFacade;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.future.FutureActivityTask;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcDefault;
-import com.googlecode.android_scripting.rpc.RpcOptional;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-/**
- * Manages access to camera streaming.
- * <br>
- * <h3>Usage Notes</h3>
- * <br><b>webCamStart</b> and <b>webCamStop</b> are used to start and stop an Mpeg stream on a given port. <b>webcamAdjustQuality</b> is used to ajust the quality of the streaming video.
- * <br><b>cameraStartPreview</b> is used to get access to the camera preview screen. It will generate "preview" events as images become available.
- * <br>The preview has two modes: data or file. If you pass a non-blank, writable file path to the <b>cameraStartPreview</b> it will store jpg images in that folder.
- * It is up to the caller to clean up these files after the fact. If no file element is provided,
- * the event will include the image data as a base64 encoded string.
- * <h3>Event details</h3>
- * <br>The data element of the preview event will be a map, with the following elements defined.
- * <ul>
- * <li><b>format</b> - currently always "jpeg"
- * <li><b>width</b> - image width (in pixels)
- * <li><b>height</b> - image height (in pixels)
- * <li><b>quality</b> - JPEG quality. Number from 1-100
- * <li><b>filename</b> - Name of file where image was saved. Only relevant if filepath defined.
- * <li><b>error</b> - included if there was an IOException saving file, ie, disk full or path write protected.
- * <li><b>encoding</b> - Data encoding. If filepath defined, will be "file" otherwise "base64"
- * <li><b>data</b> - Base64 encoded image data.
- * </ul>
- *<br>Note that "filename", "error" and "data" are mutual exclusive.
- *<br>
- *<br>The webcam and preview modes use the same resources, so you can't use them both at the same time. Stop one mode before starting the other.
- *
- * @author Damon Kohler (damonkohler@gmail.com) (probably)
- * @author Robbie Matthews (rjmatthews62@gmail.com)
- *
- */
-public class WebCamFacade extends RpcReceiver {
-
- private final Service mService;
- private final Executor mJpegCompressionExecutor = new SingleThreadExecutor();
- private final ByteArrayOutputStream mJpegCompressionBuffer = new ByteArrayOutputStream();
-
- private volatile byte[] mJpegData;
-
- private CountDownLatch mJpegDataReady;
- private boolean mStreaming;
- private int mPreviewHeight;
- private int mPreviewWidth;
- private int mJpegQuality;
-
- private MjpegServer mJpegServer;
- private FutureActivityTask<SurfaceHolder> mPreviewTask;
- private Camera mCamera;
- private Parameters mParameters;
- private final EventFacade mEventFacade;
- private boolean mPreview;
- private File mDest;
-
- private final PreviewCallback mPreviewCallback = new PreviewCallback() {
- @Override
- public void onPreviewFrame(final byte[] data, final Camera camera) {
- mJpegCompressionExecutor.execute(new Runnable() {
- @Override
- public void run() {
- mJpegData = compressYuvToJpeg(data);
- mJpegDataReady.countDown();
- if (mStreaming) {
- camera.setOneShotPreviewCallback(mPreviewCallback);
- }
- }
- });
- }
- };
-
- private final PreviewCallback mPreviewEvent = new PreviewCallback() {
- @Override
- public void onPreviewFrame(final byte[] data, final Camera camera) {
- mJpegCompressionExecutor.execute(new Runnable() {
- @Override
- public void run() {
- mJpegData = compressYuvToJpeg(data);
- Map<String,Object> map = new HashMap<String, Object>();
- map.put("format", "jpeg");
- map.put("width", mPreviewWidth);
- map.put("height", mPreviewHeight);
- map.put("quality", mJpegQuality);
- if (mDest!=null) {
- try {
- File dest=File.createTempFile("prv",".jpg",mDest);
- OutputStream output = new FileOutputStream(dest);
- output.write(mJpegData);
- output.close();
- map.put("encoding","file");
- map.put("filename",dest.toString());
- } catch (IOException e) {
- map.put("error", e.toString());
- }
- }
- else {
- map.put("encoding","Base64");
- map.put("data", Base64.encodeToString(mJpegData, Base64.DEFAULT));
- }
- mEventFacade.postEvent("preview", map);
- if (mPreview) {
- camera.setOneShotPreviewCallback(mPreviewEvent);
- }
- }
- });
- }
- };
-
- public WebCamFacade(FacadeManager manager) {
- super(manager);
- mService = manager.getService();
- mJpegDataReady = new CountDownLatch(1);
- mEventFacade = manager.getReceiver(EventFacade.class);
- }
-
- private byte[] compressYuvToJpeg(final byte[] yuvData) {
- mJpegCompressionBuffer.reset();
- YuvImage yuvImage =
- new YuvImage(yuvData, ImageFormat.NV21, mPreviewWidth, mPreviewHeight, null);
- yuvImage.compressToJpeg(new Rect(0, 0, mPreviewWidth, mPreviewHeight), mJpegQuality,
- mJpegCompressionBuffer);
- return mJpegCompressionBuffer.toByteArray();
- }
-
- @Rpc(description = "Starts an MJPEG stream and returns a Tuple of address and port for the stream.")
- public InetSocketAddress webcamStart(
- @RpcParameter(name = "resolutionLevel", description = "increasing this number provides higher resolution") @RpcDefault("0") Integer resolutionLevel,
- @RpcParameter(name = "jpegQuality", description = "a number from 0-100") @RpcDefault("20") Integer jpegQuality,
- @RpcParameter(name = "port", description = "If port is specified, the webcam service will bind to port, otherwise it will pick any available port.") @RpcDefault("0") Integer port)
- throws Exception {
- try {
- openCamera(resolutionLevel, jpegQuality);
- return startServer(port);
- } catch (Exception e) {
- webcamStop();
- throw e;
- }
- }
-
- private InetSocketAddress startServer(Integer port) {
- mJpegServer = new MjpegServer(new JpegProvider() {
- @Override
- public byte[] getJpeg() {
- try {
- mJpegDataReady.await();
- } catch (InterruptedException e) {
- Log.e(e);
- }
- return mJpegData;
- }
- });
- mJpegServer.addObserver(new SimpleServerObserver() {
- @Override
- public void onDisconnect() {
- if (mJpegServer.getNumberOfConnections() == 0 && mStreaming) {
- stopStream();
- }
- }
-
- @Override
- public void onConnect() {
- if (!mStreaming) {
- startStream();
- }
- }
- });
- return mJpegServer.startPublic(port);
- }
-
- private void stopServer() {
- if (mJpegServer != null) {
- mJpegServer.shutdown();
- mJpegServer = null;
- }
- }
-
- @Rpc(description = "Adjusts the quality of the webcam stream while it is running.")
- public void webcamAdjustQuality(
- @RpcParameter(name = "resolutionLevel", description = "increasing this number provides higher resolution") @RpcDefault("0") Integer resolutionLevel,
- @RpcParameter(name = "jpegQuality", description = "a number from 0-100") @RpcDefault("20") Integer jpegQuality)
- throws Exception {
- if (mStreaming == false) {
- throw new IllegalStateException("Webcam not streaming.");
- }
- stopStream();
- releaseCamera();
- openCamera(resolutionLevel, jpegQuality);
- startStream();
- }
-
- private void openCamera(Integer resolutionLevel, Integer jpegQuality) throws IOException,
- InterruptedException {
- mCamera = Camera.open();
- mParameters = mCamera.getParameters();
- mParameters.setPictureFormat(ImageFormat.JPEG);
- mParameters.setPreviewFormat(ImageFormat.JPEG);
- List<Size> supportedPreviewSizes = mParameters.getSupportedPreviewSizes();
- Collections.sort(supportedPreviewSizes, new Comparator<Size>() {
- @Override
- public int compare(Size o1, Size o2) {
- return o1.width - o2.width;
- }
- });
- Size previewSize =
- supportedPreviewSizes.get(Math.min(resolutionLevel, supportedPreviewSizes.size() - 1));
- mPreviewHeight = previewSize.height;
- mPreviewWidth = previewSize.width;
- mParameters.setPreviewSize(mPreviewWidth, mPreviewHeight);
- mJpegQuality = Math.min(Math.max(jpegQuality, 0), 100);
- mCamera.setParameters(mParameters);
- // TODO(damonkohler): Rotate image based on orientation.
- mPreviewTask = createPreviewTask();
- mCamera.startPreview();
- }
-
- private void startStream() {
- mStreaming = true;
- mCamera.setOneShotPreviewCallback(mPreviewCallback);
- }
-
- private void stopStream() {
- mJpegDataReady = new CountDownLatch(1);
- mStreaming = false;
- if (mPreviewTask != null) {
- mPreviewTask.finish();
- mPreviewTask = null;
- }
- }
-
- private void releaseCamera() {
- if (mCamera != null) {
- mCamera.release();
- mCamera = null;
- }
- mParameters = null;
- }
-
- @Rpc(description = "Stops the webcam stream.")
- public void webcamStop() {
- stopServer();
- stopStream();
- releaseCamera();
- }
-
- private FutureActivityTask<SurfaceHolder> createPreviewTask() throws IOException,
- InterruptedException {
- FutureActivityTask<SurfaceHolder> task = new FutureActivityTask<SurfaceHolder>() {
- @Override
- public void onCreate() {
- super.onCreate();
- final SurfaceView view = new SurfaceView(getActivity());
- getActivity().setContentView(view);
- getActivity().getWindow().setSoftInputMode(
- WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
- //view.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
- view.getHolder().addCallback(new Callback() {
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
- }
-
- @Override
- public void surfaceCreated(SurfaceHolder holder) {
- setResult(view.getHolder());
- }
-
- @Override
- public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
- }
- });
- }
- };
- FutureActivityTaskExecutor taskExecutor =
- ((BaseApplication) mService.getApplication()).getTaskExecutor();
- taskExecutor.execute(task);
- mCamera.setPreviewDisplay(task.getResult());
- return task;
- }
-
- @Rpc(description = "Start Preview Mode. Throws 'preview' events.",returns="True if successful")
- public boolean cameraStartPreview(
- @RpcParameter(name = "resolutionLevel", description = "increasing this number provides higher resolution") @RpcDefault("0") Integer resolutionLevel,
- @RpcParameter(name = "jpegQuality", description = "a number from 0-100") @RpcDefault("20") Integer jpegQuality,
- @RpcParameter(name = "filepath", description = "Path to store jpeg files.") @RpcOptional String filepath)
- throws InterruptedException {
- mDest=null;
- if (filepath!=null && (filepath.length()>0)) {
- mDest = new File(filepath);
- if (!mDest.exists()) mDest.mkdirs();
- if (!(mDest.isDirectory() && mDest.canWrite())) {
- return false;
- }
- }
-
- try {
- openCamera(resolutionLevel, jpegQuality);
- } catch (IOException e) {
- Log.e(e);
- return false;
- }
- startPreview();
- return true;
- }
-
- @Rpc(description = "Stop the preview mode.")
- public void cameraStopPreview() {
- stopPreview();
- }
-
- private void startPreview() {
- mPreview = true;
- mCamera.setOneShotPreviewCallback(mPreviewEvent);
- }
-
- private void stopPreview() {
- mPreview = false;
- if (mPreviewTask!=null)
- {
- mPreviewTask.finish();
- mPreviewTask=null;
- }
- releaseCamera();
- }
-
- @Override
- public void shutdown() {
- mPreview=false;
- webcamStop();
- }
-}
diff --git a/sl4a/Common/src/org/apache/commons/codec/BinaryDecoder.java b/sl4a/Common/src/org/apache/commons/codec/BinaryDecoder.java
deleted file mode 100644
index 07d93fa..0000000
--- a/sl4a/Common/src/org/apache/commons/codec/BinaryDecoder.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.codec;
-
-/**
- * Defines common decoding methods for byte array decoders.
- *
- * @author Apache Software Foundation
- * @version $Id: BinaryDecoder.java 651573 2008-04-25 11:11:21Z niallp $
- */
-public interface BinaryDecoder extends Decoder {
-
- /**
- * Decodes a byte array and returns the results as a byte array.
- *
- * @param pArray A byte array which has been encoded with the
- * appropriate encoder
- *
- * @return a byte array that contains decoded content
- *
- * @throws DecoderException A decoder exception is thrown
- * if a Decoder encounters a failure condition during
- * the decode process.
- */
- byte[] decode(byte[] pArray) throws DecoderException;
-}
-
diff --git a/sl4a/Common/src/org/apache/commons/codec/BinaryEncoder.java b/sl4a/Common/src/org/apache/commons/codec/BinaryEncoder.java
deleted file mode 100644
index 40bd797..0000000
--- a/sl4a/Common/src/org/apache/commons/codec/BinaryEncoder.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.codec;
-
-/**
- * Defines common encoding methods for byte array encoders.
- *
- * @author Apache Software Foundation
- * @version $Id: BinaryEncoder.java 651573 2008-04-25 11:11:21Z niallp $
- */
-public interface BinaryEncoder extends Encoder {
-
- /**
- * Encodes a byte array and return the encoded data
- * as a byte array.
- *
- * @param pArray Data to be encoded
- *
- * @return A byte array containing the encoded data
- *
- * @throws EncoderException thrown if the Encoder
- * encounters a failure condition during the
- * encoding process.
- */
- byte[] encode(byte[] pArray) throws EncoderException;
-}
-
diff --git a/sl4a/Common/src/org/apache/commons/codec/CharEncoding.java b/sl4a/Common/src/org/apache/commons/codec/CharEncoding.java
deleted file mode 100644
index 01af749..0000000
--- a/sl4a/Common/src/org/apache/commons/codec/CharEncoding.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.codec;
-
-/**
- * Character encoding names required of every implementation of the Java platform.
- *
- * From the Java documentation <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html">Standard
- * charsets</a>:
- * <p>
- * <cite>Every implementation of the Java platform is required to support the following character encodings. Consult the
- * release documentation for your implementation to see if any other encodings are supported. Consult the release
- * documentation for your implementation to see if any other encodings are supported. </cite>
- * </p>
- *
- * <ul>
- * <li><code>US-ASCII</code><br/>
- * Seven-bit ASCII, a.k.a. ISO646-US, a.k.a. the Basic Latin block of the Unicode character set.</li>
- * <li><code>ISO-8859-1</code><br/>
- * ISO Latin Alphabet No. 1, a.k.a. ISO-LATIN-1.</li>
- * <li><code>UTF-8</code><br/>
- * Eight-bit Unicode Transformation Format.</li>
- * <li><code>UTF-16BE</code><br/>
- * Sixteen-bit Unicode Transformation Format, big-endian byte order.</li>
- * <li><code>UTF-16LE</code><br/>
- * Sixteen-bit Unicode Transformation Format, little-endian byte order.</li>
- * <li><code>UTF-16</code><br/>
- * Sixteen-bit Unicode Transformation Format, byte order specified by a mandatory initial byte-order mark (either order
- * accepted on input, big-endian used on output.)</li>
- * </ul>
- *
- * This perhaps would best belong in the [lang] project. Even if a similar interface is defined in [lang], it is not
- * forseen that [codec] would be made to depend on [lang].
- *
- * @see <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html">Standard charsets</a>
- * @author Apache Software Foundation
- * @since 1.4
- * @version $Id: CharEncoding.java 797857 2009-07-25 23:43:33Z ggregory $
- */
-public class CharEncoding {
- /**
- * CharEncodingISO Latin Alphabet No. 1, a.k.a. ISO-LATIN-1. </p>
- * <p>
- * Every implementation of the Java platform is required to support this character encoding.
- * </p>
- *
- * @see <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html">Standard charsets</a>
- */
- public static final String ISO_8859_1 = "ISO-8859-1";
-
- /**
- * <p>
- * Seven-bit ASCII, also known as ISO646-US, also known as the Basic Latin block of the Unicode character set.
- * </p>
- * <p>
- * Every implementation of the Java platform is required to support this character encoding.
- * </p>
- *
- * @see <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html">Standard charsets</a>
- */
- public static final String US_ASCII = "US-ASCII";
-
- /**
- * <p>
- * Sixteen-bit Unicode Transformation Format, The byte order specified by a mandatory initial byte-order mark
- * (either order accepted on input, big-endian used on output)
- * </p>
- * <p>
- * Every implementation of the Java platform is required to support this character encoding.
- * </p>
- *
- * @see <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html">Standard charsets</a>
- */
- public static final String UTF_16 = "UTF-16";
-
- /**
- * <p>
- * Sixteen-bit Unicode Transformation Format, big-endian byte order.
- * </p>
- * <p>
- * Every implementation of the Java platform is required to support this character encoding.
- * </p>
- *
- * @see <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html">Standard charsets</a>
- */
- public static final String UTF_16BE = "UTF-16BE";
-
- /**
- * <p>
- * Sixteen-bit Unicode Transformation Format, little-endian byte order.
- * </p>
- * <p>
- * Every implementation of the Java platform is required to support this character encoding.
- * </p>
- *
- * @see <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html">Standard charsets</a>
- */
- public static final String UTF_16LE = "UTF-16LE";
-
- /**
- * <p>
- * Eight-bit Unicode Transformation Format.
- * </p>
- * <p>
- * Every implementation of the Java platform is required to support this character encoding.
- * </p>
- *
- * @see <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html">Standard charsets</a>
- */
- public static final String UTF_8 = "UTF-8";
-} \ No newline at end of file
diff --git a/sl4a/Common/src/org/apache/commons/codec/Decoder.java b/sl4a/Common/src/org/apache/commons/codec/Decoder.java
deleted file mode 100644
index c4de37a..0000000
--- a/sl4a/Common/src/org/apache/commons/codec/Decoder.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.codec;
-
-/**
- * <p>Provides the highest level of abstraction for Decoders.
- * This is the sister interface of {@link Encoder}. All
- * Decoders implement this common generic interface.</p>
- *
- * <p>Allows a user to pass a generic Object to any Decoder
- * implementation in the codec package.</p>
- *
- * <p>One of the two interfaces at the center of the codec package.</p>
- *
- * @author Apache Software Foundation
- * @version $Id: Decoder.java 797690 2009-07-24 23:28:35Z ggregory $
- */
-public interface Decoder {
-
- /**
- * Decodes an "encoded" Object and returns a "decoded"
- * Object. Note that the implementation of this
- * interface will try to cast the Object parameter
- * to the specific type expected by a particular Decoder
- * implementation. If a {@link ClassCastException} occurs
- * this decode method will throw a DecoderException.
- *
- * @param pObject an object to "decode"
- *
- * @return a 'decoded" object
- *
- * @throws DecoderException a decoder exception can
- * be thrown for any number of reasons. Some good
- * candidates are that the parameter passed to this
- * method is null, a param cannot be cast to the
- * appropriate type for a specific encoder.
- */
- Object decode(Object pObject) throws DecoderException;
-}
-
diff --git a/sl4a/Common/src/org/apache/commons/codec/DecoderException.java b/sl4a/Common/src/org/apache/commons/codec/DecoderException.java
deleted file mode 100644
index c928086..0000000
--- a/sl4a/Common/src/org/apache/commons/codec/DecoderException.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.codec;
-
-/**
- * Thrown when a Decoder has encountered a failure condition during a decode.
- *
- * @author Apache Software Foundation
- * @version $Id: DecoderException.java 797804 2009-07-25 17:27:04Z ggregory $
- */
-public class DecoderException extends Exception {
-
- /**
- * Declares the Serial Version Uid.
- *
- * @see <a href="http://c2.com/cgi/wiki?AlwaysDeclareSerialVersionUid">Always Declare Serial Version Uid</a>
- */
- private static final long serialVersionUID = 1L;
-
- /**
- * Constructs a new exception with <code>null</code> as its detail message. The cause is not initialized, and may
- * subsequently be initialized by a call to {@link #initCause}.
- *
- * @since 1.4
- */
- public DecoderException() {
- super();
- }
-
- /**
- * Constructs a new exception with the specified detail message. The cause is not initialized, and may subsequently
- * be initialized by a call to {@link #initCause}.
- *
- * @param message
- * The detail message which is saved for later retrieval by the {@link #getMessage()} method.
- */
- public DecoderException(String message) {
- super(message);
- }
-
- /**
- * Constructsa new exception with the specified detail message and cause.
- *
- * <p>
- * Note that the detail message associated with <code>cause</code> is not automatically incorporated into this
- * exception's detail message.
- * </p>
- *
- * @param message
- * The detail message which is saved for later retrieval by the {@link #getMessage()} method.
- * @param cause
- * The cause which is saved for later retrieval by the {@link #getCause()} method. A <code>null</code>
- * value is permitted, and indicates that the cause is nonexistent or unknown.
- * @since 1.4
- */
- public DecoderException(String message, Throwable cause) {
- super(message, cause);
- }
-
- /**
- * Constructs a new exception with the specified cause and a detail message of <code>(cause==null ?
- * null : cause.toString())</code> (which typically contains the class and detail message of <code>cause</code>).
- * This constructor is useful for exceptions that are little more than wrappers for other throwables.
- *
- * @param cause
- * The cause which is saved for later retrieval by the {@link #getCause()} method. A <code>null</code>
- * value is permitted, and indicates that the cause is nonexistent or unknown.
- * @since 1.4
- */
- public DecoderException(Throwable cause) {
- super(cause);
- }
-}
diff --git a/sl4a/Common/src/org/apache/commons/codec/Encoder.java b/sl4a/Common/src/org/apache/commons/codec/Encoder.java
deleted file mode 100644
index a137e39..0000000
--- a/sl4a/Common/src/org/apache/commons/codec/Encoder.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.codec;
-
-/**
- * <p>Provides the highest level of abstraction for Encoders.
- * This is the sister interface of {@link Decoder}. Every implementation of
- * Encoder provides this common generic interface whic allows a user to pass a
- * generic Object to any Encoder implementation in the codec package.</p>
- *
- * @author Apache Software Foundation
- * @version $Id: Encoder.java 634915 2008-03-08 09:30:25Z bayard $
- */
-public interface Encoder {
-
- /**
- * Encodes an "Object" and returns the encoded content
- * as an Object. The Objects here may just be <code>byte[]</code>
- * or <code>String</code>s depending on the implementation used.
- *
- * @param pObject An object ot encode
- *
- * @return An "encoded" Object
- *
- * @throws EncoderException an encoder exception is
- * thrown if the encoder experiences a failure
- * condition during the encoding process.
- */
- Object encode(Object pObject) throws EncoderException;
-}
-
diff --git a/sl4a/Common/src/org/apache/commons/codec/EncoderException.java b/sl4a/Common/src/org/apache/commons/codec/EncoderException.java
deleted file mode 100644
index 975bb77..0000000
--- a/sl4a/Common/src/org/apache/commons/codec/EncoderException.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.codec;
-
-/**
- * Thrown when there is a failure condition during the encoding process. This exception is thrown when an Encoder
- * encounters a encoding specific exception such as invalid data, inability to calculate a checksum, characters outside
- * of the expected range.
- *
- * @author Apache Software Foundation
- * @version $Id: EncoderException.java 797804 2009-07-25 17:27:04Z ggregory $
- */
-public class EncoderException extends Exception {
-
- /**
- * Declares the Serial Version Uid.
- *
- * @see <a href="http://c2.com/cgi/wiki?AlwaysDeclareSerialVersionUid">Always Declare Serial Version Uid</a>
- */
- private static final long serialVersionUID = 1L;
-
- /**
- * Constructs a new exception with <code>null</code> as its detail message. The cause is not initialized, and may
- * subsequently be initialized by a call to {@link #initCause}.
- *
- * @since 1.4
- */
- public EncoderException() {
- super();
- }
-
- /**
- * Constructs a new exception with the specified detail message. The cause is not initialized, and may subsequently
- * be initialized by a call to {@link #initCause}.
- *
- * @param message
- * a useful message relating to the encoder specific error.
- */
- public EncoderException(String message) {
- super(message);
- }
-
- /**
- * Constructs a new exception with the specified detail message and cause.
- *
- * <p>
- * Note that the detail message associated with <code>cause</code> is not automatically incorporated into this
- * exception's detail message.
- * </p>
- *
- * @param message
- * The detail message which is saved for later retrieval by the {@link #getMessage()} method.
- * @param cause
- * The cause which is saved for later retrieval by the {@link #getCause()} method. A <code>null</code>
- * value is permitted, and indicates that the cause is nonexistent or unknown.
- * @since 1.4
- */
- public EncoderException(String message, Throwable cause) {
- super(message, cause);
- }
-
- /**
- * Constructs a new exception with the specified cause and a detail message of <code>(cause==null ?
- * null : cause.toString())</code> (which typically contains the class and detail message of <code>cause</code>).
- * This constructor is useful for exceptions that are little more than wrappers for other throwables.
- *
- * @param cause
- * The cause which is saved for later retrieval by the {@link #getCause()} method. A <code>null</code>
- * value is permitted, and indicates that the cause is nonexistent or unknown.
- * @since 1.4
- */
- public EncoderException(Throwable cause) {
- super(cause);
- }
-}
diff --git a/sl4a/Common/src/org/apache/commons/codec/binary/Base64Codec.java b/sl4a/Common/src/org/apache/commons/codec/binary/Base64Codec.java
deleted file mode 100644
index 20239e2..0000000
--- a/sl4a/Common/src/org/apache/commons/codec/binary/Base64Codec.java
+++ /dev/null
@@ -1,1055 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.codec.binary;
-
-import java.math.BigInteger;
-
-import org.apache.commons.codec.BinaryDecoder;
-import org.apache.commons.codec.BinaryEncoder;
-import org.apache.commons.codec.DecoderException;
-import org.apache.commons.codec.EncoderException;
-
-/**
- * Provides Base64 encoding and decoding as defined by RFC 2045.
- *
- * <p>
- * This class implements section <cite>6.8. Base64 Content-Transfer-Encoding</cite> from RFC 2045 <cite>Multipurpose
- * Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies</cite> by Freed and Borenstein.
- * </p>
- * <p>
- * The class can be parameterized in the following manner with various constructors:
- * <ul>
- * <li>URL-safe mode: Default off.</li>
- * <li>Line length: Default 76. Line length that aren't multiples of 4 will still essentially end up being multiples of
- * 4 in the encoded data.
- * <li>Line separator: Default is CRLF ("\r\n")</li>
- * </ul>
- * </p>
- * <p>
- * Since this class operates directly on byte streams, and not character streams, it is hard-coded to only encode/decode
- * character encodings which are compatible with the lower 127 ASCII chart (ISO-8859-1, Windows-1252, UTF-8, etc).
- * </p>
- *
- * @see <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045</a>
- * @author Apache Software Foundation
- * @since 1.0
- * @version $Id: Base64.java 801706 2009-08-06 16:27:06Z niallp $
- */
-public class Base64Codec implements BinaryEncoder, BinaryDecoder {
- private static final int DEFAULT_BUFFER_RESIZE_FACTOR = 2;
-
- private static final int DEFAULT_BUFFER_SIZE = 8192;
-
- /**
- * Chunk size per RFC 2045 section 6.8.
- *
- * <p>
- * The {@value} character limit does not count the trailing CRLF, but counts all other characters, including any
- * equal signs.
- * </p>
- *
- * @see <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045 section 6.8</a>
- */
- static final int CHUNK_SIZE = 76;
-
- /**
- * Chunk separator per RFC 2045 section 2.1.
- *
- * <p>
- * N.B. The next major release may break compatibility and make this field private.
- * </p>
- *
- * @see <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045 section 2.1</a>
- */
- static final byte[] CHUNK_SEPARATOR = {'\r', '\n'};
-
- /**
- * This array is a lookup table that translates 6-bit positive integer index values into their "Base64 Alphabet"
- * equivalents as specified in Table 1 of RFC 2045.
- *
- * Thanks to "commons" project in ws.apache.org for this code.
- * http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/
- */
- private static final byte[] STANDARD_ENCODE_TABLE = {
- 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
- 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
- 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
- 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
- };
-
- /**
- * This is a copy of the STANDARD_ENCODE_TABLE above, but with + and /
- * changed to - and _ to make the encoded Base64 results more URL-SAFE.
- * This table is only used when the Base64's mode is set to URL-SAFE.
- */
- private static final byte[] URL_SAFE_ENCODE_TABLE = {
- 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
- 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
- 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
- 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_'
- };
-
- /**
- * Byte used to pad output.
- */
- private static final byte PAD = '=';
-
- /**
- * This array is a lookup table that translates Unicode characters drawn from the "Base64 Alphabet" (as specified in
- * Table 1 of RFC 2045) into their 6-bit positive integer equivalents. Characters that are not in the Base64
- * alphabet but fall within the bounds of the array are translated to -1.
- *
- * Note: '+' and '-' both decode to 62. '/' and '_' both decode to 63. This means decoder seamlessly handles both
- * URL_SAFE and STANDARD base64. (The encoder, on the other hand, needs to know ahead of time what to emit).
- *
- * Thanks to "commons" project in ws.apache.org for this code.
- * http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/
- */
- private static final byte[] DECODE_TABLE = {
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, 62, -1, 63, 52, 53, 54,
- 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4,
- 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
- 24, 25, -1, -1, -1, -1, 63, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34,
- 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51
- };
-
- /** Mask used to extract 6 bits, used when encoding */
- private static final int MASK_6BITS = 0x3f;
-
- /** Mask used to extract 8 bits, used in decoding base64 bytes */
- private static final int MASK_8BITS = 0xff;
-
- // The static final fields above are used for the original static byte[] methods on Base64.
- // The private member fields below are used with the new streaming approach, which requires
- // some state be preserved between calls of encode() and decode().
-
- /**
- * Encode table to use: either STANDARD or URL_SAFE. Note: the DECODE_TABLE above remains static because it is able
- * to decode both STANDARD and URL_SAFE streams, but the encodeTable must be a member variable so we can switch
- * between the two modes.
- */
- private final byte[] encodeTable;
-
- /**
- * Line length for encoding. Not used when decoding. A value of zero or less implies no chunking of the base64
- * encoded data.
- */
- private final int lineLength;
-
- /**
- * Line separator for encoding. Not used when decoding. Only used if lineLength > 0.
- */
- private final byte[] lineSeparator;
-
- /**
- * Convenience variable to help us determine when our buffer is going to run out of room and needs resizing.
- * <code>decodeSize = 3 + lineSeparator.length;</code>
- */
- private final int decodeSize;
-
- /**
- * Convenience variable to help us determine when our buffer is going to run out of room and needs resizing.
- * <code>encodeSize = 4 + lineSeparator.length;</code>
- */
- private final int encodeSize;
-
- /**
- * Buffer for streaming.
- */
- private byte[] buffer;
-
- /**
- * Position where next character should be written in the buffer.
- */
- private int pos;
-
- /**
- * Position where next character should be read from the buffer.
- */
- private int readPos;
-
- /**
- * Variable tracks how many characters have been written to the current line. Only used when encoding. We use it to
- * make sure each encoded line never goes beyond lineLength (if lineLength > 0).
- */
- private int currentLinePos;
-
- /**
- * Writes to the buffer only occur after every 3 reads when encoding, an every 4 reads when decoding. This variable
- * helps track that.
- */
- private int modulus;
-
- /**
- * Boolean flag to indicate the EOF has been reached. Once EOF has been reached, this Base64 object becomes useless,
- * and must be thrown away.
- */
- private boolean eof;
-
- /**
- * Place holder for the 3 bytes we're dealing with for our base64 logic. Bitwise operations store and extract the
- * base64 encoding or decoding from this variable.
- */
- private int x;
-
- /**
- * Creates a Base64 codec used for decoding (all modes) and encoding in URL-unsafe mode.
- * <p>
- * When encoding the line length is 76, the line separator is CRLF, and the encoding table is STANDARD_ENCODE_TABLE.
- * </p>
- *
- * <p>
- * When decoding all variants are supported.
- * </p>
- */
- public Base64Codec() {
- this(false);
- }
-
- /**
- * Creates a Base64 codec used for decoding (all modes) and encoding in the given URL-safe mode.
- * <p>
- * When encoding the line length is 76, the line separator is CRLF, and the encoding table is STANDARD_ENCODE_TABLE.
- * </p>
- *
- * <p>
- * When decoding all variants are supported.
- * </p>
- *
- * @param urlSafe
- * if <code>true</code>, URL-safe encoding is used. In most cases this should be set to
- * <code>false</code>.
- * @since 1.4
- */
- public Base64Codec(boolean urlSafe) {
- this(CHUNK_SIZE, CHUNK_SEPARATOR, urlSafe);
- }
-
- /**
- * Creates a Base64 codec used for decoding (all modes) and encoding in URL-unsafe mode.
- * <p>
- * When encoding the line length is given in the constructor, the line separator is CRLF, and the encoding table is
- * STANDARD_ENCODE_TABLE.
- * </p>
- * <p>
- * Line lengths that aren't multiples of 4 will still essentially end up being multiples of 4 in the encoded data.
- * </p>
- * <p>
- * When decoding all variants are supported.
- * </p>
- *
- * @param lineLength
- * Each line of encoded data will be at most of the given length (rounded down to nearest multiple of 4).
- * If lineLength <= 0, then the output will not be divided into lines (chunks). Ignored when decoding.
- * @since 1.4
- */
- public Base64Codec(int lineLength) {
- this(lineLength, CHUNK_SEPARATOR);
- }
-
- /**
- * Creates a Base64 codec used for decoding (all modes) and encoding in URL-unsafe mode.
- * <p>
- * When encoding the line length and line separator are given in the constructor, and the encoding table is
- * STANDARD_ENCODE_TABLE.
- * </p>
- * <p>
- * Line lengths that aren't multiples of 4 will still essentially end up being multiples of 4 in the encoded data.
- * </p>
- * <p>
- * When decoding all variants are supported.
- * </p>
- *
- * @param lineLength
- * Each line of encoded data will be at most of the given length (rounded down to nearest multiple of 4).
- * If lineLength <= 0, then the output will not be divided into lines (chunks). Ignored when decoding.
- * @param lineSeparator
- * Each line of encoded data will end with this sequence of bytes.
- * @throws IllegalArgumentException
- * Thrown when the provided lineSeparator included some base64 characters.
- * @since 1.4
- */
- public Base64Codec(int lineLength, byte[] lineSeparator) {
- this(lineLength, lineSeparator, false);
- }
-
- /**
- * Creates a Base64 codec used for decoding (all modes) and encoding in URL-unsafe mode.
- * <p>
- * When encoding the line length and line separator are given in the constructor, and the encoding table is
- * STANDARD_ENCODE_TABLE.
- * </p>
- * <p>
- * Line lengths that aren't multiples of 4 will still essentially end up being multiples of 4 in the encoded data.
- * </p>
- * <p>
- * When decoding all variants are supported.
- * </p>
- *
- * @param lineLength
- * Each line of encoded data will be at most of the given length (rounded down to nearest multiple of 4).
- * If lineLength <= 0, then the output will not be divided into lines (chunks). Ignored when decoding.
- * @param lineSeparator
- * Each line of encoded data will end with this sequence of bytes.
- * @param urlSafe
- * Instead of emitting '+' and '/' we emit '-' and '_' respectively. urlSafe is only applied to encode
- * operations. Decoding seamlessly handles both modes.
- * @throws IllegalArgumentException
- * The provided lineSeparator included some base64 characters. That's not going to work!
- * @since 1.4
- */
- public Base64Codec(int lineLength, byte[] lineSeparator, boolean urlSafe) {
- if (lineSeparator == null) {
- lineLength = 0; // disable chunk-separating
- lineSeparator = CHUNK_SEPARATOR; // this just gets ignored
- }
- this.lineLength = lineLength > 0 ? (lineLength / 4) * 4 : 0;
- this.lineSeparator = new byte[lineSeparator.length];
- System.arraycopy(lineSeparator, 0, this.lineSeparator, 0, lineSeparator.length);
- if (lineLength > 0) {
- this.encodeSize = 4 + lineSeparator.length;
- } else {
- this.encodeSize = 4;
- }
- this.decodeSize = this.encodeSize - 1;
- if (containsBase64Byte(lineSeparator)) {
- String sep = StringUtils.newStringUtf8(lineSeparator);
- throw new IllegalArgumentException("lineSeperator must not contain base64 characters: [" + sep + "]");
- }
- this.encodeTable = urlSafe ? URL_SAFE_ENCODE_TABLE : STANDARD_ENCODE_TABLE;
- }
-
- /**
- * Returns our current encode mode. True if we're URL-SAFE, false otherwise.
- *
- * @return true if we're in URL-SAFE mode, false otherwise.
- * @since 1.4
- */
- public boolean isUrlSafe() {
- return this.encodeTable == URL_SAFE_ENCODE_TABLE;
- }
-
- /**
- * Returns true if this Base64 object has buffered data for reading.
- *
- * @return true if there is Base64 object still available for reading.
- */
- boolean hasData() {
- return this.buffer != null;
- }
-
- /**
- * Returns the amount of buffered data available for reading.
- *
- * @return The amount of buffered data available for reading.
- */
- int avail() {
- return buffer != null ? pos - readPos : 0;
- }
-
- /** Doubles our buffer. */
- private void resizeBuffer() {
- if (buffer == null) {
- buffer = new byte[DEFAULT_BUFFER_SIZE];
- pos = 0;
- readPos = 0;
- } else {
- byte[] b = new byte[buffer.length * DEFAULT_BUFFER_RESIZE_FACTOR];
- System.arraycopy(buffer, 0, b, 0, buffer.length);
- buffer = b;
- }
- }
-
- /**
- * Extracts buffered data into the provided byte[] array, starting at position bPos, up to a maximum of bAvail
- * bytes. Returns how many bytes were actually extracted.
- *
- * @param b
- * byte[] array to extract the buffered data into.
- * @param bPos
- * position in byte[] array to start extraction at.
- * @param bAvail
- * amount of bytes we're allowed to extract. We may extract fewer (if fewer are available).
- * @return The number of bytes successfully extracted into the provided byte[] array.
- */
- int readResults(byte[] b, int bPos, int bAvail) {
- if (buffer != null) {
- int len = Math.min(avail(), bAvail);
- if (buffer != b) {
- System.arraycopy(buffer, readPos, b, bPos, len);
- readPos += len;
- if (readPos >= pos) {
- buffer = null;
- }
- } else {
- // Re-using the original consumer's output array is only
- // allowed for one round.
- buffer = null;
- }
- return len;
- }
- return eof ? -1 : 0;
- }
-
- /**
- * Sets the streaming buffer. This is a small optimization where we try to buffer directly to the consumer's output
- * array for one round (if the consumer calls this method first) instead of starting our own buffer.
- *
- * @param out
- * byte[] array to buffer directly to.
- * @param outPos
- * Position to start buffering into.
- * @param outAvail
- * Amount of bytes available for direct buffering.
- */
- void setInitialBuffer(byte[] out, int outPos, int outAvail) {
- // We can re-use consumer's original output array under
- // special circumstances, saving on some System.arraycopy().
- if (out != null && out.length == outAvail) {
- buffer = out;
- pos = outPos;
- readPos = outPos;
- }
- }
-
- /**
- * <p>
- * Encodes all of the provided data, starting at inPos, for inAvail bytes. Must be called at least twice: once with
- * the data to encode, and once with inAvail set to "-1" to alert encoder that EOF has been reached, so flush last
- * remaining bytes (if not multiple of 3).
- * </p>
- * <p>
- * Thanks to "commons" project in ws.apache.org for the bitwise operations, and general approach.
- * http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/
- * </p>
- *
- * @param in
- * byte[] array of binary data to base64 encode.
- * @param inPos
- * Position to start reading data from.
- * @param inAvail
- * Amount of bytes available from input for encoding.
- */
- void encode(byte[] in, int inPos, int inAvail) {
- if (eof) {
- return;
- }
- // inAvail < 0 is how we're informed of EOF in the underlying data we're
- // encoding.
- if (inAvail < 0) {
- eof = true;
- if (buffer == null || buffer.length - pos < encodeSize) {
- resizeBuffer();
- }
- switch (modulus) {
- case 1 :
- buffer[pos++] = encodeTable[(x >> 2) & MASK_6BITS];
- buffer[pos++] = encodeTable[(x << 4) & MASK_6BITS];
- // URL-SAFE skips the padding to further reduce size.
- if (encodeTable == STANDARD_ENCODE_TABLE) {
- buffer[pos++] = PAD;
- buffer[pos++] = PAD;
- }
- break;
-
- case 2 :
- buffer[pos++] = encodeTable[(x >> 10) & MASK_6BITS];
- buffer[pos++] = encodeTable[(x >> 4) & MASK_6BITS];
- buffer[pos++] = encodeTable[(x << 2) & MASK_6BITS];
- // URL-SAFE skips the padding to further reduce size.
- if (encodeTable == STANDARD_ENCODE_TABLE) {
- buffer[pos++] = PAD;
- }
- break;
- }
- if (lineLength > 0 && pos > 0) {
- System.arraycopy(lineSeparator, 0, buffer, pos, lineSeparator.length);
- pos += lineSeparator.length;
- }
- } else {
- for (int i = 0; i < inAvail; i++) {
- if (buffer == null || buffer.length - pos < encodeSize) {
- resizeBuffer();
- }
- modulus = (++modulus) % 3;
- int b = in[inPos++];
- if (b < 0) {
- b += 256;
- }
- x = (x << 8) + b;
- if (0 == modulus) {
- buffer[pos++] = encodeTable[(x >> 18) & MASK_6BITS];
- buffer[pos++] = encodeTable[(x >> 12) & MASK_6BITS];
- buffer[pos++] = encodeTable[(x >> 6) & MASK_6BITS];
- buffer[pos++] = encodeTable[x & MASK_6BITS];
- currentLinePos += 4;
- if (lineLength > 0 && lineLength <= currentLinePos) {
- System.arraycopy(lineSeparator, 0, buffer, pos, lineSeparator.length);
- pos += lineSeparator.length;
- currentLinePos = 0;
- }
- }
- }
- }
- }
-
- /**
- * <p>
- * Decodes all of the provided data, starting at inPos, for inAvail bytes. Should be called at least twice: once
- * with the data to decode, and once with inAvail set to "-1" to alert decoder that EOF has been reached. The "-1"
- * call is not necessary when decoding, but it doesn't hurt, either.
- * </p>
- * <p>
- * Ignores all non-base64 characters. This is how chunked (e.g. 76 character) data is handled, since CR and LF are
- * silently ignored, but has implications for other bytes, too. This method subscribes to the garbage-in,
- * garbage-out philosophy: it will not check the provided data for validity.
- * </p>
- * <p>
- * Thanks to "commons" project in ws.apache.org for the bitwise operations, and general approach.
- * http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/
- * </p>
- *
- * @param in
- * byte[] array of ascii data to base64 decode.
- * @param inPos
- * Position to start reading data from.
- * @param inAvail
- * Amount of bytes available from input for encoding.
- */
- void decode(byte[] in, int inPos, int inAvail) {
- if (eof) {
- return;
- }
- if (inAvail < 0) {
- eof = true;
- }
- for (int i = 0; i < inAvail; i++) {
- if (buffer == null || buffer.length - pos < decodeSize) {
- resizeBuffer();
- }
- byte b = in[inPos++];
- if (b == PAD) {
- // We're done.
- eof = true;
- break;
- } else {
- if (b >= 0 && b < DECODE_TABLE.length) {
- int result = DECODE_TABLE[b];
- if (result >= 0) {
- modulus = (++modulus) % 4;
- x = (x << 6) + result;
- if (modulus == 0) {
- buffer[pos++] = (byte) ((x >> 16) & MASK_8BITS);
- buffer[pos++] = (byte) ((x >> 8) & MASK_8BITS);
- buffer[pos++] = (byte) (x & MASK_8BITS);
- }
- }
- }
- }
- }
-
- // Two forms of EOF as far as base64 decoder is concerned: actual
- // EOF (-1) and first time '=' character is encountered in stream.
- // This approach makes the '=' padding characters completely optional.
- if (eof && modulus != 0) {
- x = x << 6;
- switch (modulus) {
- case 2 :
- x = x << 6;
- buffer[pos++] = (byte) ((x >> 16) & MASK_8BITS);
- break;
- case 3 :
- buffer[pos++] = (byte) ((x >> 16) & MASK_8BITS);
- buffer[pos++] = (byte) ((x >> 8) & MASK_8BITS);
- break;
- }
- }
- }
-
- /**
- * Returns whether or not the <code>octet</code> is in the base 64 alphabet.
- *
- * @param octet
- * The value to test
- * @return <code>true</code> if the value is defined in the the base 64 alphabet, <code>false</code> otherwise.
- * @since 1.4
- */
- public static boolean isBase64(byte octet) {
- return octet == PAD || (octet >= 0 && octet < DECODE_TABLE.length && DECODE_TABLE[octet] != -1);
- }
-
- /**
- * Tests a given byte array to see if it contains only valid characters within the Base64 alphabet. Currently the
- * method treats whitespace as valid.
- *
- * @param arrayOctet
- * byte array to test
- * @return <code>true</code> if all bytes are valid characters in the Base64 alphabet or if the byte array is empty;
- * false, otherwise
- */
- public static boolean isArrayByteBase64(byte[] arrayOctet) {
- for (int i = 0; i < arrayOctet.length; i++) {
- if (!isBase64(arrayOctet[i]) && !isWhiteSpace(arrayOctet[i])) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Tests a given byte array to see if it contains only valid characters within the Base64 alphabet.
- *
- * @param arrayOctet
- * byte array to test
- * @return <code>true</code> if any byte is a valid character in the Base64 alphabet; false herwise
- */
- private static boolean containsBase64Byte(byte[] arrayOctet) {
- for (int i = 0; i < arrayOctet.length; i++) {
- if (isBase64(arrayOctet[i])) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Encodes binary data using the base64 algorithm but does not chunk the output.
- *
- * @param binaryData
- * binary data to encode
- * @return byte[] containing Base64 characters in their UTF-8 representation.
- */
- public static byte[] encodeBase64(byte[] binaryData) {
- return encodeBase64(binaryData, false);
- }
-
- /**
- * Encodes binary data using the base64 algorithm into 76 character blocks separated by CRLF.
- *
- * @param binaryData
- * binary data to encode
- * @return String containing Base64 characters.
- * @since 1.4
- */
- public static String encodeBase64String(byte[] binaryData) {
- return StringUtils.newStringUtf8(encodeBase64(binaryData, true));
- }
-
- /**
- * Encodes binary data using a URL-safe variation of the base64 algorithm but does not chunk the output. The
- * url-safe variation emits - and _ instead of + and / characters.
- *
- * @param binaryData
- * binary data to encode
- * @return byte[] containing Base64 characters in their UTF-8 representation.
- * @since 1.4
- */
- public static byte[] encodeBase64URLSafe(byte[] binaryData) {
- return encodeBase64(binaryData, false, true);
- }
-
- /**
- * Encodes binary data using a URL-safe variation of the base64 algorithm but does not chunk the output. The
- * url-safe variation emits - and _ instead of + and / characters.
- *
- * @param binaryData
- * binary data to encode
- * @return String containing Base64 characters
- * @since 1.4
- */
- public static String encodeBase64URLSafeString(byte[] binaryData) {
- return StringUtils.newStringUtf8(encodeBase64(binaryData, false, true));
- }
-
- /**
- * Encodes binary data using the base64 algorithm and chunks the encoded output into 76 character blocks
- *
- * @param binaryData
- * binary data to encode
- * @return Base64 characters chunked in 76 character blocks
- */
- public static byte[] encodeBase64Chunked(byte[] binaryData) {
- return encodeBase64(binaryData, true);
- }
-
- /**
- * Decodes an Object using the base64 algorithm. This method is provided in order to satisfy the requirements of the
- * Decoder interface, and will throw a DecoderException if the supplied object is not of type byte[] or String.
- *
- * @param pObject
- * Object to decode
- * @return An object (of type byte[]) containing the binary data which corresponds to the byte[] or String supplied.
- * @throws DecoderException
- * if the parameter supplied is not of type byte[]
- */
- public Object decode(Object pObject) throws DecoderException {
- if (pObject instanceof byte[]) {
- return decode((byte[]) pObject);
- } else if (pObject instanceof String) {
- return decode((String) pObject);
- } else {
- throw new DecoderException("Parameter supplied to Base64 decode is not a byte[] or a String");
- }
- }
-
- /**
- * Decodes a String containing containing characters in the Base64 alphabet.
- *
- * @param pArray
- * A String containing Base64 character data
- * @return a byte array containing binary data
- * @since 1.4
- */
- public byte[] decode(String pArray) {
- return decode(StringUtils.getBytesUtf8(pArray));
- }
-
- /**
- * Decodes a byte[] containing containing characters in the Base64 alphabet.
- *
- * @param pArray
- * A byte array containing Base64 character data
- * @return a byte array containing binary data
- */
- public byte[] decode(byte[] pArray) {
- reset();
- if (pArray == null || pArray.length == 0) {
- return pArray;
- }
- long len = (pArray.length * 3) / 4;
- byte[] buf = new byte[(int) len];
- setInitialBuffer(buf, 0, buf.length);
- decode(pArray, 0, pArray.length);
- decode(pArray, 0, -1); // Notify decoder of EOF.
-
- // Would be nice to just return buf (like we sometimes do in the encode
- // logic), but we have no idea what the line-length was (could even be
- // variable). So we cannot determine ahead of time exactly how big an
- // array is necessary. Hence the need to construct a 2nd byte array to
- // hold the final result:
-
- byte[] result = new byte[pos];
- readResults(result, 0, result.length);
- return result;
- }
-
- /**
- * Encodes binary data using the base64 algorithm, optionally chunking the output into 76 character blocks.
- *
- * @param binaryData
- * Array containing binary data to encode.
- * @param isChunked
- * if <code>true</code> this encoder will chunk the base64 output into 76 character blocks
- * @return Base64-encoded data.
- * @throws IllegalArgumentException
- * Thrown when the input array needs an output array bigger than {@link Integer#MAX_VALUE}
- */
- public static byte[] encodeBase64(byte[] binaryData, boolean isChunked) {
- return encodeBase64(binaryData, isChunked, false);
- }
-
- /**
- * Encodes binary data using the base64 algorithm, optionally chunking the output into 76 character blocks.
- *
- * @param binaryData
- * Array containing binary data to encode.
- * @param isChunked
- * if <code>true</code> this encoder will chunk the base64 output into 76 character blocks
- * @param urlSafe
- * if <code>true</code> this encoder will emit - and _ instead of the usual + and / characters.
- * @return Base64-encoded data.
- * @throws IllegalArgumentException
- * Thrown when the input array needs an output array bigger than {@link Integer#MAX_VALUE}
- * @since 1.4
- */
- public static byte[] encodeBase64(byte[] binaryData, boolean isChunked, boolean urlSafe) {
- return encodeBase64(binaryData, isChunked, urlSafe, Integer.MAX_VALUE);
- }
-
- /**
- * Encodes binary data using the base64 algorithm, optionally chunking the output into 76 character blocks.
- *
- * @param binaryData
- * Array containing binary data to encode.
- * @param isChunked
- * if <code>true</code> this encoder will chunk the base64 output into 76 character blocks
- * @param urlSafe
- * if <code>true</code> this encoder will emit - and _ instead of the usual + and / characters.
- * @param maxResultSize
- * The maximum result size to accept.
- * @return Base64-encoded data.
- * @throws IllegalArgumentException
- * Thrown when the input array needs an output array bigger than maxResultSize
- * @since 1.4
- */
- public static byte[] encodeBase64(byte[] binaryData, boolean isChunked, boolean urlSafe, int maxResultSize) {
- if (binaryData == null || binaryData.length == 0) {
- return binaryData;
- }
-
- long len = getEncodeLength(binaryData, CHUNK_SIZE, CHUNK_SEPARATOR);
- if (len > maxResultSize) {
- throw new IllegalArgumentException("Input array too big, the output array would be bigger (" +
- len +
- ") than the specified maxium size of " +
- maxResultSize);
- }
-
- Base64Codec b64 = isChunked ? new Base64Codec(urlSafe) : new Base64Codec(0, CHUNK_SEPARATOR, urlSafe);
- return b64.encode(binaryData);
- }
-
- /**
- * Decodes a Base64 String into octets
- *
- * @param base64String
- * String containing Base64 data
- * @return Array containing decoded data.
- * @since 1.4
- */
- public static byte[] decodeBase64(String base64String) {
- return new Base64Codec().decode(base64String);
- }
-
- /**
- * Decodes Base64 data into octets
- *
- * @param base64Data
- * Byte array containing Base64 data
- * @return Array containing decoded data.
- */
- public static byte[] decodeBase64(byte[] base64Data) {
- return new Base64Codec().decode(base64Data);
- }
-
- /**
- * Discards any whitespace from a base-64 encoded block.
- *
- * @param data
- * The base-64 encoded data to discard the whitespace from.
- * @return The data, less whitespace (see RFC 2045).
- * @deprecated This method is no longer needed
- */
- static byte[] discardWhitespace(byte[] data) {
- byte groomedData[] = new byte[data.length];
- int bytesCopied = 0;
- for (int i = 0; i < data.length; i++) {
- switch (data[i]) {
- case ' ' :
- case '\n' :
- case '\r' :
- case '\t' :
- break;
- default :
- groomedData[bytesCopied++] = data[i];
- }
- }
- byte packedData[] = new byte[bytesCopied];
- System.arraycopy(groomedData, 0, packedData, 0, bytesCopied);
- return packedData;
- }
-
- /**
- * Checks if a byte value is whitespace or not.
- *
- * @param byteToCheck
- * the byte to check
- * @return true if byte is whitespace, false otherwise
- */
- private static boolean isWhiteSpace(byte byteToCheck) {
- switch (byteToCheck) {
- case ' ' :
- case '\n' :
- case '\r' :
- case '\t' :
- return true;
- default :
- return false;
- }
- }
-
- // Implementation of the Encoder Interface
-
- /**
- * Encodes an Object using the base64 algorithm. This method is provided in order to satisfy the requirements of the
- * Encoder interface, and will throw an EncoderException if the supplied object is not of type byte[].
- *
- * @param pObject
- * Object to encode
- * @return An object (of type byte[]) containing the base64 encoded data which corresponds to the byte[] supplied.
- * @throws EncoderException
- * if the parameter supplied is not of type byte[]
- */
- public Object encode(Object pObject) throws EncoderException {
- if (!(pObject instanceof byte[])) {
- throw new EncoderException("Parameter supplied to Base64 encode is not a byte[]");
- }
- return encode((byte[]) pObject);
- }
-
- /**
- * Encodes a byte[] containing binary data, into a String containing characters in the Base64 alphabet.
- *
- * @param pArray
- * a byte array containing binary data
- * @return A String containing only Base64 character data
- * @since 1.4
- */
- public String encodeToString(byte[] pArray) {
- return StringUtils.newStringUtf8(encode(pArray));
- }
-
- /**
- * Encodes a byte[] containing binary data, into a byte[] containing characters in the Base64 alphabet.
- *
- * @param pArray
- * a byte array containing binary data
- * @return A byte array containing only Base64 character data
- */
- public byte[] encode(byte[] pArray) {
- reset();
- if (pArray == null || pArray.length == 0) {
- return pArray;
- }
- long len = getEncodeLength(pArray, lineLength, lineSeparator);
- byte[] buf = new byte[(int) len];
- setInitialBuffer(buf, 0, buf.length);
- encode(pArray, 0, pArray.length);
- encode(pArray, 0, -1); // Notify encoder of EOF.
- // Encoder might have resized, even though it was unnecessary.
- if (buffer != buf) {
- readResults(buf, 0, buf.length);
- }
- // In URL-SAFE mode we skip the padding characters, so sometimes our
- // final length is a bit smaller.
- if (isUrlSafe() && pos < buf.length) {
- byte[] smallerBuf = new byte[pos];
- System.arraycopy(buf, 0, smallerBuf, 0, pos);
- buf = smallerBuf;
- }
- return buf;
- }
-
- /**
- * Pre-calculates the amount of space needed to base64-encode the supplied array.
- *
- * @param pArray byte[] array which will later be encoded
- * @param chunkSize line-length of the output (<= 0 means no chunking) between each
- * chunkSeparator (e.g. CRLF).
- * @param chunkSeparator the sequence of bytes used to separate chunks of output (e.g. CRLF).
- *
- * @return amount of space needed to encoded the supplied array. Returns
- * a long since a max-len array will require Integer.MAX_VALUE + 33%.
- */
- private static long getEncodeLength(byte[] pArray, int chunkSize, byte[] chunkSeparator) {
- // base64 always encodes to multiples of 4.
- chunkSize = (chunkSize / 4) * 4;
-
- long len = (pArray.length * 4) / 3;
- long mod = len % 4;
- if (mod != 0) {
- len += 4 - mod;
- }
- if (chunkSize > 0) {
- boolean lenChunksPerfectly = len % chunkSize == 0;
- len += (len / chunkSize) * chunkSeparator.length;
- if (!lenChunksPerfectly) {
- len += chunkSeparator.length;
- }
- }
- return len;
- }
-
- // Implementation of integer encoding used for crypto
- /**
- * Decodes a byte64-encoded integer according to crypto standards such as W3C's XML-Signature
- *
- * @param pArray
- * a byte array containing base64 character data
- * @return A BigInteger
- * @since 1.4
- */
- public static BigInteger decodeInteger(byte[] pArray) {
- return new BigInteger(1, decodeBase64(pArray));
- }
-
- /**
- * Encodes to a byte64-encoded integer according to crypto standards such as W3C's XML-Signature
- *
- * @param bigInt
- * a BigInteger
- * @return A byte array containing base64 character data
- * @throws NullPointerException
- * if null is passed in
- * @since 1.4
- */
- public static byte[] encodeInteger(BigInteger bigInt) {
- if (bigInt == null) {
- throw new NullPointerException("encodeInteger called with null parameter");
- }
- return encodeBase64(toIntegerBytes(bigInt), false);
- }
-
- /**
- * Returns a byte-array representation of a <code>BigInteger</code> without sign bit.
- *
- * @param bigInt
- * <code>BigInteger</code> to be converted
- * @return a byte array representation of the BigInteger parameter
- */
- static byte[] toIntegerBytes(BigInteger bigInt) {
- int bitlen = bigInt.bitLength();
- // round bitlen
- bitlen = ((bitlen + 7) >> 3) << 3;
- byte[] bigBytes = bigInt.toByteArray();
-
- if (((bigInt.bitLength() % 8) != 0) && (((bigInt.bitLength() / 8) + 1) == (bitlen / 8))) {
- return bigBytes;
- }
- // set up params for copying everything but sign bit
- int startSrc = 0;
- int len = bigBytes.length;
-
- // if bigInt is exactly byte-aligned, just skip signbit in copy
- if ((bigInt.bitLength() % 8) == 0) {
- startSrc = 1;
- len--;
- }
- int startDst = bitlen / 8 - len; // to pad w/ nulls as per spec
- byte[] resizedBytes = new byte[bitlen / 8];
- System.arraycopy(bigBytes, startSrc, resizedBytes, startDst, len);
- return resizedBytes;
- }
-
- /**
- * Resets this Base64 object to its initial newly constructed state.
- */
- private void reset() {
- buffer = null;
- pos = 0;
- readPos = 0;
- currentLinePos = 0;
- modulus = 0;
- eof = false;
- }
-
-}
diff --git a/sl4a/Common/src/org/apache/commons/codec/binary/StringUtils.java b/sl4a/Common/src/org/apache/commons/codec/binary/StringUtils.java
deleted file mode 100644
index e3af657..0000000
--- a/sl4a/Common/src/org/apache/commons/codec/binary/StringUtils.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.codec.binary;
-
-import java.io.UnsupportedEncodingException;
-
-import org.apache.commons.codec.CharEncoding;
-
-/**
- * Converts String to and from bytes using the encodings required by the Java specification. These encodings are specified in <a
- * href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html">Standard charsets</a>
- *
- * @see CharEncoding
- * @see <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html">Standard charsets</a>
- * @author <a href="mailto:ggregory@seagullsw.com">Gary Gregory</a>
- * @version $Id: StringUtils.java 801391 2009-08-05 19:55:54Z ggregory $
- * @since 1.4
- */
-public class StringUtils {
-
- /**
- * Encodes the given string into a sequence of bytes using the ISO-8859-1 charset, storing the result into a new
- * byte array.
- *
- * @param string
- * the String to encode
- * @return encoded bytes
- * @throws IllegalStateException
- * Thrown when the charset is missing, which should be never according the the Java specification.
- * @see <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html">Standard charsets</a>
- * @see #getBytesUnchecked(String, String)
- */
- public static byte[] getBytesIso8859_1(String string) {
- return StringUtils.getBytesUnchecked(string, CharEncoding.ISO_8859_1);
- }
-
- /**
- * Encodes the given string into a sequence of bytes using the US-ASCII charset, storing the result into a new byte
- * array.
- *
- * @param string
- * the String to encode
- * @return encoded bytes
- * @throws IllegalStateException
- * Thrown when the charset is missing, which should be never according the the Java specification.
- * @see <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html">Standard charsets</a>
- * @see #getBytesUnchecked(String, String)
- */
- public static byte[] getBytesUsAscii(String string) {
- return StringUtils.getBytesUnchecked(string, CharEncoding.US_ASCII);
- }
-
- /**
- * Encodes the given string into a sequence of bytes using the UTF-16 charset, storing the result into a new byte
- * array.
- *
- * @param string
- * the String to encode
- * @return encoded bytes
- * @throws IllegalStateException
- * Thrown when the charset is missing, which should be never according the the Java specification.
- * @see <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html">Standard charsets</a>
- * @see #getBytesUnchecked(String, String)
- */
- public static byte[] getBytesUtf16(String string) {
- return StringUtils.getBytesUnchecked(string, CharEncoding.UTF_16);
- }
-
- /**
- * Encodes the given string into a sequence of bytes using the UTF-16BE charset, storing the result into a new byte
- * array.
- *
- * @param string
- * the String to encode
- * @return encoded bytes
- * @throws IllegalStateException
- * Thrown when the charset is missing, which should be never according the the Java specification.
- * @see <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html">Standard charsets</a>
- * @see #getBytesUnchecked(String, String)
- */
- public static byte[] getBytesUtf16Be(String string) {
- return StringUtils.getBytesUnchecked(string, CharEncoding.UTF_16BE);
- }
-
- /**
- * Encodes the given string into a sequence of bytes using the UTF-16LE charset, storing the result into a new byte
- * array.
- *
- * @param string
- * the String to encode
- * @return encoded bytes
- * @throws IllegalStateException
- * Thrown when the charset is missing, which should be never according the the Java specification.
- * @see <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html">Standard charsets</a>
- * @see #getBytesUnchecked(String, String)
- */
- public static byte[] getBytesUtf16Le(String string) {
- return StringUtils.getBytesUnchecked(string, CharEncoding.UTF_16LE);
- }
-
- /**
- * Encodes the given string into a sequence of bytes using the UTF-8 charset, storing the result into a new byte
- * array.
- *
- * @param string
- * the String to encode
- * @return encoded bytes
- * @throws IllegalStateException
- * Thrown when the charset is missing, which should be never according the the Java specification.
- * @see <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html">Standard charsets</a>
- * @see #getBytesUnchecked(String, String)
- */
- public static byte[] getBytesUtf8(String string) {
- return StringUtils.getBytesUnchecked(string, CharEncoding.UTF_8);
- }
-
- /**
- * Encodes the given string into a sequence of bytes using the named charset, storing the result into a new byte
- * array.
- * <p>
- * This method catches {@link UnsupportedEncodingException} and rethrows it as {@link IllegalStateException}, which
- * should never happen for a required charset name. Use this method when the encoding is required to be in the JRE.
- * </p>
- *
- * @param string
- * the String to encode
- * @param charsetName
- * The name of a required {@link java.nio.charset.Charset}
- * @return encoded bytes
- * @throws IllegalStateException
- * Thrown when a {@link UnsupportedEncodingException} is caught, which should never happen for a
- * required charset name.
- * @see CharEncoding
- * @see String#getBytes(String)
- */
- public static byte[] getBytesUnchecked(String string, String charsetName) {
- if (string == null) {
- return null;
- }
- try {
- return string.getBytes(charsetName);
- } catch (UnsupportedEncodingException e) {
- throw StringUtils.newIllegalStateException(charsetName, e);
- }
- }
-
- private static IllegalStateException newIllegalStateException(String charsetName, UnsupportedEncodingException e) {
- return new IllegalStateException(charsetName + ": " + e);
- }
-
- /**
- * Constructs a new <code>String</code> by decoding the specified array of bytes using the given charset.
- * <p>
- * This method catches {@link UnsupportedEncodingException} and re-throws it as {@link IllegalStateException}, which
- * should never happen for a required charset name. Use this method when the encoding is required to be in the JRE.
- * </p>
- *
- * @param bytes
- * The bytes to be decoded into characters
- * @param charsetName
- * The name of a required {@link java.nio.charset.Charset}
- * @return A new <code>String</code> decoded from the specified array of bytes using the given charset.
- * @throws IllegalStateException
- * Thrown when a {@link UnsupportedEncodingException} is caught, which should never happen for a
- * required charset name.
- * @see CharEncoding
- * @see String#String(byte[], String)
- */
- public static String newString(byte[] bytes, String charsetName) {
- if (bytes == null) {
- return null;
- }
- try {
- return new String(bytes, charsetName);
- } catch (UnsupportedEncodingException e) {
- throw StringUtils.newIllegalStateException(charsetName, e);
- }
- }
-
- /**
- * Constructs a new <code>String</code> by decoding the specified array of bytes using the ISO-8859-1 charset.
- *
- * @param bytes
- * The bytes to be decoded into characters
- * @return A new <code>String</code> decoded from the specified array of bytes using the given charset.
- * @throws IllegalStateException
- * Thrown when a {@link UnsupportedEncodingException} is caught, which should never happen since the
- * charset is required.
- */
- public static String newStringIso8859_1(byte[] bytes) {
- return StringUtils.newString(bytes, CharEncoding.ISO_8859_1);
- }
-
- /**
- * Constructs a new <code>String</code> by decoding the specified array of bytes using the US-ASCII charset.
- *
- * @param bytes
- * The bytes to be decoded into characters
- * @return A new <code>String</code> decoded from the specified array of bytes using the given charset.
- * @throws IllegalStateException
- * Thrown when a {@link UnsupportedEncodingException} is caught, which should never happen since the
- * charset is required.
- */
- public static String newStringUsAscii(byte[] bytes) {
- return StringUtils.newString(bytes, CharEncoding.US_ASCII);
- }
-
- /**
- * Constructs a new <code>String</code> by decoding the specified array of bytes using the UTF-16 charset.
- *
- * @param bytes
- * The bytes to be decoded into characters
- * @return A new <code>String</code> decoded from the specified array of bytes using the given charset.
- * @throws IllegalStateException
- * Thrown when a {@link UnsupportedEncodingException} is caught, which should never happen since the
- * charset is required.
- */
- public static String newStringUtf16(byte[] bytes) {
- return StringUtils.newString(bytes, CharEncoding.UTF_16);
- }
-
- /**
- * Constructs a new <code>String</code> by decoding the specified array of bytes using the UTF-16BE charset.
- *
- * @param bytes
- * The bytes to be decoded into characters
- * @return A new <code>String</code> decoded from the specified array of bytes using the given charset.
- * @throws IllegalStateException
- * Thrown when a {@link UnsupportedEncodingException} is caught, which should never happen since the
- * charset is required.
- */
- public static String newStringUtf16Be(byte[] bytes) {
- return StringUtils.newString(bytes, CharEncoding.UTF_16BE);
- }
-
- /**
- * Constructs a new <code>String</code> by decoding the specified array of bytes using the UTF-16LE charset.
- *
- * @param bytes
- * The bytes to be decoded into characters
- * @return A new <code>String</code> decoded from the specified array of bytes using the given charset.
- * @throws IllegalStateException
- * Thrown when a {@link UnsupportedEncodingException} is caught, which should never happen since the
- * charset is required.
- */
- public static String newStringUtf16Le(byte[] bytes) {
- return StringUtils.newString(bytes, CharEncoding.UTF_16LE);
- }
-
- /**
- * Constructs a new <code>String</code> by decoding the specified array of bytes using the UTF-8 charset.
- *
- * @param bytes
- * The bytes to be decoded into characters
- * @return A new <code>String</code> decoded from the specified array of bytes using the given charset.
- * @throws IllegalStateException
- * Thrown when a {@link UnsupportedEncodingException} is caught, which should never happen since the
- * charset is required.
- */
- public static String newStringUtf8(byte[] bytes) {
- return StringUtils.newString(bytes, CharEncoding.UTF_8);
- }
-
-}
diff --git a/sl4a/Docs/generate_api_reference_md.pl b/sl4a/Docs/generate_api_reference_md.pl
deleted file mode 100755
index 546fe28..0000000
--- a/sl4a/Docs/generate_api_reference_md.pl
+++ /dev/null
@@ -1,163 +0,0 @@
-#!/usr/bin/perl
-#
-# Copyright (C) 2015 Google, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at:
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-use strict;
-use warnings;
-use Cwd 'abs_path';
-use JSON;
-use File::Find;
-
-my $sl4a_path = $ARGV[0];
-my $md = "";
-my $md_end = "";
-
-if (not defined $sl4a_path) {
- $sl4a_path = abs_path($0);
- $sl4a_path =~ s/\/Docs\/generate_api_reference_md\.pl//g;
-}
-
-sub eachFile {
- my $filename = $_;
- my $fullpath = $File::Find::name;
- if (-e $filename && $filename =~ m/Facade\.java/) {
- open(FILE, $filename);
- my @lines = <FILE>;
- close(FILE);
-
- my $title = $filename;
- $title =~ s/\.java//;
- $title = '**' . $title . '**' . "\n";
- $md = $md . "\n$title";
- my $description = "";
- for (my $i = 0; $i < scalar(@lines); $i++) {
- my $line = $lines[$i];
- $line =~ s/\n//;
- $line =~ s/^\s+|\s+$//g;
-
- if ($line =~ m /^\@Rpc\(description/) {
- $description = "";
- for (my $j = $i; $j < scalar(@lines); $j++) {
- my $l = $lines[$j];
- $l =~ s/^\s+|\s+$//g;
- $description = $description . $l;
- if ($l =~ m/\)$/) {
- $i = $j;
- last;
- }
- }
- $description = _format_description($description);
-
- }
- if ($line =~ m /^public/ && $description ne "") {
- my @words = split(/\s/, $line);
- my $func_name = $words[2];
- my $func_names_and_params = "";
- if ($func_name =~ /void/) {
- $func_name = $words[3];
- if ($func_name =~ /void/) {
- $description = "";
- $func_names_and_params = "";
- next;
- }
- }
- if ($func_name =~ /\(/) {
- $func_name =~ s/\(.*//;
- }
- $func_name =~ s/\(//g;
- $func_name =~ s/\)//g;
- for (my $j = $i; $j < scalar(@lines); $j++) {
- $func_names_and_params = $func_names_and_params . $lines[$j];
- if ($lines[$j] =~ m/{$/) {
- last;
- }
- }
- $func_names_and_params = _format_func_names_and_params($func_names_and_params);
- if ($func_names_and_params eq "") {
- $func_names_and_params = ")\n";
- } else {
- $func_names_and_params = "\n" . $func_names_and_params;
- }
- $md_end = $md_end . "# $func_name\n```\n" .
- "$func_name(" . $func_names_and_params . "\n$description\n```\n\n" ;
- $description = "";
- $func_names_and_params = "";
- my $lc_name = lc $func_name;
- $md = $md . " * [$func_name](\#$lc_name)\n";
- }
- }
-
- }
-}
-
-sub _format_func_names_and_params {
- my $fn = shift;
- $fn =~ s/^\s+|\s+$//g;
- my @words = split(/\n/,$fn);
- my $format = "";
- my $description = "";
- my $name = "";
- my $params = "";
- for my $w (@words) {
- if ($w =~ /\@RpcParameter\(name = "(.+?)", description = "(.+?)"/) {
- $name = $1;
- $description = $2;
- }
- elsif ($w =~ /\@RpcParameter\(name = "(.+?)"/) {
- $name = $1;
- }
- if ($w =~ m/,$/) {
- my @split = split(/\s/, $w);
- $params = "$split[$#split-1] $split[$#split]";
- if ($description eq "") {
- $format = $params;
- } elsif ($description ne "") {
- $params =~ s/,//;
- $format = $format . " $params: $description,\n"
- }
- $description = "";
- $name = "";
- $params = "";
- }
- }
- $format =~ s/,$/)/;
- return $format;
-}
-
-sub _format_description {
- my $description = shift;
- $description =~ s/\@Rpc\(//;
- $description =~ s/^\s+|\s+$//g;
- $description =~ s/\n//g;
- $description =~ s/description = \"//g;
- $description =~ s/\"\)//g;
- if ($description =~ m/returns(\s*)=/) {
- $description =~ s/\",//;
- my @words = split(/returns(\s*)=/, $description);
- my $des = $words[0];
- my $ret = $words[1];
- $ret =~ s/^\s+|\s+$//g;
- $ret =~ s/^"//;
- $description = $des . "\n\n" . "Returns:\n" . " $ret";
- }
- return $description;
-}
-
-find (\&eachFile, $sl4a_path);
-open(FILE, ">$sl4a_path/Docs/ApiReference.md");
-print FILE $md . "\n";
-print FILE $md_end . "\n";
-close(FILE);
diff --git a/sl4a/InterpreterForAndroid/Android.mk b/sl4a/InterpreterForAndroid/Android.mk
deleted file mode 100644
index 7f222f6..0000000
--- a/sl4a/InterpreterForAndroid/Android.mk
+++ /dev/null
@@ -1,28 +0,0 @@
-#
-# Copyright (C) 2016 Google, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at:
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-
-LOCAL_MODULE := sl4a.InterpreterForAndroid
-LOCAL_MODULE_OWNER := google
-LOCAL_STATIC_JAVA_LIBRARIES := guava android-common sl4a.Utils
-#LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4
-LOCAL_SRC_FILES := $(call all-java-files-under, src/com/googlecode/android_scripting)
-
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/AsyncTaskListener.java b/sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/AsyncTaskListener.java
deleted file mode 100644
index 38bb34b..0000000
--- a/sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/AsyncTaskListener.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-/**
- * This listener asynchronously receives a task result whenever it finishes. Should be implemented
- * to avoid blocking on task's get() method.
- *
- * @author Alexey Reznichenko (alexey.reznichenko@gmail.com)
- */
-public interface AsyncTaskListener<T> {
- public void onTaskFinished(T result, String message);
-}
diff --git a/sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/InterpreterInstaller.java b/sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/InterpreterInstaller.java
deleted file mode 100644
index 53a1d6c..0000000
--- a/sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/InterpreterInstaller.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.os.AsyncTask;
-import android.os.Handler;
-import android.os.Looper;
-import android.preference.PreferenceManager;
-
-import com.googlecode.android_scripting.exception.Sl4aException;
-import com.googlecode.android_scripting.interpreter.InterpreterConstants;
-import com.googlecode.android_scripting.interpreter.InterpreterDescriptor;
-import com.googlecode.android_scripting.interpreter.InterpreterUtils;
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Queue;
-
-/**
- * AsyncTask for installing interpreters.
- *
- * @author Damon Kohler (damonkohler@gmail.com)
- * @author Alexey Reznichenko (alexey.reznichenko@gmail.com)
- */
-public abstract class InterpreterInstaller extends AsyncTask<Void, Void, Boolean> {
-
- protected final InterpreterDescriptor mDescriptor;
- protected final AsyncTaskListener<Boolean> mTaskListener;
- protected final Queue<RequestCode> mTaskQueue;
- protected final Context mContext;
-
- protected final Handler mainThreadHandler;
- protected Handler mBackgroundHandler;
-
- protected volatile AsyncTask<Void, Integer, Long> mTaskHolder;
-
- protected final String mInterpreterRoot;
-
- protected static enum RequestCode {
- DOWNLOAD_INTERPRETER, DOWNLOAD_INTERPRETER_EXTRAS, DOWNLOAD_SCRIPTS, EXTRACT_INTERPRETER,
- EXTRACT_INTERPRETER_EXTRAS, EXTRACT_SCRIPTS
- }
-
- // Executed in the UI thread.
- private final Runnable mTaskStarter = new Runnable() {
- @Override
- public void run() {
- RequestCode task = mTaskQueue.peek();
- try {
- AsyncTask<Void, Integer, Long> newTask = null;
- switch (task) {
- case DOWNLOAD_INTERPRETER:
- newTask = downloadInterpreter();
- break;
- case DOWNLOAD_INTERPRETER_EXTRAS:
- newTask = downloadInterpreterExtras();
- break;
- case DOWNLOAD_SCRIPTS:
- newTask = downloadScripts();
- break;
- case EXTRACT_INTERPRETER:
- newTask = extractInterpreter();
- break;
- case EXTRACT_INTERPRETER_EXTRAS:
- newTask = extractInterpreterExtras();
- break;
- case EXTRACT_SCRIPTS:
- newTask = extractScripts();
- break;
- }
- mTaskHolder = newTask.execute();
- } catch (Exception e) {
- Log.v(e.getMessage(), e);
- }
-
- if (mBackgroundHandler != null) {
- mBackgroundHandler.post(mTaskWorker);
- }
- }
- };
-
- // Executed in the background.
- private final Runnable mTaskWorker = new Runnable() {
- @Override
- public void run() {
- RequestCode request = mTaskQueue.peek();
- try {
- if (mTaskHolder != null && mTaskHolder.get() != null) {
- mTaskQueue.remove();
- mTaskHolder = null;
- // Post processing.
- if (request == RequestCode.EXTRACT_INTERPRETER && !chmodIntepreter()) {
- // Chmod returned false.
- Looper.myLooper().quit();
- } else if (mTaskQueue.size() == 0) {
- // We're done here.
- Looper.myLooper().quit();
- return;
- } else if (mainThreadHandler != null) {
- // There's still some work to do.
- mainThreadHandler.post(mTaskStarter);
- return;
- }
- }
- } catch (Exception e) {
- Log.e(e);
- }
- // Something went wrong...
- switch (request) {
- case DOWNLOAD_INTERPRETER:
- Log.e("Downloading interpreter failed.");
- break;
- case DOWNLOAD_INTERPRETER_EXTRAS:
- Log.e("Downloading interpreter extras failed.");
- break;
- case DOWNLOAD_SCRIPTS:
- Log.e("Downloading scripts failed.");
- break;
- case EXTRACT_INTERPRETER:
- Log.e("Extracting interpreter failed.");
- break;
- case EXTRACT_INTERPRETER_EXTRAS:
- Log.e("Extracting interpreter extras failed.");
- break;
- case EXTRACT_SCRIPTS:
- Log.e("Extracting scripts failed.");
- break;
- }
- Looper.myLooper().quit();
- }
- };
-
- // TODO(Alexey): Add Javadoc.
- public InterpreterInstaller(InterpreterDescriptor descriptor, Context context,
- AsyncTaskListener<Boolean> taskListener) throws Sl4aException {
- super();
- mDescriptor = descriptor;
- mContext = context;
- mTaskListener = taskListener;
- mainThreadHandler = new Handler();
- mTaskQueue = new LinkedList<RequestCode>();
-
- String packageName = mDescriptor.getClass().getPackage().getName();
-
- if (packageName.length() == 0) {
- throw new Sl4aException("Interpreter package name is empty.");
- }
-
- mInterpreterRoot = InterpreterConstants.SDCARD_ROOT + packageName;
-
- if (mDescriptor == null) {
- throw new Sl4aException("Interpreter description not provided.");
- }
- if (mDescriptor.getName() == null) {
- throw new Sl4aException("Interpreter not specified.");
- }
- if (isInstalled()) {
- throw new Sl4aException("Interpreter is installed.");
- }
-
- if (mDescriptor.hasInterpreterArchive()) {
- mTaskQueue.offer(RequestCode.DOWNLOAD_INTERPRETER);
- mTaskQueue.offer(RequestCode.EXTRACT_INTERPRETER);
- }
- if (mDescriptor.hasExtrasArchive()) {
- mTaskQueue.offer(RequestCode.DOWNLOAD_INTERPRETER_EXTRAS);
- mTaskQueue.offer(RequestCode.EXTRACT_INTERPRETER_EXTRAS);
- }
- if (mDescriptor.hasScriptsArchive()) {
- mTaskQueue.offer(RequestCode.DOWNLOAD_SCRIPTS);
- mTaskQueue.offer(RequestCode.EXTRACT_SCRIPTS);
- }
- }
-
- @Override
- protected Boolean doInBackground(Void... params) {
- new Thread(new Runnable() {
- @Override
- public void run() {
- executeInBackground();
- final boolean result = (mTaskQueue.size() == 0);
- mainThreadHandler.post(new Runnable() {
- @Override
- public void run() {
- finish(result);
- }
- });
- }
- }).start();
- return true;
- }
-
- private boolean executeInBackground() {
-
- File root = new File(mInterpreterRoot);
- if (root.exists()) {
- FileUtils.delete(root);
- }
- if (!root.mkdirs()) {
- Log.e("Failed to make directories: " + root.getAbsolutePath());
- return false;
- }
-
- if (Looper.myLooper() == null) {
- Looper.prepare();
- }
- mBackgroundHandler = new Handler(Looper.myLooper());
- mainThreadHandler.post(mTaskStarter);
- Looper.loop();
- // Have we executed all the tasks?
- return (mTaskQueue.size() == 0);
- }
-
- protected void finish(boolean result) {
- if (result && setup()) {
- mTaskListener.onTaskFinished(true, "Installation successful.");
- } else {
- if (mTaskHolder != null) {
- mTaskHolder.cancel(true);
- }
- cleanup();
- mTaskListener.onTaskFinished(false, "Installation failed.");
- }
- }
-
- protected AsyncTask<Void, Integer, Long> download(String in) throws MalformedURLException {
- String out = mInterpreterRoot;
- return new UrlDownloaderTask(in, out, mContext);
- }
-
- protected AsyncTask<Void, Integer, Long> downloadInterpreter() throws MalformedURLException {
- return download(mDescriptor.getInterpreterArchiveUrl());
- }
-
- protected AsyncTask<Void, Integer, Long> downloadInterpreterExtras() throws MalformedURLException {
- return download(mDescriptor.getExtrasArchiveUrl());
- }
-
- protected AsyncTask<Void, Integer, Long> downloadScripts() throws MalformedURLException {
- return download(mDescriptor.getScriptsArchiveUrl());
- }
-
- protected AsyncTask<Void, Integer, Long> extract(String in, String out, boolean replaceAll)
- throws Sl4aException {
- return new ZipExtractorTask(in, out, mContext, replaceAll);
- }
-
- protected AsyncTask<Void, Integer, Long> extractInterpreter() throws Sl4aException {
- String in =
- new File(mInterpreterRoot, mDescriptor.getInterpreterArchiveName()).getAbsolutePath();
- String out = InterpreterUtils.getInterpreterRoot(mContext).getAbsolutePath();
- return extract(in, out, true);
- }
-
- protected AsyncTask<Void, Integer, Long> extractInterpreterExtras() throws Sl4aException {
- String in = new File(mInterpreterRoot, mDescriptor.getExtrasArchiveName()).getAbsolutePath();
- String out = mInterpreterRoot + InterpreterConstants.INTERPRETER_EXTRAS_ROOT;
- return extract(in, out, true);
- }
-
- protected AsyncTask<Void, Integer, Long> extractScripts() throws Sl4aException {
- String in = new File(mInterpreterRoot, mDescriptor.getScriptsArchiveName()).getAbsolutePath();
- String out = InterpreterConstants.SCRIPTS_ROOT;
- return extract(in, out, false);
- }
-
- protected boolean chmodIntepreter() {
- int dataChmodErrno;
- boolean interpreterChmodSuccess;
- try {
- dataChmodErrno = FileUtils.chmod(InterpreterUtils.getInterpreterRoot(mContext), 0755);
- interpreterChmodSuccess =
- FileUtils.recursiveChmod(InterpreterUtils.getInterpreterRoot(mContext, mDescriptor
- .getName()), 0755);
- } catch (Exception e) {
- Log.e(e);
- return false;
- }
- return dataChmodErrno == 0 && interpreterChmodSuccess;
- }
-
- protected boolean isInstalled() {
- SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(mContext);
- return preferences.getBoolean(InterpreterConstants.INSTALLED_PREFERENCE_KEY, false);
- }
-
- private void cleanup() {
- List<File> directories = new ArrayList<File>();
-
- directories.add(new File(mInterpreterRoot));
-
- if (mDescriptor.hasInterpreterArchive()) {
- if (!mTaskQueue.contains(RequestCode.EXTRACT_INTERPRETER)) {
- directories.add(InterpreterUtils.getInterpreterRoot(mContext, mDescriptor.getName()));
- }
- }
-
- for (File directory : directories) {
- FileUtils.delete(directory);
- }
- }
-
- protected abstract boolean setup();
-}
diff --git a/sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/InterpreterUninstaller.java b/sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/InterpreterUninstaller.java
deleted file mode 100644
index 5d0c17f..0000000
--- a/sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/InterpreterUninstaller.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-import android.app.ProgressDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.SharedPreferences;
-import android.content.DialogInterface.OnCancelListener;
-import android.os.AsyncTask;
-import android.preference.PreferenceManager;
-
-import com.googlecode.android_scripting.exception.Sl4aException;
-import com.googlecode.android_scripting.interpreter.InterpreterConstants;
-import com.googlecode.android_scripting.interpreter.InterpreterDescriptor;
-import com.googlecode.android_scripting.interpreter.InterpreterUtils;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * AsyncTask for uninstalling interpreters.
- *
- * @author Damon Kohler (damonkohler@gmail.com)
- * @author Alexey Reznichenko (alexey.reznichenko@gmail.com)
- */
-public abstract class InterpreterUninstaller extends AsyncTask<Void, Void, Boolean> {
-
- protected final InterpreterDescriptor mDescriptor;
- protected final Context mContext;
- protected final ProgressDialog mDialog;
- protected final AsyncTaskListener<Boolean> mListener;
-
- protected final String mInterpreterRoot;
-
- public InterpreterUninstaller(InterpreterDescriptor descriptor, Context context,
- AsyncTaskListener<Boolean> listener) throws Sl4aException {
-
- super();
-
- mDescriptor = descriptor;
- mContext = context;
- mListener = listener;
-
- String packageName = mDescriptor.getClass().getPackage().getName();
-
- if (packageName.length() == 0) {
- throw new Sl4aException("Interpreter package name is empty.");
- }
-
- mInterpreterRoot = InterpreterConstants.SDCARD_ROOT + packageName;
-
- if (mDescriptor == null) {
- throw new Sl4aException("Interpreter description not provided.");
- }
- if (mDescriptor.getName() == null) {
- throw new Sl4aException("Interpreter not specified.");
- }
- if (!isInstalled()) {
- throw new Sl4aException("Interpreter not installed.");
- }
-
- if (context != null) {
- mDialog = new ProgressDialog(context);
- } else {
- mDialog = null;
- }
- }
-
- public final void execute() {
- execute(null, null, null);
- }
-
- @Override
- protected void onPreExecute() {
- if (mDialog != null) {
- mDialog.setMessage("Uninstalling " + mDescriptor.getNiceName());
- mDialog.setIndeterminate(true);
- mDialog.setOnCancelListener(new OnCancelListener() {
- @Override
- public void onCancel(DialogInterface dialog) {
- cancel(true);
- }
- });
- mDialog.show();
- }
- }
-
- @Override
- protected void onPostExecute(Boolean result) {
- if (mDialog != null && mDialog.isShowing()) {
- mDialog.dismiss();
- }
- if (result) {
- mListener.onTaskFinished(result, "Uninstallation successful.");
- } else {
- mListener.onTaskFinished(result, "Uninstallation failed.");
- }
- }
-
- @Override
- protected Boolean doInBackground(Void... params) {
- List<File> directories = new ArrayList<File>();
-
- directories.add(new File(mInterpreterRoot));
-
- if (mDescriptor.hasInterpreterArchive()) {
- directories.add(InterpreterUtils.getInterpreterRoot(mContext, mDescriptor.getName()));
- }
-
- for (File directory : directories) {
- FileUtils.delete(directory);
- }
-
- return cleanup();
- }
-
- protected boolean isInstalled() {
- SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(mContext);
- return preferences.getBoolean(InterpreterConstants.INSTALLED_PREFERENCE_KEY, false);
- }
-
- protected abstract boolean cleanup();
-}
diff --git a/sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/UrlDownloaderTask.java b/sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/UrlDownloaderTask.java
deleted file mode 100644
index f9ba053..0000000
--- a/sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/UrlDownloaderTask.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-import android.app.ProgressDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.os.AsyncTask;
-
-
-import com.googlecode.android_scripting.IoUtils;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.exception.Sl4aException;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLConnection;
-
-/**
- * AsyncTask for extracting ZIP files.
- *
- * @author Damon Kohler (damonkohler@gmail.com)
- * @author Alexey Reznichenko (alexey.reznichenko@gmail.com)
- */
-public class UrlDownloaderTask extends AsyncTask<Void, Integer, Long> {
-
- private final URL mUrl;
- private final File mFile;
- private final ProgressDialog mDialog;
-
- private Throwable mException;
- private OutputStream mProgressReportingOutputStream;
-
- private final class ProgressReportingOutputStream extends FileOutputStream {
- private int mProgress = 0;
-
- private ProgressReportingOutputStream(File f) throws FileNotFoundException {
- super(f);
- }
-
- @Override
- public void write(byte[] buffer, int offset, int count) throws IOException {
- super.write(buffer, offset, count);
- mProgress += count;
- publishProgress(mProgress);
- }
- }
-
- public UrlDownloaderTask(String url, String out, Context context) throws MalformedURLException {
- super();
- if (context != null) {
- mDialog = new ProgressDialog(context);
- } else {
- mDialog = null;
- }
- mUrl = new URL(url);
- String fileName = new File(mUrl.getFile()).getName();
- mFile = new File(out, fileName);
- }
-
- @Override
- protected void onPreExecute() {
- Log.v("Downloading " + mUrl);
- if (mDialog != null) {
- mDialog.setTitle("Downloading");
- mDialog.setMessage(mFile.getName());
- // mDialog.setIndeterminate(true);
- mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
- mDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
- @Override
- public void onCancel(DialogInterface dialog) {
- cancel(true);
- }
- });
- mDialog.show();
- }
- }
-
- @Override
- protected Long doInBackground(Void... params) {
- try {
- return download();
- } catch (Exception e) {
- if (mFile.exists()) {
- // Clean up bad downloads.
- mFile.delete();
- }
- mException = e;
- return null;
- }
- }
-
- @Override
- protected void onProgressUpdate(Integer... progress) {
- if (mDialog == null) {
- return;
- }
- if (progress.length > 1) {
- int contentLength = progress[1];
- if (contentLength == -1) {
- mDialog.setIndeterminate(true);
- } else {
- mDialog.setMax(contentLength);
- }
- } else {
- mDialog.setProgress(progress[0].intValue());
- }
- }
-
- @Override
- protected void onPostExecute(Long result) {
- if (mDialog != null && mDialog.isShowing()) {
- mDialog.dismiss();
- }
- if (isCancelled()) {
- return;
- }
- if (mException != null) {
- Log.e("Download failed.", mException);
- }
- }
-
- @Override
- protected void onCancelled() {
- if (mDialog != null) {
- mDialog.setTitle("Download cancelled.");
- }
- }
-
- private long download() throws Exception {
- URLConnection connection = null;
- try {
- connection = mUrl.openConnection();
- } catch (IOException e) {
- throw new Sl4aException("Cannot open URL: " + mUrl, e);
- }
-
- int contentLength = connection.getContentLength();
-
- if (mFile.exists() && contentLength == mFile.length()) {
- Log.v("Output file already exists. Skipping download.");
- return 0l;
- }
-
- try {
- mProgressReportingOutputStream = new ProgressReportingOutputStream(mFile);
- } catch (FileNotFoundException e) {
- throw new Sl4aException(e);
- }
-
- publishProgress(0, contentLength);
-
- int bytesCopied = IoUtils.copy(connection.getInputStream(), mProgressReportingOutputStream);
- if (bytesCopied != contentLength && contentLength != -1) {
- throw new IOException("Download incomplete: " + bytesCopied + " != " + contentLength);
- }
- mProgressReportingOutputStream.close();
- Log.v("Download completed successfully.");
- return bytesCopied;
- }
-}
diff --git a/sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/ZipExtractorTask.java b/sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/ZipExtractorTask.java
deleted file mode 100644
index 3d7eb01..0000000
--- a/sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/ZipExtractorTask.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-import android.app.AlertDialog;
-import android.app.ProgressDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnCancelListener;
-import android.os.AsyncTask;
-
-import com.googlecode.android_scripting.exception.Sl4aException;
-import com.googlecode.android_scripting.future.FutureResult;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Enumeration;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-
-/**
- * AsyncTask for extracting ZIP files.
- *
- * @author Damon Kohler (damonkohler@gmail.com)
- * @author Alexey Reznichenko (alexey.reznichenko@gmail.com)
- */
-public class ZipExtractorTask extends AsyncTask<Void, Integer, Long> {
-
- private static enum Replace {
- YES, NO, YESTOALL, SKIPALL
- }
-
- private final File mInput;
- private final File mOutput;
- private final ProgressDialog mDialog;
- private Throwable mException;
- private int mProgress = 0;
- private final Context mContext;
- private boolean mReplaceAll;
-
- private final class ProgressReportingOutputStream extends FileOutputStream {
- private ProgressReportingOutputStream(File f) throws FileNotFoundException {
- super(f);
- }
-
- @Override
- public void write(byte[] buffer, int offset, int count) throws IOException {
- super.write(buffer, offset, count);
- mProgress += count;
- publishProgress(mProgress);
- }
- }
-
- public ZipExtractorTask(String in, String out, Context context, boolean replaceAll)
- throws Sl4aException {
- super();
- mInput = new File(in);
- mOutput = new File(out);
- if (!mOutput.exists()) {
- if (!mOutput.mkdirs()) {
- throw new Sl4aException("Failed to make directories: " + mOutput.getAbsolutePath());
- }
- }
- if (context != null) {
- mDialog = new ProgressDialog(context);
- } else {
- mDialog = null;
- }
-
- mContext = context;
- mReplaceAll = replaceAll;
-
- }
-
- @Override
- protected void onPreExecute() {
- Log.v("Extracting " + mInput.getAbsolutePath() + " to " + mOutput.getAbsolutePath());
- if (mDialog != null) {
- mDialog.setTitle("Extracting");
- mDialog.setMessage(mInput.getName());
- mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
- mDialog.setOnCancelListener(new OnCancelListener() {
- @Override
- public void onCancel(DialogInterface dialog) {
- cancel(true);
- }
- });
- mDialog.show();
- }
- }
-
- @Override
- protected Long doInBackground(Void... params) {
- try {
- return unzip();
- } catch (Exception e) {
- if (mInput.exists()) {
- // Clean up bad zip file.
- mInput.delete();
- }
- mException = e;
- return null;
- }
- }
-
- @Override
- protected void onProgressUpdate(Integer... progress) {
- if (mDialog == null) {
- return;
- }
- if (progress.length > 1) {
- int max = progress[1];
- mDialog.setMax(max);
- } else {
- mDialog.setProgress(progress[0].intValue());
- }
- }
-
- @Override
- protected void onPostExecute(Long result) {
- if (mDialog != null && mDialog.isShowing()) {
- mDialog.dismiss();
- }
- if (isCancelled()) {
- return;
- }
- if (mException != null) {
- Log.e("Zip extraction failed.", mException);
- }
- }
-
- @Override
- protected void onCancelled() {
- if (mDialog != null) {
- mDialog.setTitle("Extraction cancelled.");
- }
- }
-
- private long unzip() throws Exception {
- long extractedSize = 0l;
- Enumeration<? extends ZipEntry> entries;
- ZipFile zip = new ZipFile(mInput);
- long uncompressedSize = getOriginalSize(zip);
-
- publishProgress(0, (int) uncompressedSize);
-
- entries = zip.entries();
-
- try {
- while (entries.hasMoreElements()) {
- ZipEntry entry = entries.nextElement();
- if (entry.isDirectory()) {
- // Not all zip files actually include separate directory entries.
- // We'll just ignore them
- // and create them as necessary for each actual entry.
- continue;
- }
- File destination = new File(mOutput, entry.getName());
- if (!destination.getParentFile().exists()) {
- destination.getParentFile().mkdirs();
- }
- if (destination.exists() && mContext != null && !mReplaceAll) {
- Replace answer = showDialog(entry.getName());
- switch (answer) {
- case YES:
- break;
- case NO:
- continue;
- case YESTOALL:
- mReplaceAll = true;
- break;
- default:
- return extractedSize;
- }
- }
- ProgressReportingOutputStream outStream = new ProgressReportingOutputStream(destination);
- extractedSize += IoUtils.copy(zip.getInputStream(entry), outStream);
- outStream.close();
- }
- } finally {
- try {
- zip.close();
- } catch (Exception e) {
- // swallow this exception, we are only interested in the original one
- }
- }
- Log.v("Extraction is complete.");
- return extractedSize;
- }
-
- private long getOriginalSize(ZipFile file) {
- Enumeration<? extends ZipEntry> entries = file.entries();
- long originalSize = 0l;
- while (entries.hasMoreElements()) {
- ZipEntry entry = entries.nextElement();
- if (entry.getSize() >= 0) {
- originalSize += entry.getSize();
- }
- }
- return originalSize;
- }
-
- private Replace showDialog(final String name) {
- final FutureResult<Replace> mResult = new FutureResult<Replace>();
-
- MainThread.run(mContext, new Runnable() {
- @Override
- public void run() {
- AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
- builder.setTitle(String.format("Script \"%s\" already exist.", name));
- builder.setMessage(String.format("Do you want to replace script \"%s\" ?", name));
-
- DialogInterface.OnClickListener buttonListener = new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- Replace result = Replace.SKIPALL;
- switch (which) {
- case DialogInterface.BUTTON_POSITIVE:
- result = Replace.YES;
- break;
- case DialogInterface.BUTTON_NEGATIVE:
- result = Replace.NO;
- break;
- case DialogInterface.BUTTON_NEUTRAL:
- result = Replace.YESTOALL;
- break;
- }
- mResult.set(result);
- dialog.dismiss();
- }
- };
- builder.setNegativeButton("Skip", buttonListener);
- builder.setPositiveButton("Replace", buttonListener);
- builder.setNeutralButton("Replace All", buttonListener);
-
- builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
- @Override
- public void onCancel(DialogInterface dialog) {
- mResult.set(Replace.SKIPALL);
- dialog.dismiss();
- }
- });
- builder.show();
- }
- });
-
- try {
- return mResult.get();
- } catch (InterruptedException e) {
- Log.e(e);
- }
- return null;
- }
-}
diff --git a/sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/activity/Main.java b/sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/activity/Main.java
deleted file mode 100644
index 2af4d17..0000000
--- a/sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/activity/Main.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.activity;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.net.Uri;
-import android.os.Bundle;
-import android.preference.PreferenceManager;
-import android.view.Gravity;
-import android.view.View;
-import android.view.Window;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup.LayoutParams;
-import android.view.ViewGroup.MarginLayoutParams;
-import android.widget.Button;
-import android.widget.LinearLayout;
-
-import com.googlecode.android_scripting.AsyncTaskListener;
-import com.googlecode.android_scripting.InterpreterInstaller;
-import com.googlecode.android_scripting.InterpreterUninstaller;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.exception.Sl4aException;
-import com.googlecode.android_scripting.interpreter.InterpreterConstants;
-import com.googlecode.android_scripting.interpreter.InterpreterDescriptor;
-
-/**
- * Base activity for distributing interpreters as APK's.
- *
- * @author Damon Kohler (damonkohler@gmail.com)
- * @author Alexey Reznichenko (alexey.reznichenko@gmail.com)
- */
-public abstract class Main extends Activity {
-
- protected final static float MARGIN_DIP = 3.0f;
-
- protected final String mId = getClass().getPackage().getName();
-
- protected SharedPreferences mPreferences;
- protected InterpreterDescriptor mDescriptor;
- protected Button mButton;
- protected LinearLayout mLayout;
-
- protected abstract InterpreterDescriptor getDescriptor();
-
- protected abstract InterpreterInstaller getInterpreterInstaller(InterpreterDescriptor descriptor,
- Context context, AsyncTaskListener<Boolean> listener) throws Sl4aException;
-
- protected abstract InterpreterUninstaller getInterpreterUninstaller(
- InterpreterDescriptor descriptor, Context context, AsyncTaskListener<Boolean> listener)
- throws Sl4aException;
-
- protected enum RunningTask {
- INSTALL, UNINSTALL
- }
-
- protected volatile RunningTask mCurrentTask = null;
-
- protected final AsyncTaskListener<Boolean> mTaskListener = new AsyncTaskListener<Boolean>() {
- @Override
- public void onTaskFinished(Boolean result, String message) {
- getWindow().setFeatureInt(Window.FEATURE_INDETERMINATE_PROGRESS,
- Window.PROGRESS_VISIBILITY_OFF);
- if (result) {
- switch (mCurrentTask) {
- case INSTALL:
- setInstalled(true);
- prepareUninstallButton();
- break;
- case UNINSTALL:
- setInstalled(false);
- prepareInstallButton();
- break;
- }
- }
- Log.v(Main.this, message);
- mCurrentTask = null;
- }
- };
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
- mDescriptor = getDescriptor();
-
- requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
- initializeViews();
- if (checkInstalled()) {
- prepareUninstallButton();
- } else {
- prepareInstallButton();
- }
- }
-
- @Override
- protected void onStop() {
- super.onStop();
- finish();
- }
-
- // TODO(alexey): Pull out to a layout XML?
- protected void initializeViews() {
- mLayout = new LinearLayout(this);
- mLayout.setOrientation(LinearLayout.VERTICAL);
- mLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
- mLayout.setGravity(Gravity.CENTER_HORIZONTAL);
-
- mButton = new Button(this);
- MarginLayoutParams marginParams =
- new MarginLayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
- final float scale = getResources().getDisplayMetrics().density;
- int marginPixels = (int) (MARGIN_DIP * scale + 0.5f);
- marginParams.setMargins(marginPixels, marginPixels, marginPixels, marginPixels);
- mButton.setLayoutParams(marginParams);
- mLayout.addView(mButton);
- setContentView(mLayout);
- }
-
- protected void prepareInstallButton() {
- mButton.setText("Install");
- mButton.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- install();
- }
- });
- }
-
- protected void prepareUninstallButton() {
- mButton.setText("Uninstall");
- mButton.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- uninstall();
- }
- });
- }
-
- protected void broadcastInstallationStateChange(boolean isInterpreterInstalled) {
- Intent intent = new Intent();
- intent.setData(Uri.parse("package:" + mId));
- if (isInterpreterInstalled) {
- intent.setAction(InterpreterConstants.ACTION_INTERPRETER_ADDED);
- } else {
- intent.setAction(InterpreterConstants.ACTION_INTERPRETER_REMOVED);
- }
- sendBroadcast(intent);
- }
-
- protected synchronized void install() {
- if (mCurrentTask != null) {
- return;
- }
- getWindow().setFeatureInt(Window.FEATURE_INDETERMINATE_PROGRESS, Window.PROGRESS_VISIBILITY_ON);
- mCurrentTask = RunningTask.INSTALL;
- InterpreterInstaller installTask;
- try {
- installTask = getInterpreterInstaller(mDescriptor, Main.this, mTaskListener);
- } catch (Sl4aException e) {
- Log.e(this, e.getMessage(), e);
- return;
- }
- installTask.execute();
- }
-
- protected synchronized void uninstall() {
- if (mCurrentTask != null) {
- return;
- }
- getWindow().setFeatureInt(Window.FEATURE_INDETERMINATE_PROGRESS, Window.PROGRESS_VISIBILITY_ON);
- mCurrentTask = RunningTask.UNINSTALL;
- InterpreterUninstaller uninstallTask;
- try {
- uninstallTask = getInterpreterUninstaller(mDescriptor, Main.this, mTaskListener);
- } catch (Sl4aException e) {
- Log.e(this, e.getMessage(), e);
- return;
- }
- uninstallTask.execute();
- }
-
- protected void setInstalled(boolean isInstalled) {
- SharedPreferences.Editor editor = mPreferences.edit();
- editor.putBoolean(InterpreterConstants.INSTALLED_PREFERENCE_KEY, isInstalled);
- editor.commit();
- broadcastInstallationStateChange(isInstalled);
- }
-
- protected boolean checkInstalled() {
- boolean isInstalled =
- mPreferences.getBoolean(InterpreterConstants.INSTALLED_PREFERENCE_KEY, false);
- broadcastInstallationStateChange(isInstalled);
- return isInstalled;
- }
-
- public LinearLayout getLayout() {
- return mLayout;
- }
-
-}
diff --git a/sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/interpreter/InterpreterProvider.java b/sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/interpreter/InterpreterProvider.java
deleted file mode 100644
index 500c5d4..0000000
--- a/sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/interpreter/InterpreterProvider.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.interpreter;
-
-import android.content.ContentProvider;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.content.UriMatcher;
-import android.database.Cursor;
-import android.database.MatrixCursor;
-import android.net.Uri;
-import android.preference.PreferenceManager;
-
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-/**
- * A provider that can be queried to obtain execution-related interpreter info.
- *
- * <p>
- * To create an interpreter APK, please extend this content provider and implement getDescriptor()
- * and getEnvironmentSettings().<br>
- * Please declare the provider in the android manifest xml (the authority values has to be set to
- * your_package_name.provider_name).
- *
- * @author Alexey Reznichenko (alexey.reznichenko@gmail.com)
- */
-public abstract class InterpreterProvider extends ContentProvider {
-
- private static final int PROPERTIES = 1;
- private static final int ENVIRONMENT_VARIABLES = 2;
- private static final int ARGUMENTS = 3;
-
- private UriMatcher mUriMatcher;
- private SharedPreferences mPreferences;
-
- private InterpreterDescriptor mDescriptor;
- private Context mContext;
-
- public static final String MIME = "vnd.android.cursor.item/vnd.googlecode.interpreter";
-
- public InterpreterProvider() {
- mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
- String auth = this.getClass().getName().toLowerCase();
- mUriMatcher.addURI(auth, InterpreterConstants.PROVIDER_PROPERTIES, PROPERTIES);
- mUriMatcher.addURI(auth, InterpreterConstants.PROVIDER_ENVIRONMENT_VARIABLES,
- ENVIRONMENT_VARIABLES);
- mUriMatcher.addURI(auth, InterpreterConstants.PROVIDER_ARGUMENTS, ARGUMENTS);
- }
-
- /**
- * Returns an instance of the class that implements the desired {@link InterpreterDescriptor}.
- */
- protected abstract InterpreterDescriptor getDescriptor();
-
- @Override
- public int delete(Uri uri, String selection, String[] selectionArgs) {
- return 0;
- }
-
- @Override
- public String getType(Uri uri) {
- return MIME;
- }
-
- @Override
- public Uri insert(Uri uri, ContentValues values) {
- return null;
- }
-
- @Override
- public boolean onCreate() {
- mDescriptor = getDescriptor();
- mContext = getContext();
- mPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
- return false;
- }
-
- @Override
- public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
- String sortOrder) {
- if (!isInterpreterInstalled()) {
- return null;
- }
- Map<String, String> map;
- switch (mUriMatcher.match(uri)) {
- case PROPERTIES:
- map = getProperties();
- break;
- case ENVIRONMENT_VARIABLES:
- map = getEnvironmentVariables();
- break;
- case ARGUMENTS:
- map = getArguments();
- break;
- default:
- map = null;
- }
- return buildCursorFromMap(map);
- }
-
- @Override
- public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
- return 0;
- }
-
- private boolean isInterpreterInstalled() {
- return mPreferences.getBoolean(InterpreterConstants.INSTALLED_PREFERENCE_KEY, false);
- }
-
- private Cursor buildCursorFromMap(Map<String, String> map) {
- if (map == null) {
- return null;
- }
- MatrixCursor cursor = new MatrixCursor(map.keySet().toArray(new String[map.size()]));
- cursor.addRow(map.values());
- return cursor;
- }
-
- private Map<String, String> getProperties() {
- Map<String, String> values = new HashMap<String, String>();
- values.put(InterpreterPropertyNames.NAME, mDescriptor.getName());
- values.put(InterpreterPropertyNames.NICE_NAME, mDescriptor.getNiceName());
- values.put(InterpreterPropertyNames.EXTENSION, mDescriptor.getExtension());
- values.put(InterpreterPropertyNames.BINARY, mDescriptor.getBinary(mContext).getAbsolutePath());
- values.put(InterpreterPropertyNames.INTERACTIVE_COMMAND, mDescriptor
- .getInteractiveCommand(mContext));
- values.put(InterpreterPropertyNames.SCRIPT_COMMAND, mDescriptor.getScriptCommand(mContext));
- values.put(InterpreterPropertyNames.HAS_INTERACTIVE_MODE, Boolean.toString(mDescriptor
- .hasInteractiveMode()));
- return values;
- }
-
- private Map<String, String> getEnvironmentVariables() {
- Map<String, String> values = new HashMap<String, String>();
- values.putAll(mDescriptor.getEnvironmentVariables(mContext));
- return values;
- }
-
- private Map<String, String> getArguments() {
- Map<String, String> values = new LinkedHashMap<String, String>();
- int column = 0;
- for (String argument : mDescriptor.getArguments(mContext)) {
- values.put(Integer.toString(column), argument);
- column++;
- }
- return values;
- }
-}
diff --git a/sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/interpreter/Sl4aHostedInterpreter.java b/sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/interpreter/Sl4aHostedInterpreter.java
deleted file mode 100644
index e6ca41c..0000000
--- a/sl4a/InterpreterForAndroid/src/com/googlecode/android_scripting/interpreter/Sl4aHostedInterpreter.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.interpreter;
-
-import android.content.Context;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * A description of the interpreters hosted by the SL4A project.
- *
- * @author Damon Kohler (damonkohler@gmail.com)
- * @author Alexey Reznichenko (alexey.reznichenko@gmail.com)
- */
-public abstract class Sl4aHostedInterpreter implements InterpreterDescriptor {
-
- public static final String BASE_INSTALL_URL = "http://android-scripting.googlecode.com/files/";
- public static final String DALVIKVM = "/system/bin/dalvikvm";
-
- // TODO(damonkohler): Remove getVersion() and pull these three version methods up in to the base
- // class.
-
- public String getBaseInstallUrl() {
- return BASE_INSTALL_URL;
- }
-
- public int getInterpreterVersion() {
- return getVersion();
- }
-
- public int getExtrasVersion() {
- return getVersion();
- }
-
- public int getScriptsVersion() {
- return getVersion();
- }
-
- @Override
- public String getInterpreterArchiveName() {
- return String.format("%s_r%s.zip", getName(), getInterpreterVersion());
- }
-
- @Override
- public String getExtrasArchiveName() {
- return String.format("%s_extras_r%s.zip", getName(), getExtrasVersion());
- }
-
- @Override
- public String getScriptsArchiveName() {
- return String.format("%s_scripts_r%s.zip", getName(), getScriptsVersion());
- }
-
- @Override
- public String getInterpreterArchiveUrl() {
- return getBaseInstallUrl() + getInterpreterArchiveName();
- }
-
- @Override
- public String getExtrasArchiveUrl() {
- return getBaseInstallUrl() + getExtrasArchiveName();
- }
-
- @Override
- public String getScriptsArchiveUrl() {
- return getBaseInstallUrl() + getScriptsArchiveName();
- }
-
- @Override
- public String getInteractiveCommand(Context context) {
- return "";
- }
-
- @Override
- public boolean hasInteractiveMode() {
- return true;
- }
-
- @Override
- public String getScriptCommand(Context context) {
- return "%s";
- }
-
- @Override
- public List<String> getArguments(Context context) {
- return new ArrayList<String>();
- }
-
- @Override
- public Map<String, String> getEnvironmentVariables(Context context) {
- return new HashMap<String, String>();
- }
-
- // TODO(damonkohler): This shouldn't be public.
- public File getExtrasPath(Context context) {
- if (!hasInterpreterArchive() && hasExtrasArchive()) {
- return new File(InterpreterConstants.SDCARD_ROOT + this.getClass().getPackage().getName()
- + InterpreterConstants.INTERPRETER_EXTRAS_ROOT, getName());
- }
- return InterpreterUtils.getInterpreterRoot(context, getName());
- }
-}
diff --git a/sl4a/README b/sl4a/README
deleted file mode 100644
index cf7b58b..0000000
--- a/sl4a/README
+++ /dev/null
@@ -1,61 +0,0 @@
-=============================
-Project Info
-=============================
-Scripting Layer For Android
-
-Originally authored by Damon Kohler, Scripting Layer for Android, SL4A, is an automation toolset
-for calling Android APIs in a platform-independent manner. It supports both remote automation via
-ADB as well as execution of scripts from on-device via a series of lightweight translation layers.
-
-=============================
-Build Instructions
-=============================
-
-Due to its inclusion in AOSP as a privileged app, building SL4A requires a system build.
-
-For the initial build of Android:
-
-1) cd <ANDROID_SOURCE_ROOT>
-2) source build/envsetup.sh
-3) lunch <TARGET>
-4) make [-j15]
-
-Then Build SL4A:
-
-1) cd <ANDROID_SOURCE_ROOT>/packages/apps/Test/connectivity/sl4a
-2) mm [-j15]
-
-===========================
-Install Instructions
-===========================
-
-1) adb install -r <ANDROID_SOURCE_ROOT>/out/target/product/<TARGET>/data/app/sl4a/sl4a.apk
-
-===========================
-Run Instructions
-===========================
-
-1) SL4A may be launched from Android as a normal App.
-
-or;
-
-2) To enable RPC access from the command prompt:
-
- 1) adb forward tcp:<HOST_PORT_NUM> tcp:<DEVICE_PORT_NUM>
- 2) adb shell "am start -a com.googlecode.android_scripting.action.LAUNCH_SERVER \
- --ei com.googlecode.android_scripting.extra.USE_SERVICE_PORT <DEVICE_PORT_NUM> \
- com.googlecode.android_scripting/.activity.ScriptingLayerServiceLauncher"
-
- where <HOST_PORT_NUM> and <DEVICE_PORT_NUM> are the tcp ports on the host computer and device.
-
-
-===========================
-Doc Generation Instructions
-===========================
-
-From SL4A source directory run this command:
- 1)"perl Docs/generate_api_reference_md.pl"
-
-In the Docs direcotry there should now be an ApiReference.md file that
-contains which RPC functions are available in SL4A as well as documentation
-for the RPC functions.
diff --git a/sl4a/ScriptingLayer/Android.mk b/sl4a/ScriptingLayer/Android.mk
deleted file mode 100644
index 2871eff..0000000
--- a/sl4a/ScriptingLayer/Android.mk
+++ /dev/null
@@ -1,31 +0,0 @@
-#
-# Copyright (C) 2016 Google, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at:
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-
-LOCAL_MODULE := sl4a.ScriptingLayer
-LOCAL_MODULE_OWNER := google
-
-LOCAL_STATIC_JAVA_LIBRARIES := guava android-common
-LOCAL_STATIC_JAVA_LIBRARIES += sl4a.Utils sl4a.Common
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src/com/googlecode/android_scripting)
-
-
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/sl4a/ScriptingLayer/src/com/googlecode/android_scripting/AndroidProxy.java b/sl4a/ScriptingLayer/src/com/googlecode/android_scripting/AndroidProxy.java
deleted file mode 100644
index 997582c..0000000
--- a/sl4a/ScriptingLayer/src/com/googlecode/android_scripting/AndroidProxy.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-import android.app.Service;
-import android.content.Intent;
-
-import com.googlecode.android_scripting.facade.FacadeConfiguration;
-import com.googlecode.android_scripting.facade.FacadeManagerFactory;
-import com.googlecode.android_scripting.jsonrpc.JsonRpcServer;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiverManagerFactory;
-
-import java.net.InetSocketAddress;
-import java.util.UUID;
-
-public class AndroidProxy {
-
- private InetSocketAddress mAddress;
- private final JsonRpcServer mJsonRpcServer;
- private final UUID mSecret;
- private final RpcReceiverManagerFactory mFacadeManagerFactory;
-
- /**
- *
- * @param service
- * Android service (required to build facades).
- * @param intent
- * the intent that launched the proxy/script.
- * @param requiresHandshake
- * indicates whether RPC security protocol should be enabled.
- */
- public AndroidProxy(Service service, Intent intent, boolean requiresHandshake) {
- if (requiresHandshake) {
- mSecret = UUID.randomUUID();
- } else {
- mSecret = null;
- }
- mFacadeManagerFactory =
- new FacadeManagerFactory(FacadeConfiguration.getSdkLevel(), service, intent,
- FacadeConfiguration.getFacadeClasses());
- mJsonRpcServer = new JsonRpcServer(mFacadeManagerFactory, getSecret());
- }
-
- public InetSocketAddress getAddress() {
- return mAddress;
- }
-
- public InetSocketAddress startLocal() {
- return startLocal(0);
- }
-
- public InetSocketAddress startLocal(int port) {
- mAddress = mJsonRpcServer.startLocal(port);
- return mAddress;
- }
-
- public InetSocketAddress startPublic() {
- return startPublic(0);
- }
-
- public InetSocketAddress startPublic(int port) {
- mAddress = mJsonRpcServer.startPublic(port);
- return mAddress;
- }
-
- public void shutdown() {
- mJsonRpcServer.shutdown();
- }
-
- public String getSecret() {
- if (mSecret == null) {
- return null;
- }
- return mSecret.toString();
- }
-
- public RpcReceiverManagerFactory getRpcReceiverManagerFactory() {
- return mFacadeManagerFactory;
- }
-}
diff --git a/sl4a/ScriptingLayer/src/com/googlecode/android_scripting/ScriptLauncher.java b/sl4a/ScriptingLayer/src/com/googlecode/android_scripting/ScriptLauncher.java
deleted file mode 100644
index a0f3eb8..0000000
--- a/sl4a/ScriptingLayer/src/com/googlecode/android_scripting/ScriptLauncher.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-import android.app.Service;
-import android.content.Intent;
-
-import com.googlecode.android_scripting.facade.FacadeConfiguration;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.interpreter.Interpreter;
-import com.googlecode.android_scripting.interpreter.InterpreterConfiguration;
-import com.googlecode.android_scripting.interpreter.InterpreterProcess;
-
-import java.io.File;
-
-public class ScriptLauncher {
-
- private ScriptLauncher() {
- // Utility class.
- }
-
- public static InterpreterProcess launchInterpreter(final AndroidProxy proxy, Intent intent,
- InterpreterConfiguration config, Runnable shutdownHook) {
- Interpreter interpreter;
- String interpreterName;
- interpreterName = intent.getStringExtra(Constants.EXTRA_INTERPRETER_NAME);
- interpreter = config.getInterpreterByName(interpreterName);
- InterpreterProcess process = new InterpreterProcess(interpreter, proxy);
- if (shutdownHook == null) {
- process.start(new Runnable() {
- @Override
- public void run() {
- proxy.shutdown();
- }
- });
- } else {
- process.start(shutdownHook);
- }
- return process;
- }
-
- public static ScriptProcess launchScript(File script, InterpreterConfiguration configuration,
- final AndroidProxy proxy, Runnable shutdownHook) {
- if (!script.exists()) {
- throw new RuntimeException("No such script to launch.");
- }
- ScriptProcess process = new ScriptProcess(script, configuration, proxy);
- if (shutdownHook == null) {
- process.start(new Runnable() {
- @Override
- public void run() {
- proxy.shutdown();
- }
- });
- } else {
- process.start(shutdownHook);
- }
- return process;
- }
-}
diff --git a/sl4a/ScriptingLayer/src/com/googlecode/android_scripting/ScriptProcess.java b/sl4a/ScriptingLayer/src/com/googlecode/android_scripting/ScriptProcess.java
deleted file mode 100644
index 607bb64..0000000
--- a/sl4a/ScriptingLayer/src/com/googlecode/android_scripting/ScriptProcess.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-import com.googlecode.android_scripting.interpreter.Interpreter;
-import com.googlecode.android_scripting.interpreter.InterpreterConfiguration;
-import com.googlecode.android_scripting.interpreter.InterpreterProcess;
-
-import java.io.File;
-
-public class ScriptProcess extends InterpreterProcess {
-
- private final File mScript;
-
- public ScriptProcess(File script, InterpreterConfiguration configuration, AndroidProxy proxy) {
- super(configuration.getInterpreterForScript(script.getName()), proxy);
- mScript = script;
- String scriptName = script.getName();
- setName(scriptName);
- Interpreter interpreter = configuration.getInterpreterForScript(scriptName);
- setCommand(String.format(interpreter.getScriptCommand(), script.getAbsolutePath()));
- }
-
- public String getPath() {
- return mScript.getPath();
- }
-
-}
diff --git a/sl4a/ScriptingLayer/src/com/googlecode/android_scripting/ScriptStorageAdapter.java b/sl4a/ScriptingLayer/src/com/googlecode/android_scripting/ScriptStorageAdapter.java
deleted file mode 100644
index 96608c1..0000000
--- a/sl4a/ScriptingLayer/src/com/googlecode/android_scripting/ScriptStorageAdapter.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-import com.googlecode.android_scripting.interpreter.Interpreter;
-import com.googlecode.android_scripting.interpreter.InterpreterConfiguration;
-import com.googlecode.android_scripting.interpreter.InterpreterConstants;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * Manages storage and retrieval of scripts on the file system.
- *
- * @author Damon Kohler (damonkohler@gmail.com)
- */
-public class ScriptStorageAdapter {
-
- private ScriptStorageAdapter() {
- // Utility class.
- }
-
- /**
- * Writes data to the script by name and overwrites any existing data.
- */
- public static void writeScript(File script, String data) {
- if (script.getParent() == null) {
- script = new File(InterpreterConstants.SCRIPTS_ROOT, script.getPath());
- }
- try {
- FileWriter stream = new FileWriter(script, false /* overwrite */);
- BufferedWriter out = new BufferedWriter(stream);
- out.write(data);
- out.close();
- } catch (IOException e) {
- Log.e("Failed to write script.", e);
- }
- }
-
- /**
- * Returns a list of all available script {@link File}s.
- */
- public static List<File> listAllScripts(File dir) {
- if (dir == null) {
- dir = new File(InterpreterConstants.SCRIPTS_ROOT);
- }
- if (dir.exists()) {
- List<File> scripts = Arrays.asList(dir.listFiles());
- Collections.sort(scripts, new Comparator<File>() {
- @Override
- public int compare(File file1, File file2) {
- if (file1.isDirectory() && !file2.isDirectory()) {
- return -1;
- } else if (!file1.isDirectory() && file2.isDirectory()) {
- return 1;
- }
- return file1.compareTo(file2);
- }
- });
- return scripts;
- }
- return new ArrayList<File>();
- }
-
- /**
- * Returns a list of script {@link File}s from the given folder for which there is an interpreter
- * installed.
- */
- public static List<File> listExecutableScripts(File directory, InterpreterConfiguration config) {
- // NOTE(damonkohler): Creating a LinkedList here is necessary in order to be able to filter it
- // later.
- List<File> scripts = new LinkedList<File>(listAllScripts(directory));
- // Filter out any files that don't have interpreters installed.
- for (Iterator<File> it = scripts.iterator(); it.hasNext();) {
- File script = it.next();
- if (script.isDirectory()) {
- continue;
- }
- Interpreter interpreter = config.getInterpreterForScript(script.getName());
- if (interpreter == null || !interpreter.isInstalled()) {
- it.remove();
- }
- }
- return scripts;
- }
-
- /**
- * Returns a list of all (including subfolders) script {@link File}s for which there is an
- * interpreter installed.
- */
- public static List<File> listExecutableScriptsRecursively(File directory,
- InterpreterConfiguration config) {
- // NOTE(damonkohler): Creating a LinkedList here is necessary in order to be able to filter it
- // later.
- List<File> scripts = new LinkedList<File>();
- List<File> files = listAllScripts(directory);
-
- // Filter out any files that don't have interpreters installed.
- for (Iterator<File> it = files.iterator(); it.hasNext();) {
- File file = it.next();
- if (file.isDirectory()) {
- scripts.addAll(listExecutableScriptsRecursively(file, config));
- }
- Interpreter interpreter = config.getInterpreterForScript(file.getName());
- if (interpreter != null && interpreter.isInstalled()) {
- scripts.add(file);
- }
- }
- Collections.sort(scripts);
- return scripts;
- }
-} \ No newline at end of file
diff --git a/sl4a/ScriptingLayer/src/com/googlecode/android_scripting/facade/FacadeConfiguration.java b/sl4a/ScriptingLayer/src/com/googlecode/android_scripting/facade/FacadeConfiguration.java
deleted file mode 100644
index b297580..0000000
--- a/sl4a/ScriptingLayer/src/com/googlecode/android_scripting/facade/FacadeConfiguration.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade;
-
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.SortedMap;
-import java.util.TreeMap;
-
-import com.google.common.collect.Maps;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.facade.bluetooth.BluetoothA2dpFacade;
-import com.googlecode.android_scripting.facade.bluetooth.BluetoothAvrcpFacade;
-import com.googlecode.android_scripting.facade.bluetooth.BluetoothConnectionFacade;
-import com.googlecode.android_scripting.facade.bluetooth.BluetoothFacade;
-import com.googlecode.android_scripting.facade.bluetooth.BluetoothHidFacade;
-import com.googlecode.android_scripting.facade.bluetooth.BluetoothHspFacade;
-import com.googlecode.android_scripting.facade.bluetooth.BluetoothLeAdvertiseFacade;
-import com.googlecode.android_scripting.facade.bluetooth.BluetoothLeScanFacade;
-import com.googlecode.android_scripting.facade.bluetooth.BluetoothMapFacade;
-import com.googlecode.android_scripting.facade.bluetooth.BluetoothRfcommFacade;
-import com.googlecode.android_scripting.facade.bluetooth.GattClientFacade;
-import com.googlecode.android_scripting.facade.bluetooth.GattServerFacade;
-import com.googlecode.android_scripting.facade.media.AudioManagerFacade;
-import com.googlecode.android_scripting.facade.media.MediaPlayerFacade;
-import com.googlecode.android_scripting.facade.media.MediaRecorderFacade;
-import com.googlecode.android_scripting.facade.media.MediaScannerFacade;
-import com.googlecode.android_scripting.facade.media.MediaSessionFacade;
-import com.googlecode.android_scripting.facade.telephony.CarrierConfigFacade;
-import com.googlecode.android_scripting.facade.telephony.ImsManagerFacade;
-import com.googlecode.android_scripting.facade.telephony.SmsFacade;
-import com.googlecode.android_scripting.facade.telephony.SubscriptionManagerFacade;
-import com.googlecode.android_scripting.facade.telephony.TelecomCallFacade;
-import com.googlecode.android_scripting.facade.telephony.TelecomManagerFacade;
-import com.googlecode.android_scripting.facade.telephony.TelephonyManagerFacade;
-import com.googlecode.android_scripting.facade.ui.UiFacade;
-import com.googlecode.android_scripting.facade.wifi.HttpFacade;
-import com.googlecode.android_scripting.facade.wifi.WifiManagerFacade;
-import com.googlecode.android_scripting.facade.wifi.WifiNanManagerFacade;
-import com.googlecode.android_scripting.facade.wifi.WifiP2pManagerFacade;
-import com.googlecode.android_scripting.facade.wifi.WifiRttManagerFacade;
-import com.googlecode.android_scripting.facade.wifi.WifiScannerFacade;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.MethodDescriptor;
-import com.googlecode.android_scripting.rpc.RpcDeprecated;
-import com.googlecode.android_scripting.rpc.RpcMinSdk;
-import com.googlecode.android_scripting.rpc.RpcStartEvent;
-import com.googlecode.android_scripting.rpc.RpcStopEvent;
-import com.googlecode.android_scripting.webcam.WebCamFacade;
-
-/**
- * Encapsulates the list of supported facades and their construction.
- */
-public class FacadeConfiguration {
- private final static Set<Class<? extends RpcReceiver>> sFacadeClassList;
- private final static SortedMap<String, MethodDescriptor> sRpcs =
- new TreeMap<String, MethodDescriptor>();
-
- private static int sSdkLevel;
-
- static {
- sSdkLevel = android.os.Build.VERSION.SDK_INT;
-
- sFacadeClassList = new HashSet<Class<? extends RpcReceiver>>();
- sFacadeClassList.add(ActivityResultFacade.class);
- sFacadeClassList.add(AndroidFacade.class);
- sFacadeClassList.add(ApplicationManagerFacade.class);
- sFacadeClassList.add(AudioManagerFacade.class);
- sFacadeClassList.add(BatteryManagerFacade.class);
- sFacadeClassList.add(CameraFacade.class);
- sFacadeClassList.add(CommonIntentsFacade.class);
- sFacadeClassList.add(ContactsFacade.class);
- sFacadeClassList.add(EventFacade.class);
- sFacadeClassList.add(ImsManagerFacade.class);
- sFacadeClassList.add(LocationFacade.class);
- sFacadeClassList.add(TelephonyManagerFacade.class);
- sFacadeClassList.add(PreferencesFacade.class);
- sFacadeClassList.add(MediaPlayerFacade.class);
- sFacadeClassList.add(MediaRecorderFacade.class);
- sFacadeClassList.add(MediaScannerFacade.class);
- sFacadeClassList.add(MediaSessionFacade.class);
- sFacadeClassList.add(SensorManagerFacade.class);
- sFacadeClassList.add(SettingsFacade.class);
- sFacadeClassList.add(SmsFacade.class);
- sFacadeClassList.add(SpeechRecognitionFacade.class);
- sFacadeClassList.add(ToneGeneratorFacade.class);
- sFacadeClassList.add(WakeLockFacade.class);
- sFacadeClassList.add(HttpFacade.class);
- sFacadeClassList.add(WifiManagerFacade.class);
- sFacadeClassList.add(UiFacade.class);
- sFacadeClassList.add(TextToSpeechFacade.class);
- sFacadeClassList.add(BluetoothFacade.class);
- sFacadeClassList.add(BluetoothA2dpFacade.class);
- sFacadeClassList.add(BluetoothAvrcpFacade.class);
- sFacadeClassList.add(BluetoothConnectionFacade.class);
- sFacadeClassList.add(BluetoothHspFacade.class);
- sFacadeClassList.add(BluetoothHidFacade.class);
- sFacadeClassList.add(BluetoothMapFacade.class);
- sFacadeClassList.add(BluetoothRfcommFacade.class);
- sFacadeClassList.add(WebCamFacade.class);
- sFacadeClassList.add(WifiP2pManagerFacade.class);
- sFacadeClassList.add(BluetoothLeScanFacade.class);
- sFacadeClassList.add(BluetoothLeAdvertiseFacade.class);
- sFacadeClassList.add(GattClientFacade.class);
- sFacadeClassList.add(GattServerFacade.class);
- sFacadeClassList.add(ConnectivityManagerFacade.class);
- sFacadeClassList.add(DisplayFacade.class);
- sFacadeClassList.add(TelecomManagerFacade.class);
- sFacadeClassList.add(WifiRttManagerFacade.class);
- sFacadeClassList.add(WifiScannerFacade.class);
- sFacadeClassList.add(SubscriptionManagerFacade.class);
- sFacadeClassList.add(TelecomCallFacade.class);
- sFacadeClassList.add(CarrierConfigFacade.class);
-
- /*Compatibility reset to >= Marshmallow */
- if( sSdkLevel >= 23 ) {
- //add new facades here
- sFacadeClassList.add(WifiNanManagerFacade.class);
- }
-
- for (Class<? extends RpcReceiver> recieverClass : sFacadeClassList) {
- for (MethodDescriptor rpcMethod : MethodDescriptor.collectFrom(recieverClass)) {
- sRpcs.put(rpcMethod.getName(), rpcMethod);
- }
- }
- }
-
- private FacadeConfiguration() {
- // Utility class.
- }
-
- public static int getSdkLevel() {
- return sSdkLevel;
- }
-
- /** Returns a list of {@link MethodDescriptor} objects for all facades. */
- public static List<MethodDescriptor> collectMethodDescriptors() {
- return new ArrayList<MethodDescriptor>(sRpcs.values());
- }
-
- /**
- * Returns a list of not deprecated {@link MethodDescriptor} objects for facades supported by
- * the current SDK version.
- */
- public static List<MethodDescriptor> collectSupportedMethodDescriptors() {
- List<MethodDescriptor> list = new ArrayList<MethodDescriptor>();
- for (MethodDescriptor descriptor : sRpcs.values()) {
- Method method = descriptor.getMethod();
- if (method.isAnnotationPresent(RpcDeprecated.class)) {
- continue;
- } else if (method.isAnnotationPresent(RpcMinSdk.class)) {
- int requiredSdkLevel = method.getAnnotation(RpcMinSdk.class).value();
- if (sSdkLevel < requiredSdkLevel) {
- continue;
- }
- }
- list.add(descriptor);
- }
- return list;
- }
-
- public static Map<String, MethodDescriptor> collectStartEventMethodDescriptors() {
- Map<String, MethodDescriptor> map = Maps.newHashMap();
- for (MethodDescriptor descriptor : sRpcs.values()) {
- Method method = descriptor.getMethod();
- if (method.isAnnotationPresent(RpcStartEvent.class)) {
- String eventName = method.getAnnotation(RpcStartEvent.class).value();
- if (map.containsKey(eventName)) {
- Log.d("Duplicate eventName " + eventName);
- throw new RuntimeException("Duplicate start event method descriptor found.");
- }
- map.put(eventName, descriptor);
- }
- }
- return map;
- }
-
- public static Map<String, MethodDescriptor> collectStopEventMethodDescriptors() {
- Map<String, MethodDescriptor> map = Maps.newHashMap();
- for (MethodDescriptor descriptor : sRpcs.values()) {
- Method method = descriptor.getMethod();
- if (method.isAnnotationPresent(RpcStopEvent.class)) {
- String eventName = method.getAnnotation(RpcStopEvent.class).value();
- if (map.containsKey(eventName)) {
- throw new RuntimeException("Duplicate stop event method descriptor found.");
- }
- map.put(eventName, descriptor);
- }
- }
- return map;
- }
-
- /** Returns a method by name. */
- public static MethodDescriptor getMethodDescriptor(String name) {
- return sRpcs.get(name);
- }
-
- public static Collection<Class<? extends RpcReceiver>> getFacadeClasses() {
- return sFacadeClassList;
- }
-}
diff --git a/sl4a/ScriptingLayer/src/com/googlecode/android_scripting/interpreter/InterpreterProcess.java b/sl4a/ScriptingLayer/src/com/googlecode/android_scripting/interpreter/InterpreterProcess.java
deleted file mode 100644
index 52a12c0..0000000
--- a/sl4a/ScriptingLayer/src/com/googlecode/android_scripting/interpreter/InterpreterProcess.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.interpreter;
-
-import com.googlecode.android_scripting.AndroidProxy;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.Process;
-import com.googlecode.android_scripting.SimpleServer;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiverManagerFactory;
-
-import java.net.InetSocketAddress;
-import java.net.SocketException;
-import java.net.UnknownHostException;
-
-/**
- * This is a skeletal implementation of an interpreter process.
- *
- * @author Damon Kohler (damonkohler@gmail.com)
- */
-public class InterpreterProcess extends Process {
-
- private final AndroidProxy mProxy;
- private final Interpreter mInterpreter;
- private String mCommand;
-
- /**
- * Creates a new {@link InterpreterProcess}.
- *
- * @param launchScript
- * the absolute path to a script that should be launched with the interpreter
- * @param port
- * the port that the AndroidProxy is listening on
- */
- public InterpreterProcess(Interpreter interpreter, AndroidProxy proxy) {
- mProxy = proxy;
- mInterpreter = interpreter;
-
- setBinary(interpreter.getBinary());
- setName(interpreter.getNiceName());
- setCommand(interpreter.getInteractiveCommand());
- addAllArguments(interpreter.getArguments());
- putAllEnvironmentVariables(System.getenv());
- putEnvironmentVariable("AP_HOST", getHost());
- putEnvironmentVariable("AP_PORT", Integer.toString(getPort()));
- if (proxy.getSecret() != null) {
- putEnvironmentVariable("AP_HANDSHAKE", getSecret());
- }
- putAllEnvironmentVariables(interpreter.getEnvironmentVariables());
- }
-
- protected void setCommand(String command) {
- mCommand = command;
- }
-
- public Interpreter getInterpreter() {
- return mInterpreter;
- }
-
- public String getHost() {
- String result = mProxy.getAddress().getHostName();
- if (result.equals("0.0.0.0")) { // Wildcard.
- try {
- return SimpleServer.getPublicInetAddress().getHostName();
- } catch (UnknownHostException e) {
- Log.i("public address", e);
- e.printStackTrace();
- } catch (SocketException e) {
- Log.i("public address", e);
- }
- }
- return result;
- }
-
- public int getPort() {
- return mProxy.getAddress().getPort();
- }
-
- public InetSocketAddress getAddress() {
- return mProxy.getAddress();
- }
-
- public String getSecret() {
- return mProxy.getSecret();
- }
-
- public RpcReceiverManagerFactory getRpcReceiverManagerFactory() {
- return mProxy.getRpcReceiverManagerFactory();
- }
-
- @Override
- public void start(final Runnable shutdownHook) {
- if (!mCommand.isEmpty()) {
- addArgument(mCommand);
- }
- super.start(shutdownHook);
- }
-
- @Override
- public void kill() {
- super.kill();
- mProxy.shutdown();
- }
-
- @Override
- public String getWorkingDirectory() {
- return InterpreterConstants.SDCARD_SL4A_ROOT;
- }
-}
diff --git a/sl4a/ScriptingLayer/src/com/googlecode/android_scripting/trigger/EventGenerationControllingObserver.java b/sl4a/ScriptingLayer/src/com/googlecode/android_scripting/trigger/EventGenerationControllingObserver.java
deleted file mode 100644
index 0c38a0f..0000000
--- a/sl4a/ScriptingLayer/src/com/googlecode/android_scripting/trigger/EventGenerationControllingObserver.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.trigger;
-
-import com.google.common.collect.Maps;
-import com.googlecode.android_scripting.facade.FacadeConfiguration;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.rpc.MethodDescriptor;
-import com.googlecode.android_scripting.trigger.TriggerRepository.TriggerRepositoryObserver;
-
-import java.util.Map;
-
-import org.json.JSONArray;
-
-/**
- * A {@link TriggerRepositoryObserver} that starts and stops the monitoring of events depending on
- * whether or not triggers for the event exist.
- *
- * @author Felix Arends (felix.arends@gmail.com)
- */
-public class EventGenerationControllingObserver implements TriggerRepositoryObserver {
- private final FacadeManager mFacadeManager;
- private final Map<String, MethodDescriptor> mStartEventGeneratingMethodDescriptors;
- private final Map<String, MethodDescriptor> mStopEventGeneratingMethodDescriptors;
- private final Map<String, Integer> mEventTriggerRefCounts = Maps.newHashMap();
-
- /**
- * Creates a new StartEventMonitoringObserver for the given trigger repository.
- *
- * @param facadeManager
- * @param triggerRepository
- */
- public EventGenerationControllingObserver(FacadeManager facadeManager) {
- mFacadeManager = facadeManager;
- mStartEventGeneratingMethodDescriptors =
- FacadeConfiguration.collectStartEventMethodDescriptors();
- mStopEventGeneratingMethodDescriptors = FacadeConfiguration.collectStopEventMethodDescriptors();
- }
-
- private synchronized int incrementAndGetRefCount(String eventName) {
- int refCount =
- (mEventTriggerRefCounts.containsKey(eventName)) ? mEventTriggerRefCounts.get(eventName) : 0;
- refCount++;
- mEventTriggerRefCounts.put(eventName, refCount);
- return refCount;
- }
-
- private synchronized int decrementAndGetRefCount(String eventName) {
- int refCount =
- (mEventTriggerRefCounts.containsKey(eventName)) ? mEventTriggerRefCounts.get(eventName) : 0;
- refCount--;
- mEventTriggerRefCounts.put(eventName, refCount);
- return refCount;
- }
-
- @Override
- public synchronized void onPut(Trigger trigger) {
- // If we're not already monitoring the events corresponding to this trigger, do so.
- if (incrementAndGetRefCount(trigger.getEventName()) == 1) {
- startMonitoring(trigger.getEventName());
- }
- }
-
- @Override
- public synchronized void onRemove(Trigger trigger) {
- // If there are no more triggers listening to this event, then we need to stop monitoring.
- if (decrementAndGetRefCount(trigger.getEventName()) == 1) {
- stopMonitoring(trigger.getEventName());
- }
- }
-
- private void startMonitoring(String eventName) {
- MethodDescriptor startEventGeneratingMethod =
- mStartEventGeneratingMethodDescriptors.get(eventName);
- try {
- startEventGeneratingMethod.invoke(mFacadeManager, new JSONArray());
- } catch (Throwable t) {
- throw new RuntimeException(t);
- }
- }
-
- private void stopMonitoring(String eventName) {
- MethodDescriptor stopEventGeneratingMethod =
- mStopEventGeneratingMethodDescriptors.get(eventName);
- try {
- stopEventGeneratingMethod.invoke(mFacadeManager, new JSONArray());
- } catch (Throwable t) {
- throw new RuntimeException(t);
- }
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/Android.mk b/sl4a/ScriptingLayerForAndroid/Android.mk
deleted file mode 100644
index 79f66c3..0000000
--- a/sl4a/ScriptingLayerForAndroid/Android.mk
+++ /dev/null
@@ -1,59 +0,0 @@
-#
-# Copyright (C) 2016 Google, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at:
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_PACKAGE_NAME := sl4a
-LOCAL_MODULE_OWNER := google
-LOCAL_DEX_PREOPT := false
-
-LOCAL_CERTIFICATE := platform
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-
-LOCAL_AAPT_FLAGS := --auto-add-overlay
-
-LOCAL_MULTILIB := both
-
-# Builds on the Data Partition
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-
-LOCAL_STATIC_JAVA_LIBRARIES := guava android-common locale_platform android-support-v4
-LOCAL_STATIC_JAVA_LIBRARIES += sl4a.Utils sl4a.Common
-LOCAL_STATIC_JAVA_LIBRARIES += sl4a.InterpreterForAndroid sl4a.ScriptingLayer
-
-LOCAL_PRIVILEGED_MODULE := true
-LOCAL_PROGUARD_ENABLED := disabled
-
-
-LOCAL_JNI_SHARED_LIBRARIES := libcom_googlecode_android_scripting_Exec
-
-include $(PREBUILT_SHARED_LIBRARY)
-
-include $(BUILD_PACKAGE)
-
-include $(CLEAR_VARS)
-LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := locale_platform:libs/locale_platform.jar
-include $(BUILD_MULTI_PREBUILT)
-
-include $(call all-makefiles-under,$(LOCAL_PATH))
-
diff --git a/sl4a/ScriptingLayerForAndroid/AndroidManifest.xml b/sl4a/ScriptingLayerForAndroid/AndroidManifest.xml
deleted file mode 100644
index cc9f2b8..0000000
--- a/sl4a/ScriptingLayerForAndroid/AndroidManifest.xml
+++ /dev/null
@@ -1,220 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2016, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.googlecode.android_scripting"
- android:sharedUserId="android.uid.system">
-
- <uses-permission android:name="com.android.permission.WHITELIST_BLUETOOTH_DEVICE"
- android:protectionLevel="signature" />
- <uses-permission android:name="android.permission.ACCESS_BLUETOOTH_SHARE"
- android:protectionLevel="signature" />
- <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
- <uses-permission android:name="android.permission.INTERNET" />
- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
- <uses-permission android:name="android.permission.BIND_INCALL_SERVICE" />
- <uses-permission android:name="android.permission.CALL_PHONE" />
- <uses-permission android:name="android.permission.CALL_PRIVILEGED" />
- <uses-permission android:name="android.permission.CONTROL_INCALL_EXPERIENCE" />
- <uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" />
- <uses-permission android:name="android.permission.LOCATION_HARDWARE" />
- <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
- <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.RECEIVE_SMS" />
- <uses-permission android:name="android.permission.SEND_SMS" />
- <uses-permission android:name="android.permission.READ_SMS" />
- <uses-permission android:name="android.permission.WRITE_SMS" />
- <uses-permission android:name="android.permission.RECEIVE_MMS" />
- <uses-permission android:name="android.permission.BROADCAST_WAP_PUSH" />
- <uses-permission android:name="android.permission.RECEIVE_WAP_PUSH" />
- <uses-permission android:name="android.permission.WRITE_APN_SETTINGS" />
- <uses-permission android:name="android.permission.VIBRATE" />
- <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
- <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
- <uses-permission android:name="android.permission.READ_PHONE_STATE" />
- <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
- <uses-permission android:name="android.permission.PERSISTENT_ACTIVITY" />
- <uses-permission android:name="android.permission.RESTART_PACKAGES" />
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- <uses-permission android:name="android.permission.RECORD_AUDIO" />
- <uses-permission android:name="android.permission.READ_LOGS" />
- <uses-permission android:name="android.permission.REAL_GET_TASKS" />
- <uses-permission android:name="android.permission.WRITE_SETTINGS" />
- <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
- <uses-permission android:name="android.permission.BLUETOOTH" />
- <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
- <uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" />
- <uses-permission android:name="android.permission.BLUETOOTH_MAP" />
- <uses-permission android:name="android.permission.BLUETOOTH_STACK" />
- <uses-permission android:name="android.permission.NET_ADMIN" />
- <uses-permission android:name="android.permission.CAMERA" />
- <uses-permission android:name="android.permission.WAKE_LOCK" />
- <uses-permission android:name="android.permission.READ_CONTACTS" />
- <uses-permission android:name="android.permission.DEVICE_POWER" />
- <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
- <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
- <uses-permission android:name="android.permission.NFC" />
- <uses-permission android:name="android.permission.HARDWARE_TEST" />
- <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
- <uses-permission android:name="android.permission.MASTER_CLEAR" />
- <uses-permission android:name="android.permission.USE_CREDENTIALS" />
- <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" />
- <uses-permission android:name="android.permission.WRITE_CONTACTS" />
- <uses-permission android:name="android.permission.ACCESS_WIMAX_STATE" />
- <uses-permission android:name="android.permission.CHANGE_WIMAX_STATE" />
- <uses-permission android:name="com.android.certinstaller.INSTALL_AS_USER" />
- <uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" />
- <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
- <uses-permission android:name="android.permission.ACCESS_CHECKIN_PROPERTIES" />
- <uses-permission android:name="android.permission.READ_USER_DICTIONARY" />
- <uses-permission android:name="android.permission.WRITE_USER_DICTIONARY" />
- <uses-permission android:name="android.permission.FORCE_STOP_PACKAGES" />
- <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
- <uses-permission android:name="android.permission.BATTERY_STATS" />
- <uses-permission android:name="android.permission.MOVE_PACKAGE" />
- <uses-permission android:name="android.permission.BACKUP" />
- <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
- <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
- <uses-permission android:name="android.permission.READ_SYNC_STATS" />
- <uses-permission android:name="android.permission.STATUS_BAR" />
- <uses-permission android:name="android.permission.MANAGE_USB" />
- <uses-permission android:name="android.permission.SET_POINTER_SPEED" />
- <uses-permission android:name="android.permission.SET_KEYBOARD_LAYOUT" />
- <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
- <uses-permission android:name="android.permission.COPY_PROTECTED_DATA" />
- <uses-permission android:name="android.permission.MANAGE_USERS" />
- <uses-permission android:name="android.permission.READ_PROFILE" />
- <uses-permission android:name="android.permission.CONFIGURE_WIFI_DISPLAY" />
- <uses-permission android:name="android.permission.SET_TIME" />
- <uses-permission android:name="android.permission.SET_TIME_ZONE" />
- <uses-permission android:name="android.permission.ACCESS_NOTIFICATIONS" />
- <uses-permission android:name="android.permission.REBOOT" />
- <uses-permission android:name="android.permission.MANAGE_DEVICE_ADMINS" />
- <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
- <uses-permission android:name="android.permission.READ_PRECISE_PHONE_STATE" />
- <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
- <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
- <uses-permission android:name="android.permission.RECEIVE_EMERGENCY_BROADCAST"/>
- <application android:icon="@drawable/sl4a_logo_48" android:label="@string/application_title" android:name=".Sl4aApplication"
- android:theme="@android:style/Theme.DeviceDefault">
- <activity android:name=".activity.ScriptManager" android:configChanges="keyboardHidden|orientation" android:windowSoftInputMode="adjustResize" android:launchMode="singleTop">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.SEARCH" />
- </intent-filter>
- <meta-data android:name="android.app.searchable" android:resource="@xml/searchable_scripts" />
- </activity>
- <activity android:name=".activity.ScriptPicker" android:configChanges="keyboardHidden|orientation" android:label="Scripts">
- <intent-filter>
- <action android:name="android.intent.action.CREATE_SHORTCUT" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.PICK" />
- <data android:scheme="content" android:path="sl4a/scripts" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
- <activity android:name=".activity.InterpreterPicker" android:configChanges="keyboardHidden|orientation" android:label="Interpreters">
- <intent-filter>
- <action android:name="android.intent.action.CREATE_SHORTCUT" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
- <activity-alias android:name="LocalePlugin" android:targetActivity=".activity.ScriptPicker" android:label="@string/application_title" android:icon="@drawable/sl4a_logo_32">
- <intent-filter>
- <action android:name="com.twofortyfouram.locale.intent.action.EDIT_SETTING" />
- </intent-filter>
- </activity-alias>
- <receiver android:name=".locale.LocaleReceiver">
- <intent-filter>
- <action android:name="com.twofortyfouram.locale.intent.action.FIRE_SETTING" />
- </intent-filter>
- </receiver>
- <activity android:name=".activity.Preferences" android:theme="@android:style/Theme.DeviceDefault.Settings" />
- <activity android:name="org.connectbot.ConsoleActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:configChanges="keyboardHidden|orientation" android:windowSoftInputMode="stateAlwaysVisible|adjustResize" android:finishOnTaskLaunch="true" android:launchMode="singleTask" />
- <activity android:name=".activity.ScriptEditor" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:configChanges="keyboardHidden|orientation" android:windowSoftInputMode="stateAlwaysVisible|adjustResize">
- <intent-filter>
- <action android:name="com.googlecode.android_scripting.action.EDIT_SCRIPT" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
- <activity android:name=".activity.ApiBrowser" android:configChanges="keyboardHidden|orientation" android:launchMode="singleTop" android:windowSoftInputMode="adjustResize">
- <intent-filter>
- <action android:name="android.intent.action.SEARCH" />
- </intent-filter>
- <meta-data android:name="android.app.searchable" android:resource="@xml/searchable_apis" />
- </activity>
- <activity android:name=".activity.ApiPrompt" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:configChanges="keyboardHidden|orientation" />
- <activity android:name=".activity.TriggerManager" android:launchMode="singleTask" android:configChanges="keyboardHidden|orientation" />
- <activity android:name=".activity.BluetoothDeviceList" android:configChanges="keyboardHidden|orientation" />
- <activity android:name=".activity.ScriptingLayerServiceLauncher" android:taskAffinity="" android:theme="@android:style/Theme.DeviceDefault.NoActionBar.TranslucentDecor">
- <intent-filter>
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
- <activity android:name=".activity.FutureActivity" android:configChanges="keyboardHidden|orientation" android:theme="@android:style/Theme.DeviceDefault.NoActionBar.TranslucentDecor" />
- <activity android:name="org.connectbot.HelpActivity" android:configChanges="keyboardHidden|orientation" />
- <activity android:name="org.connectbot.HelpTopicActivity" android:configChanges="keyboardHidden|orientation" />
- <service android:name=".activity.ScriptingLayerService" />
- <service android:name=".activity.TriggerService" />
- <service android:name="com.googlecode.android_scripting.facade.telephony.InCallServiceImpl"
- android:permission="android.permission.BIND_INCALL_SERVICE" >
- <intent-filter>
- <action android:name="android.telecom.InCallService"/>
- </intent-filter>
- </service>
- <service android:name=".service.FacadeService" android:enabled="true" android:exported="true" >
- <intent-filter>
- <action android:name="com.googlecode.android_scripting.service.FacadeService.ACTION_BIND" />
- </intent-filter>
- </service>
- <activity android:name=".activity.InterpreterManager" android:launchMode="singleTask" android:configChanges="keyboardHidden|orientation" />
- <activity android:name=".activity.LogcatViewer" android:launchMode="singleTask" android:configChanges="keyboardHidden|orientation" />
- <activity android:name=".activity.ScriptsLiveFolder" android:label="Scripts" android:icon="@drawable/live_folder" android:configChanges="keyboardHidden|orientation">
- <intent-filter>
- <action android:name="android.intent.action.CREATE_LIVE_FOLDER" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
- <provider android:name=".provider.ScriptProvider" android:authorities="com.googlecode.android_scripting.provider.scriptprovider" />
- <provider android:name=".provider.ApiProvider" android:authorities="com.googlecode.android_scripting.provider.apiprovider" />
- <provider
- android:name="android.support.v4.content.FileProvider"
- android:authorities="com.googlecode.android_scripting.provider.telephonytestprovider"
- android:grantUriPermissions="true"
- android:exported="false">
- <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/paths" />
- </provider>
- <uses-library android:name="android.test.runner" />
- <activity android:name=".activity.ScriptProcessMonitor" android:launchMode="singleTask" android:finishOnTaskLaunch="true" />
- <activity android:configChanges="keyboardHidden|orientation" android:name="org.connectbot.util.ColorsActivity" android:theme="@android:style/Theme.DeviceDefault.Dialog">
- <intent-filter>
- <action android:name="com.googlecode.android_scripting.PICK_TERMINAL_COLORS" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
- </application>
-</manifest>
diff --git a/sl4a/ScriptingLayerForAndroid/jni/Android.mk b/sl4a/ScriptingLayerForAndroid/jni/Android.mk
deleted file mode 100644
index 541aafb..0000000
--- a/sl4a/ScriptingLayerForAndroid/jni/Android.mk
+++ /dev/null
@@ -1,37 +0,0 @@
-#
-# Copyright (C) 2016 Google, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at:
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := com_googlecode_android_scripting_Exec.cpp
-
-LOCAL_CFLAGS += -Wno-unused-parameter
-
-LOCAL_C_INCLUDES += \
- $(JNI_H_INCLUDE) \
-
-LOCAL_SHARED_LIBRARIES := \
- libandroid_runtime \
- libnativehelper \
- libcutils \
- libutils \
- liblog
-
-LOCAL_MODULE := libcom_googlecode_android_scripting_Exec
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/sl4a/ScriptingLayerForAndroid/jni/com_googlecode_android_scripting_Exec.cpp b/sl4a/ScriptingLayerForAndroid/jni/com_googlecode_android_scripting_Exec.cpp
deleted file mode 100644
index 495f27a..0000000
--- a/sl4a/ScriptingLayerForAndroid/jni/com_googlecode_android_scripting_Exec.cpp
+++ /dev/null
@@ -1,202 +0,0 @@
-//
-// Copyright (C) 2016 Google, Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at:
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-#include "com_googlecode_android_scripting_Exec.h"
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <sys/ioctl.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <termios.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "android/log.h"
-
-#define LOG_TAG "Exec"
-#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
-
-int CreateSubprocess(const char* cmd, char* args[], char* vars[], char *wkdir, pid_t* pid) {
- char* devname;
- int ptm = open("/dev/ptmx", O_RDWR);
- if(ptm < 0){
- LOGE("Cannot open /dev/ptmx: %s\n", strerror(errno));
- return -1;
- }
- fcntl(ptm, F_SETFD, FD_CLOEXEC);
-
- if (grantpt(ptm) || unlockpt(ptm) ||
- ((devname = (char*) ptsname(ptm)) == 0)) {
- LOGE("Trouble with /dev/ptmx: %s\n", strerror(errno));
- return -1;
- }
-
- *pid = fork();
- if(*pid < 0) {
- LOGE("Fork failed: %s\n", strerror(errno));
- return -1;
- }
-
- if(*pid == 0){
- int pts;
- setsid();
- pts = open(devname, O_RDWR);
- if(pts < 0) {
- exit(-1);
- }
- dup2(pts, 0);
- dup2(pts, 1);
- dup2(pts, 2);
- close(ptm);
- if (wkdir) chdir(wkdir);
- execve(cmd, args, vars);
- exit(-1);
- } else {
- return ptm;
- }
-}
-
-void JNU_ThrowByName(JNIEnv* env, const char* name, const char* msg) {
- jclass clazz = env->FindClass(name);
- if (clazz != NULL) {
- env->ThrowNew(clazz, msg);
- }
- env->DeleteLocalRef(clazz);
-}
-
-char* JNU_GetStringNativeChars(JNIEnv* env, jstring jstr) {
- if (jstr == NULL) {
- return NULL;
- }
- jbyteArray bytes = 0;
- jthrowable exc;
- char* result = 0;
- if (env->EnsureLocalCapacity(2) < 0) {
- return 0; /* out of memory error */
- }
- jclass Class_java_lang_String = env->FindClass("java/lang/String");
- jmethodID MID_String_getBytes = env->GetMethodID(
- Class_java_lang_String, "getBytes", "()[B");
- bytes = (jbyteArray) env->CallObjectMethod(jstr, MID_String_getBytes);
- exc = env->ExceptionOccurred();
- if (!exc) {
- jint len = env->GetArrayLength(bytes);
- result = (char*) malloc(len + 1);
- if (result == 0) {
- JNU_ThrowByName(env, "java/lang/OutOfMemoryError", 0);
- env->DeleteLocalRef(bytes);
- return 0;
- }
- env->GetByteArrayRegion(bytes, 0, len, (jbyte*) result);
- result[len] = 0; /* NULL-terminate */
- } else {
- env->DeleteLocalRef(exc);
- }
- env->DeleteLocalRef(bytes);
- return result;
-}
-
-int JNU_GetFdFromFileDescriptor(JNIEnv* env, jobject fileDescriptor) {
- jclass Class_java_io_FileDescriptor = env->FindClass("java/io/FileDescriptor");
- jfieldID descriptor = env->GetFieldID(Class_java_io_FileDescriptor, "descriptor", "I");
- return env->GetIntField(fileDescriptor, descriptor);
-}
-
-JNIEXPORT jobject JNICALL Java_com_googlecode_android_1scripting_Exec_createSubprocess(
- JNIEnv* env, jclass clazz, jstring cmd, jobjectArray argArray, jobjectArray varArray,
- jstring workingDirectory,
- jintArray processIdArray) {
- char* cmd_native = JNU_GetStringNativeChars(env, cmd);
- char* wkdir_native = JNU_GetStringNativeChars(env, workingDirectory);
- pid_t pid;
- jsize len = 0;
- if (argArray) {
- len = env->GetArrayLength(argArray);
- }
- char* args[len + 2];
- args[0] = cmd_native;
- for (int i = 0; i < len; i++) {
- jstring arg = (jstring) env->GetObjectArrayElement(argArray, i);
- char* arg_native = JNU_GetStringNativeChars(env, arg);
- args[i + 1] = arg_native;
- }
- args[len + 1] = NULL;
-
- len = 0;
- if (varArray) {
- len = env->GetArrayLength(varArray);
- }
- char* vars[len + 1];
- for (int i = 0; i < len; i++) {
- jstring var = (jstring) env->GetObjectArrayElement(varArray, i);
- char* var_native = JNU_GetStringNativeChars(env, var);
- vars[i] = var_native;
- }
- vars[len] = NULL;
-
- int ptm = CreateSubprocess(cmd_native, args, vars, wkdir_native, &pid);
- if (processIdArray) {
- if (env->GetArrayLength(processIdArray) > 0) {
- jboolean isCopy;
- int* proccessId = (int*) env->GetPrimitiveArrayCritical(processIdArray, &isCopy);
- if (proccessId) {
- *proccessId = (int) pid;
- env->ReleasePrimitiveArrayCritical(processIdArray, proccessId, 0);
- }
- }
- }
-
- jclass Class_java_io_FileDescriptor =
- env->FindClass("java/io/FileDescriptor");
- jmethodID init = env->GetMethodID(Class_java_io_FileDescriptor, "<init>", "()V");
- jobject result = env->NewObject(Class_java_io_FileDescriptor, init);
-
- if (!result) {
- LOGE("Couldn't create a FileDescriptor.");
- } else {
- jfieldID descriptor = env->GetFieldID(Class_java_io_FileDescriptor, "descriptor", "I");
- env->SetIntField(result, descriptor, ptm);
- }
- return result;
-}
-
-JNIEXPORT void JNICALL Java_com_googlecode_android_1scripting_Exec_setPtyWindowSize(
- JNIEnv* env, jclass clazz, jobject fileDescriptor, jint row, jint col, jint xpixel,
- jint ypixel) {
- struct winsize sz;
- int fd = JNU_GetFdFromFileDescriptor(env, fileDescriptor);
- if (env->ExceptionOccurred() != NULL) {
- return;
- }
- sz.ws_row = row;
- sz.ws_col = col;
- sz.ws_xpixel = xpixel;
- sz.ws_ypixel = ypixel;
- ioctl(fd, TIOCSWINSZ, &sz);
-}
-
-JNIEXPORT jint JNICALL Java_com_googlecode_android_1scripting_Exec_waitFor(JNIEnv* env, jclass clazz, jint procId) {
- int status;
- waitpid(procId, &status, 0);
- int result = 0;
- if (WIFEXITED(status)) {
- result = WEXITSTATUS(status);
- }
- return result;
-}
diff --git a/sl4a/ScriptingLayerForAndroid/jni/com_googlecode_android_scripting_Exec.h b/sl4a/ScriptingLayerForAndroid/jni/com_googlecode_android_scripting_Exec.h
deleted file mode 100644
index 6f6d422..0000000
--- a/sl4a/ScriptingLayerForAndroid/jni/com_googlecode_android_scripting_Exec.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/* DO NOT EDIT THIS FILE - it is machine generated */
-#include <jni.h>
-/* Header for class com_googlecode_android_scripting_Exec */
-
-#ifndef _Included_com_googlecode_android_scripting_Exec
-#define _Included_com_googlecode_android_scripting_Exec
-#ifdef __cplusplus
-extern "C" {
-#endif
-/*
- * Class: com_googlecode_android_scripting_Exec
- * Method: createSubprocess
- * Signature: (Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;[I)Ljava/io/FileDescriptor;
- */
-JNIEXPORT jobject JNICALL Java_com_googlecode_android_1scripting_Exec_createSubprocess
- (JNIEnv *, jclass, jstring, jobjectArray, jobjectArray, jstring, jintArray);
-
-/*
- * Class: com_googlecode_android_scripting_Exec
- * Method: setPtyWindowSize
- * Signature: (Ljava/io/FileDescriptor;IIII)V
- */
-JNIEXPORT void JNICALL Java_com_googlecode_android_1scripting_Exec_setPtyWindowSize
- (JNIEnv *, jclass, jobject, jint, jint, jint, jint);
-
-/*
- * Class: com_googlecode_android_scripting_Exec
- * Method: waitFor
- * Signature: (I)I
- */
-JNIEXPORT jint JNICALL Java_com_googlecode_android_1scripting_Exec_waitFor
- (JNIEnv *, jclass, jint);
-
-#ifdef __cplusplus
-}
-#endif
-#endif
diff --git a/sl4a/ScriptingLayerForAndroid/libs/locale_platform.jar b/sl4a/ScriptingLayerForAndroid/libs/locale_platform.jar
deleted file mode 100644
index 4697825..0000000
--- a/sl4a/ScriptingLayerForAndroid/libs/locale_platform.jar
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/proguard.flags b/sl4a/ScriptingLayerForAndroid/proguard.flags
deleted file mode 100644
index 93a2728..0000000
--- a/sl4a/ScriptingLayerForAndroid/proguard.flags
+++ /dev/null
@@ -1,5 +0,0 @@
-
--libraryjars libs
-
--keep class net.londatiga.android.**{*;}
-
diff --git a/sl4a/ScriptingLayerForAndroid/res/anim/fade_out_delayed.xml b/sl4a/ScriptingLayerForAndroid/res/anim/fade_out_delayed.xml
deleted file mode 100644
index 20ca839..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/anim/fade_out_delayed.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-
-<alpha xmlns:android="http://schemas.android.com/apk/res/android"
- android:fromAlpha="1.0"
- android:toAlpha="0.0"
- android:duration="500"
- android:startOffset="1000"
- android:fillAfter="true"
- />
diff --git a/sl4a/ScriptingLayerForAndroid/res/anim/fade_stay_hidden.xml b/sl4a/ScriptingLayerForAndroid/res/anim/fade_stay_hidden.xml
deleted file mode 100644
index e62ca8b..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/anim/fade_stay_hidden.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-
-<alpha xmlns:android="http://schemas.android.com/apk/res/android"
- android:fromAlpha="0.0"
- android:toAlpha="0.0"
- android:duration="500"
- android:fillAfter="true"
- />
diff --git a/sl4a/ScriptingLayerForAndroid/res/anim/keyboard_fade_in.xml b/sl4a/ScriptingLayerForAndroid/res/anim/keyboard_fade_in.xml
deleted file mode 100644
index edd5b94..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/anim/keyboard_fade_in.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-
-<alpha xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:anim/accelerate_interpolator"
- android:fromAlpha="0.0"
- android:toAlpha="1.0"
- android:duration="100" />
diff --git a/sl4a/ScriptingLayerForAndroid/res/anim/keyboard_fade_out.xml b/sl4a/ScriptingLayerForAndroid/res/anim/keyboard_fade_out.xml
deleted file mode 100644
index 1f37d32..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/anim/keyboard_fade_out.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-
-<alpha xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:anim/accelerate_interpolator"
- android:fromAlpha="1.0"
- android:toAlpha="0.0"
- android:duration="100" />
diff --git a/sl4a/ScriptingLayerForAndroid/res/anim/slide_left_in.xml b/sl4a/ScriptingLayerForAndroid/res/anim/slide_left_in.xml
deleted file mode 100644
index 29a0048..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/anim/slide_left_in.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android">
- <translate android:fromXDelta="100%p" android:toXDelta="0" android:duration="300"/>
- <!-- <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" /> -->
-</set>
diff --git a/sl4a/ScriptingLayerForAndroid/res/anim/slide_left_out.xml b/sl4a/ScriptingLayerForAndroid/res/anim/slide_left_out.xml
deleted file mode 100644
index 9c46442..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/anim/slide_left_out.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android">
- <translate android:fromXDelta="0" android:toXDelta="-100%p" android:duration="300"/>
- <!-- <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" /> -->
-</set>
diff --git a/sl4a/ScriptingLayerForAndroid/res/anim/slide_right_in.xml b/sl4a/ScriptingLayerForAndroid/res/anim/slide_right_in.xml
deleted file mode 100644
index 0d52c9f..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/anim/slide_right_in.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android">
- <translate android:fromXDelta="-100%p" android:toXDelta="0" android:duration="300"/>
- <!-- <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" /> -->
-</set>
diff --git a/sl4a/ScriptingLayerForAndroid/res/anim/slide_right_out.xml b/sl4a/ScriptingLayerForAndroid/res/anim/slide_right_out.xml
deleted file mode 100644
index ace4e9d..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/anim/slide_right_out.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android">
- <translate android:fromXDelta="0" android:toXDelta="100%p" android:duration="300"/>
- <!-- <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" /> -->
-</set>
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/atari_small.png b/sl4a/ScriptingLayerForAndroid/res/drawable/atari_small.png
deleted file mode 100644
index 535e295..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/atari_small.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/atari_small_notice.txt b/sl4a/ScriptingLayerForAndroid/res/drawable/atari_small_notice.txt
deleted file mode 100644
index afa8539..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/atari_small_notice.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-COMMENT Copyright (c) 1999, Thomas A. Fine
-COMMENT
-COMMENT License to copy, modify, and distribute for both commercial and
-COMMENT non-commercial use is herby granted, provided this notice
-COMMENT is preserved.
-COMMENT
-COMMENT Email to my last name at head.cfa.harvard.edu
-COMMENT http://hea-www.harvard.edu/~fine/
-COMMENT
-COMMENT Produced with bdfedit, a tcl/tk font editing program
-COMMENT written by Thomas A. Fine \ No newline at end of file
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/background.png b/sl4a/ScriptingLayerForAndroid/res/drawable/background.png
deleted file mode 100644
index d0fc14f..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/background.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/bsh_icon.png b/sl4a/ScriptingLayerForAndroid/res/drawable/bsh_icon.png
deleted file mode 100644
index 1d73eb5..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/bsh_icon.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/file_bg.png b/sl4a/ScriptingLayerForAndroid/res/drawable/file_bg.png
deleted file mode 100644
index 949613c..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/file_bg.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/folder.png b/sl4a/ScriptingLayerForAndroid/res/drawable/folder.png
deleted file mode 100644
index 6333914..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/folder.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/html_icon.png b/sl4a/ScriptingLayerForAndroid/res/drawable/html_icon.png
deleted file mode 100644
index c86bee0..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/html_icon.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/ic_dialog_time.png b/sl4a/ScriptingLayerForAndroid/res/drawable/ic_dialog_time.png
deleted file mode 100644
index 3ce2751..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/ic_dialog_time.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/ic_menu_close_clear_cancel.png b/sl4a/ScriptingLayerForAndroid/res/drawable/ic_menu_close_clear_cancel.png
deleted file mode 100644
index 619858c..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/ic_menu_close_clear_cancel.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/ic_menu_refresh.png b/sl4a/ScriptingLayerForAndroid/res/drawable/ic_menu_refresh.png
deleted file mode 100644
index 77d70dd..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/ic_menu_refresh.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/ic_menu_search.png b/sl4a/ScriptingLayerForAndroid/res/drawable/ic_menu_search.png
deleted file mode 100644
index 94446db..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/ic_menu_search.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/js_icon.png b/sl4a/ScriptingLayerForAndroid/res/drawable/js_icon.png
deleted file mode 100644
index 86d2504..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/js_icon.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/keyboard_icon.png b/sl4a/ScriptingLayerForAndroid/res/drawable/keyboard_icon.png
deleted file mode 100644
index 9205d8b..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/keyboard_icon.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/live_folder.png b/sl4a/ScriptingLayerForAndroid/res/drawable/live_folder.png
deleted file mode 100644
index 3dac86a..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/live_folder.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/lua_icon.png b/sl4a/ScriptingLayerForAndroid/res/drawable/lua_icon.png
deleted file mode 100644
index 0a7a2f3..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/lua_icon.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/nut_icon.png b/sl4a/ScriptingLayerForAndroid/res/drawable/nut_icon.png
deleted file mode 100644
index 06ef267..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/nut_icon.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/pl_icon.png b/sl4a/ScriptingLayerForAndroid/res/drawable/pl_icon.png
deleted file mode 100644
index 7265f46..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/pl_icon.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/py_icon.png b/sl4a/ScriptingLayerForAndroid/res/drawable/py_icon.png
deleted file mode 100644
index 0dcbc64..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/py_icon.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/rb_icon.png b/sl4a/ScriptingLayerForAndroid/res/drawable/rb_icon.png
deleted file mode 100644
index 8c33c29..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/rb_icon.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/script_logo_48.png b/sl4a/ScriptingLayerForAndroid/res/drawable/script_logo_48.png
deleted file mode 100644
index 488ed82..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/script_logo_48.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/sh_icon.png b/sl4a/ScriptingLayerForAndroid/res/drawable/sh_icon.png
deleted file mode 100644
index 6469c34..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/sh_icon.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_32.png b/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_32.png
deleted file mode 100644
index 8fb9e6d..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_32.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48.png b/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48.png
deleted file mode 100644
index 488ed82..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_10.png b/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_10.png
deleted file mode 100644
index feac584..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_10.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_2.png b/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_2.png
deleted file mode 100644
index 400d3b4..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_2.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_3.png b/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_3.png
deleted file mode 100644
index f666771..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_3.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_4.png b/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_4.png
deleted file mode 100644
index 9021173..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_4.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_5.png b/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_5.png
deleted file mode 100644
index c40a9ae..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_5.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_6.png b/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_6.png
deleted file mode 100644
index a428da4..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_6.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_7.png b/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_7.png
deleted file mode 100644
index b515c3a..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_7.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_8.png b/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_8.png
deleted file mode 100644
index 6474542..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_8.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_9.png b/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_9.png
deleted file mode 100644
index 6c6ffd5..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_logo_48_9.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_notification_logo.xml b/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_notification_logo.xml
deleted file mode 100644
index cea5465..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/sl4a_notification_logo.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<level-list xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:maxLevel="1" android:drawable="@drawable/sl4a_logo_48" />
- <item android:maxLevel="2" android:drawable="@drawable/sl4a_logo_48_2" />
- <item android:maxLevel="3" android:drawable="@drawable/sl4a_logo_48_3" />
- <item android:maxLevel="4" android:drawable="@drawable/sl4a_logo_48_4" />
- <item android:maxLevel="5" android:drawable="@drawable/sl4a_logo_48_5" />
- <item android:maxLevel="6" android:drawable="@drawable/sl4a_logo_48_6" />
- <item android:maxLevel="7" android:drawable="@drawable/sl4a_logo_48_7" />
- <item android:maxLevel="8" android:drawable="@drawable/sl4a_logo_48_8" />
- <item android:maxLevel="9" android:drawable="@drawable/sl4a_logo_48_9" />
- <item android:maxLevel="2147483647" android:drawable="@drawable/sl4a_logo_48_10" />
-</level-list>
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/sl_icon.png b/sl4a/ScriptingLayerForAndroid/res/drawable/sl_icon.png
deleted file mode 100644
index a85ef87..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/sl_icon.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/stat_sys_warning.png b/sl4a/ScriptingLayerForAndroid/res/drawable/stat_sys_warning.png
deleted file mode 100644
index be00f47..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/stat_sys_warning.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/terminal.png b/sl4a/ScriptingLayerForAndroid/res/drawable/terminal.png
deleted file mode 100644
index 9e25569..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/terminal.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_down_btn.xml b/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_down_btn.xml
deleted file mode 100644
index a0a566b..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_down_btn.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<selector
- xmlns:android="http://schemas.android.com/apk/res/android">
- <item
- android:state_pressed="false"
- android:state_enabled="true"
- android:state_focused="false"
- android:drawable="@drawable/timepicker_down_normal" />
- <item
- android:state_pressed="true"
- android:state_enabled="true"
- android:drawable="@drawable/timepicker_down_pressed" />
- <item
- android:state_pressed="false"
- android:state_enabled="true"
- android:state_focused="true"
- android:drawable="@drawable/timepicker_down_selected" />
- <item
- android:state_pressed="false"
- android:state_enabled="false"
- android:state_focused="false"
- android:drawable="@drawable/timepicker_down_disabled" />
- <item
- android:state_pressed="false"
- android:state_enabled="false"
- android:state_focused="true"
- android:drawable="@drawable/timepicker_down_disabled_focused" />
-</selector> \ No newline at end of file
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_down_disabled.png b/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_down_disabled.png
deleted file mode 100644
index af72d22..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_down_disabled.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_down_disabled_focused.png b/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_down_disabled_focused.png
deleted file mode 100644
index 2d80424..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_down_disabled_focused.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_down_normal.png b/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_down_normal.png
deleted file mode 100644
index c427fc3..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_down_normal.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_down_pressed.png b/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_down_pressed.png
deleted file mode 100644
index ac6ac53..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_down_pressed.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_down_selected.png b/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_down_selected.png
deleted file mode 100644
index f710b57..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_down_selected.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_input.xml b/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_input.xml
deleted file mode 100644
index df73ab2..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_input.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<selector
- xmlns:android="http://schemas.android.com/apk/res/android">
- <item
- android:state_pressed="false"
- android:state_enabled="true"
- android:state_focused="false"
- android:drawable="@drawable/timepicker_input_normal" />
- <item
- android:state_pressed="true"
- android:state_enabled="true"
- android:drawable="@drawable/timepicker_input_pressed" />
- <item
- android:state_pressed="false"
- android:state_enabled="true"
- android:state_focused="true"
- android:drawable="@drawable/timepicker_input_selected" />
- <item
- android:state_pressed="false"
- android:state_enabled="false"
- android:state_focused="false"
- android:drawable="@drawable/timepicker_input_disabled" />
- <item
- android:state_pressed="false"
- android:state_enabled="false"
- android:state_focused="true"
- android:drawable="@drawable/timepicker_input_normal" />
-</selector> \ No newline at end of file
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_input_disabled.png b/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_input_disabled.png
deleted file mode 100644
index 97da87a..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_input_disabled.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_input_normal.png b/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_input_normal.png
deleted file mode 100644
index eb101c5..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_input_normal.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_input_pressed.png b/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_input_pressed.png
deleted file mode 100644
index c83b1eb..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_input_pressed.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_input_selected.png b/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_input_selected.png
deleted file mode 100644
index e152848..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_input_selected.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_up_btn.xml b/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_up_btn.xml
deleted file mode 100644
index 5be8d82..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_up_btn.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<selector
- xmlns:android="http://schemas.android.com/apk/res/android">
- <item
- android:state_pressed="false"
- android:state_enabled="true"
- android:state_focused="false"
- android:drawable="@drawable/timepicker_up_normal" />
- <item
- android:state_pressed="true"
- android:state_enabled="true"
- android:drawable="@drawable/timepicker_up_pressed" />
- <item
- android:state_pressed="false"
- android:state_enabled="true"
- android:state_focused="true"
- android:drawable="@drawable/timepicker_up_selected" />
- <item
- android:state_pressed="false"
- android:state_enabled="false"
- android:state_focused="false"
- android:drawable="@drawable/timepicker_up_disabled" />
- <item
- android:state_pressed="false"
- android:state_enabled="false"
- android:state_focused="true"
- android:drawable="@drawable/timepicker_up_disabled_focused" />
-</selector>
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_up_disabled.png b/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_up_disabled.png
deleted file mode 100644
index 1814bb4..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_up_disabled.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_up_disabled_focused.png b/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_up_disabled_focused.png
deleted file mode 100644
index 9ad5b85..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_up_disabled_focused.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_up_normal.png b/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_up_normal.png
deleted file mode 100644
index 35fc221..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_up_normal.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_up_pressed.png b/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_up_pressed.png
deleted file mode 100644
index c910777..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_up_pressed.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_up_selected.png b/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_up_selected.png
deleted file mode 100644
index 549a7e5..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/drawable/timepicker_up_selected.png
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/layout/act_colors.xml b/sl4a/ScriptingLayerForAndroid/res/layout/act_colors.xml
deleted file mode 100644
index b40c2f1..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/layout/act_colors.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-
-<RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
-
- <LinearLayout
- android:id="@+id/color_layout"
- android:layout_height="wrap_content"
- android:layout_width="210dp"
- android:layout_centerInParent="true"
- android:gravity="center">
-
- <GridView
- android:id="@+id/color_grid"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:gravity="center"
- android:padding="20dp"
- android:verticalSpacing="20dp"
- android:horizontalSpacing="20dp"
- android:columnWidth="160dp"
- android:numColumns="1"
- android:stretchMode="none"/>
-
- </LinearLayout>
-</RelativeLayout>
diff --git a/sl4a/ScriptingLayerForAndroid/res/layout/act_console.xml b/sl4a/ScriptingLayerForAndroid/res/layout/act_console.xml
deleted file mode 100644
index 8993db3..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/layout/act_console.xml
+++ /dev/null
@@ -1,93 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="#ff000000"
- >
-
- <ViewFlipper
- android:id="@+id/console_flip"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- />
-
- <RelativeLayout
- android:id="@+id/console_boolean_group"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:padding="5dip"
- android:background="#80000000"
- android:fadingEdge="horizontal"
- android:fadingEdgeLength="25dip"
- android:visibility="gone"
- >
-
- <TextView
- android:id="@+id/console_prompt"
- android:layout_height="wrap_content"
- android:layout_width="fill_parent"
- android:textAppearance="?android:attr/textAppearanceMedium"
- />
-
- <Button
- android:id="@+id/console_prompt_no"
- android:text="@string/prompt_no"
- android:paddingTop="5dip"
- android:paddingBottom="10dip"
- android:paddingLeft="40dip"
- android:paddingRight="40dip"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_below="@+id/console_prompt"
- android:clickable="false"
- />
-
- <Button
- android:id="@+id/console_prompt_yes"
- android:text="@string/prompt_yes"
- android:paddingTop="5dip"
- android:paddingBottom="10dip"
- android:paddingLeft="40dip"
- android:paddingRight="40dip"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_toLeftOf="@+id/console_prompt_no"
- android:layout_below="@+id/console_prompt"
- />
-
- </RelativeLayout>
-
- <ImageView
- android:id="@+id/keyboard_button"
- android:paddingRight="15dip"
- android:paddingBottom="15dip"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:layout_alignParentRight="true"
- android:visibility="gone"
- android:src="@+drawable/keyboard_icon"
- />
-
-</RelativeLayout>
diff --git a/sl4a/ScriptingLayerForAndroid/res/layout/act_help.xml b/sl4a/ScriptingLayerForAndroid/res/layout/act_help.xml
deleted file mode 100644
index 2afe9e4..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/layout/act_help.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-
-<ScrollView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- >
-
- <LinearLayout
- android:id="@+id/topics"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:gravity="center_horizontal"
- >
-
- <TextView
- android:id="@+id/version"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:paddingTop="2dip"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:gravity="right"
- android:paddingRight="2dip"
- />
-
- <TextView
- android:id="@+id/help_acks_text"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/help_acks"
- android:paddingTop="2dip"
- android:linksClickable="true"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:gravity="center_horizontal"
- />
-
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/help_intro"
- android:paddingTop="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:gravity="center_horizontal"
- />
-
- </LinearLayout>
-</ScrollView>
diff --git a/sl4a/ScriptingLayerForAndroid/res/layout/act_help_topic.xml b/sl4a/ScriptingLayerForAndroid/res/layout/act_help_topic.xml
deleted file mode 100644
index 7123d63..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/layout/act_help_topic.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
-
- <org.connectbot.util.HelpTopicView
- android:id="@+id/topic_text"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- />
-
-</LinearLayout>
diff --git a/sl4a/ScriptingLayerForAndroid/res/layout/api_browser.xml b/sl4a/ScriptingLayerForAndroid/res/layout/api_browser.xml
deleted file mode 100644
index 4c4f8a4..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/layout/api_browser.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <ListView
- android:id="@+id/android:list"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" />
- <TextView
- android:id="@+id/android:empty"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/no_apis_message" />
-</LinearLayout> \ No newline at end of file
diff --git a/sl4a/ScriptingLayerForAndroid/res/layout/api_prompt.xml b/sl4a/ScriptingLayerForAndroid/res/layout/api_prompt.xml
deleted file mode 100644
index 7a65663..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/layout/api_prompt.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:padding="2dip">
- <ListView
- android:id="@+id/list"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:divider="#00000000" />
- <Button
- android:id="@+id/done"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/prompt_finish"
- android:layout_alignParentBottom="true" />
-</RelativeLayout>
diff --git a/sl4a/ScriptingLayerForAndroid/res/layout/api_prompt_item.xml b/sl4a/ScriptingLayerForAndroid/res/layout/api_prompt_item.xml
deleted file mode 100644
index a529139..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/layout/api_prompt_item.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <TextView
- android:id="@+id/api_prompt_item_description"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" />
- <EditText
- android:id="@+id/api_prompt_item_value"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" />
-</LinearLayout> \ No newline at end of file
diff --git a/sl4a/ScriptingLayerForAndroid/res/layout/bluetooth_device_list.xml b/sl4a/ScriptingLayerForAndroid/res/layout/bluetooth_device_list.xml
deleted file mode 100644
index bec4c53..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/layout/bluetooth_device_list.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <ListView
- android:id="@+id/android:list"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" />
- <TextView
- android:id="@+id/android:empty"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/no_bluetooth_devices_message" />
-</LinearLayout> \ No newline at end of file
diff --git a/sl4a/ScriptingLayerForAndroid/res/layout/dia_resize.xml b/sl4a/ScriptingLayerForAndroid/res/layout/dia_resize.xml
deleted file mode 100644
index 32253fb..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/layout/dia_resize.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingLeft="10dip"
- android:paddingRight="10dip"
- >
-
- <EditText
- android:id="@+id/width"
- android:layout_width="100dip"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:numeric="integer"
- android:text="@string/default_width"/>
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingLeft="10dip"
- android:paddingRight="10dip"
- android:gravity="right|bottom"
- android:textAppearance="?android:attr/textAppearanceLarge"
- />
-
-
- <EditText
- android:id="@+id/height"
- android:layout_width="100dip"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:numeric="integer"
- android:text="@string/default_height"/>
-</LinearLayout>
diff --git a/sl4a/ScriptingLayerForAndroid/res/layout/duration_picker.xml b/sl4a/ScriptingLayerForAndroid/res/layout/duration_picker.xml
deleted file mode 100644
index 29e524d..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/layout/duration_picker.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * Copyright (C) 2008 OpenIntents.org
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- -->
-<RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content">
- <com.googlecode.android_scripting.widget.NumberPicker
- android:id="@+id/day"
- android:layout_width="70dip"
- android:layout_height="wrap_content"
- android:focusable="true"
- android:focusableInTouchMode="true" />
- <TextView
- android:text="@string/display_days"
- android:gravity="center_horizontal"
- android:layout_width="70dip"
- android:layout_height="wrap_content"
- android:layout_below="@+id/day"
- android:layout_alignLeft="@+id/day" />
- <com.googlecode.android_scripting.widget.NumberPicker
- android:id="@+id/hour"
- android:layout_width="70dip"
- android:layout_height="wrap_content"
- android:layout_marginLeft="2dip"
- android:focusable="true"
- android:focusableInTouchMode="true"
- android:layout_toRightOf="@+id/day" />
- <TextView
- android:text="@string/display_hours"
- android:gravity="center_horizontal"
- android:layout_width="70dip"
- android:layout_height="wrap_content"
- android:layout_below="@+id/hour"
- android:layout_alignLeft="@+id/hour" />
- <com.googlecode.android_scripting.widget.NumberPicker
- android:id="@+id/minute"
- android:layout_width="70dip"
- android:layout_height="wrap_content"
- android:layout_marginLeft="2dip"
- android:focusable="true"
- android:focusableInTouchMode="true"
- android:layout_toRightOf="@+id/hour" />
- <TextView
- android:text="@string/display_minutes"
- android:gravity="center_horizontal"
- android:layout_width="70dip"
- android:layout_height="wrap_content"
- android:layout_below="@+id/minute"
- android:layout_alignLeft="@+id/minute" />
- <com.googlecode.android_scripting.widget.NumberPicker
- android:id="@+id/second"
- android:layout_width="70dip"
- android:layout_height="wrap_content"
- android:layout_marginLeft="2dip"
- android:focusable="true"
- android:focusableInTouchMode="true"
- android:layout_toRightOf="@+id/minute" />
- <TextView
- android:text="@string/display_seconds"
- android:gravity="center_horizontal"
- android:layout_width="70dip"
- android:layout_height="wrap_content"
- android:layout_below="@+id/second"
- android:layout_alignLeft="@+id/second" />
-</RelativeLayout>
diff --git a/sl4a/ScriptingLayerForAndroid/res/layout/findreplace.xml b/sl4a/ScriptingLayerForAndroid/res/layout/findreplace.xml
deleted file mode 100644
index 64ec004..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/layout/findreplace.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/display_find"></TextView>
- <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/searchFind">
- <requestFocus></requestFocus>
- </EditText>
- <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/display_replace"></TextView>
- <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/searchReplace"></EditText>
- <LinearLayout android:id="@+id/linearLayout1" android:layout_width="match_parent" android:layout_height="wrap_content">
- </LinearLayout>
- <LinearLayout android:id="@+id/linearLayout2" android:layout_width="match_parent" android:layout_height="wrap_content">
- </LinearLayout>
- <TableLayout android:id="@+id/tableLayout1" android:layout_width="match_parent" android:layout_height="wrap_content">
- <TableRow android:id="@+id/tableRow1" android:layout_width="wrap_content" android:layout_height="wrap_content">
- <CheckBox android:text="@string/display_whole_words" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/searchWord"></CheckBox>
- <CheckBox android:text="@string/display_case_sensitive" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/searchCase"></CheckBox>
- </TableRow>
- <TableRow android:id="@+id/tableRow2" android:layout_width="wrap_content" android:layout_height="wrap_content">
- <CheckBox android:text="@string/display_replace_all" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/searchAll"></CheckBox>
- <CheckBox android:text="@string/display_from_start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/searchStart"></CheckBox>
- </TableRow>
- </TableLayout>
- <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/textView3" android:typeface="normal" android:text="@string/findreplace_undo_reminder"></TextView>
-</LinearLayout>
diff --git a/sl4a/ScriptingLayerForAndroid/res/layout/interpreter_manager.xml b/sl4a/ScriptingLayerForAndroid/res/layout/interpreter_manager.xml
deleted file mode 100644
index 6b2afb9..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/layout/interpreter_manager.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <ListView
- android:id="@+id/android:list"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" />
- <TextView
- android:id="@+id/android:empty"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/no_interpreters" />
-</LinearLayout>
diff --git a/sl4a/ScriptingLayerForAndroid/res/layout/item_terminal.xml b/sl4a/ScriptingLayerForAndroid/res/layout/item_terminal.xml
deleted file mode 100644
index 9a8ff19..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/layout/item_terminal.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-
-<RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
-
- <TextView
- android:id="@+id/terminal_overlay"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:background="#aa000000"
- android:padding="10dip"
- android:layout_centerInParent="true"
- />
-
-</RelativeLayout>
diff --git a/sl4a/ScriptingLayerForAndroid/res/layout/list_item.xml b/sl4a/ScriptingLayerForAndroid/res/layout/list_item.xml
deleted file mode 100644
index e9f2814..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/layout/list_item.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="4dip"
- android:gravity="center_vertical">
- <ImageView
- android:id="@+id/list_item_icon"
- android:layout_width="32dip"
- android:layout_height="32dip"
- android:fadingEdgeLength="0dip" />
- <TextView
- android:id="@+id/list_item_title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingLeft="5dip"
- android:textSize="22dip" />
-</LinearLayout> \ No newline at end of file
diff --git a/sl4a/ScriptingLayerForAndroid/res/layout/logcat_viewer.xml b/sl4a/ScriptingLayerForAndroid/res/layout/logcat_viewer.xml
deleted file mode 100644
index 2517432..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/layout/logcat_viewer.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <ListView
- android:id="@+id/android:list"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" />
- <TextView
- android:id="@+id/android:empty"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/no_logcat_msg" />
-</LinearLayout>
diff --git a/sl4a/ScriptingLayerForAndroid/res/layout/notification.xml b/sl4a/ScriptingLayerForAndroid/res/layout/notification.xml
deleted file mode 100644
index a450fbe..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/layout/notification.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:padding="3dip">
- <RelativeLayout
- android:orientation="horizontal"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" >
- <TextView
- android:id="@+id/notification_title"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:textColor="#000"
- android:textStyle="bold"
- android:textSize="12dip"
- android:layout_alignParentLeft="true" />
- <TextView
- android:id="@+id/notification_action"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textColor="#000"
- android:textSize="12dip"
- android:layout_alignParentRight="true" />
- </RelativeLayout>
- <TextView
- android:id="@+id/notification_message"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:textColor="#000"
- android:textSize="12dip" />
-</LinearLayout> \ No newline at end of file
diff --git a/sl4a/ScriptingLayerForAndroid/res/layout/number_picker.xml b/sl4a/ScriptingLayerForAndroid/res/layout/number_picker.xml
deleted file mode 100644
index 8b1a433..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/layout/number_picker.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2008, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<merge
- xmlns:android="http://schemas.android.com/apk/res/android">
- <com.googlecode.android_scripting.widget.NumberPickerButton
- android:id="@+id/increment"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:background="@drawable/timepicker_up_btn" />
- <EditText
- android:id="@+id/timepicker_input"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:gravity="center"
- android:singleLine="true"
- style="?android:attr/textAppearanceLargeInverse"
- android:textSize="30sp"
- android:background="@drawable/timepicker_input"
- android:numeric="integer" />
- <com.googlecode.android_scripting.widget.NumberPickerButton
- android:id="@+id/decrement"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:background="@drawable/timepicker_down_btn" />
-</merge> \ No newline at end of file
diff --git a/sl4a/ScriptingLayerForAndroid/res/layout/number_picker_edit.xml b/sl4a/ScriptingLayerForAndroid/res/layout/number_picker_edit.xml
deleted file mode 100644
index ebf34da..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/layout/number_picker_edit.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2008, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<EditText
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:gravity="center_horizontal"
- android:singleLine="true"
- style="?android:attr/textAppearanceLargeInverse"
- android:textSize="30sp"
- android:background="@drawable/timepicker_input" /> \ No newline at end of file
diff --git a/sl4a/ScriptingLayerForAndroid/res/layout/script_editor.xml b/sl4a/ScriptingLayerForAndroid/res/layout/script_editor.xml
deleted file mode 100644
index be9c22e..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/layout/script_editor.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:paddingTop="4dip">
- <EditText
- android:id="@+id/script_editor_title"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:hint="Script Name"
- android:singleLine="true" />
- <EditText
- android:id="@+id/script_editor_body"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:hint="Script Content"
- android:typeface="monospace"
- android:gravity="top"
- android:inputType="textMultiLine" android:scrollHorizontally="true" android:scrollbars="horizontal|vertical"/>
-</LinearLayout> \ No newline at end of file
diff --git a/sl4a/ScriptingLayerForAndroid/res/layout/script_manager.xml b/sl4a/ScriptingLayerForAndroid/res/layout/script_manager.xml
deleted file mode 100644
index e8ce08e..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/layout/script_manager.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <ListView
- android:id="@+id/android:list"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" />
- <TextView
- android:id="@+id/android:empty"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/no_scripts_message" />
-</RelativeLayout> \ No newline at end of file
diff --git a/sl4a/ScriptingLayerForAndroid/res/layout/script_monitor.xml b/sl4a/ScriptingLayerForAndroid/res/layout/script_monitor.xml
deleted file mode 100644
index 7c57f3b..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/layout/script_monitor.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <ListView
- android:id="@+id/android:list"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" />
- <TextView
- android:id="@+id/android:empty"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/no_running_scripts_message" />
-</LinearLayout> \ No newline at end of file
diff --git a/sl4a/ScriptingLayerForAndroid/res/layout/script_monitor_list_item.xml b/sl4a/ScriptingLayerForAndroid/res/layout/script_monitor_list_item.xml
deleted file mode 100644
index df3c339..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/layout/script_monitor_list_item.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <RelativeLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
-
- <TextView
- android:id="@+id/process_title"
- android:textSize="16sp"
- android:textStyle="bold"
- android:textColor="#FFF"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- <TextView
- android:id="@+id/process_age"
- android:layout_alignParentRight="true"
- android:gravity="right"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- </RelativeLayout>
- <RelativeLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- <TextView
- android:id="@+id/process_details"
- android:gravity="left"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- <TextView
- android:id="@+id/process_status"
- android:layout_alignParentRight="true"
- android:gravity="right"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- </RelativeLayout>
-</LinearLayout> \ No newline at end of file
diff --git a/sl4a/ScriptingLayerForAndroid/res/layout/title.xml b/sl4a/ScriptingLayerForAndroid/res/layout/title.xml
deleted file mode 100644
index 54df631..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/layout/title.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/screen"
- android:layout_width="fill_parent" android:layout_height="fill_parent"
- android:orientation="vertical">
- <TextView android:id="@+id/left_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:ellipsize="end"
- android:maxLines="1"
- android:scrollHorizontally="true"
- android:layout_centerVertical="true"
- android:fadingEdge="horizontal"
- android:layout_alignParentLeft="true"
- android:textStyle="bold"
- android:textColor="#ffffff"
- android:shadowColor="#000000"
- android:shadowRadius="1"
- android:layout_toLeftOf="@+id/right_text"/>
- <TextView android:id="@+id/right_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerVertical="true"
- android:layout_toLeftOf="@+id/progress_bar"
- android:layout_alignWithParentIfMissing="true"/>
- <ProgressBar android:id="@+id/progress_bar"
- android:layout_height="18sp"
- android:layout_width="18sp"
- android:layout_marginLeft="5sp"
- android:visibility="gone"
- style="android:attr/ProgressBar_indeterminate"
- android:layout_centerVertical="true"
- android:layout_alignParentRight="true"
- />
-</RelativeLayout>
diff --git a/sl4a/ScriptingLayerForAndroid/res/layout/trigger_manager.xml b/sl4a/ScriptingLayerForAndroid/res/layout/trigger_manager.xml
deleted file mode 100644
index 926da9d..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/layout/trigger_manager.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" android:orientation="vertical">
- <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btnTriggerCancel" android:onClick="clickCancel" android:text="@string/cancel_all"></Button><ListView
- android:id="@+id/android:list"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" />
- <TextView
- android:id="@+id/android:empty"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/no_triggers_message" />
-
-</LinearLayout>
diff --git a/sl4a/ScriptingLayerForAndroid/res/menu/terminal.xml b/sl4a/ScriptingLayerForAndroid/res/menu/terminal.xml
deleted file mode 100644
index 136dcaf..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/menu/terminal.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2016, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<menu
- xmlns:android="http://schemas.android.com/apk/res/android">
- <item
- android:id="@+id/terminal_menu_resize"
- android:title="@string/terminal_menu_resize"
- android:alphabeticShortcut="s"
- android:icon="@android:drawable/ic_menu_crop" />
- <item
- android:id="@+id/terminal_menu_send_email"
- android:title="Email"
- android:alphabeticShortcut="e"
- android:icon="@android:drawable/ic_menu_send" />
- <item
- android:id="@+id/terminal_menu_preferences"
- android:title="Preferences"
- android:alphabeticShortcut="p"
- android:icon="@android:drawable/ic_menu_preferences" />
- <item
- android:id="@+id/terminal_menu_exit_and_edit"
- android:title="Exit &amp; Edit"
- android:alphabeticShortcut="q"
- android:enabled="false"
- android:icon="@android:drawable/ic_menu_edit" />
-</menu> \ No newline at end of file
diff --git a/sl4a/ScriptingLayerForAndroid/res/raw/bell.ogg b/sl4a/ScriptingLayerForAndroid/res/raw/bell.ogg
deleted file mode 100644
index 674f25d..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/raw/bell.ogg
+++ /dev/null
Binary files differ
diff --git a/sl4a/ScriptingLayerForAndroid/res/values/arrays.xml b/sl4a/ScriptingLayerForAndroid/res/values/arrays.xml
deleted file mode 100644
index a4e3851..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/values/arrays.xml
+++ /dev/null
@@ -1,138 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2016, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources>
- <string-array
- name="entries_fontsize_preference">
- <item>4 x 8 pixels</item>
- <item>6 pt</item>
- <item>7 pt</item>
- <item>8 pt</item>
- <item>9 pt</item>
- <item>10 pt</item>
- <item>12 pt</item>
- <item>14 pt</item>
- <item>16 pt</item>
- <item>18 pt</item>
- <item>20 pt</item>
- <item>22 pt</item>
- <item>24 pt</item>
- <item>26 pt</item>
- <item>28 pt</item>
- <item>30 pt</item>
- </string-array>
- <string-array
- name="list_rotation">
- <item>@string/list_rotation_default</item>
- <item>@string/list_rotation_land</item>
- <item>@string/list_rotation_port</item>
- <item>@string/list_rotation_auto</item>
- </string-array>
- <string-array
- name="list_rotation_values">
- <item>Default</item>
- <item>Force landscape</item>
- <item>Force portrait</item>
- <item>Automatic</item>
- </string-array>
-
- <string-array name="list_keymode">
- <item>@string/list_keymode_right</item>
- <item>@string/list_keymode_left</item>
- <item>@string/list_keymode_none</item>
- </string-array>
-
- <string-array name="list_keymode_values">
- <item>Use right-side keys</item>
- <item>Use left-side keys</item>
- <item>none</item>
- </string-array>
-
- <string-array name="list_camera">
- <item>@string/list_camera_ctrlaspace</item>
- <item>@string/list_camera_ctrla</item>
- <item>@string/list_camera_esc</item>
- <item>@string/list_camera_esc_a</item>
- <item>@string/list_camera_none</item>
- </string-array>
-
- <string-array name="list_camera_values">
- <item>Ctrl+A then Space</item>
- <item>Ctrl+A</item>
- <item>Esc</item>
- <item>Esc+A</item>
- <item>None</item>
- </string-array>
-
- <string-array name="list_delkey">
- <item>@string/list_delkey_del</item>
- <item>@string/list_delkey_backspace</item>
- </string-array>
-
- <string-array name="list_delkey_values">
- <item>del</item>
- <item>backspace</item>
- </string-array>
-
- <string-array
- name="entryvalues_fontsize_preference">
- <item>0</item>
- <item>6</item>
- <item>7</item>
- <item>8</item>
- <item>9</item>
- <item>10</item>
- <item>12</item>
- <item>14</item>
- <item>16</item>
- <item>18</item>
- <item>20</item>
- <item>22</item>
- <item>24</item>
- <item>26</item>
- <item>28</item>
- <item>30</item>
- </string-array>
- <string-array
- name="entries_color_preference">
- <item>Black text on white</item>
- <item>White text on black</item>
- <item>White text on blue</item>
- </string-array>
- <string-array
- name="entryvalues_color_preference">
- <item>0</item>
- <item>1</item>
- <item>2</item>
- </string-array>
- <string-array
- name="entries_controlkey_preference">
- <item>Jog ball</item>
- <item>\@ key</item>
- <item>Left Alt key</item>
- <item>Right Alt key</item>
- </string-array>
- <string-array
- name="entryvalues_controlkey_preference">
- <item>0</item>
- <item>1</item>
- <item>2</item>
- <item>3</item>
- </string-array>
-</resources> \ No newline at end of file
diff --git a/sl4a/ScriptingLayerForAndroid/res/values/strings.xml b/sl4a/ScriptingLayerForAndroid/res/values/strings.xml
deleted file mode 100644
index b95427e..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/values/strings.xml
+++ /dev/null
@@ -1,213 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2016, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources>
- <string name="help_force_browser">Force API Browser</string>
- <string
- name="stop_all">Stop All</string>
- <string
- name="application_title">SL4A</string>
- <string
- name="application_nice_title">Scripting Layer for Android</string>
- <string
- name="text_preferences">Text</string>
- <string
- name="title_fontsize_preference">Font size</string>
- <string
- name="summary_fontsize_preference">Choose character height in pixels.</string>
- <string
- name="dialog_title_fontsize_preference">Font size</string>
- <string
- name="title_color_preference">Colors</string>
- <string
- name="summary_color_preference">Choose text color.</string>
- <string
- name="dialog_title_color_preference">Text color</string>
- <string
- name="keyboard_preferences">Keyboard</string>
- <string
- name="title_controlkey_preference">Control key</string>
- <string
- name="summary_controlkey_preference">Choose control key.</string>
- <string
- name="dialog_title_controlkey_preference">Control key</string>
- <string
- name="shell_preferences">Shell</string>
- <string
- name="title_shell_preference">Command line</string>
- <string
- name="summary_shell_preference">Specify the shell command line.</string>
- <string
- name="dialog_title_shell_preference">Shell</string>
- <string
- name="title_initialcommand_preference">Initial command</string>
- <string
- name="summary_initialcommand_preference">Sent to the shell when it starts.</string>
- <string
- name="dialog_title_initialcommand_preference">Initial Command</string>
- <string
- name="default_value_fontsize_preference">10</string>
- <string
- name="default_value_color_preference">1</string>
- <string
- name="default_value_controlkey_preference">0</string>
- <string
- name="no_scripts_message">Start adding scripts and interpreters by pressing the menu
- button.</string>
- <string
- name="no_apis_message">No matching APIs found.</string>
- <string
- name="notification_action_message">Tap to open Script Monitor.</string>
- <string
- name="no_running_scripts_message">There are no currently running scripts.</string>
- <string
- name="script_number_message">Number of running scripts:\t</string>
- <string
- name="no_triggers_message">No triggers.</string>
- <string
- name="no_bluetooth_devices_message">No Bluetooth devices found.</string>
- <string
- name="search_description_scripts">Search scripts</string>
- <string
- name="search_description_apis">Search APIs</string>
-
- <string name="prompt_process_exited">Process has exited.\nClose terminal?</string>
- <string name="prompt_confirm_exit">Confirm exit.\nKill process?</string>
-
- <string name="terminal_copy_done">Copied %1$d bytes to clipboard</string>
- <string name="terminal_copy_start">Touch and drag\nor use directional pad\nto select area to copy</string>
-
-
- <string name="terminal_menu_close">Close</string>
- <string name="terminal_menu_copy">Copy</string>
- <string name="terminal_menu_paste">Paste</string>
- <string name="terminal_menu_resize">Force Size</string>
-
- <string name="button_resize">Resize</string>
-
- <!-- Name for the scrollback size preference -->
- <string name="pref_scrollback_title">Scrollback size</string>
- <!-- Description of the scrollback size preference -->
- <string name="pref_scrollback_summary">Size of scrollback buffer to keep in memory for each console</string>
- <!-- Name for the rotation mode preference -->
- <string name="pref_rotation_title">Rotation mode</string>
- <!-- Summary for the rotation mode preference -->
- <string name="pref_rotation_summary">How to change rotation when keyboard popped in/out</string>
- <!-- Name for the full screen preference -->
- <string name="pref_fullscreen_title">Full screen</string>
- <!-- Summary for the full screen preference -->
- <string name="pref_fullscreen_summary">Hide status bar while in console</string>
- <!-- Name for the keyboard shortcuts preference -->
- <string name="pref_keymode_title">Directory shortcuts</string>
- <!-- Summary for the keyboard shortcuts preference -->
- <string name="pref_keymode_summary">Select how to use Alt for \'/\' and Shift for Tab</string>
- <!-- Name for the camera shortcut usage preference -->
- <string name="pref_camera_title">Camera shortcut</string>
- <!-- Summary for the camera shortcut usage preference -->
- <string name="pref_camera_summary">Select which shortcut to trigger when the camera button is pushed</string>
- <!-- Name for the keep screen on preference -->
- <string name="pref_keepalive_title">Keep screen awake</string>
- <!-- Summary for the camera shortcut usage preference -->
- <string name="pref_keepalive_summary">Prevent the screen from turning off when working in a console</string>
- <!-- Name for the haptic feedback (bumpy arrow) preference -->
- <string name="pref_bumpyarrows_title">Bumpy arrows</string>
- <!-- Summary for the haptic feedback (bumpy arrow) preference -->
- <string name="pref_bumpyarrows_summary">Vibrate when sending arrow keys from trackball</string>
- <string name="pref_hidekeyboard_title">Hide Keyboard</string>
- <string name="pref_hidekeyboard_summary">Hide soft keyboard in terminal on startup</string>
- <!-- Category title for the Terminal Bell preferences -->
- <string name="pref_bell_category">Terminal bell</string>
- <!-- Checkbox preference title for the audible terminal bell feature -->
- <string name="pref_bell_title">Audible bell</string>
- <!-- Title for the slider preference to set the volume -->
- <string name="pref_bell_volume_title">Bell volume</string>
- <!-- Checkbox preference title for the vibrate on terminal bell feature -->
- <string name="pref_bell_vibrate_title">Vibrate on bell</string>
- <string name="pref_fontsize_title">Font size (pt)</string>
- <!-- Setting for what key code is sent to the server when DEL key is pressed. -->
- <string name="pref_delkey_title">DEL Key</string>
- <!-- Summary for field asking what key code is sent to the server when DEL key is pressed. -->
- <string name="pref_delkey_summary">The key code sent when DEL key is pressed</string>
- <!-- Host character encoding preference title -->
- <string name="pref_encoding_title">Encoding</string>
- <!-- Host character encoding preference summary -->
- <string name="pref_encoding_summary">Character encoding for the host</string>
- <string name="pref_hide_notifications">Hide Notifications</string>
- <!-- Default screen rotation preference selection -->
- <string name="list_rotation_default">Default</string>
- <string name="list_rotation_land">Force landscape</string>
- <string name="list_rotation_port">Force portrait</string>
- <!-- Selection to indicate the rotation should be selected automatically based on the tilt sensor. -->
- <string name="list_rotation_auto">Automatic</string>
- <!-- Preference selection to indicate use of right side of keyboard for special shortcuts. -->
- <string name="list_keymode_right">Use right-side keys</string>
- <!-- Preference selection to indicate use of left side of keyboard for special shortcuts. -->
- <string name="list_keymode_left">Use left-side keys</string>
- <!-- Preference selection to indicate never to use special shortcut keys. -->
- <string name="list_keymode_none">Disable</string>
- <!-- Selection to indicate pressing the Camera button should send "Ctrl+A then Space". -->
- <string name="list_camera_ctrlaspace">Ctrl+A then Space</string>
- <!-- Selection to indicate pressing the Camera button should send "Ctrl+A". -->
- <string name="list_camera_ctrla">Ctrl+A</string>
- <!-- Selection to indicate pressing the Camera button should send the "Esc" key. -->
- <string name="list_camera_esc">Esc</string>
- <!-- Selection to indicate pressing the Camera button should send "Esc+A". -->
- <string name="list_camera_esc_a">Esc+A</string>
- <!-- Selection to indicate pressing the Camera button should send nothing at all. -->
- <string name="list_camera_none">None</string>
- <!-- Name for the backspace character -->
- <string name="list_delkey_backspace">Backspace</string>
- <!-- Name for the ASCII DEL character -->
- <string name="list_delkey_del">Delete</string>
-
- <!-- Window title for Help index -->
- <string name="title_help">Help</string>
-
- <string name="help_acks">SL4A uses <a href="http://code.google.com/p/connectbot/">ConnectBot</a> terminal.</string>
- <string name="help_intro">Please select a topic below for more information on a particular subject.</string>
- <string name="enable_auto_close">Enable Auto Close</string>
- <string name="prompt_no">No</string>
- <string name="prompt_yes">Yes</string>
- <string name="prompt_finish">Finish</string>
- <string name="default_width">80</string>
- <string name="default_height">25</string>
- <string name="display_days">Days</string>
- <string name="display_hours">Hours</string>
- <string name="display_minutes">Minutes</string>
- <string name="display_seconds">Seconds</string>
- <string name="display_find">Find</string>
- <string name="display_replace">Replace</string>
- <string name="display_whole_words">Whole Words</string>
- <string name="display_case_sensitive">Case Sensitive</string>
- <string name="display_replace_all">Replace All</string>
- <string name="display_from_start">From Start</string>
- <string name="findreplace_undo_reminder">Remember you can use the volume keys to undo mistakes.</string>
- <string name="no_interpreters">No interpreters.</string>
- <string name="no_logcat_msg">No logcat messages.</string>
- <string name="cancel_all">Cancel All</string>
-
- <string name="title_triggers">Triggers</string>
- <string name="title_scripts">Scripts</string>
- <string name="title_api_browser">API Browser</string>
- <string name="title_logcat">Logcat</string>
- <string name="title_interpreters">Interpreters</string>
- <string name="title_script_monitor">Script Monitor</string>
- <string name="title_bluetooth_devices">Bluetooth Devices</string>
-
-</resources>
diff --git a/sl4a/ScriptingLayerForAndroid/res/xml/paths.xml b/sl4a/ScriptingLayerForAndroid/res/xml/paths.xml
deleted file mode 100644
index ca3b85a..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/xml/paths.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-<paths xmlns:android="http://schemas.android.com/apk/res/android">
- <cache-path name="mms" path="." />
-</paths>
diff --git a/sl4a/ScriptingLayerForAndroid/res/xml/preferences.xml b/sl4a/ScriptingLayerForAndroid/res/xml/preferences.xml
deleted file mode 100644
index e0e6d35..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/xml/preferences.xml
+++ /dev/null
@@ -1,139 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2016, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<PreferenceScreen
- xmlns:android="http://schemas.android.com/apk/res/android">
- <PreferenceCategory
- android:title="General">
- <EditTextPreference android:summary="Port to use for running server. Leave at 0 for random selection." android:key="use_service_port" android:title="Server Port" android:defaultValue="0" android:numeric="integer"></EditTextPreference>
- </PreferenceCategory>
- <PreferenceCategory
- android:title="Script Manager">
- <CheckBoxPreference
- android:key="show_all_files"
- android:title="Show all files"
- android:defaultValue="false" />
- </PreferenceCategory>
- <PreferenceCategory
- android:title="Script Editor">
- <ListPreference
- android:key="editor_fontsize"
- android:defaultValue="@string/default_value_fontsize_preference"
- android:title="@string/title_fontsize_preference"
- android:summary="@string/summary_fontsize_preference"
- android:entries="@array/entries_fontsize_preference"
- android:entryValues="@array/entryvalues_fontsize_preference"
- android:dialogTitle="@string/dialog_title_fontsize_preference" />
- <CheckBoxPreference android:title="@string/help_force_browser" android:key="helpForceBrowser" android:defaultValue="true" android:summary="Force API Help to use default Android Browser"></CheckBoxPreference>
- <CheckBoxPreference android:summary="When enabled, quotes and brackets are automatically completed." android:key="enableAutoClose" android:title="@string/enable_auto_close" android:defaultValue="true"></CheckBoxPreference>
- <CheckBoxPreference android:title="No Wrap" android:summary="Don't wrap text in editor" android:key="editor_no_wrap"></CheckBoxPreference>
- <CheckBoxPreference android:key="editor_auto_indent" android:defaultValue="false" android:summaryOff="Auto Indent Disabled" android:summaryOn="Auto Indent Enabled" android:title="Auto Indent"></CheckBoxPreference>
-</PreferenceCategory>
- <PreferenceCategory
- android:title="Terminal">
- <EditTextPreference
- android:key="scrollback"
- android:title="@string/pref_scrollback_title"
- android:summary="@string/pref_scrollback_summary"
- android:defaultValue="140" />
- <EditTextPreference
- android:key="fontsize"
- android:title="@string/pref_fontsize_title"
- android:defaultValue="10" />
- <org.connectbot.util.EncodingPreference
- android:key="encoding"
- android:title="@string/pref_encoding_title"
- android:summary="@string/pref_encoding_summary" />
- <ListPreference
- android:key="rotation"
- android:title="@string/pref_rotation_title"
- android:summary="@string/pref_rotation_summary"
- android:entries="@array/list_rotation"
- android:entryValues="@array/list_rotation_values"
- android:defaultValue="Default" />
- <Preference
- android:key="color"
- android:title="@string/title_color_preference"
- android:summary="@string/summary_color_preference">
- <intent
- android:action="com.googlecode.android_scripting.PICK_TERMINAL_COLORS" />
- </Preference>
- <CheckBoxPreference
- android:key="fullscreen"
- android:title="@string/pref_fullscreen_title"
- android:summary="@string/pref_fullscreen_summary"
- android:defaultValue="false" />
- <ListPreference
- android:key="delkey"
- android:title="@string/pref_delkey_title"
- android:summary="@string/pref_delkey_summary"
- android:entries="@array/list_delkey"
- android:entryValues="@array/list_delkey_values" />
- <ListPreference
- android:key="keymode"
- android:title="@string/pref_keymode_title"
- android:summary="@string/pref_keymode_summary"
- android:entries="@array/list_keymode"
- android:entryValues="@array/list_keymode_values"
- android:defaultValue="Use right-side keys" />
- <ListPreference
- android:key="camera"
- android:title="@string/pref_camera_title"
- android:summary="@string/pref_camera_summary"
- android:entries="@array/list_camera"
- android:entryValues="@array/list_camera_values"
- android:defaultValue="Ctrl+A then Space" ></ListPreference>
- <CheckBoxPreference
- android:key="keepalive"
- android:title="@string/pref_keepalive_title"
- android:summary="@string/pref_keepalive_summary"
- android:defaultValue="true" />
- <CheckBoxPreference
- android:key="bumpyarrows"
- android:title="@string/pref_bumpyarrows_title"
- android:summary="@string/pref_bumpyarrows_summary"
- android:defaultValue="true" />
- <CheckBoxPreference
- android:key="hidekeyboard"
- android:title="@string/pref_hidekeyboard_title"
- android:summary="@string/pref_hidekeyboard_summary"
- android:defaultValue="false" />
- </PreferenceCategory>
- <PreferenceCategory
- android:title="Terminal bell">
- <CheckBoxPreference
- android:key="bell"
- android:title="@string/pref_bell_title"
- android:defaultValue="true" />
- <org.connectbot.util.VolumePreference
- android:key="bellVolume"
- android:title="@string/pref_bell_volume_title" />
- <CheckBoxPreference
- android:key="bellVibrate"
- android:title="@string/pref_bell_vibrate_title"
- android:defaultValue="true" />
- </PreferenceCategory>
- <PreferenceCategory
- android:title="Trigger Behaviour">
- <CheckBoxPreference
- android:key="hideServiceNotifications"
- android:title="@string/pref_hide_notifications"
- android:defaultValue="false" />
- </PreferenceCategory>
-</PreferenceScreen>
diff --git a/sl4a/ScriptingLayerForAndroid/res/xml/searchable_apis.xml b/sl4a/ScriptingLayerForAndroid/res/xml/searchable_apis.xml
deleted file mode 100644
index bab5acc..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/xml/searchable_apis.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2016, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
- <searchable xmlns:android="http://schemas.android.com/apk/res/android"
- android:label="@string/application_title"
- android:hint="@string/search_description_apis"
- android:searchSettingsDescription="@string/search_description_apis"
- android:voiceSearchMode="showVoiceSearchButton|launchRecognizer"
- android:searchSuggestAuthority="com.googlecode.android_scripting.provider.apiprovider"
- android:searchSuggestPath="searchSuggestions">
-</searchable>
-
diff --git a/sl4a/ScriptingLayerForAndroid/res/xml/searchable_scripts.xml b/sl4a/ScriptingLayerForAndroid/res/xml/searchable_scripts.xml
deleted file mode 100644
index b0773cc..0000000
--- a/sl4a/ScriptingLayerForAndroid/res/xml/searchable_scripts.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2016, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
- <searchable xmlns:android="http://schemas.android.com/apk/res/android"
- android:label="@string/application_title"
- android:hint="@string/search_description_scripts"
- android:searchSettingsDescription="@string/search_description_scripts"
- android:includeInGlobalSearch="true"
- android:voiceSearchMode="showVoiceSearchButton|launchRecognizer"
- android:searchSuggestAuthority="com.googlecode.android_scripting.provider.scriptprovider"
- android:searchSuggestPath="searchSuggestions"
- android:searchSuggestIntentAction="android.intent.action.SEARCH">
-</searchable>
-
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/ActivityFlinger.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/ActivityFlinger.java
deleted file mode 100644
index 91216ac..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/ActivityFlinger.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.view.GestureDetector;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.GestureDetector.SimpleOnGestureListener;
-import android.view.View.OnTouchListener;
-
-import com.googlecode.android_scripting.activity.InterpreterManager;
-import com.googlecode.android_scripting.activity.LogcatViewer;
-import com.googlecode.android_scripting.activity.ScriptManager;
-import com.googlecode.android_scripting.activity.TriggerManager;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-public class ActivityFlinger {
-
- private static final int SWIPE_MIN_DISTANCE = 120;
- private static final int SWIPE_MAX_OFF_PATH = 100;
- private static final int SWIPE_THRESHOLD_VELOCITY = 200;
-
- private static class ActivityTransition {
- Class<? extends Activity> mLeft;
- Class<? extends Activity> mRight;
-
- public ActivityTransition(Class<? extends Activity> left, Class<? extends Activity> right) {
- mLeft = left;
- mRight = right;
- }
- }
-
- private static Map<Class<?>, ActivityTransition> mActivityTransitions =
- new HashMap<Class<?>, ActivityTransition>();
-
- private ActivityFlinger() {
- // Utility class.
- }
-
- static {
- List<Class<? extends Activity>> entries = new ArrayList<Class<? extends Activity>>();
- entries.add(ScriptManager.class);
- entries.add(InterpreterManager.class);
- entries.add(TriggerManager.class);
- entries.add(LogcatViewer.class);
-
- Class<? extends Activity> left = null;
- Class<? extends Activity> current = null;
- Class<? extends Activity> right = null;
-
- for (Iterator<Class<? extends Activity>> it = entries.iterator(); it.hasNext()
- || current != null;) {
- if (current == null) {
- current = it.next();
- }
- if (it.hasNext()) {
- right = it.next();
- } else {
- right = null;
- }
- mActivityTransitions.put(current, new ActivityTransition(left, right));
- left = current;
- current = right;
- }
- }
-
- public static void attachView(View view, Context context) {
- final LeftRightFlingListener mListener = new LeftRightFlingListener();
- final GestureDetector mGestureDetector = new GestureDetector(mListener);
- ActivityTransition transition = mActivityTransitions.get(context.getClass());
- if (transition.mLeft != null) {
- mListener.mLeftRunnable = new StartActivityRunnable(context, transition.mLeft);
- }
- if (transition.mRight != null) {
- mListener.mRightRunnable = new StartActivityRunnable(context, transition.mRight);
- }
- view.setOnTouchListener(new OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- return mGestureDetector.onTouchEvent(event);
- }
- });
- }
-
- private static class StartActivityRunnable implements Runnable {
-
- private final Context mContext;
- private final Class<?> mActivityClass;
-
- private StartActivityRunnable(Context context, Class<?> activity) {
- mContext = context;
- mActivityClass = activity;
- }
-
- @Override
- public void run() {
- Intent intent = new Intent(mContext, mActivityClass);
- mContext.startActivity(intent);
- }
- }
-
- private static class LeftRightFlingListener extends SimpleOnGestureListener {
- Runnable mLeftRunnable;
- Runnable mRightRunnable;
-
- @Override
- public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) {
- if (Math.abs(event1.getY() - event2.getY()) > SWIPE_MAX_OFF_PATH) {
- return false;
- }
- if (event1.getX() - event2.getX() > SWIPE_MIN_DISTANCE
- && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
- if (mRightRunnable != null) {
- mRightRunnable.run();
- }
- } else if (event2.getX() - event1.getX() > SWIPE_MIN_DISTANCE
- && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
- if (mLeftRunnable != null) {
- mLeftRunnable.run();
- }
- } else {
- return super.onFling(event1, event2, velocityX, velocityY);
- }
- return true;
- }
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/ScriptListAdapter.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/ScriptListAdapter.java
deleted file mode 100644
index d1e6f65..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/ScriptListAdapter.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-import android.content.Context;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.BaseAdapter;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import java.io.File;
-import java.util.List;
-
-public abstract class ScriptListAdapter extends BaseAdapter {
-
- protected final Context mContext;
- protected final LayoutInflater mInflater;
-
- public ScriptListAdapter(Context context) {
- mContext = context;
- mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- }
-
- @Override
- public int getCount() {
- return getScriptList().size();
- }
-
- @Override
- public Object getItem(int position) {
- return getScriptList().get(position);
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- LinearLayout container;
- File script = getScriptList().get(position);
-
- if (convertView == null) {
- container = (LinearLayout) mInflater.inflate(R.layout.list_item, null);
- } else {
- container = (LinearLayout) convertView;
- }
-
- ImageView icon = (ImageView) container.findViewById(R.id.list_item_icon);
- int resourceId;
- if (script.isDirectory()) {
- resourceId = R.drawable.folder;
- } else {
- resourceId = FeaturedInterpreters.getInterpreterIcon(mContext, script.getName());
- if (resourceId == 0) {
- resourceId = R.drawable.sl4a_logo_32;
- }
- }
- icon.setImageResource(resourceId);
-
- TextView text = (TextView) container.findViewById(R.id.list_item_title);
- text.setText(getScriptList().get(position).getName());
- return container;
- }
-
- protected abstract List<File> getScriptList();
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/Sl4aApplication.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/Sl4aApplication.java
deleted file mode 100644
index 953c6aa..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/Sl4aApplication.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-public class Sl4aApplication extends BaseApplication {
-
- @Override
- public void onCreate() {
- super.onCreate();
- }
-
- @Override
- public void onTerminate() {
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ApiBrowser.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ApiBrowser.java
deleted file mode 100644
index 8255313..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ApiBrowser.java
+++ /dev/null
@@ -1,344 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.activity;
-
-import android.app.ListActivity;
-import android.app.SearchManager;
-import android.content.Intent;
-import android.database.MatrixCursor;
-import android.os.Bundle;
-import android.util.TypedValue;
-import android.view.ContextMenu;
-import android.view.KeyEvent;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ContextMenu.ContextMenuInfo;
-import android.widget.AdapterView;
-import android.widget.AlphabetIndexer;
-import android.widget.BaseAdapter;
-import android.widget.ListView;
-import android.widget.SectionIndexer;
-import android.widget.TextView;
-
-import com.google.common.base.Predicate;
-import com.google.common.collect.Collections2;
-import com.google.common.collect.Lists;
-import com.googlecode.android_scripting.BaseApplication;
-import com.googlecode.android_scripting.Constants;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.R;
-import com.googlecode.android_scripting.facade.FacadeConfiguration;
-import com.googlecode.android_scripting.interpreter.Interpreter;
-import com.googlecode.android_scripting.interpreter.InterpreterConfiguration;
-import com.googlecode.android_scripting.language.SupportedLanguages;
-import com.googlecode.android_scripting.rpc.MethodDescriptor;
-import com.googlecode.android_scripting.rpc.ParameterDescriptor;
-import com.googlecode.android_scripting.rpc.RpcDeprecated;
-import com.googlecode.android_scripting.rpc.RpcMinSdk;
-
-import java.lang.reflect.Method;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-public class ApiBrowser extends ListActivity {
-
- private boolean searchResultMode = false;
-
- private static enum RequestCode {
- RPC_PROMPT
- }
-
- private static enum MenuId {
- EXPAND_ALL, COLLAPSE_ALL, SEARCH;
- public int getId() {
- return ordinal() + Menu.FIRST;
- }
- }
-
- private static enum ContextMenuId {
- INSERT_TEXT, PROMPT_PARAMETERS, HELP;
- public int getId() {
- return ordinal() + Menu.FIRST;
- }
- }
-
- private List<MethodDescriptor> mMethodDescriptors;
- private Set<Integer> mExpandedPositions;
- private ApiBrowserAdapter mAdapter;
- private boolean mIsLanguageSupported;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- CustomizeWindow.requestCustomTitle(this, "API Browser", R.layout.api_browser);
- getListView().setFastScrollEnabled(true);
- mExpandedPositions = new HashSet<Integer>();
- updateAndFilterMethodDescriptors(null);
- String scriptName = getIntent().getStringExtra(Constants.EXTRA_SCRIPT_PATH);
- mIsLanguageSupported = SupportedLanguages.checkLanguageSupported(scriptName);
- mAdapter = new ApiBrowserAdapter();
- setListAdapter(mAdapter);
- registerForContextMenu(getListView());
- setResult(RESULT_CANCELED);
- }
-
- private void updateAndFilterMethodDescriptors(final String query) {
- mMethodDescriptors =
- Lists.newArrayList(Collections2.filter(FacadeConfiguration.collectMethodDescriptors(),
- new Predicate<MethodDescriptor>() {
- @Override
- public boolean apply(MethodDescriptor descriptor) {
- Method method = descriptor.getMethod();
- if (method.isAnnotationPresent(RpcDeprecated.class)) {
- return false;
- } else if (method.isAnnotationPresent(RpcMinSdk.class)) {
- int requiredSdkLevel = method.getAnnotation(RpcMinSdk.class).value();
- if (FacadeConfiguration.getSdkLevel() < requiredSdkLevel) {
- return false;
- }
- }
- if (query == null) {
- return true;
- }
- return descriptor.getName().toLowerCase().contains(query.toLowerCase());
- }
- }));
- }
-
- @Override
- protected void onNewIntent(Intent intent) {
- if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
- searchResultMode = true;
- final String query = intent.getStringExtra(SearchManager.QUERY);
- ((TextView) findViewById(R.id.left_text)).setText(query);
- updateAndFilterMethodDescriptors(query);
- if (mMethodDescriptors.size() == 1) {
- mExpandedPositions.add(0);
- } else {
- mExpandedPositions.clear();
- }
- mAdapter.notifyDataSetChanged();
- }
- }
-
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_BACK && searchResultMode) {
- searchResultMode = false;
- mExpandedPositions.clear();
- ((TextView) findViewById(R.id.left_text)).setText("API Browser");
- updateAndFilterMethodDescriptors("");
- mAdapter.notifyDataSetChanged();
- return true;
- }
- return super.onKeyDown(keyCode, event);
- }
-
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- super.onPrepareOptionsMenu(menu);
- menu.clear();
- menu.add(Menu.NONE, MenuId.EXPAND_ALL.getId(), Menu.NONE, "Expand All").setIcon(
- android.R.drawable.ic_menu_add);
- menu.add(Menu.NONE, MenuId.COLLAPSE_ALL.getId(), Menu.NONE, "Collapse All").setIcon(
- android.R.drawable.ic_menu_close_clear_cancel);
- menu.add(Menu.NONE, MenuId.SEARCH.getId(), Menu.NONE, "Search").setIcon(
- R.drawable.ic_menu_search);
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- super.onOptionsItemSelected(item);
- int itemId = item.getItemId();
- if (itemId == MenuId.EXPAND_ALL.getId()) {
- for (int i = 0; i < mMethodDescriptors.size(); i++) {
- mExpandedPositions.add(i);
- }
- } else if (itemId == MenuId.COLLAPSE_ALL.getId()) {
- mExpandedPositions.clear();
- } else if (itemId == MenuId.SEARCH.getId()) {
- onSearchRequested();
- }
-
- mAdapter.notifyDataSetInvalidated();
- return true;
- }
-
- @Override
- protected void onListItemClick(ListView l, View v, int position, long id) {
- if (mExpandedPositions.contains(position)) {
- mExpandedPositions.remove(position);
- } else {
- mExpandedPositions.add(position);
- }
- mAdapter.notifyDataSetInvalidated();
- }
-
- @Override
- public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) {
- if (!mIsLanguageSupported) {
- return;
- }
- menu.add(Menu.NONE, ContextMenuId.INSERT_TEXT.getId(), Menu.NONE, "Insert");
- menu.add(Menu.NONE, ContextMenuId.PROMPT_PARAMETERS.getId(), Menu.NONE, "Prompt");
- }
-
- @Override
- public boolean onContextItemSelected(MenuItem item) {
- AdapterView.AdapterContextMenuInfo info;
- try {
- info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
- } catch (ClassCastException e) {
- Log.e("Bad menuInfo", e);
- return false;
- }
-
- MethodDescriptor rpc = (MethodDescriptor) getListAdapter().getItem(info.position);
- if (rpc == null) {
- Log.v("No RPC selected.");
- return false;
- }
-
- if (item.getItemId() == ContextMenuId.INSERT_TEXT.getId()) {
- // There's no activity to track calls to insert (like there is for prompt) so we track it
- // here instead.
- insertText(rpc, new String[0]);
- } else if (item.getItemId() == ContextMenuId.PROMPT_PARAMETERS.getId()) {
- Intent intent = new Intent(this, ApiPrompt.class);
- intent.putExtra(Constants.EXTRA_API_PROMPT_RPC_NAME, rpc.getName());
- ParameterDescriptor[] parameters = rpc.getParameterValues(new String[0]);
- String[] values = new String[parameters.length];
- int index = 0;
- for (ParameterDescriptor parameter : parameters) {
- values[index++] = parameter.getValue();
- }
- intent.putExtra(Constants.EXTRA_API_PROMPT_VALUES, values);
- startActivityForResult(intent, RequestCode.RPC_PROMPT.ordinal());
- } else if (item.getItemId() == ContextMenuId.HELP.getId()) {
- String help = rpc.getDeclaringClass().getSimpleName() + ".html#" + rpc.getName();
-
- }
- return true;
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- RequestCode request = RequestCode.values()[requestCode];
- if (resultCode == RESULT_OK) {
- switch (request) {
- case RPC_PROMPT:
- MethodDescriptor rpc =
- FacadeConfiguration.getMethodDescriptor(data
- .getStringExtra(Constants.EXTRA_API_PROMPT_RPC_NAME));
- String[] values = data.getStringArrayExtra(Constants.EXTRA_API_PROMPT_VALUES);
- insertText(rpc, values);
- break;
- default:
- break;
- }
- } else {
- switch (request) {
- case RPC_PROMPT:
- break;
- default:
- break;
- }
- }
- }
-
- private void insertText(MethodDescriptor rpc, String[] values) {
- String scriptText = getIntent().getStringExtra(Constants.EXTRA_SCRIPT_TEXT);
- InterpreterConfiguration config =
- ((BaseApplication) getApplication()).getInterpreterConfiguration();
-
- Interpreter interpreter =
- config.getInterpreterByName(getIntent().getStringExtra(Constants.EXTRA_INTERPRETER_NAME));
- String rpcHelpText = interpreter.getRpcText(scriptText, rpc, values);
-
- Intent intent = new Intent();
- intent.putExtra(Constants.EXTRA_RPC_HELP_TEXT, rpcHelpText);
- setResult(RESULT_OK, intent);
- finish();
- }
-
- private class ApiBrowserAdapter extends BaseAdapter implements SectionIndexer {
-
- private final AlphabetIndexer mIndexer;
- private final MatrixCursor mCursor;
-
- public ApiBrowserAdapter() {
- mCursor = new MatrixCursor(new String[] { "NAME" });
- for (MethodDescriptor info : mMethodDescriptors) {
- mCursor.addRow(new String[] { info.getName() });
- }
- mIndexer = new AlphabetIndexer(mCursor, 0, " ABCDEFGHIJKLMNOPQRSTUVWXYZ");
- }
-
- @Override
- public int getCount() {
- return mMethodDescriptors.size();
- }
-
- @Override
- public Object getItem(int position) {
- return mMethodDescriptors.get(position);
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public View getView(final int position, View convertView, ViewGroup parent) {
- TextView view;
- if (convertView == null) {
- view = new TextView(ApiBrowser.this);
- } else {
- view = (TextView) convertView;
- }
- view.setPadding(4, 4, 4, 4);
- view.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
- if (mExpandedPositions.contains(position)) {
- view.setText(mMethodDescriptors.get(position).getHelp());
- } else {
- view.setText(mMethodDescriptors.get(position).getName());
- }
- return view;
- }
-
- @Override
- public int getPositionForSection(int section) {
- return mIndexer.getPositionForSection(section);
- }
-
- @Override
- public int getSectionForPosition(int position) {
- return mIndexer.getSectionForPosition(position);
- }
-
- @Override
- public Object[] getSections() {
- return mIndexer.getSections();
- }
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ApiPrompt.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ApiPrompt.java
deleted file mode 100644
index e9655a2..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ApiPrompt.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.activity;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.text.Editable;
-import android.text.TextWatcher;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.View.OnClickListener;
-import android.widget.BaseAdapter;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.ListView;
-import android.widget.TextView;
-
-import com.googlecode.android_scripting.Constants;
-import com.googlecode.android_scripting.R;
-import com.googlecode.android_scripting.facade.FacadeConfiguration;
-import com.googlecode.android_scripting.rpc.MethodDescriptor;
-
-/**
- * Prompts for API parameters.
- *
- * <p>
- * This activity is started by {@link ApiBrowser} to prompt user for RPC call parameters.
- * Input/output interface is RPC name and explicit parameter values.
- *
- * @author igor.v.karp@gmail.com (Igor Karp)
- */
-public class ApiPrompt extends Activity {
- private MethodDescriptor mRpc;
- private String[] mHints;
- private String[] mValues;
- private ApiPromptAdapter mAdapter;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.api_prompt);
- mRpc =
- FacadeConfiguration.getMethodDescriptor(getIntent().getStringExtra(
- Constants.EXTRA_API_PROMPT_RPC_NAME));
- mHints = mRpc.getParameterHints();
- mValues = getIntent().getStringArrayExtra(Constants.EXTRA_API_PROMPT_VALUES);
- mAdapter = new ApiPromptAdapter();
- ((ListView) findViewById(R.id.list)).setAdapter(mAdapter);
- ((Button) findViewById(R.id.done)).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent intent = new Intent();
- intent.putExtra(Constants.EXTRA_API_PROMPT_RPC_NAME, mRpc.getName());
- intent.putExtra(Constants.EXTRA_API_PROMPT_VALUES, mValues);
- setResult(RESULT_OK, intent);
- finish();
- }
- });
- setResult(RESULT_CANCELED);
- }
-
- private class ApiPromptAdapter extends BaseAdapter {
- @Override
- public int getCount() {
- return mHints.length;
- }
-
- @Override
- public Object getItem(int position) {
- return mValues[position];
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- View item;
- if (convertView == null) {
- LayoutInflater inflater =
- (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- item =
- inflater.inflate(R.layout.api_prompt_item, parent, false /* do not attach to root */);
- } else {
- item = convertView;
- }
- TextView description = (TextView) item.findViewById(R.id.api_prompt_item_description);
- EditText value = (EditText) item.findViewById(R.id.api_prompt_item_value);
- description.setText(mHints[position]);
- value.setText(mValues[position]);
- value.addTextChangedListener(new ValueWatcher(position));
- return item;
- }
- }
-
- private class ValueWatcher implements TextWatcher {
- private final int mPosition;
-
- public ValueWatcher(int position) {
- mPosition = position;
- }
-
- @Override
- public void afterTextChanged(Editable e) {
- }
-
- @Override
- public void beforeTextChanged(CharSequence s, int start, int before, int count) {
- }
-
- @Override
- public void onTextChanged(CharSequence s, int start, int before, int count) {
- mValues[mPosition] = s.toString();
- }
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/BluetoothDeviceList.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/BluetoothDeviceList.java
deleted file mode 100644
index 962f69f..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/BluetoothDeviceList.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.activity;
-
-import android.app.ListActivity;
-import android.content.Intent;
-import android.os.Bundle;
-import android.util.TypedValue;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.BaseAdapter;
-import android.widget.TextView;
-
-import com.googlecode.android_scripting.Constants;
-import com.googlecode.android_scripting.R;
-import com.googlecode.android_scripting.facade.bluetooth.BluetoothDiscoveryHelper;
-import com.googlecode.android_scripting.facade.bluetooth.BluetoothDiscoveryHelper.BluetoothDiscoveryListener;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class BluetoothDeviceList extends ListActivity {
-
- private static class DeviceInfo {
- public final String mmName;
- public final String mmAddress;
-
- public DeviceInfo(String name, String address) {
- mmName = name;
- mmAddress = address;
- }
- }
-
- private final DeviceListAdapter mAdapter = new DeviceListAdapter();
- private final BluetoothDiscoveryHelper mBluetoothHelper =
- new BluetoothDiscoveryHelper(this, mAdapter);
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- CustomizeWindow.requestCustomTitle(this, "Bluetooth Devices", R.layout.bluetooth_device_list);
- setListAdapter(mAdapter);
- }
-
- @Override
- protected void onStart() {
- super.onStart();
- CustomizeWindow.toggleProgressBarVisibility(this, true);
- mBluetoothHelper.startDiscovery();
- }
-
- @Override
- protected void onStop() {
- super.onStop();
- mBluetoothHelper.cancel();
- }
-
- @Override
- protected void onListItemClick(android.widget.ListView l, View v, int position, long id) {
- DeviceInfo device = (DeviceInfo) mAdapter.getItem(position);
- final Intent result = new Intent();
- result.putExtra(Constants.EXTRA_DEVICE_ADDRESS, device.mmAddress);
- setResult(RESULT_OK, result);
- finish();
- };
-
- private class DeviceListAdapter extends BaseAdapter implements BluetoothDiscoveryListener {
- List<DeviceInfo> mmDeviceList;
-
- public DeviceListAdapter() {
- mmDeviceList = new ArrayList<DeviceInfo>();
- }
-
- @Override
- public void addDevice(String name, String address) {
- mmDeviceList.add(new DeviceInfo(name, address));
- notifyDataSetChanged();
- }
-
- @Override
- public int getCount() {
- return mmDeviceList.size();
- }
-
- @Override
- public Object getItem(int position) {
- return mmDeviceList.get(position);
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup viewGroup) {
- final DeviceInfo device = mmDeviceList.get(position);
- final TextView view = new TextView(BluetoothDeviceList.this);
- view.setPadding(2, 2, 2, 2);
- view.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20);
- view.setText(device.mmName + " (" + device.mmAddress + ")");
- return view;
- }
-
- @Override
- public void addBondedDevice(String name, String address) {
- addDevice(name, address);
- }
-
- @Override
- public void scanDone() {
- CustomizeWindow.toggleProgressBarVisibility(BluetoothDeviceList.this, false);
- }
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/CustomizeWindow.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/CustomizeWindow.java
deleted file mode 100644
index 897748f..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/CustomizeWindow.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.activity;
-
-import android.app.Activity;
-import android.view.View;
-import android.view.Window;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-
-import com.googlecode.android_scripting.R;
-import com.googlecode.android_scripting.Version;
-
-public class CustomizeWindow {
- private CustomizeWindow() {
- // Utility class.
- }
-
- public static void requestCustomTitle(Activity activity, String title, int contentViewLayoutResId) {
- //b/26218264
- //activity.requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
- //activity.setContentView(contentViewLayoutResId);
- //activity.getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title);
- //((TextView) activity.findViewById(R.id.left_text)).setText(title);
- //((TextView) activity.findViewById(R.id.right_text)).setText("SL4A r"
- // + Version.getVersion(activity));
- }
-
- public static void toggleProgressBarVisibility(Activity activity, boolean on) {
- ((ProgressBar) activity.findViewById(R.id.progress_bar)).setVisibility(on ? View.VISIBLE
- : View.GONE);
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/InterpreterManager.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/InterpreterManager.java
deleted file mode 100644
index 1cd2fc2..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/InterpreterManager.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.activity;
-
-import android.app.AlertDialog;
-import android.app.ListActivity;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnClickListener;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.database.DataSetObserver;
-import android.net.Uri;
-import android.os.Bundle;
-import android.preference.PreferenceManager;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.SubMenu;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.BaseAdapter;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.ListView;
-import android.widget.TextView;
-
-import com.googlecode.android_scripting.ActivityFlinger;
-import com.googlecode.android_scripting.BaseApplication;
-import com.googlecode.android_scripting.Constants;
-import com.googlecode.android_scripting.FeaturedInterpreters;
-import com.googlecode.android_scripting.R;
-import com.googlecode.android_scripting.interpreter.Interpreter;
-import com.googlecode.android_scripting.interpreter.InterpreterConfiguration;
-import com.googlecode.android_scripting.interpreter.InterpreterConfiguration.ConfigurationObserver;
-
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.List;
-
-public class InterpreterManager extends ListActivity {
-
- private InterpreterManagerAdapter mAdapter;
- private InterpreterListObserver mObserver;
- private List<Interpreter> mInterpreters;
- private List<String> mFeaturedInterpreters;
- private InterpreterConfiguration mConfiguration;
- private SharedPreferences mPreferences;
-
- private static enum MenuId {
- HELP, ADD, NETWORK, PREFERENCES;
- public int getId() {
- return ordinal() + Menu.FIRST;
- }
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- CustomizeWindow.requestCustomTitle(this, "Interpreters", R.layout.interpreter_manager);
- mConfiguration = ((BaseApplication) getApplication()).getInterpreterConfiguration();
- mInterpreters = new ArrayList<Interpreter>();
- mAdapter = new InterpreterManagerAdapter();
- mObserver = new InterpreterListObserver();
- mAdapter.registerDataSetObserver(mObserver);
- setListAdapter(mAdapter);
- ActivityFlinger.attachView(getListView(), this);
- ActivityFlinger.attachView(getWindow().getDecorView(), this);
- mFeaturedInterpreters = FeaturedInterpreters.getList();
- mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
- }
-
- @Override
- public void onStart() {
- super.onStart();
- mConfiguration.registerObserver(mObserver);
- mAdapter.notifyDataSetInvalidated();
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- mAdapter.notifyDataSetInvalidated();
- }
-
- @Override
- public void onStop() {
- super.onStop();
- mConfiguration.unregisterObserver(mObserver);
- }
-
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- menu.clear();
- buildInstallLanguagesMenu(menu);
- menu.add(Menu.NONE, MenuId.NETWORK.getId(), Menu.NONE, "Start Server").setIcon(
- android.R.drawable.ic_menu_share);
- menu.add(Menu.NONE, MenuId.PREFERENCES.getId(), Menu.NONE, "Preferences").setIcon(
- android.R.drawable.ic_menu_preferences);
- return super.onPrepareOptionsMenu(menu);
- }
-
- private void buildInstallLanguagesMenu(Menu menu) {
- SubMenu installMenu =
- menu.addSubMenu(Menu.NONE, MenuId.ADD.getId(), Menu.NONE, "Add").setIcon(
- android.R.drawable.ic_menu_add);
- int i = MenuId.values().length + Menu.FIRST;
- for (String interpreterName : mFeaturedInterpreters) {
- installMenu.add(Menu.NONE, i++, Menu.NONE, interpreterName);
- }
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- int itemId = item.getItemId();
- if (itemId == MenuId.NETWORK.getId()) {
- AlertDialog.Builder dialog = new AlertDialog.Builder(this);
- dialog.setItems(new CharSequence[] { "Public", "Private" }, new OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- launchService(which == 0 /* usePublicIp */);
- }
- });
- dialog.show();
- } else if (itemId == MenuId.PREFERENCES.getId()) {
- startActivity(new Intent(this, Preferences.class));
- } else if (itemId >= MenuId.values().length + Menu.FIRST) {
- int i = itemId - MenuId.values().length - Menu.FIRST;
- if (i < mFeaturedInterpreters.size()) {
- URL url = FeaturedInterpreters.getUrlForName(mFeaturedInterpreters.get(i));
- Intent viewIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url.toString()));
- startActivity(viewIntent);
- }
- }
- return true;
- }
-
- private int getPrefInt(String key, int defaultValue) {
- int result = defaultValue;
- String value = mPreferences.getString(key, null);
- if (value != null) {
- try {
- result = Integer.parseInt(value);
- } catch (NumberFormatException e) {
- result = defaultValue;
- }
- }
- return result;
- }
-
- private void launchService(boolean usePublicIp) {
- Intent intent = new Intent(this, ScriptingLayerService.class);
- intent.setAction(Constants.ACTION_LAUNCH_SERVER);
- intent.putExtra(Constants.EXTRA_USE_EXTERNAL_IP, usePublicIp);
- intent.putExtra(Constants.EXTRA_USE_SERVICE_PORT, getPrefInt("use_service_port", 0));
- startService(intent);
- }
-
- private void launchTerminal(Interpreter interpreter) {
- Intent intent = new Intent(this, ScriptingLayerService.class);
- intent.setAction(Constants.ACTION_LAUNCH_INTERPRETER);
- intent.putExtra(Constants.EXTRA_INTERPRETER_NAME, interpreter.getName());
- startService(intent);
- }
-
- @Override
- protected void onListItemClick(ListView list, View view, int position, long id) {
- Interpreter interpreter = (Interpreter) list.getItemAtPosition(position);
- launchTerminal(interpreter);
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- mConfiguration.unregisterObserver(mObserver);
- }
-
- private class InterpreterListObserver extends DataSetObserver implements ConfigurationObserver {
- @Override
- public void onInvalidated() {
- mInterpreters = mConfiguration.getInteractiveInterpreters();
- }
-
- @Override
- public void onChanged() {
- mInterpreters = mConfiguration.getInteractiveInterpreters();
- }
-
- @Override
- public void onConfigurationChanged() {
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- mAdapter.notifyDataSetChanged();
- }
- });
- }
- }
-
- private class InterpreterManagerAdapter extends BaseAdapter {
-
- @Override
- public int getCount() {
- return mInterpreters.size();
- }
-
- @Override
- public Object getItem(int position) {
- return mInterpreters.get(position);
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- LinearLayout container;
-
- Interpreter interpreter = mInterpreters.get(position);
-
- if (convertView == null) {
- LayoutInflater inflater =
- (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- container = (LinearLayout) inflater.inflate(R.layout.list_item, null);
- } else {
- container = (LinearLayout) convertView;
- }
- ImageView img = (ImageView) container.findViewById(R.id.list_item_icon);
-
- int imgId =
- FeaturedInterpreters.getInterpreterIcon(InterpreterManager.this,
- interpreter.getExtension());
- if (imgId == 0) {
- imgId = R.drawable.sl4a_logo_32;
- }
-
- img.setImageResource(imgId);
-
- TextView text = (TextView) container.findViewById(R.id.list_item_title);
-
- text.setText(interpreter.getNiceName());
- return container;
- }
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/InterpreterPicker.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/InterpreterPicker.java
deleted file mode 100644
index 79145d5..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/InterpreterPicker.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.activity;
-
-import android.app.ListActivity;
-import android.content.Context;
-import android.content.Intent;
-import android.database.DataSetObserver;
-import android.os.Bundle;
-import android.os.Parcelable;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.BaseAdapter;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.ListView;
-import android.widget.TextView;
-
-import com.googlecode.android_scripting.BaseApplication;
-import com.googlecode.android_scripting.FeaturedInterpreters;
-import com.googlecode.android_scripting.IntentBuilders;
-import com.googlecode.android_scripting.R;
-import com.googlecode.android_scripting.interpreter.Interpreter;
-import com.googlecode.android_scripting.interpreter.InterpreterConfiguration;
-import com.googlecode.android_scripting.interpreter.InterpreterConfiguration.ConfigurationObserver;
-
-import java.util.List;
-
-/**
- * Presents available scripts and returns the selected one.
- *
- * @author Damon Kohler (damonkohler@gmail.com)
- */
-public class InterpreterPicker extends ListActivity {
-
- private List<Interpreter> mInterpreters;
- private InterpreterPickerAdapter mAdapter;
- private InterpreterConfiguration mConfiguration;
- private ScriptListObserver mObserver;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- CustomizeWindow.requestCustomTitle(this, "Interpreters", R.layout.script_manager);
- mObserver = new ScriptListObserver();
- mConfiguration = ((BaseApplication) getApplication()).getInterpreterConfiguration();
- mInterpreters = mConfiguration.getInteractiveInterpreters();
- mConfiguration.registerObserver(mObserver);
- mAdapter = new InterpreterPickerAdapter();
- mAdapter.registerDataSetObserver(mObserver);
- setListAdapter(mAdapter);
- }
-
- @Override
- protected void onListItemClick(ListView list, View view, int position, long id) {
- final Interpreter interpreter = (Interpreter) list.getItemAtPosition(position);
- if (Intent.ACTION_CREATE_SHORTCUT.equals(getIntent().getAction())) {
- int icon =
- FeaturedInterpreters.getInterpreterIcon(InterpreterPicker.this, interpreter
- .getExtension());
- if (icon == 0) {
- icon = R.drawable.sl4a_logo_48;
- }
- Parcelable iconResource =
- Intent.ShortcutIconResource.fromContext(InterpreterPicker.this, icon);
- Intent intent = IntentBuilders.buildInterpreterShortcutIntent(interpreter, iconResource);
- setResult(RESULT_OK, intent);
- }
- finish();
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- mConfiguration.unregisterObserver(mObserver);
- }
-
- private class ScriptListObserver extends DataSetObserver implements ConfigurationObserver {
- @Override
- public void onInvalidated() {
- mInterpreters = mConfiguration.getInteractiveInterpreters();
- }
-
- @Override
- public void onConfigurationChanged() {
- mAdapter.notifyDataSetInvalidated();
- }
- }
-
- private class InterpreterPickerAdapter extends BaseAdapter {
-
- @Override
- public int getCount() {
- return mInterpreters.size();
- }
-
- @Override
- public Object getItem(int position) {
- return mInterpreters.get(position);
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- LinearLayout container;
-
- Interpreter interpreter = mInterpreters.get(position);
-
- if (convertView == null) {
- LayoutInflater inflater =
- (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- container = (LinearLayout) inflater.inflate(R.layout.list_item, null);
- } else {
- container = (LinearLayout) convertView;
- }
- ImageView img = (ImageView) container.findViewById(R.id.list_item_icon);
-
- int imgId =
- FeaturedInterpreters.getInterpreterIcon(InterpreterPicker.this, interpreter
- .getExtension());
- if (imgId == 0) {
- imgId = R.drawable.sl4a_logo_32;
- }
-
- img.setImageResource(imgId);
-
- TextView text = (TextView) container.findViewById(R.id.list_item_title);
-
- text.setText(interpreter.getNiceName());
- return container;
- }
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/LogcatViewer.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/LogcatViewer.java
deleted file mode 100644
index 7025c23..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/LogcatViewer.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.activity;
-
-import android.app.ListActivity;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.text.ClipboardManager;
-import android.util.TypedValue;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.BaseAdapter;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.googlecode.android_scripting.ActivityFlinger;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.Process;
-import com.googlecode.android_scripting.R;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.LinkedList;
-import java.util.List;
-
-public class LogcatViewer extends ListActivity {
-
- private List<String> mLogcatMessages;
- private int mOldLastPosition;
- private LogcatViewerAdapter mAdapter;
- private Process mLogcatProcess;
-
- private static enum MenuId {
- HELP, PREFERENCES, JUMP_TO_BOTTOM, SHARE, COPY;
- public int getId() {
- return ordinal() + Menu.FIRST;
- }
- }
-
- private class LogcatWatcher implements Runnable {
- @Override
- public void run() {
- mLogcatProcess = new Process();
- mLogcatProcess.setBinary(new File("/system/bin/logcat"));
- mLogcatProcess.start(null);
- try {
- BufferedReader br = new BufferedReader(new InputStreamReader(mLogcatProcess.getIn()));
- while (true) {
- final String line = br.readLine();
- if (line == null) {
- break;
- }
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- mLogcatMessages.add(line);
- mAdapter.notifyDataSetInvalidated();
- // This logic performs what transcriptMode="normal" should do. Since that doesn't seem
- // to work, we do it this way.
- int lastVisiblePosition = getListView().getLastVisiblePosition();
- int lastPosition = mLogcatMessages.size() - 1;
- if (lastVisiblePosition == mOldLastPosition || lastVisiblePosition == -1) {
- getListView().setSelection(lastPosition);
- }
- mOldLastPosition = lastPosition;
- }
- });
- }
- } catch (IOException e) {
- Log.e("Failed to read from logcat process.", e);
- } finally {
- mLogcatProcess.kill();
- }
- }
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- CustomizeWindow.requestCustomTitle(this, "Logcat", R.layout.logcat_viewer);
- mLogcatMessages = new LinkedList<String>();
- mOldLastPosition = 0;
- mAdapter = new LogcatViewerAdapter();
- setListAdapter(mAdapter);
- ActivityFlinger.attachView(getListView(), this);
- ActivityFlinger.attachView(getWindow().getDecorView(), this);
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- menu.add(Menu.NONE, MenuId.PREFERENCES.getId(), Menu.NONE, "Preferences").setIcon(
- android.R.drawable.ic_menu_preferences);
- menu.add(Menu.NONE, MenuId.JUMP_TO_BOTTOM.getId(), Menu.NONE, "Jump to Bottom").setIcon(
- android.R.drawable.ic_menu_revert);
- menu.add(Menu.NONE, MenuId.SHARE.getId(), Menu.NONE, "Share").setIcon(
- android.R.drawable.ic_menu_share);
- menu.add(Menu.NONE, MenuId.COPY.getId(), Menu.NONE, "Copy").setIcon(
- android.R.drawable.ic_menu_edit);
- return super.onCreateOptionsMenu(menu);
- }
-
- private String getAsString() {
- StringBuilder builder = new StringBuilder();
- for (String message : mLogcatMessages) {
- builder.append(message + "\n");
- }
- return builder.toString();
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- int itemId = item.getItemId();
- if (itemId == MenuId.JUMP_TO_BOTTOM.getId()) {
- getListView().setSelection(mLogcatMessages.size() - 1);
- } else if (itemId == MenuId.PREFERENCES.getId()) {
- startActivity(new Intent(this, Preferences.class));
- } else if (itemId == MenuId.SHARE.getId()) {
- Intent intent = new Intent(Intent.ACTION_SEND);
- intent.putExtra(Intent.EXTRA_TEXT, getAsString().toString());
- intent.putExtra(Intent.EXTRA_SUBJECT, "Logcat Dump");
- intent.setType("text/plain");
- startActivity(Intent.createChooser(intent, "Send Logcat to:"));
- } else if (itemId == MenuId.COPY.getId()) {
- ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
- clipboard.setText(getAsString());
- Toast.makeText(this, "Copied to clipboard", Toast.LENGTH_SHORT).show();
- }
- return super.onOptionsItemSelected(item);
- }
-
- @Override
- protected void onStart() {
- mLogcatMessages.clear();
- Thread logcatWatcher = new Thread(new LogcatWatcher());
- logcatWatcher.setPriority(Thread.NORM_PRIORITY - 1);
- logcatWatcher.start();
- mAdapter.notifyDataSetInvalidated();
- super.onStart();
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- mLogcatProcess.kill();
- }
-
- private class LogcatViewerAdapter extends BaseAdapter {
-
- @Override
- public int getCount() {
- return mLogcatMessages.size();
- }
-
- @Override
- public Object getItem(int position) {
- return mLogcatMessages.get(position);
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public View getView(final int position, View convertView, ViewGroup parent) {
- TextView view = new TextView(LogcatViewer.this);
- view.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15);
- view.setText(mLogcatMessages.get(position));
- return view;
- }
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/Preferences.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/Preferences.java
deleted file mode 100644
index 5197d9e..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/Preferences.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.activity;
-
-import android.os.Bundle;
-import android.preference.PreferenceActivity;
-
-import com.googlecode.android_scripting.R;
-
-public class Preferences extends PreferenceActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // Load the preferences from an XML resource
- addPreferencesFromResource(R.xml.preferences);
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptEditor.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptEditor.java
deleted file mode 100644
index b83720e..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptEditor.java
+++ /dev/null
@@ -1,621 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.activity;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnClickListener;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.Editor;
-import android.media.AudioManager;
-import android.os.Bundle;
-import android.preference.PreferenceManager;
-import android.text.Editable;
-import android.text.InputFilter;
-import android.text.InputType;
-import android.text.Selection;
-import android.text.Spanned;
-import android.text.TextWatcher;
-import android.text.style.UnderlineSpan;
-import android.view.KeyEvent;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.CheckBox;
-import android.widget.EditText;
-import android.widget.Toast;
-
-import com.googlecode.android_scripting.BaseApplication;
-import com.googlecode.android_scripting.Constants;
-import com.googlecode.android_scripting.FileUtils;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.R;
-import com.googlecode.android_scripting.ScriptStorageAdapter;
-import com.googlecode.android_scripting.interpreter.Interpreter;
-import com.googlecode.android_scripting.interpreter.InterpreterConfiguration;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Vector;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * A text editor for scripts.
- *
- * @author Damon Kohler (damonkohler@gmail.com)
- */
-public class ScriptEditor extends Activity implements OnClickListener {
- private static final int DIALOG_FIND_REPLACE = 2;
- private static final int DIALOG_LINE = 1;
- private EditText mNameText;
- private EditText mContentText;
- private boolean mScheduleMoveLeft;
- private String mLastSavedContent;
- private SharedPreferences mPreferences;
- private InterpreterConfiguration mConfiguration;
- private ContentTextWatcher mWatcher;
- private EditHistory mHistory;
- private File mScript;
- private EditText mLineNo;
-
- private boolean mIsUndoOrRedo = false;
- private boolean mEnableAutoClose;
- private boolean mAutoIndent;
-
- private EditText mSearchFind;
- private EditText mSearchReplace;
- private CheckBox mSearchCase;
- private CheckBox mSearchWord;
- private CheckBox mSearchAll;
- private CheckBox mSearchStart;
-
- private static enum MenuId {
- SAVE, SAVE_AND_RUN, PREFERENCES, API_BROWSER, HELP, SHARE, GOTO, SEARCH;
- public int getId() {
- return ordinal() + Menu.FIRST;
- }
- }
-
- private static enum RequestCode {
- RPC_HELP
- }
-
- private int readIntPref(String key, int defaultValue, int maxValue) {
- int val;
- try {
- val = Integer.parseInt(mPreferences.getString(key, Integer.toString(defaultValue)));
- } catch (NumberFormatException e) {
- val = defaultValue;
- }
- val = Math.max(0, Math.min(val, maxValue));
- return val;
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.script_editor);
- mNameText = (EditText) findViewById(R.id.script_editor_title);
- mContentText = (EditText) findViewById(R.id.script_editor_body);
- mHistory = new EditHistory();
- mWatcher = new ContentTextWatcher(mHistory);
- mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
- updatePreferences();
-
- mScript = new File(getIntent().getStringExtra(Constants.EXTRA_SCRIPT_PATH));
- mNameText.setText(mScript.getName());
- mNameText.setSelected(true);
- // NOTE: This appears to be the only way to get Android to put the cursor to the beginning of
- // the EditText field.
- mNameText.setSelection(1);
- mNameText.extendSelection(0);
- mNameText.setSelection(0);
- mLastSavedContent = getIntent().getStringExtra(Constants.EXTRA_SCRIPT_CONTENT);
- if (mLastSavedContent == null) {
- try {
- mLastSavedContent = FileUtils.readToString(mScript);
- } catch (IOException e) {
- Log.e("Failed to read script.", e);
- mLastSavedContent = "";
- } finally {
- }
- }
-
- mContentText.setText(mLastSavedContent);
- InputFilter[] oldFilters = mContentText.getFilters();
- List<InputFilter> filters = new ArrayList<InputFilter>(oldFilters.length + 1);
- filters.addAll(Arrays.asList(oldFilters));
- filters.add(new ContentInputFilter());
- mContentText.setFilters(filters.toArray(oldFilters));
- mContentText.addTextChangedListener(mWatcher);
- mConfiguration = ((BaseApplication) getApplication()).getInterpreterConfiguration();
- // Disables volume key beep.
- setVolumeControlStream(AudioManager.STREAM_MUSIC);
- mLineNo = new EditText(this);
- mLineNo.setInputType(InputType.TYPE_CLASS_NUMBER);
- int lastLocation = mPreferences.getInt("lasteditpos." + mScript, -1);
- if (lastLocation >= 0) {
- mContentText.requestFocus();
- mContentText.setSelection(lastLocation);
- }
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- updatePreferences();
- }
-
- private void updatePreferences() {
- mContentText.setTextSize(readIntPref("editor_fontsize", 10, 30));
- mEnableAutoClose = mPreferences.getBoolean("enableAutoClose", true);
- mAutoIndent = mPreferences.getBoolean("editor_auto_indent", false);
- mContentText.setHorizontallyScrolling(mPreferences.getBoolean("editor_no_wrap", false));
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- super.onCreateOptionsMenu(menu);
- menu.add(0, MenuId.SAVE.getId(), 0, "Save & Exit").setIcon(android.R.drawable.ic_menu_save);
- menu.add(0, MenuId.SAVE_AND_RUN.getId(), 0, "Save & Run").setIcon(
- android.R.drawable.ic_media_play);
- menu.add(0, MenuId.PREFERENCES.getId(), 0, "Preferences").setIcon(
- android.R.drawable.ic_menu_preferences);
- menu.add(0, MenuId.API_BROWSER.getId(), 0, "API Browser").setIcon(
- android.R.drawable.ic_menu_info_details);
- menu.add(0, MenuId.SHARE.getId(), 0, "Share").setIcon(android.R.drawable.ic_menu_share);
- menu.add(0, MenuId.GOTO.getId(), 0, "GoTo").setIcon(android.R.drawable.ic_menu_directions);
- menu.add(0, MenuId.SEARCH.getId(), 0, "Find").setIcon(android.R.drawable.ic_menu_search);
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- if (item.getItemId() == MenuId.SAVE.getId()) {
- save();
- finish();
- } else if (item.getItemId() == MenuId.SAVE_AND_RUN.getId()) {
- save();
- Interpreter interpreter =
- mConfiguration.getInterpreterForScript(mNameText.getText().toString());
- if (interpreter != null) { // We may be editing an unknown type.
- Intent intent = new Intent(this, ScriptingLayerService.class);
- intent.setAction(Constants.ACTION_LAUNCH_FOREGROUND_SCRIPT);
- intent.putExtra(Constants.EXTRA_SCRIPT_PATH, mScript.getAbsolutePath());
- startService(intent);
- } else {
- // TODO(damonkohler): Should remove menu option.
- Toast.makeText(this, "Can't run this type.", Toast.LENGTH_SHORT).show();
- }
- finish();
- } else if (item.getItemId() == MenuId.PREFERENCES.getId()) {
- startActivity(new Intent(this, Preferences.class));
- } else if (item.getItemId() == MenuId.API_BROWSER.getId()) {
- Intent intent = new Intent(this, ApiBrowser.class);
- intent.putExtra(Constants.EXTRA_SCRIPT_PATH, mNameText.getText().toString());
- intent.putExtra(Constants.EXTRA_INTERPRETER_NAME,
- mConfiguration.getInterpreterForScript(mNameText.getText().toString()).getName());
- intent.putExtra(Constants.EXTRA_SCRIPT_TEXT, mContentText.getText().toString());
- startActivityForResult(intent, RequestCode.RPC_HELP.ordinal());
- } else if (item.getItemId() == MenuId.SHARE.getId()) {
- Intent intent = new Intent(Intent.ACTION_SEND);
- intent.putExtra(Intent.EXTRA_TEXT, mContentText.getText().toString());
- intent.putExtra(Intent.EXTRA_SUBJECT, "Share " + mNameText.getText().toString());
- intent.setType("text/plain");
- startActivity(Intent.createChooser(intent, "Send Script to:"));
- } else if (item.getItemId() == MenuId.GOTO.getId()) {
- showDialog(DIALOG_LINE);
- } else if (item.getItemId() == MenuId.SEARCH.getId()) {
- showDialog(DIALOG_FIND_REPLACE);
- }
- return super.onOptionsItemSelected(item);
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- RequestCode request = RequestCode.values()[requestCode];
-
- if (resultCode == RESULT_OK) {
- switch (request) {
- case RPC_HELP:
- String rpcText = data.getStringExtra(Constants.EXTRA_RPC_HELP_TEXT);
- insertContent(rpcText);
- break;
- default:
- break;
- }
- } else {
- switch (request) {
- case RPC_HELP:
- break;
- default:
- break;
- }
- }
- }
-
- private void save() {
- int start = mContentText.getSelectionStart();
- mLastSavedContent = mContentText.getText().toString();
- mScript = new File(mScript.getParent(), mNameText.getText().toString());
- ScriptStorageAdapter.writeScript(mScript, mLastSavedContent);
- Toast.makeText(this, "Saved " + mNameText.getText().toString(), Toast.LENGTH_SHORT).show();
- Editor e = mPreferences.edit();
- e.putInt("lasteditpos." + mScript, start);
- e.commit();
- }
-
- private void insertContent(String text) {
- int selectionStart = Math.min(mContentText.getSelectionStart(), mContentText.getSelectionEnd());
- int selectionEnd = Math.max(mContentText.getSelectionStart(), mContentText.getSelectionEnd());
- mContentText.getEditableText().replace(selectionStart, selectionEnd, text);
- }
-
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_BACK && hasContentChanged()) {
- AlertDialog.Builder alert = new AlertDialog.Builder(this);
- setVolumeControlStream(AudioManager.STREAM_MUSIC);
- alert.setCancelable(false);
- alert.setTitle("Confirm exit");
- alert.setMessage("Would you like to save?");
- alert.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- save();
- finish();
- }
- });
- alert.setNegativeButton("No", new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- finish();
- }
- });
- alert.setNeutralButton("Cancel", new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- }
- });
- alert.show();
- return true;
- } else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
- redo();
- return true;
- } else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
- undo();
- return true;
- } else if (keyCode == KeyEvent.KEYCODE_SEARCH) {
- showDialog(DIALOG_FIND_REPLACE);
- return true;
- } else {
- return super.onKeyDown(keyCode, event);
- }
- }
-
- @Override
- protected Dialog onCreateDialog(int id, Bundle args) {
- AlertDialog.Builder b = new AlertDialog.Builder(this);
- if (id == DIALOG_LINE) {
- b.setTitle("Goto Line");
- b.setView(mLineNo);
- b.setPositiveButton("Ok", new OnClickListener() {
-
- @Override
- public void onClick(DialogInterface dialog, int which) {
- gotoLine(Integer.parseInt(mLineNo.getText().toString()));
- }
- });
- b.setNegativeButton("Cancel", null);
- return b.create();
- } else if (id == DIALOG_FIND_REPLACE) {
- View v = getLayoutInflater().inflate(R.layout.findreplace, null);
- mSearchFind = (EditText) v.findViewById(R.id.searchFind);
- mSearchReplace = (EditText) v.findViewById(R.id.searchReplace);
- mSearchAll = (CheckBox) v.findViewById(R.id.searchAll);
- mSearchCase = (CheckBox) v.findViewById(R.id.searchCase);
- mSearchStart = (CheckBox) v.findViewById(R.id.searchStart);
- mSearchWord = (CheckBox) v.findViewById(R.id.searchWord);
- b.setTitle("Search and Replace");
- b.setView(v);
- b.setPositiveButton("Find", this);
- b.setNeutralButton("Next", this);
- b.setNegativeButton("Replace", this);
- return b.create();
- }
-
- return super.onCreateDialog(id, args);
- }
-
- @Override
- protected void onPrepareDialog(int id, Dialog dialog, Bundle args) {
- if (id == DIALOG_LINE) {
- mLineNo.setText(String.valueOf(getLineNo()));
- } else if (id == DIALOG_FIND_REPLACE) {
- mSearchStart.setChecked(false);
- }
- super.onPrepareDialog(id, dialog, args);
- }
-
- protected int getLineNo() {
- int pos = mContentText.getSelectionStart();
- String text = mContentText.getText().toString();
- int i = 0;
- int n = 1;
- while (i < pos) {
- int j = text.indexOf("\n", i);
- if (j < 0) {
- break;
- }
- i = j + 1;
- if (i < pos) {
- n += 1;
- }
- }
- return n;
- }
-
- protected void gotoLine(int line) {
- String text = mContentText.getText().toString();
- if (text.length() < 1) {
- return;
- }
- int i = 0;
- int n = 1;
- while (i < text.length() && n < line) {
- int j = text.indexOf("\n", i);
- if (j < 0) {
- break;
- }
- i = j + 1;
- n += 1;
- }
- mContentText.setSelection(Math.min(text.length() - 1, i));
- }
-
- @Override
- protected void onUserLeaveHint() {
- if (hasContentChanged()) {
- save();
- }
- }
-
- private boolean hasContentChanged() {
- return !mLastSavedContent.equals(mContentText.getText().toString());
- }
-
- private final class ContentInputFilter implements InputFilter {
- @Override
- public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart,
- int dend) {
- if (end - start == 1) {
- Interpreter ip = mConfiguration.getInterpreterForScript(mNameText.getText().toString());
- String auto = null;
- if (ip != null && mEnableAutoClose) {
- auto = ip.getLanguage().autoClose(source.charAt(start));
- }
- // Auto indent code?
- if (auto == null && source.charAt(start) == '\n' && mAutoIndent) {
- int i = dstart - 1;
- int spaces = 0;
- while ((i >= 0) && dest.charAt(i) != '\n') {
- i -= 1; // Find start of line.
- }
- i += 1;
- while (i < dest.length() && dest.charAt(i++) == ' ') {
- spaces += 1;
- }
- if (spaces > 0) {
- return String.format("\n%" + spaces + "s", " ");
- }
- }
- if (auto != null) {
- mScheduleMoveLeft = true;
- return auto;
- }
- }
- return null;
- }
- }
-
- private final class ContentTextWatcher implements TextWatcher {
- private final EditHistory mmEditHistory;
- private CharSequence mmBeforeChange;
- private CharSequence mmAfterChange;
-
- private ContentTextWatcher(EditHistory history) {
- mmEditHistory = history;
- }
-
- @Override
- public void onTextChanged(CharSequence s, int start, int before, int count) {
- if (!mIsUndoOrRedo) {
- mmAfterChange = s.subSequence(start, start + count);
- mmEditHistory.add(new EditItem(start, mmBeforeChange, mmAfterChange));
- }
- }
-
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count, int after) {
- if (!mIsUndoOrRedo) {
- mmBeforeChange = s.subSequence(start, start + count);
- }
- }
-
- @Override
- public void afterTextChanged(Editable s) {
- if (mScheduleMoveLeft) {
- mScheduleMoveLeft = false;
- Selection.moveLeft(mContentText.getText(), mContentText.getLayout());
- }
- }
- }
-
- /**
- * Keeps track of all the edit history of a text.
- */
- private final class EditHistory {
- int mmPosition = 0;
- private final Vector<EditItem> mmHistory = new Vector<EditItem>();
-
- /**
- * Adds a new edit operation to the history at the current position. If executed after a call to
- * getPrevious() removes all the future history (elements with positions >= current history
- * position).
- *
- */
- private void add(EditItem item) {
- mmHistory.setSize(mmPosition);
- mmHistory.add(item);
- mmPosition++;
- }
-
- /**
- * Traverses the history backward by one position, returns and item at that position.
- */
- private EditItem getPrevious() {
- if (mmPosition == 0) {
- return null;
- }
- mmPosition--;
- return mmHistory.get(mmPosition);
- }
-
- /**
- * Traverses the history forward by one position, returns and item at that position.
- */
- private EditItem getNext() {
- if (mmPosition == mmHistory.size()) {
- return null;
- }
- EditItem item = mmHistory.get(mmPosition);
- mmPosition++;
- return item;
- }
- }
-
- /**
- * Represents a single edit operation.
- */
- private final class EditItem {
- private final int mmIndex;
- private final CharSequence mmBefore;
- private final CharSequence mmAfter;
-
- /**
- * Constructs EditItem of a modification that was applied at position start and replaced
- * CharSequence before with CharSequence after.
- */
- public EditItem(int start, CharSequence before, CharSequence after) {
- mmIndex = start;
- mmBefore = before;
- mmAfter = after;
- }
- }
-
- private void undo() {
- EditItem edit = mHistory.getPrevious();
- if (edit == null) {
- return;
- }
- Editable text = mContentText.getText();
- int start = edit.mmIndex;
- int end = start + (edit.mmAfter != null ? edit.mmAfter.length() : 0);
- mIsUndoOrRedo = true;
- text.replace(start, end, edit.mmBefore);
- mIsUndoOrRedo = false;
- // This will get rid of underlines inserted when editor tries to come up with a suggestion.
- for (Object o : text.getSpans(0, text.length(), UnderlineSpan.class)) {
- text.removeSpan(o);
- }
- Selection.setSelection(text, edit.mmBefore == null ? start : (start + edit.mmBefore.length()));
- }
-
- private void redo() {
- EditItem edit = mHistory.getNext();
- if (edit == null) {
- return;
- }
- Editable text = mContentText.getText();
- int start = edit.mmIndex;
- int end = start + (edit.mmBefore != null ? edit.mmBefore.length() : 0);
- mIsUndoOrRedo = true;
- text.replace(start, end, edit.mmAfter);
- mIsUndoOrRedo = false;
- for (Object o : text.getSpans(0, text.length(), UnderlineSpan.class)) {
- text.removeSpan(o);
- }
- Selection.setSelection(text, edit.mmAfter == null ? start : (start + edit.mmAfter.length()));
- }
-
- @Override
- public void onClick(DialogInterface dialog, int which) {
- int start = mContentText.getSelectionStart();
- int end = mContentText.getSelectionEnd();
- String original = mContentText.getText().toString();
- if (start == end || which != AlertDialog.BUTTON_NEGATIVE) {
- end = original.length();
- }
- if (which == AlertDialog.BUTTON_NEUTRAL) {
- start += 1;
- }
- if (mSearchStart.isChecked()) {
- start = 0;
- end = original.length();
- }
- String findText = mSearchFind.getText().toString();
- String replaceText = mSearchReplace.getText().toString();
- String search = Pattern.quote(findText);
- int flags = 0;
- if (!mSearchCase.isChecked()) {
- flags |= Pattern.CASE_INSENSITIVE;
- }
- if (mSearchWord.isChecked()) {
- search = "\\b" + search + "\\b";
- }
- Pattern p = Pattern.compile(search, flags);
- Matcher m = p.matcher(original);
- m.region(start, end);
- if (!m.find()) {
- Toast.makeText(this, "Search not found.", Toast.LENGTH_SHORT).show();
- return;
- }
- int foundpos = m.start();
- if (which != AlertDialog.BUTTON_NEGATIVE) { // Find
- mContentText.setSelection(foundpos, foundpos + findText.length());
- } else { // Replace
- String s;
- // Seems to be a bug in the android 2.2 implementation of replace... regions not returning
- // whole string.
- m = p.matcher(original.substring(start, end));
- String replace = Matcher.quoteReplacement(replaceText);
- if (mSearchAll.isChecked()) {
- s = m.replaceAll(replace);
- } else {
- s = m.replaceFirst(replace);
- }
- mContentText.setText(original.substring(0, start) + s + original.substring(end));
- mContentText.setSelection(foundpos, foundpos + replaceText.length());
- }
- mContentText.requestFocus();
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptManager.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptManager.java
deleted file mode 100644
index 9cc7c97..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptManager.java
+++ /dev/null
@@ -1,579 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.activity;
-
-import android.app.AlertDialog;
-import android.app.ListActivity;
-import android.app.SearchManager;
-import android.content.ActivityNotFoundException;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.database.DataSetObserver;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.preference.PreferenceManager;
-import android.view.ContextMenu;
-import android.view.ContextMenu.ContextMenuInfo;
-import android.view.KeyEvent;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.AdapterView;
-import android.widget.EditText;
-import android.widget.ListView;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.google.common.base.Predicate;
-import com.google.common.collect.Collections2;
-import com.google.common.collect.Lists;
-import com.googlecode.android_scripting.ActivityFlinger;
-import com.googlecode.android_scripting.BaseApplication;
-import com.googlecode.android_scripting.Constants;
-import com.googlecode.android_scripting.FileUtils;
-import com.googlecode.android_scripting.IntentBuilders;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.R;
-import com.googlecode.android_scripting.ScriptListAdapter;
-import com.googlecode.android_scripting.ScriptStorageAdapter;
-import com.googlecode.android_scripting.facade.FacadeConfiguration;
-import com.googlecode.android_scripting.interpreter.Interpreter;
-import com.googlecode.android_scripting.interpreter.InterpreterConfiguration;
-import com.googlecode.android_scripting.interpreter.InterpreterConfiguration.ConfigurationObserver;
-import com.googlecode.android_scripting.interpreter.InterpreterConstants;
-
-import java.io.File;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map.Entry;
-
-/**
- * Manages creation, deletion, and execution of stored scripts.
- *
- * @author Damon Kohler (damonkohler@gmail.com)
- */
-public class ScriptManager extends ListActivity {
-
- private final static String EMPTY = "";
-
- private List<File> mScripts;
- private ScriptManagerAdapter mAdapter;
- private SharedPreferences mPreferences;
- private HashMap<Integer, Interpreter> mAddMenuIds;
- private ScriptListObserver mObserver;
- private InterpreterConfiguration mConfiguration;
- private SearchManager mManager;
- private boolean mInSearchResultMode = false;
- private String mQuery = EMPTY;
- private File mCurrentDir;
- private final File mBaseDir = new File(InterpreterConstants.SCRIPTS_ROOT);
- private final Handler mHandler = new Handler();
- private File mCurrent;
-
- private static enum RequestCode {
- INSTALL_INTERPETER, QRCODE_ADD
- }
-
- private static enum MenuId {
- DELETE, HELP, FOLDER_ADD, QRCODE_ADD, INTERPRETER_MANAGER, PREFERENCES, LOGCAT_VIEWER,
- TRIGGER_MANAGER, REFRESH, SEARCH, RENAME, EXTERNAL;
- public int getId() {
- return ordinal() + Menu.FIRST;
- }
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- CustomizeWindow.requestCustomTitle(this, "Scripts", R.layout.script_manager);
- if (FileUtils.externalStorageMounted()) {
- File sl4a = mBaseDir.getParentFile();
- if (!sl4a.exists()) {
- sl4a.mkdir();
- try {
- FileUtils.chmod(sl4a, 0755); // Handle the sl4a parent folder first.
- } catch (Exception e) {
- // Not much we can do here if it doesn't work.
- }
- }
- if (!FileUtils.makeDirectories(mBaseDir, 0755)) {
- new AlertDialog.Builder(this)
- .setTitle("Error")
- .setMessage(
- "Failed to create scripts directory.\n" + mBaseDir + "\n"
- + "Please check the permissions of your external storage media.")
- .setIcon(android.R.drawable.ic_dialog_alert).setPositiveButton("Ok", null).show();
- }
- } else {
- new AlertDialog.Builder(this).setTitle("External Storage Unavilable")
- .setMessage("Scripts will be unavailable as long as external storage is unavailable.")
- .setIcon(android.R.drawable.ic_dialog_alert).setPositiveButton("Ok", null).show();
- }
-
- mCurrentDir = mBaseDir;
- mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
- mAdapter = new ScriptManagerAdapter(this);
- mObserver = new ScriptListObserver();
- mAdapter.registerDataSetObserver(mObserver);
- mConfiguration = ((BaseApplication) getApplication()).getInterpreterConfiguration();
- mManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
-
- registerForContextMenu(getListView());
- updateAndFilterScriptList(mQuery);
- setListAdapter(mAdapter);
- ActivityFlinger.attachView(getListView(), this);
- ActivityFlinger.attachView(getWindow().getDecorView(), this);
- startService(IntentBuilders.buildTriggerServiceIntent());
- handleIntent(getIntent());
- }
-
- @Override
- protected void onNewIntent(Intent intent) {
- handleIntent(intent);
- }
-
- @SuppressWarnings("serial")
- private void updateAndFilterScriptList(final String query) {
- List<File> scripts;
- if (mPreferences.getBoolean("show_all_files", false)) {
- scripts = ScriptStorageAdapter.listAllScripts(mCurrentDir);
- } else {
- scripts = ScriptStorageAdapter.listExecutableScripts(mCurrentDir, mConfiguration);
- }
- mScripts = Lists.newArrayList(Collections2.filter(scripts, new Predicate<File>() {
- @Override
- public boolean apply(File file) {
- return file.getName().toLowerCase().contains(query.toLowerCase());
- }
- }));
-
- // TODO(tturney): Add a text view that shows the queried text.
- synchronized (mQuery) {
- if (!mQuery.equals(query)) {
- if (query != null || !query.equals(EMPTY)) {
- mQuery = query;
- }
- }
- }
-
- if ((mScripts.size() == 0) && findViewById(android.R.id.empty) != null) {
- ((TextView) findViewById(android.R.id.empty)).setText("No matches found.");
- }
-
- // TODO(damonkohler): Extending the File class here seems odd.
- if (!mCurrentDir.equals(mBaseDir)) {
- mScripts.add(0, new File(mCurrentDir.getParent()) {
- @Override
- public boolean isDirectory() {
- return true;
- }
-
- @Override
- public String getName() {
- return "..";
- }
- });
- }
- }
-
- private void handleIntent(Intent intent) {
- if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
- mInSearchResultMode = true;
- String query = intent.getStringExtra(SearchManager.QUERY);
- updateAndFilterScriptList(query);
- mAdapter.notifyDataSetChanged();
- }
- }
-
- @Override
- public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
- menu.add(Menu.NONE, MenuId.RENAME.getId(), Menu.NONE, "Rename");
- menu.add(Menu.NONE, MenuId.DELETE.getId(), Menu.NONE, "Delete");
- }
-
- @Override
- public boolean onContextItemSelected(MenuItem item) {
- AdapterView.AdapterContextMenuInfo info;
- try {
- info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
- } catch (ClassCastException e) {
- Log.e("Bad menuInfo", e);
- return false;
- }
- File file = (File) mAdapter.getItem(info.position);
- int itemId = item.getItemId();
- if (itemId == MenuId.DELETE.getId()) {
- delete(file);
- return true;
- } else if (itemId == MenuId.RENAME.getId()) {
- rename(file);
- return true;
- }
- return false;
- }
-
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_BACK && mInSearchResultMode) {
- mInSearchResultMode = false;
- mAdapter.notifyDataSetInvalidated();
- return true;
- }
- return super.onKeyDown(keyCode, event);
- }
-
- @Override
- public void onStop() {
- super.onStop();
- mConfiguration.unregisterObserver(mObserver);
- }
-
- @Override
- public void onStart() {
- super.onStart();
- mConfiguration.registerObserver(mObserver);
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- if (!mInSearchResultMode && findViewById(android.R.id.empty) != null) {
- ((TextView) findViewById(android.R.id.empty)).setText(R.string.no_scripts_message);
- }
- updateAndFilterScriptList(mQuery);
- mAdapter.notifyDataSetChanged();
- }
-
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- super.onPrepareOptionsMenu(menu);
- menu.clear();
- buildMenuIdMaps();
- buildAddMenu(menu);
- buildSwitchActivityMenu(menu);
- menu.add(Menu.NONE, MenuId.SEARCH.getId(), Menu.NONE, "Search").setIcon(
- R.drawable.ic_menu_search);
- menu.add(Menu.NONE, MenuId.PREFERENCES.getId(), Menu.NONE, "Preferences").setIcon(
- android.R.drawable.ic_menu_preferences);
- menu.add(Menu.NONE, MenuId.REFRESH.getId(), Menu.NONE, "Refresh").setIcon(
- R.drawable.ic_menu_refresh);
- return true;
- }
-
- private void buildSwitchActivityMenu(Menu menu) {
- Menu subMenu =
- menu.addSubMenu(Menu.NONE, Menu.NONE, Menu.NONE, "View").setIcon(
- android.R.drawable.ic_menu_more);
- subMenu.add(Menu.NONE, MenuId.INTERPRETER_MANAGER.getId(), Menu.NONE, "Interpreters");
- subMenu.add(Menu.NONE, MenuId.TRIGGER_MANAGER.getId(), Menu.NONE, "Triggers");
- subMenu.add(Menu.NONE, MenuId.LOGCAT_VIEWER.getId(), Menu.NONE, "Logcat");
- }
-
- private void buildMenuIdMaps() {
- mAddMenuIds = new LinkedHashMap<Integer, Interpreter>();
- int i = MenuId.values().length + Menu.FIRST;
- List<Interpreter> installed = mConfiguration.getInstalledInterpreters();
- Collections.sort(installed, new Comparator<Interpreter>() {
- @Override
- public int compare(Interpreter interpreterA, Interpreter interpreterB) {
- return interpreterA.getNiceName().compareTo(interpreterB.getNiceName());
- }
- });
- for (Interpreter interpreter : installed) {
- mAddMenuIds.put(i, interpreter);
- ++i;
- }
- }
-
- private void buildAddMenu(Menu menu) {
- Menu addMenu =
- menu.addSubMenu(Menu.NONE, Menu.NONE, Menu.NONE, "Add").setIcon(
- android.R.drawable.ic_menu_add);
- addMenu.add(Menu.NONE, MenuId.FOLDER_ADD.getId(), Menu.NONE, "Folder");
- for (Entry<Integer, Interpreter> entry : mAddMenuIds.entrySet()) {
- addMenu.add(Menu.NONE, entry.getKey(), Menu.NONE, entry.getValue().getNiceName());
- }
- addMenu.add(Menu.NONE, MenuId.QRCODE_ADD.getId(), Menu.NONE, "Scan Barcode");
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- int itemId = item.getItemId();
- if (itemId == MenuId.INTERPRETER_MANAGER.getId()) {
- // Show interpreter manger.
- Intent i = new Intent(this, InterpreterManager.class);
- startActivity(i);
- } else if (mAddMenuIds.containsKey(itemId)) {
- // Add a new script.
- Intent intent = new Intent(Constants.ACTION_EDIT_SCRIPT);
- Interpreter interpreter = mAddMenuIds.get(itemId);
- intent.putExtra(Constants.EXTRA_SCRIPT_PATH,
- new File(mCurrentDir.getPath(), interpreter.getExtension()).getPath());
- intent.putExtra(Constants.EXTRA_SCRIPT_CONTENT, interpreter.getContentTemplate());
- intent.putExtra(Constants.EXTRA_IS_NEW_SCRIPT, true);
- startActivity(intent);
- synchronized (mQuery) {
- mQuery = EMPTY;
- }
- } else if (itemId == MenuId.QRCODE_ADD.getId()) {
- try {
- Intent intent = new Intent("com.google.zxing.client.android.SCAN");
- startActivityForResult(intent, RequestCode.QRCODE_ADD.ordinal());
- }catch(ActivityNotFoundException e) {
- Log.e("No handler found to Scan a QR Code!", e);
- }
- } else if (itemId == MenuId.FOLDER_ADD.getId()) {
- addFolder();
- } else if (itemId == MenuId.PREFERENCES.getId()) {
- startActivity(new Intent(this, Preferences.class));
- } else if (itemId == MenuId.TRIGGER_MANAGER.getId()) {
- startActivity(new Intent(this, TriggerManager.class));
- } else if (itemId == MenuId.LOGCAT_VIEWER.getId()) {
- startActivity(new Intent(this, LogcatViewer.class));
- } else if (itemId == MenuId.REFRESH.getId()) {
- updateAndFilterScriptList(mQuery);
- mAdapter.notifyDataSetChanged();
- } else if (itemId == MenuId.SEARCH.getId()) {
- onSearchRequested();
- }
- return true;
- }
-
- @Override
- protected void onListItemClick(ListView list, View view, int position, long id) {
- final File file = (File) list.getItemAtPosition(position);
- mCurrent = file;
- if (file.isDirectory()) {
- mCurrentDir = file;
- mAdapter.notifyDataSetInvalidated();
- return;
- }
- doDialogMenu();
- return;
- }
-
- // Quickedit chokes on sdk 3 or below, and some Android builds. Provides alternative menu.
- private void doDialogMenu() {
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- final CharSequence[] menuList =
- { "Run Foreground", "Run Background", "Edit", "Delete", "Rename" };
- builder.setTitle(mCurrent.getName());
- builder.setItems(menuList, new DialogInterface.OnClickListener() {
-
- @Override
- public void onClick(DialogInterface dialog, int which) {
- Intent intent;
- switch (which) {
- case 0:
- intent = new Intent(ScriptManager.this, ScriptingLayerService.class);
- intent.setAction(Constants.ACTION_LAUNCH_FOREGROUND_SCRIPT);
- intent.putExtra(Constants.EXTRA_SCRIPT_PATH, mCurrent.getPath());
- startService(intent);
- break;
- case 1:
- intent = new Intent(ScriptManager.this, ScriptingLayerService.class);
- intent.setAction(Constants.ACTION_LAUNCH_BACKGROUND_SCRIPT);
- intent.putExtra(Constants.EXTRA_SCRIPT_PATH, mCurrent.getPath());
- startService(intent);
- break;
- case 2:
- editScript(mCurrent);
- break;
- case 3:
- delete(mCurrent);
- break;
- case 4:
- rename(mCurrent);
- break;
- }
- }
- });
- builder.show();
- }
-
- /**
- * Opens the script for editing.
- *
- * @param script
- * the name of the script to edit
- */
- private void editScript(File script) {
- Intent i = new Intent(Constants.ACTION_EDIT_SCRIPT);
- i.putExtra(Constants.EXTRA_SCRIPT_PATH, script.getAbsolutePath());
- startActivity(i);
- }
-
- private void delete(final File file) {
- AlertDialog.Builder alert = new AlertDialog.Builder(this);
- alert.setTitle("Delete");
- alert.setMessage("Would you like to delete " + file.getName() + "?");
- alert.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- FileUtils.delete(file);
- mScripts.remove(file);
- mAdapter.notifyDataSetChanged();
- }
- });
- alert.setNegativeButton("No", new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- // Ignore.
- }
- });
- alert.show();
- }
-
- private void addFolder() {
- final EditText folderName = new EditText(this);
- folderName.setHint("Folder Name");
- AlertDialog.Builder alert = new AlertDialog.Builder(this);
- alert.setTitle("Add Folder");
- alert.setView(folderName);
- alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- String name = folderName.getText().toString();
- if (name.length() == 0) {
- Log.e(ScriptManager.this, "Folder name is empty.");
- return;
- } else {
- for (File f : mScripts) {
- if (f.getName().equals(name)) {
- Log.e(ScriptManager.this, String.format("Folder \"%s\" already exists.", name));
- return;
- }
- }
- }
- File dir = new File(mCurrentDir, name);
- if (!FileUtils.makeDirectories(dir, 0755)) {
- Log.e(ScriptManager.this, String.format("Cannot create folder \"%s\".", name));
- }
- mAdapter.notifyDataSetInvalidated();
- }
- });
- alert.show();
- }
-
- private void rename(final File file) {
- final EditText newName = new EditText(this);
- newName.setText(file.getName());
- AlertDialog.Builder alert = new AlertDialog.Builder(this);
- alert.setTitle("Rename");
- alert.setView(newName);
- alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- String name = newName.getText().toString();
- if (name.length() == 0) {
- Log.e(ScriptManager.this, "Name is empty.");
- return;
- } else {
- for (File f : mScripts) {
- if (f.getName().equals(name)) {
- Log.e(ScriptManager.this, String.format("\"%s\" already exists.", name));
- return;
- }
- }
- }
- if (!FileUtils.rename(file, name)) {
- throw new RuntimeException(String.format("Cannot rename \"%s\".", file.getPath()));
- }
- mAdapter.notifyDataSetInvalidated();
- }
- });
- alert.show();
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- RequestCode request = RequestCode.values()[requestCode];
- if (resultCode == RESULT_OK) {
- switch (request) {
- case QRCODE_ADD:
- writeScriptFromBarcode(data);
- break;
- default:
- break;
- }
- } else {
- switch (request) {
- case QRCODE_ADD:
- break;
- default:
- break;
- }
- }
- mAdapter.notifyDataSetInvalidated();
- }
-
- private void writeScriptFromBarcode(Intent data) {
- String result = data.getStringExtra("SCAN_RESULT");
- if (result == null) {
- Log.e(this, "Invalid QR code content.");
- return;
- }
- String contents[] = result.split("\n", 2);
- if (contents.length != 2) {
- Log.e(this, "Invalid QR code content.");
- return;
- }
- String title = contents[0];
- String body = contents[1];
- File script = new File(mCurrentDir, title);
- ScriptStorageAdapter.writeScript(script, body);
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- mConfiguration.unregisterObserver(mObserver);
- mManager.setOnCancelListener(null);
- }
-
- private class ScriptListObserver extends DataSetObserver implements ConfigurationObserver {
- @Override
- public void onInvalidated() {
- updateAndFilterScriptList(EMPTY);
- }
-
- @Override
- public void onConfigurationChanged() {
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- updateAndFilterScriptList(mQuery);
- mAdapter.notifyDataSetChanged();
- }
- });
- }
- }
-
- private class ScriptManagerAdapter extends ScriptListAdapter {
- public ScriptManagerAdapter(Context context) {
- super(context);
- }
-
- @Override
- protected List<File> getScriptList() {
- return mScripts;
- }
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptPicker.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptPicker.java
deleted file mode 100644
index 9385382..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptPicker.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.activity;
-
-import android.app.ListActivity;
-import android.content.Context;
-import android.content.Intent;
-import android.database.DataSetObserver;
-import android.os.Bundle;
-import android.os.Parcelable;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.ListView;
-
-import com.googlecode.android_scripting.BaseApplication;
-import com.googlecode.android_scripting.Constants;
-import com.googlecode.android_scripting.FeaturedInterpreters;
-import com.googlecode.android_scripting.IntentBuilders;
-import com.googlecode.android_scripting.R;
-import com.googlecode.android_scripting.ScriptListAdapter;
-import com.googlecode.android_scripting.ScriptStorageAdapter;
-import com.googlecode.android_scripting.interpreter.InterpreterConfiguration;
-import com.googlecode.android_scripting.interpreter.InterpreterConstants;
-
-import java.io.File;
-import java.util.List;
-
-
-/**
- * Presents available scripts and returns the selected one.
- *
- * @author Damon Kohler (damonkohler@gmail.com)
- */
-public class ScriptPicker extends ListActivity {
-
- private List<File> mScripts;
- private ScriptPickerAdapter mAdapter;
- private InterpreterConfiguration mConfiguration;
- private File mCurrentDir;
- private final File mBaseDir = new File(InterpreterConstants.SCRIPTS_ROOT);
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- CustomizeWindow.requestCustomTitle(this, "Scripts", R.layout.script_manager);
- mCurrentDir = mBaseDir;
- mConfiguration = ((BaseApplication) getApplication()).getInterpreterConfiguration();
- mScripts = ScriptStorageAdapter.listExecutableScripts(null, mConfiguration);
- mAdapter = new ScriptPickerAdapter(this);
- mAdapter.registerDataSetObserver(new ScriptListObserver());
- setListAdapter(mAdapter);
- }
-
- @Override
- protected void onListItemClick(ListView list, View view, int position, long id) {
- final File script = (File) list.getItemAtPosition(position);
-
- if (script.isDirectory()) {
- mCurrentDir = script;
- mAdapter.notifyDataSetInvalidated();
- return;
- }
-
- //TODO: Take action here based on item click
- }
-
- private class ScriptListObserver extends DataSetObserver {
- @SuppressWarnings("serial")
- @Override
- public void onInvalidated() {
- mScripts = ScriptStorageAdapter.listExecutableScripts(mCurrentDir, mConfiguration);
- // TODO(damonkohler): Extending the File class here seems odd.
- if (!mCurrentDir.equals(mBaseDir)) {
- mScripts.add(0, new File(mCurrentDir.getParent()) {
- @Override
- public boolean isDirectory() {
- return true;
- }
-
- @Override
- public String getName() {
- return "..";
- }
- });
- }
- }
- }
-
- private class ScriptPickerAdapter extends ScriptListAdapter {
-
- public ScriptPickerAdapter(Context context) {
- super(context);
- }
-
- @Override
- protected List<File> getScriptList() {
- return mScripts;
- }
-
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptProcessMonitor.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptProcessMonitor.java
deleted file mode 100644
index 614890a..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptProcessMonitor.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.activity;
-
-import android.app.ListActivity;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.view.ContextMenu;
-import android.view.ContextMenu.ContextMenuInfo;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.BaseAdapter;
-import android.widget.ListView;
-import android.widget.TextView;
-
-import com.googlecode.android_scripting.Constants;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.R;
-import com.googlecode.android_scripting.interpreter.InterpreterProcess;
-
-import java.util.List;
-import java.util.Timer;
-import java.util.TimerTask;
-
-import org.connectbot.ConsoleActivity;
-
-/**
- * An activity that allows to monitor running scripts.
- *
- * @author Alexey Reznichenko (alexey.reznichenko@gmail.com)
- */
-public class ScriptProcessMonitor extends ListActivity {
-
- private final static int UPDATE_INTERVAL_SECS = 1;
-
- private final Timer mTimer = new Timer();
-
- private volatile ScriptingLayerService mService;
-
- private ScriptListAdapter mUpdater;
- private List<InterpreterProcess> mProcessList;
- private ScriptMonitorAdapter mAdapter;
- private boolean mIsConnected = false;
-
- private ServiceConnection mConnection = new ServiceConnection() {
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- mService = ((ScriptingLayerService.LocalBinder) service).getService();
- mUpdater = new ScriptListAdapter();
- mTimer.scheduleAtFixedRate(mUpdater, 0, UPDATE_INTERVAL_SECS * 1000);
- mIsConnected = true;
- }
-
- @Override
- public void onServiceDisconnected(ComponentName name) {
- mService = null;
- mIsConnected = false;
- mProcessList = null;
- mAdapter.notifyDataSetChanged();
- }
- };
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- bindService(new Intent(this, ScriptingLayerService.class), mConnection, 0);
- CustomizeWindow.requestCustomTitle(this, "Script Monitor", R.layout.script_monitor);
- mAdapter = new ScriptMonitorAdapter();
- setListAdapter(mAdapter);
- registerForContextMenu(getListView());
- }
-
- @Override
- public void onPause() {
- super.onPause();
- if (mUpdater != null) {
- mUpdater.cancel();
- }
- mTimer.purge();
- }
-
- @Override
- public void onResume() {
- super.onResume();
- if (mIsConnected) {
- try {
- mUpdater = new ScriptListAdapter();
- mTimer.scheduleAtFixedRate(mUpdater, 0, UPDATE_INTERVAL_SECS * 1000);
- } catch (IllegalStateException e) {
- Log.e(e.getMessage(), e);
- }
- }
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- mTimer.cancel();
- unbindService(mConnection);
- }
-
- @Override
- protected void onListItemClick(ListView list, View view, int position, long id) {
- final InterpreterProcess script = (InterpreterProcess) list.getItemAtPosition(position);
- Intent intent = new Intent(this, ConsoleActivity.class);
- intent.putExtra(Constants.EXTRA_PROXY_PORT, script.getPort());
- startActivity(intent);
- }
-
- @Override
- public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) {
- menu.add(Menu.NONE, 0, Menu.NONE, "Stop");
- }
-
- @Override
- public boolean onContextItemSelected(MenuItem item) {
- AdapterView.AdapterContextMenuInfo info;
- try {
- info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
- } catch (ClassCastException e) {
- Log.e("Bad menuInfo", e);
- return false;
- }
-
- InterpreterProcess script = mAdapter.getItem(info.position);
- if (script == null) {
- Log.v("No script selected.");
- return false;
- }
-
- Intent intent = new Intent(ScriptProcessMonitor.this, ScriptingLayerService.class);
- intent.setAction(Constants.ACTION_KILL_PROCESS);
- intent.putExtra(Constants.EXTRA_PROXY_PORT, script.getPort());
- startService(intent);
-
- return true;
- }
-
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- menu.clear();
- // TODO(damonkohler): How could mProcessList ever be null?
- if (mProcessList != null && !mProcessList.isEmpty()) {
- menu.add(Menu.NONE, 0, Menu.NONE, R.string.stop_all).setIcon(
- android.R.drawable.ic_menu_close_clear_cancel);
- }
- return super.onPrepareOptionsMenu(menu);
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- Intent intent = new Intent(this, ScriptingLayerService.class);
- intent.setAction(Constants.ACTION_KILL_ALL);
- startService(intent);
- return true;
- }
-
- private class ScriptListAdapter extends TimerTask {
- private int mmExpectedModCount = 0;
- private volatile List<InterpreterProcess> mmList;
-
- @Override
- public void run() {
- if (mService == null) {
- mmList.clear();
- mTimer.cancel();
- } else {
- int freshModCount = mService.getModCount();
- if (freshModCount != mmExpectedModCount) {
- mmExpectedModCount = freshModCount;
- mmList = mService.getScriptProcessesList();
- }
- }
- runOnUiThread(new Runnable() {
- public void run() {
- mProcessList = mUpdater.getFreshProcessList();
- mAdapter.notifyDataSetChanged();
- }
- });
- }
-
- private List<InterpreterProcess> getFreshProcessList() {
- return mmList;
- }
- }
-
- private class ScriptMonitorAdapter extends BaseAdapter {
-
- @Override
- public int getCount() {
- if (mProcessList == null) {
- return 0;
- }
- return mProcessList.size();
- }
-
- @Override
- public InterpreterProcess getItem(int position) {
- return mProcessList.get(position);
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- View itemView;
- if (convertView == null) {
- LayoutInflater inflater =
- (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- itemView = inflater.inflate(R.layout.script_monitor_list_item, parent, false);
- } else {
- itemView = convertView;
- }
- InterpreterProcess process = mProcessList.get(position);
- ((TextView) itemView.findViewById(R.id.process_title)).setText(process.getName());
- ((TextView) itemView.findViewById(R.id.process_age)).setText(process.getUptime());
- ((TextView) itemView.findViewById(R.id.process_details)).setText(process.getHost() + ":"
- + process.getPort());
- ((TextView) itemView.findViewById(R.id.process_status)).setText("PID " + process.getPid());
- return itemView;
- }
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptingLayerService.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptingLayerService.java
deleted file mode 100644
index 80b7aae..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptingLayerService.java
+++ /dev/null
@@ -1,346 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.activity;
-
-import android.app.Notification;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.os.Binder;
-import android.os.IBinder;
-import android.os.Build;
-import android.os.StrictMode;
-import android.preference.PreferenceManager;
-import android.util.Log;
-
-import com.googlecode.android_scripting.AndroidProxy;
-import com.googlecode.android_scripting.BaseApplication;
-import com.googlecode.android_scripting.Constants;
-import com.googlecode.android_scripting.ForegroundService;
-import com.googlecode.android_scripting.NotificationIdFactory;
-import com.googlecode.android_scripting.R;
-import com.googlecode.android_scripting.ScriptLauncher;
-import com.googlecode.android_scripting.ScriptProcess;
-import com.googlecode.android_scripting.interpreter.InterpreterConfiguration;
-import com.googlecode.android_scripting.interpreter.InterpreterProcess;
-import com.googlecode.android_scripting.interpreter.shell.ShellInterpreter;
-
-import org.connectbot.ConsoleActivity;
-import org.connectbot.service.TerminalManager;
-
-import java.io.File;
-import java.lang.ref.WeakReference;
-import java.net.InetSocketAddress;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * A service that allows scripts and the RPC server to run in the background.
- *
- * @author Damon Kohler (damonkohler@gmail.com)
- */
-public class ScriptingLayerService extends ForegroundService {
- private static final int NOTIFICATION_ID = NotificationIdFactory.create();
-
- private final IBinder mBinder;
- private final Map<Integer, InterpreterProcess> mProcessMap;
- private final String LOG_TAG = "sl4a";
- private volatile int mModCount = 0;
- private NotificationManager mNotificationManager;
- private Notification mNotification;
- private PendingIntent mNotificationPendingIntent;
- private InterpreterConfiguration mInterpreterConfiguration;
-
- private volatile WeakReference<InterpreterProcess> mRecentlyKilledProcess;
-
- private TerminalManager mTerminalManager;
-
- private SharedPreferences mPreferences = null;
- private boolean mHide;
-
- public class LocalBinder extends Binder {
- public ScriptingLayerService getService() {
- return ScriptingLayerService.this;
- }
- }
-
- @Override
- public IBinder onBind(Intent intent) {
- return mBinder;
- }
-
- public ScriptingLayerService() {
- super(NOTIFICATION_ID);
- mProcessMap = new ConcurrentHashMap<Integer, InterpreterProcess>();
- mBinder = new LocalBinder();
- }
-
- @Override
- public void onCreate() {
- super.onCreate();
- mInterpreterConfiguration = ((BaseApplication) getApplication()).getInterpreterConfiguration();
- mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
- mRecentlyKilledProcess = new WeakReference<InterpreterProcess>(null);
- mTerminalManager = new TerminalManager(this);
- mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
- mHide = mPreferences.getBoolean(Constants.HIDE_NOTIFY, false);
- }
-
- @Override
- protected Notification createNotification() {
- Intent notificationIntent = new Intent(this, ScriptingLayerService.class);
- notificationIntent.setAction(Constants.ACTION_SHOW_RUNNING_SCRIPTS);
- mNotificationPendingIntent = PendingIntent.getService(this, 0, notificationIntent, 0);
-
- Notification.Builder builder = new Notification.Builder(this);
- builder.setSmallIcon(R.drawable.sl4a_notification_logo)
- .setTicker(null)
- .setWhen(System.currentTimeMillis())
- .setContentTitle("SL4A Service")
- .setContentText("Tap to view running scripts")
- .setContentIntent(mNotificationPendingIntent);
- mNotification = builder.build();
- mNotification.flags = Notification.FLAG_NO_CLEAR | Notification.FLAG_ONGOING_EVENT;
- return mNotification;
- }
-
- private void updateNotification(String tickerText) {
- if (tickerText.equals(mNotification.tickerText)) {
- // Consequent notifications with the same ticker-text are displayed without any ticker-text.
- // This is a way around. Alternatively, we can display process name and port.
- tickerText = tickerText + " ";
- }
- String msg;
- if (mProcessMap.size() <= 1) {
- msg = "Tap to view " + Integer.toString(mProcessMap.size()) + " running script";
- } else {
- msg = "Tap to view " + Integer.toString(mProcessMap.size()) + " running scripts";
- }
- Notification.Builder builder = new Notification.Builder(this);
- builder.setContentTitle("SL4A Service")
- .setContentText(msg)
- .setContentIntent(mNotificationPendingIntent)
- .setSmallIcon(mNotification.icon, mProcessMap.size())
- .setWhen(mNotification.when)
- .setTicker(tickerText);
-
- mNotification = builder.build();
- mNotificationManager.notify(NOTIFICATION_ID, mNotification);
- }
-
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- super.onStartCommand(intent, flags, startId);
- String errmsg = null;
- if (intent == null) {
- return START_REDELIVER_INTENT;
- }
- if (intent.getAction().equals(Constants.ACTION_KILL_ALL)) {
- killAll();
- stopSelf(startId);
- return START_REDELIVER_INTENT;
- }
-
- if (intent.getAction().equals(Constants.ACTION_KILL_PROCESS)) {
- killProcess(intent);
- if (mProcessMap.isEmpty()) {
- stopSelf(startId);
- }
- return START_REDELIVER_INTENT;
- }
-
- if (intent.getAction().equals(Constants.ACTION_SHOW_RUNNING_SCRIPTS)) {
- showRunningScripts();
- return START_REDELIVER_INTENT;
- }
-
- //TODO: b/26538940 We need to go back to a strict policy and fix the problems
- StrictMode.ThreadPolicy sl4aPolicy = new StrictMode.ThreadPolicy.Builder()
- .detectAll()
- .penaltyLog()
- .build();
-
- StrictMode.setThreadPolicy(sl4aPolicy);
-
- AndroidProxy proxy = null;
- InterpreterProcess interpreterProcess = null;
- if (intent.getAction().equals(Constants.ACTION_LAUNCH_SERVER)) {
- proxy = launchServer(intent, false);
- // TODO(damonkohler): This is just to make things easier. Really, we shouldn't need to start
- // an interpreter when all we want is a server.
- interpreterProcess = new InterpreterProcess(new ShellInterpreter(), proxy);
- interpreterProcess.setName("Server");
- } else {
- proxy = launchServer(intent, true);
- if (intent.getAction().equals(Constants.ACTION_LAUNCH_FOREGROUND_SCRIPT)) {
- launchTerminal(proxy.getAddress());
- try {
- interpreterProcess = launchScript(intent, proxy);
- } catch (RuntimeException e) {
- errmsg =
- "Unable to run " + intent.getStringExtra(Constants.EXTRA_SCRIPT_PATH) + "\n"
- + e.getMessage();
- interpreterProcess = null;
- }
- } else if (intent.getAction().equals(Constants.ACTION_LAUNCH_BACKGROUND_SCRIPT)) {
- interpreterProcess = launchScript(intent, proxy);
- } else if (intent.getAction().equals(Constants.ACTION_LAUNCH_INTERPRETER)) {
- launchTerminal(proxy.getAddress());
- interpreterProcess = launchInterpreter(intent, proxy);
- }
- }
- if (errmsg != null) {
- updateNotification(errmsg);
- } else if (interpreterProcess == null) {
- updateNotification("Action not implemented: " + intent.getAction());
- } else {
- addProcess(interpreterProcess);
- }
- return START_REDELIVER_INTENT;
- }
-
- private boolean tryPort(AndroidProxy androidProxy, boolean usePublicIp, int usePort) {
- if (usePublicIp) {
- return (androidProxy.startPublic(usePort) != null);
- } else {
- return (androidProxy.startLocal(usePort) != null);
- }
- }
-
- private AndroidProxy launchServer(Intent intent, boolean requiresHandshake) {
- AndroidProxy androidProxy = new AndroidProxy(this, intent, requiresHandshake);
- boolean usePublicIp = intent.getBooleanExtra(Constants.EXTRA_USE_EXTERNAL_IP, false);
- int usePort = intent.getIntExtra(Constants.EXTRA_USE_SERVICE_PORT, 0);
- // If port is in use, fall back to default behaviour
- if (!tryPort(androidProxy, usePublicIp, usePort)) {
- if (usePort != 0) {
- tryPort(androidProxy, usePublicIp, 0);
- }
- }
- return androidProxy;
- }
-
- private ScriptProcess launchScript(Intent intent, AndroidProxy proxy) {
- final int port = proxy.getAddress().getPort();
- File script = new File(intent.getStringExtra(Constants.EXTRA_SCRIPT_PATH));
- return ScriptLauncher.launchScript(script, mInterpreterConfiguration, proxy, new Runnable() {
- @Override
- public void run() {
- // TODO(damonkohler): This action actually kills the script rather than notifying the
- // service that script exited on its own. We should distinguish between these two cases.
- Intent intent = new Intent(ScriptingLayerService.this, ScriptingLayerService.class);
- intent.setAction(Constants.ACTION_KILL_PROCESS);
- intent.putExtra(Constants.EXTRA_PROXY_PORT, port);
- startService(intent);
- }
- });
- }
-
- private InterpreterProcess launchInterpreter(Intent intent, AndroidProxy proxy) {
- InterpreterConfiguration config =
- ((BaseApplication) getApplication()).getInterpreterConfiguration();
- final int port = proxy.getAddress().getPort();
- return ScriptLauncher.launchInterpreter(proxy, intent, config, new Runnable() {
- @Override
- public void run() {
- // TODO(damonkohler): This action actually kills the script rather than notifying the
- // service that script exited on its own. We should distinguish between these two cases.
- Intent intent = new Intent(ScriptingLayerService.this, ScriptingLayerService.class);
- intent.setAction(Constants.ACTION_KILL_PROCESS);
- intent.putExtra(Constants.EXTRA_PROXY_PORT, port);
- startService(intent);
- }
- });
- }
-
- private void launchTerminal(InetSocketAddress address) {
- Intent i = new Intent(this, ConsoleActivity.class);
- i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- i.putExtra(Constants.EXTRA_PROXY_PORT, address.getPort());
- startActivity(i);
- }
-
- private void showRunningScripts() {
- Intent i = new Intent(this, ScriptProcessMonitor.class);
- i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- startActivity(i);
- }
-
- private void addProcess(InterpreterProcess process) {
- mProcessMap.put(process.getPort(), process);
- mModCount++;
- if (!mHide) {
- updateNotification(process.getName() + " started.");
- }
- }
-
- private InterpreterProcess removeProcess(int port) {
- InterpreterProcess process = mProcessMap.remove(port);
- if (process == null) {
- return null;
- }
- mModCount++;
- if (!mHide) {
- updateNotification(process.getName() + " exited.");
- }
- return process;
- }
-
- private void killProcess(Intent intent) {
- int processId = intent.getIntExtra(Constants.EXTRA_PROXY_PORT, 0);
- InterpreterProcess process = removeProcess(processId);
- if (process != null) {
- process.kill();
- mRecentlyKilledProcess = new WeakReference<InterpreterProcess>(process);
- }
- }
-
- public int getModCount() {
- return mModCount;
- }
-
- private void killAll() {
- for (InterpreterProcess process : getScriptProcessesList()) {
- process = removeProcess(process.getPort());
- if (process != null) {
- process.kill();
- }
- }
- }
-
- public List<InterpreterProcess> getScriptProcessesList() {
- ArrayList<InterpreterProcess> result = new ArrayList<InterpreterProcess>();
- result.addAll(mProcessMap.values());
- return result;
- }
-
- public InterpreterProcess getProcess(int port) {
- InterpreterProcess p = mProcessMap.get(port);
- if (p == null) {
- return mRecentlyKilledProcess.get();
- }
- return p;
- }
-
- public TerminalManager getTerminalManager() {
- return mTerminalManager;
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptingLayerServiceLauncher.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptingLayerServiceLauncher.java
deleted file mode 100644
index e373670..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptingLayerServiceLauncher.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.activity;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.SystemProperties;
-
-import android.util.Log;
-
-import com.googlecode.android_scripting.Constants;
-
-public class ScriptingLayerServiceLauncher extends Activity {
-
- private static final int DEBUGGABLE_BUILD = 1;
-
- private static final String LOG_TAG = "sl4a";
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // Forward the intent that launched us to start the service.
-
- if(SystemProperties.getInt("ro.debuggable", 0) == DEBUGGABLE_BUILD) {
- Intent intent = getIntent();
- intent.setComponent(Constants.SL4A_SERVICE_COMPONENT_NAME);
- startService(intent);
- finish();
- }
- else {
- Log.e(LOG_TAG, "ERROR: Cannot to start SL4A on non-debuggable build!");
- }
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptsLiveFolder.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptsLiveFolder.java
deleted file mode 100644
index 191c641..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptsLiveFolder.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.activity;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.content.Intent.ShortcutIconResource;
-import android.net.Uri;
-import android.os.Bundle;
-import android.provider.LiveFolders;
-
-import com.googlecode.android_scripting.R;
-import com.googlecode.android_scripting.provider.ScriptProvider;
-
-public class ScriptsLiveFolder extends Activity {
-
- public static final Uri CONTENT_URI =
- Uri.parse("content://" + ScriptProvider.AUTHORITY + "/" + ScriptProvider.LIVEFOLDER);
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- final Intent intent = getIntent();
- final String action = intent.getAction();
- if (LiveFolders.ACTION_CREATE_LIVE_FOLDER.equals(action)) {
- setResult(RESULT_OK, createLiveFolder(this, CONTENT_URI, "Scripts", R.drawable.live_folder));
- } else {
- setResult(RESULT_CANCELED);
- }
- finish();
- }
-
- private Intent createLiveFolder(Context context, Uri uri, String name, int icon) {
- final Intent intent = new Intent();
- intent.setData(uri);
- intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_NAME, name);
- intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_ICON, ShortcutIconResource
- .fromContext(this, icon));
- intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_DISPLAY_MODE, LiveFolders.DISPLAY_MODE_LIST);
- return intent;
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ServiceUtils.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ServiceUtils.java
deleted file mode 100644
index ddb5937..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ServiceUtils.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.activity;
-
-import android.app.Notification;
-import android.app.NotificationManager;
-import android.app.Service;
-import android.content.Context;
-
-import com.googlecode.android_scripting.Log;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-/**
- * A utility class supplying helper methods for {@link Service} objects.
- *
- * @author Felix Arends (felix.arends@gmail.com)
- */
-public class ServiceUtils {
- private ServiceUtils() {
- }
-
- /**
- * Marks the service as a foreground service. This uses reflection to figure out whether the new
- * APIs for marking a service as a foreground service are available. If not, it falls back to the
- * old {@link #setForeground(boolean)} call.
- *
- * @param service
- * the service to put in foreground mode
- * @param notificationId
- * id of the notification to show
- * @param notification
- * the notification to show
- */
- public static void setForeground(Service service, Integer notificationId,
- Notification notification) {
- final Class<?>[] startForegroundSignature = new Class[] { int.class, Notification.class };
- Method startForeground = null;
- try {
- startForeground = service.getClass().getMethod("startForeground", startForegroundSignature);
-
- try {
- startForeground.invoke(service, new Object[] { notificationId, notification });
- } catch (IllegalArgumentException e) {
- // Should not happen!
- Log.e("Could not set TriggerService to foreground mode.", e);
- } catch (IllegalAccessException e) {
- // Should not happen!
- Log.e("Could not set TriggerService to foreground mode.", e);
- } catch (InvocationTargetException e) {
- // Should not happen!
- Log.e("Could not set TriggerService to foreground mode.", e);
- }
-
- } catch (NoSuchMethodException e) {
- // Fall back on old API.
- // service.setForeground(true); //too old to be supported
-
- NotificationManager manager =
- (NotificationManager) service.getSystemService(Context.NOTIFICATION_SERVICE);
- manager.notify(notificationId, notification);
- }
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/TriggerManager.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/TriggerManager.java
deleted file mode 100644
index fc37796..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/TriggerManager.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.activity;
-
-import android.app.AlertDialog;
-import android.app.ListActivity;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.DialogInterface.OnClickListener;
-import android.os.Bundle;
-import android.view.ContextMenu;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ContextMenu.ContextMenuInfo;
-import android.widget.AdapterView;
-import android.widget.BaseAdapter;
-import android.widget.ListView;
-import android.widget.TextView;
-
-import com.google.common.collect.Lists;
-import com.googlecode.android_scripting.ActivityFlinger;
-import com.googlecode.android_scripting.BaseApplication;
-import com.googlecode.android_scripting.Constants;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.R;
-import com.googlecode.android_scripting.facade.FacadeConfiguration;
-import com.googlecode.android_scripting.rpc.MethodDescriptor;
-import com.googlecode.android_scripting.trigger.ScriptTrigger;
-import com.googlecode.android_scripting.trigger.Trigger;
-import com.googlecode.android_scripting.trigger.TriggerRepository;
-import com.googlecode.android_scripting.trigger.TriggerRepository.TriggerRepositoryObserver;
-
-import java.io.File;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-public class TriggerManager extends ListActivity {
- private final List<ScriptTrigger> mTriggers = Lists.newArrayList();
-
- private ScriptTriggerAdapter mAdapter;
- private TriggerRepository mTriggerRepository;
-
- private static enum ContextMenuId {
- REMOVE;
- public int getId() {
- return ordinal() + Menu.FIRST;
- }
- }
-
- private static enum MenuId {
- ADD, PREFERENCES, HELP;
- public int getId() {
- return ordinal() + Menu.FIRST;
- }
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- CustomizeWindow.requestCustomTitle(this, "Triggers", R.layout.trigger_manager);
- ScriptTriggerListObserver observer = new ScriptTriggerListObserver();
- mAdapter = new ScriptTriggerAdapter();
- setListAdapter(mAdapter);
- registerForContextMenu(getListView());
- mTriggerRepository = ((BaseApplication) getApplication()).getTriggerRepository();
- mTriggerRepository.bootstrapObserver(observer);
- ActivityFlinger.attachView(getListView(), this);
- ActivityFlinger.attachView(getWindow().getDecorView(), this);
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- menu.add(Menu.NONE, MenuId.ADD.getId(), Menu.NONE, "Add").setIcon(
- android.R.drawable.ic_menu_add);
- menu.add(Menu.NONE, MenuId.PREFERENCES.getId(), Menu.NONE, "Preferences").setIcon(
- android.R.drawable.ic_menu_preferences);
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- int itemId = item.getItemId();
- if (itemId == MenuId.PREFERENCES.getId()) {
- startActivity(new Intent(this, Preferences.class));
- } else if (itemId != Menu.NONE) {
- Intent intent = new Intent(this, ScriptPicker.class);
- intent.setAction(Intent.ACTION_PICK);
- startActivityForResult(intent, itemId);
- }
- return true;
- }
-
- @Override
- public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
- menu.add(Menu.NONE, ContextMenuId.REMOVE.getId(), Menu.NONE, "Remove");
- }
-
- @Override
- public boolean onContextItemSelected(MenuItem item) {
- AdapterView.AdapterContextMenuInfo info;
- try {
- info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
- } catch (ClassCastException e) {
- Log.e("Bad menuInfo", e);
- return false;
- }
-
- Trigger trigger = mAdapter.getItem(info.position);
- if (trigger == null) {
- Log.v("No trigger selected.");
- return false;
- }
-
- if (item.getItemId() == ContextMenuId.REMOVE.getId()) {
- mTriggerRepository.remove(trigger);
- }
- return true;
- }
-
- @Override
- public void onListItemClick(ListView l, View v, int position, long id) {
- mAdapter.notifyDataSetInvalidated();
- }
-
- private class ScriptTriggerListObserver implements TriggerRepositoryObserver {
-
- @Override
- public void onPut(Trigger trigger) {
- mTriggers.add((ScriptTrigger) trigger);
- mAdapter.notifyDataSetInvalidated();
- }
-
- @Override
- public void onRemove(Trigger trigger) {
- mTriggers.remove(trigger);
- mAdapter.notifyDataSetInvalidated();
- }
- }
-
- private class ScriptTriggerAdapter extends BaseAdapter {
-
- @Override
- public int getCount() {
- return mTriggers.size();
- }
-
- @Override
- public Trigger getItem(int position) {
- return mTriggers.get(position);
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public View getView(final int position, View convertView, ViewGroup parent) {
- ScriptTrigger trigger = mTriggers.get(position);
- TextView textView = new TextView(TriggerManager.this);
- textView.setText(trigger.getEventName() + " " + trigger.getScript().getName());
- return textView;
- }
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (resultCode == RESULT_OK) {
- final File script = new File(data.getStringExtra(Constants.EXTRA_SCRIPT_PATH));
- if (requestCode == MenuId.ADD.getId()) {
- Map<String, MethodDescriptor> eventMethodDescriptors =
- FacadeConfiguration.collectStartEventMethodDescriptors();
- final List<String> eventNames = Lists.newArrayList(eventMethodDescriptors.keySet());
- Collections.sort(eventNames);
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setItems(eventNames.toArray(new CharSequence[eventNames.size()]),
- new OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int position) {
- mTriggerRepository.put(new ScriptTrigger(eventNames.get(position), script));
- }
- });
- builder.show();
- }
- }
- }
-
- public void clickCancel(View v) {
- for (Trigger t : mTriggerRepository.getAllTriggers().values()) {
- mTriggerRepository.remove(t);
- }
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/TriggerService.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/TriggerService.java
deleted file mode 100644
index 8024533..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/TriggerService.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.activity;
-
-import android.app.AlarmManager;
-import android.app.Notification;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Binder;
-import android.os.IBinder;
-
-import com.google.common.base.Preconditions;
-import com.googlecode.android_scripting.BaseApplication;
-import com.googlecode.android_scripting.ForegroundService;
-import com.googlecode.android_scripting.IntentBuilders;
-import com.googlecode.android_scripting.NotificationIdFactory;
-import com.googlecode.android_scripting.R;
-import com.googlecode.android_scripting.event.Event;
-import com.googlecode.android_scripting.event.EventObserver;
-import com.googlecode.android_scripting.facade.EventFacade;
-import com.googlecode.android_scripting.facade.FacadeConfiguration;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.trigger.EventGenerationControllingObserver;
-import com.googlecode.android_scripting.trigger.Trigger;
-import com.googlecode.android_scripting.trigger.TriggerRepository;
-import com.googlecode.android_scripting.trigger.TriggerRepository.TriggerRepositoryObserver;
-
-/**
- * The trigger service takes care of installing triggers serialized to the preference storage.
- *
- * <p>
- * The service also installs an alarm that keeps it running, unless the user force-quits the
- * service.
- *
- * <p>
- * When no triggers are installed the service shuts down silently as to not consume resources
- * unnecessarily.
- *
- * @author Felix Arends (felix.arends@gmail.com)
- * @author Damon Kohler (damonkohler@gmail.com)
- */
-public class TriggerService extends ForegroundService {
- private static final int NOTIFICATION_ID = NotificationIdFactory.create();
- private static final long PING_MILLIS = 10 * 1000 * 60;
-
- private final IBinder mBinder;
- private TriggerRepository mTriggerRepository;
- private FacadeManager mFacadeManager;
- private EventFacade mEventFacade;
-
- public class LocalBinder extends Binder {
- public TriggerService getService() {
- return TriggerService.this;
- }
- }
-
- public TriggerService() {
- super(NOTIFICATION_ID);
- mBinder = new LocalBinder();
- }
-
- @Override
- public IBinder onBind(Intent intent) {
- return mBinder;
- }
-
- @Override
- public void onCreate() {
- super.onCreate();
-
- mFacadeManager =
- new FacadeManager(FacadeConfiguration.getSdkLevel(), this, null,
- FacadeConfiguration.getFacadeClasses());
- mEventFacade = mFacadeManager.getReceiver(EventFacade.class);
-
- mTriggerRepository = ((BaseApplication) getApplication()).getTriggerRepository();
- mTriggerRepository.bootstrapObserver(new RepositoryObserver());
- mTriggerRepository.bootstrapObserver(new EventGenerationControllingObserver(mFacadeManager));
- installAlarm();
- }
-
- @Override
- public void onStart(Intent intent, int startId) {
- if (mTriggerRepository.isEmpty()) {
- stopSelfResult(startId);
- return;
- }
- }
-
- /** Returns the notification to display whenever the service is running. */
- @Override
- protected Notification createNotification() {
- Intent notificationIntent = new Intent(this, TriggerManager.class);
- Notification.Builder builder = new Notification.Builder(this);
- builder.setSmallIcon(R.drawable.sl4a_logo_48)
- .setTicker("SL4A Trigger Service started.")
- .setWhen(System.currentTimeMillis())
- .setContentTitle("SL4A Trigger Service")
- .setContentText("Tap to view triggers")
- .setContentIntent(PendingIntent.getActivity(this, 0, notificationIntent, 0));
- Notification notification = builder.build();
- notification.flags = Notification.FLAG_NO_CLEAR | Notification.FLAG_ONGOING_EVENT;
- return notification;
- }
-
- private class TriggerEventObserver implements EventObserver {
- private final Trigger mTrigger;
-
- public TriggerEventObserver(Trigger trigger) {
- mTrigger = trigger;
- }
-
- @Override
- public void onEventReceived(Event event) {
- mTrigger.handleEvent(event, TriggerService.this);
- }
- }
-
- private class RepositoryObserver implements TriggerRepositoryObserver {
- int mTriggerCount = 0;
-
- @Override
- public void onPut(Trigger trigger) {
- mTriggerCount++;
- mEventFacade.addNamedEventObserver(trigger.getEventName(), new TriggerEventObserver(trigger));
- }
-
- @Override
- public void onRemove(Trigger trigger) {
- Preconditions.checkArgument(mTriggerCount > 0);
- // TODO(damonkohler): Tear down EventObserver associated with trigger.
- if (--mTriggerCount == 0) {
- // TODO(damonkohler): Use stopSelfResult() which would require tracking startId.
- stopSelf();
- }
- }
- }
-
- private void installAlarm() {
- AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
- alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + PING_MILLIS,
- PING_MILLIS, IntentBuilders.buildTriggerServicePendingIntent(this));
- }
-
- private void uninstallAlarm() {
- AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
- alarmManager.cancel(IntentBuilders.buildTriggerServicePendingIntent(this));
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- uninstallAlarm();
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/dialog/DurationPickerDialog.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/dialog/DurationPickerDialog.java
deleted file mode 100644
index 6a53fac..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/dialog/DurationPickerDialog.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.dialog;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.content.DialogInterface;
-
-import com.googlecode.android_scripting.R;
-import com.googlecode.android_scripting.widget.DurationPicker;
-
-public class DurationPickerDialog {
-
- private DurationPickerDialog() {
- // Utility class.
- }
-
- public interface DurationPickedListener {
- public void onSet(double duration);
-
- public void onCancel();
- }
-
- public static void getDurationFromDialog(Activity activity, String title,
- final DurationPickedListener done) {
- final DurationPicker picker = new DurationPicker(activity);
- AlertDialog.Builder alert = new AlertDialog.Builder(activity);
- alert.setIcon(R.drawable.ic_dialog_time);
- alert.setTitle(title);
- alert.setView(picker);
- alert.setPositiveButton("Set", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int whichButton) {
- done.onSet(picker.getDuration());
- }
- });
- alert.setOnCancelListener(new DialogInterface.OnCancelListener() {
- @Override
- public void onCancel(DialogInterface arg0) {
- done.onCancel();
- }
- });
- alert.show();
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/locale/LocaleReceiver.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/locale/LocaleReceiver.java
deleted file mode 100644
index 9c51720..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/locale/LocaleReceiver.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.locale;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.util.Log;
-
-import com.googlecode.android_scripting.Constants;
-import com.googlecode.android_scripting.IntentBuilders;
-
-import java.io.File;
-
-public class LocaleReceiver extends BroadcastReceiver {
-
- @Override
- public void onReceive(Context context, Intent intent) {
-
- final File script =
- new File(intent.getBundleExtra(com.twofortyfouram.locale.platform.Intent.EXTRA_BUNDLE)
- .getString(Constants.EXTRA_SCRIPT_PATH));
- Log.v("LocaleReceiver", "Locale initiated launch of " + script);
- Intent launchIntent;
- if (intent.getBooleanExtra(Constants.EXTRA_LAUNCH_IN_BACKGROUND, false)) {
- launchIntent = IntentBuilders.buildStartInBackgroundIntent(script);
- } else {
- launchIntent = IntentBuilders.buildStartInTerminalIntent(script);
- }
- launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(launchIntent);
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/provider/ApiProvider.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/provider/ApiProvider.java
deleted file mode 100644
index 5bc1754..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/provider/ApiProvider.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.provider;
-
-import android.app.SearchManager;
-import android.content.ContentProvider;
-import android.content.ContentValues;
-import android.content.UriMatcher;
-import android.database.Cursor;
-import android.database.MatrixCursor;
-import android.net.Uri;
-import android.provider.BaseColumns;
-
-import com.google.common.base.Predicate;
-import com.google.common.collect.Collections2;
-import com.googlecode.android_scripting.facade.FacadeConfiguration;
-import com.googlecode.android_scripting.rpc.MethodDescriptor;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcDeprecated;
-import com.googlecode.android_scripting.rpc.RpcMinSdk;
-
-import java.lang.reflect.Method;
-import java.util.Collection;
-
-public class ApiProvider extends ContentProvider {
-
- public static final String SINGLE_MIME = "vnd.android.cursor.item/vnd.sl4a.api";
-
- private static final int SUGGESTIONS_ID = 1;
-
- public static final String AUTHORITY = ApiProvider.class.getName().toLowerCase();
- public static final String SUGGESTIONS = "searchSuggestions/*/*";
-
- private final UriMatcher mUriMatcher;
- private final Collection<MethodDescriptor> mMethodDescriptors;
-
- public ApiProvider() {
- mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
- mUriMatcher.addURI(AUTHORITY, SUGGESTIONS, SUGGESTIONS_ID);
- mMethodDescriptors =
- Collections2.filter(FacadeConfiguration.collectMethodDescriptors(),
- new Predicate<MethodDescriptor>() {
- @Override
- public boolean apply(MethodDescriptor descriptor) {
- Method method = descriptor.getMethod();
- if (method.isAnnotationPresent(RpcDeprecated.class)) {
- return false;
- } else if (method.isAnnotationPresent(RpcMinSdk.class)) {
- int requiredSdkLevel = method.getAnnotation(RpcMinSdk.class).value();
- if (FacadeConfiguration.getSdkLevel() < requiredSdkLevel) {
- return false;
- }
- }
- return true;
- }
- });
- }
-
- @Override
- public int delete(Uri uri, String selection, String[] selectionArgs) {
- return 0;
- }
-
- @Override
- public String getType(Uri uri) {
- return SINGLE_MIME;
- }
-
- @Override
- public Uri insert(Uri uri, ContentValues values) {
- return null;
- }
-
- @Override
- public boolean onCreate() {
- return true;
- }
-
- @Override
- public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
- String sortOrder) {
- switch (mUriMatcher.match(uri)) {
- case SUGGESTIONS_ID:
- String query = uri.getLastPathSegment().toLowerCase();
- return querySearchSuggestions(query);
- }
- return null;
- }
-
- private Cursor querySearchSuggestions(String query) {
- String[] columns =
- { BaseColumns._ID, SearchManager.SUGGEST_COLUMN_TEXT_1,
- SearchManager.SUGGEST_COLUMN_TEXT_2, SearchManager.SUGGEST_COLUMN_QUERY };
- MatrixCursor cursor = new MatrixCursor(columns);
- int index = 0;
- for (MethodDescriptor descriptor : mMethodDescriptors) {
- String name = descriptor.getMethod().getName();
- if (!name.toLowerCase().contains(query)) {
- continue;
- }
- String description = descriptor.getMethod().getAnnotation(Rpc.class).description();
- description = description.replaceAll("\\s+", " ");
- Object[] row = { index, name, description, name };
- cursor.addRow(row);
- ++index;
- }
- return cursor;
- }
-
- @Override
- public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
- return 0;
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/provider/ScriptProvider.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/provider/ScriptProvider.java
deleted file mode 100644
index 0f16e0d..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/provider/ScriptProvider.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.provider;
-
-import android.app.SearchManager;
-import android.content.ContentProvider;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.Intent;
-import android.content.UriMatcher;
-import android.content.Intent.ShortcutIconResource;
-import android.database.Cursor;
-import android.database.MatrixCursor;
-import android.net.Uri;
-import android.provider.BaseColumns;
-import android.provider.LiveFolders;
-
-import com.googlecode.android_scripting.FeaturedInterpreters;
-import com.googlecode.android_scripting.IntentBuilders;
-import com.googlecode.android_scripting.R;
-import com.googlecode.android_scripting.ScriptStorageAdapter;
-import com.googlecode.android_scripting.interpreter.Interpreter;
-import com.googlecode.android_scripting.interpreter.InterpreterConfiguration;
-import com.googlecode.android_scripting.interpreter.InterpreterConstants;
-
-import java.io.File;
-
-public class ScriptProvider extends ContentProvider {
-
- public static final String SINGLE_MIME = "vnd.android.cursor.item/vnd.sl4a.script";
- public static final String MULTIPLE_MIME = "vnd.android.cursor.dir/vnd.sl4a.script";
-
- private static final int LIVEFOLDER_ID = 1;
- private static final int SUGGESTIONS_ID = 2;
-
- public static final String AUTHORITY = ScriptProvider.class.getName().toLowerCase();
- public static final String LIVEFOLDER = "liveFolder";
- public static final String SUGGESTIONS = "searchSuggestions/*/*";
-
- private final UriMatcher mUriMatcher;
-
- private Context mContext;
- private InterpreterConfiguration mConfiguration;
-
- public ScriptProvider() {
- mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
- mUriMatcher.addURI(AUTHORITY, LIVEFOLDER, LIVEFOLDER_ID);
- mUriMatcher.addURI(AUTHORITY, SUGGESTIONS, SUGGESTIONS_ID);
- }
-
- @Override
- public int delete(Uri uri, String selection, String[] selectionArgs) {
- return 0;
- }
-
- @Override
- public String getType(Uri uri) {
- if (uri.getLastPathSegment().equals("scripts")) {
- return MULTIPLE_MIME;
- }
- return SINGLE_MIME;
- }
-
- @Override
- public Uri insert(Uri uri, ContentValues values) {
- return null;
- }
-
- @Override
- public boolean onCreate() {
- mContext = getContext();
- mConfiguration = new InterpreterConfiguration(mContext);
- mConfiguration.startDiscovering();
- return true;
- }
-
- @Override
- public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
- String sortOrder) {
- switch (mUriMatcher.match(uri)) {
- case LIVEFOLDER_ID:
- return queryLiveFolder();
- case SUGGESTIONS_ID:
- String query = uri.getLastPathSegment().toLowerCase();
- return querySearchSuggestions(query);
- default:
- return null;
- }
- }
-
- private Cursor querySearchSuggestions(String query) {
- String[] columns =
- { BaseColumns._ID, SearchManager.SUGGEST_COLUMN_TEXT_1,
- SearchManager.SUGGEST_COLUMN_TEXT_2, SearchManager.SUGGEST_COLUMN_ICON_2,
- SearchManager.SUGGEST_COLUMN_QUERY, SearchManager.SUGGEST_COLUMN_SHORTCUT_ID };
- MatrixCursor cursor = new MatrixCursor(columns);
- int index = 0;
- for (File script : ScriptStorageAdapter.listExecutableScripts(null, mConfiguration)) {
- String scriptName = script.getName().toLowerCase();
- if (!scriptName.contains(query)) {
- continue;
- }
- Interpreter interpreter = mConfiguration.getInterpreterForScript(scriptName);
- String secondLine = interpreter.getNiceName();
- int icon = FeaturedInterpreters.getInterpreterIcon(mContext, interpreter.getExtension());
- Object[] row =
- { index, scriptName, secondLine, icon, scriptName,
- SearchManager.SUGGEST_NEVER_MAKE_SHORTCUT };
- cursor.addRow(row);
- ++index;
- }
- return cursor;
- }
-
- private Cursor queryLiveFolder() {
- String[] columns =
- { BaseColumns._ID, LiveFolders.NAME, LiveFolders.INTENT, LiveFolders.ICON_RESOURCE,
- LiveFolders.ICON_PACKAGE, LiveFolders.DESCRIPTION };
- MatrixCursor cursor = new MatrixCursor(columns);
- int index = 0;
- for (File script : ScriptStorageAdapter.listExecutableScriptsRecursively(null, mConfiguration)) {
- int iconId = 0;
- if (script.isDirectory()) {
- iconId = R.drawable.folder;
- } else {
- iconId = FeaturedInterpreters.getInterpreterIcon(mContext, script.getName());
- if (iconId == 0) {
- iconId = R.drawable.sl4a_logo_32;
- }
- }
- ShortcutIconResource icon = ShortcutIconResource.fromContext(mContext, iconId);
- Intent intent = IntentBuilders.buildStartInBackgroundIntent(script);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- String description = script.getAbsolutePath();
- if (description.startsWith(InterpreterConstants.SCRIPTS_ROOT)) {
- description = description.replaceAll(InterpreterConstants.SCRIPTS_ROOT, "scripts/");
- }
- Object[] row =
- { index, script.getName(), intent.toURI(), icon.resourceName, icon.packageName,
- description };
- cursor.addRow(row);
- ++index;
- }
- return cursor;
- }
-
- @Override
- public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
- return 0;
- }
-
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/provider/TelephonyTestProvider.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/provider/TelephonyTestProvider.java
deleted file mode 100644
index 2ab7c24..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/provider/TelephonyTestProvider.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.provider;
-
-import android.content.ContentProvider;
-import android.content.ContentValues;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.ParcelFileDescriptor;
-import android.text.TextUtils;
-
-import java.io.File;
-import java.io.FileReader;
-import java.io.BufferedReader;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-
-import com.googlecode.android_scripting.Log;
-
-/**
- * A simple provider to send MMS PDU to platform MMS service
- */
-public class TelephonyTestProvider extends ContentProvider {
-
- public static final String AUTHORITY = "telephonytestauthority";
-
- private final boolean DBG = false;
-
- @Override
- public boolean onCreate() {
- if(DBG) Log.d("TelephonTestProvider Successfully created!");
- return true;
- }
-
- @Override
- public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
- String sortOrder) {
- // Not supported
- return null;
- }
-
- @Override
- public String getType(Uri uri) {
- // Not supported
- return null;
- }
-
- @Override
- public Uri insert(Uri uri, ContentValues values) {
- // Not supported
- return null;
- }
-
- @Override
- public int delete(Uri uri, String selection, String[] selectionArgs) {
- // Not supported
- return 0;
- }
-
- @Override
- public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
- // Not supported
- return 0;
- }
-
- @Override
- public ParcelFileDescriptor openFile(Uri uri, String fileMode) throws FileNotFoundException {
- Log.d(String.format("Entered ParcelFileDescriptor: Uri(%s), Mode(%s)", uri.toString(),
- fileMode));
- File file = new File(getContext().getCacheDir(), uri.getPath());
- file.setReadable(true);
-
- Log.d(String.format("Looking for file at %s", getContext().getCacheDir() + uri.getPath()));
- int mode = (TextUtils.equals(fileMode, "r") ? ParcelFileDescriptor.MODE_READ_ONLY :
- ParcelFileDescriptor.MODE_WRITE_ONLY
- | ParcelFileDescriptor.MODE_TRUNCATE
- | ParcelFileDescriptor.MODE_CREATE);
-
- try {
- ParcelFileDescriptor descriptor = ParcelFileDescriptor.open(file, mode);
-
- if(DBG) {
- try {
- BufferedReader br = new BufferedReader(new
- FileReader(descriptor.getFileDescriptor()));
- String line = null;
- while ((line = br.readLine()) != null) {
- Log.d("MMS:" + line);
- }
- } catch (IOException e) {
- }
- }
-
- return descriptor;
- } catch (FileNotFoundException fnf) {
- Log.e(fnf);
- return null;
- }
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/service/FacadeService.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/service/FacadeService.java
deleted file mode 100644
index 7ca4e18..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/service/FacadeService.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.googlecode.android_scripting.service;
-
-import android.app.Service;
-import android.content.Intent;
-import android.os.HandlerThread;
-import android.os.IBinder;
-import android.os.Messenger;
-
-import com.googlecode.android_scripting.facade.FacadeConfiguration;
-import com.googlecode.android_scripting.facade.FacadeManagerFactory;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiverManagerFactory;
-
-/**
- * FacadeService exposes SL4A's Facade methods through a {@link Service} so
- * they can be invoked from third-party apps.
- * <p>
- * Example binding code:<br>
- * {@code
- * Intent intent = new Intent();
- * intent.setPackage("com.googlecode.android_scripting");
- * intent.setAction("com.googlecode.android_scripting.service.FacadeService.ACTION_BIND");
- * sl4aService = bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
- * }
- * Example using the service:<br>
- * {@code
- * Bundle sl4aBundle = new Bundle;
- * bundle.putString{"sl4aMethod", "makeToast"};
- * bundle.putString{"message", "Hello World!"};
- * Message msg = Message.obtain(null, SL4A_ACTION);
- * msg.setData(sl4aBundle);
- * msg.replyTo = myReplyHandler; // Set a Messenger if you need the response
- * mSl4aService.send(msg);
- * }
- * <p>
- * For more info on binding a {@link Service} using a {@link Messenger} please
- * refer to Android's public developer documentation.
- */
-public class FacadeService extends Service {
-
- private RpcReceiverManagerFactory rpcReceiverManagerFactory;
-
- @Override
- public IBinder onBind(Intent intent) {
- if (rpcReceiverManagerFactory == null) {
- rpcReceiverManagerFactory =
- new FacadeManagerFactory(FacadeConfiguration.getSdkLevel(), this, null,
- FacadeConfiguration.getFacadeClasses());
- }
- HandlerThread handlerThread = new HandlerThread("MessageHandlerThread");
- handlerThread.start();
- Messenger aMessenger = new Messenger(new MessageHandler(handlerThread,
- rpcReceiverManagerFactory));
- return aMessenger.getBinder();
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/service/MessageHandler.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/service/MessageHandler.java
deleted file mode 100644
index 8c6fb3f..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/service/MessageHandler.java
+++ /dev/null
@@ -1,116 +0,0 @@
-package com.googlecode.android_scripting.service;
-
-import android.annotation.TargetApi;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.Message;
-import android.os.RemoteException;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.jsonrpc.JsonRpcResult;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiverManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiverManagerFactory;
-import com.googlecode.android_scripting.rpc.MethodDescriptor;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-/**
- * Class responsible for Handling messages that came through the FacadeService
- * interface.
- * <br>
- * Please refer to {@link FacadeService} for details on how to use.
- */
-@TargetApi(3)
-public class MessageHandler extends Handler {
-
- private static final int SL4A_ACTION = 0;
- private static final int DEFAULT_SENDING_ID = 0;
-
- // Android sets this to -1 when the message is not sent by a Messenger.
- // see http://developer.android.com/reference/android/os/Message.html#sendingUid
- private static final int DEFAULT_UNSET_SENDING_ID = 1;
-
- // Keys for the Bundles.
- private static final String SL4A_METHOD = "sl4aMethod";
- private static final String SL4A_RESULT = "sl4aResult";
-
- private final RpcReceiverManagerFactory mRpcReceiverManagerFactory;
-
- public MessageHandler(HandlerThread handlerThread,
- RpcReceiverManagerFactory rpcReceiverManagerFactory) {
- super(handlerThread.getLooper());
- this.mRpcReceiverManagerFactory = rpcReceiverManagerFactory;
- }
-
- /**
- * Handles messages for the service. It does this via the same mechanism used
- * for RPCs through RpcManagers.
- *
- * @param message The message that contains the method and parameters to
- * execute.
- */
- @Override
- public void handleMessage(Message message) {
- Log.d("Handling Remote request");
- int senderId = message.sendingUid == DEFAULT_UNSET_SENDING_ID ?
- DEFAULT_SENDING_ID : message.sendingUid;
- if (message.what == SL4A_ACTION) {
- RpcReceiverManager receiverManager;
- if (mRpcReceiverManagerFactory.getRpcReceiverManagers().containsKey(senderId)) {
- receiverManager = mRpcReceiverManagerFactory.getRpcReceiverManagers().get(senderId);
- } else {
- receiverManager = mRpcReceiverManagerFactory.create(senderId);
- }
- Bundle sl4aRequest = message.getData();
- String method = sl4aRequest.getString(SL4A_METHOD);
- if (method == null || "".equals(method)) {
- Log.e("No SL4A method specified on the Bundle. Specify one with "
- + SL4A_METHOD);
- return;
- }
- MethodDescriptor rpc = receiverManager.getMethodDescriptor(method);
- if (rpc == null) {
- Log.e("Unknown RPC: \"" + method + "\"");
- return;
- }
- try {
- Log.d("Invoking method " + rpc.getName());
- Object result = rpc.invoke(receiverManager, sl4aRequest);
- // Only return a result if we were passed a Messenger. Otherwise assume
- // client did not care for the response.
- if (message.replyTo != null) {
- Message reply = Message.obtain();
- Bundle sl4aResponse = new Bundle();
- putResult(senderId, result, sl4aResponse);
- reply.setData(sl4aResponse);
- message.replyTo.send(reply);
- }
- } catch (RemoteException e) {
- Log.e("Could not send reply back to client", e);
- } catch (Throwable t) {
- Log.e("Exception while executing sl4a method", t);
- }
- }
- }
-
- private void putResult(int id, Object result, Bundle reply) {
- JSONObject json;
- try {
- if (result instanceof Throwable) {
- json = JsonRpcResult.error(id, (Throwable) result);
- } else {
- json = JsonRpcResult.result(id, result);
- }
- } catch (JSONException e) {
- // There was an error converting the result to JSON. This shouldn't
- // happen normally.
- Log.e("Caught exception when filling JSON result.", e);
- reply.putString(SL4A_RESULT, e.toString());
- return;
- }
- Log.d("Returning result: " + json.toString());
- reply.putString(SL4A_RESULT, json.toString());
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/widget/DurationPicker.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/widget/DurationPicker.java
deleted file mode 100644
index 7652471..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/widget/DurationPicker.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.googlecode.android_scripting.widget;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.widget.FrameLayout;
-
-import com.googlecode.android_scripting.R;
-
-/**
- * A view for selecting the a duration using days, hours, minutes, and seconds.
- */
-public class DurationPicker extends FrameLayout {
-
- private int mCurrentDay = 0; // 0-99
- private int mCurrentHour = 0; // 0-23
- private int mCurrentMinute = 0; // 0-59
- private int mCurrentSecond = 0; // 0-59
-
- private final NumberPicker mDayPicker;
- private final NumberPicker mHourPicker;
- private final NumberPicker mMinutePicker;
- private final NumberPicker mSecondPicker;
-
- public DurationPicker(Context context) {
- this(context, null);
- }
-
- public DurationPicker(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public DurationPicker(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- LayoutInflater inflater =
- (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- inflater.inflate(R.layout.duration_picker, this, true);
-
- mDayPicker = (NumberPicker) findViewById(R.id.day);
- mDayPicker.setRange(0, 99);
- mDayPicker.setSpeed(100);
- // mHourPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
- mDayPicker.setOnChangeListener(new NumberPicker.OnChangedListener() {
- public void onChanged(NumberPicker spinner, int oldVal, int newVal) {
- mCurrentDay = newVal;
- }
- });
-
- mHourPicker = (NumberPicker) findViewById(R.id.hour);
- mHourPicker.setRange(0, 23);
- mHourPicker.setSpeed(100);
- // mHourPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
- mHourPicker.setOnChangeListener(new NumberPicker.OnChangedListener() {
- public void onChanged(NumberPicker spinner, int oldVal, int newVal) {
- mCurrentHour = newVal;
- }
- });
-
- mMinutePicker = (NumberPicker) findViewById(R.id.minute);
- mMinutePicker.setRange(0, 59);
- mMinutePicker.setSpeed(100);
- mMinutePicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
- mMinutePicker.setOnChangeListener(new NumberPicker.OnChangedListener() {
- public void onChanged(NumberPicker spinner, int oldVal, int newVal) {
- mCurrentMinute = newVal;
- }
- });
-
- mSecondPicker = (NumberPicker) findViewById(R.id.second);
- mSecondPicker.setRange(0, 59);
- mSecondPicker.setSpeed(100);
- mSecondPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
- mSecondPicker.setOnChangeListener(new NumberPicker.OnChangedListener() {
- public void onChanged(NumberPicker spinner, int oldVal, int newVal) {
- mCurrentSecond = newVal;
- }
- });
- }
-
- @Override
- public void setEnabled(boolean enabled) {
- super.setEnabled(enabled);
- mDayPicker.setEnabled(enabled);
- mHourPicker.setEnabled(enabled);
- mMinutePicker.setEnabled(enabled);
- mSecondPicker.setEnabled(enabled);
- }
-
- /**
- * Returns the current day.
- */
- public Integer getCurrentDay() {
- return mCurrentDay;
- }
-
- /**
- * Set the current hour.
- */
- public void setCurrentDay(Integer currentDay) {
- mCurrentDay = currentDay;
- updateDayDisplay();
- }
-
- /**
- * Returns the current hour.
- */
- public Integer getCurrentHour() {
- return mCurrentHour;
- }
-
- /**
- * Set the current hour.
- */
- public void setCurrentHour(Integer currentHour) {
- mCurrentHour = currentHour;
- updateHourDisplay();
- }
-
- /**
- * Returns the current minute.
- */
- public Integer getCurrentMinute() {
- return mCurrentMinute;
- }
-
- /**
- * Set the current minute.
- */
- public void setCurrentMinute(Integer currentMinute) {
- mCurrentMinute = currentMinute;
- updateMinuteDisplay();
- }
-
- /**
- * Returns the current second.
- */
- public Integer getCurrentSecond() {
- return mCurrentSecond;
- }
-
- /**
- * Set the current minute.
- */
- public void setCurrentSecond(Integer currentSecond) {
- mCurrentSecond = currentSecond;
- updateSecondDisplay();
- }
-
- /**
- * Set the state of the spinners appropriate to the current day.
- */
- private void updateDayDisplay() {
- int currentDay = mCurrentDay;
- mDayPicker.setCurrent(currentDay);
- }
-
- /**
- * Set the state of the spinners appropriate to the current hour.
- */
- private void updateHourDisplay() {
- int currentHour = mCurrentHour;
- mHourPicker.setCurrent(currentHour);
- }
-
- /**
- * Set the state of the spinners appropriate to the current minute.
- */
- private void updateMinuteDisplay() {
- mMinutePicker.setCurrent(mCurrentMinute);
- }
-
- /**
- * Set the state of the spinners appropriate to the current minute.
- */
- private void updateSecondDisplay() {
- mSecondPicker.setCurrent(mCurrentSecond);
- }
-
- /**
- * Returns the duration in seconds.
- */
- public double getDuration() {
- // The text views may still have focus so clear theirs focus which will trigger the on focus
- // changed and any typed values to be pulled.
- mDayPicker.clearFocus();
- mHourPicker.clearFocus();
- mMinutePicker.clearFocus();
- mSecondPicker.clearFocus();
- return (((((mCurrentDay * 24l + mCurrentHour) * 60) + mCurrentMinute) * 60) + mCurrentSecond);
- }
-
- /**
- * Sets the duration in milliseconds.
- *
- * @return
- */
- public void setDuration(long duration) {
- double seconds = duration / 1000;
- double minutes = seconds / 60;
- seconds = seconds % 60;
- double hours = minutes / 60;
- minutes = minutes % 60;
- double days = hours / 24;
- hours = hours % 24;
-
- setCurrentDay((int) days);
- setCurrentHour((int) hours);
- setCurrentMinute((int) minutes);
- setCurrentSecond((int) seconds);
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/widget/NumberPicker.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/widget/NumberPicker.java
deleted file mode 100644
index 061eacd..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/widget/NumberPicker.java
+++ /dev/null
@@ -1,412 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.googlecode.android_scripting.widget;
-
-import android.content.Context;
-import android.os.Handler;
-import android.text.InputFilter;
-import android.text.InputType;
-import android.text.Spanned;
-import android.text.method.NumberKeyListener;
-import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.View.OnFocusChangeListener;
-import android.view.View.OnLongClickListener;
-import android.widget.EditText;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import com.googlecode.android_scripting.R;
-
-public class NumberPicker extends LinearLayout implements OnClickListener, OnFocusChangeListener,
- OnLongClickListener {
-
- public interface OnChangedListener {
- void onChanged(NumberPicker picker, int oldVal, int newVal);
- }
-
- public interface Formatter {
- String toString(int value);
- }
-
- /*
- * Use a custom NumberPicker formatting callback to use two-digit minutes strings like "01".
- * Keeping a static formatter etc. is the most efficient way to do this; it avoids creating
- * temporary objects on every call to format().
- */
- public static final NumberPicker.Formatter TWO_DIGIT_FORMATTER = new NumberPicker.Formatter() {
- final StringBuilder mBuilder = new StringBuilder();
- final java.util.Formatter mFmt = new java.util.Formatter(mBuilder);
- final Object[] mArgs = new Object[1];
-
- public String toString(int value) {
- mArgs[0] = value;
- mBuilder.delete(0, mBuilder.length());
- mFmt.format("%02d", mArgs);
- return mFmt.toString();
- }
- };
-
- private final Handler mHandler;
- private final Runnable mRunnable = new Runnable() {
- public void run() {
- if (mIncrement) {
- changeCurrent(mCurrent + 1);
- mHandler.postDelayed(this, mSpeed);
- } else if (mDecrement) {
- changeCurrent(mCurrent - 1);
- mHandler.postDelayed(this, mSpeed);
- }
- }
- };
-
- private final EditText mText;
- private final InputFilter mNumberInputFilter;
-
- private String[] mDisplayedValues;
- private int mStart;
- private int mEnd;
- private int mCurrent;
- private int mPrevious;
- private OnChangedListener mListener;
- private Formatter mFormatter;
- private long mSpeed = 300;
-
- private boolean mIncrement;
- private boolean mDecrement;
-
- public NumberPicker(Context context) {
- this(context, null);
- }
-
- public NumberPicker(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public NumberPicker(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs);
- setOrientation(VERTICAL);
- LayoutInflater inflater =
- (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- inflater.inflate(R.layout.number_picker, this, true);
- mHandler = new Handler();
- InputFilter inputFilter = new NumberPickerInputFilter();
- mNumberInputFilter = new NumberRangeKeyListener();
- mIncrementButton = (NumberPickerButton) findViewById(R.id.increment);
- mIncrementButton.setOnClickListener(this);
- mIncrementButton.setOnLongClickListener(this);
- mIncrementButton.setNumberPicker(this);
- mDecrementButton = (NumberPickerButton) findViewById(R.id.decrement);
- mDecrementButton.setOnClickListener(this);
- mDecrementButton.setOnLongClickListener(this);
- mDecrementButton.setNumberPicker(this);
-
- mText = (EditText) findViewById(R.id.timepicker_input);
- mText.setOnFocusChangeListener(this);
- mText.setFilters(new InputFilter[] { inputFilter });
- mText.setRawInputType(InputType.TYPE_CLASS_NUMBER);
-
- if (!isEnabled()) {
- setEnabled(false);
- }
- }
-
- @Override
- public void setEnabled(boolean enabled) {
- super.setEnabled(enabled);
- mIncrementButton.setEnabled(enabled);
- mDecrementButton.setEnabled(enabled);
- mText.setEnabled(enabled);
- }
-
- public void setOnChangeListener(OnChangedListener listener) {
- mListener = listener;
- }
-
- public void setFormatter(Formatter formatter) {
- mFormatter = formatter;
- }
-
- /**
- * Set the range of numbers allowed for the number picker. The current value will be automatically
- * set to the start.
- *
- * @param start
- * the start of the range (inclusive)
- * @param end
- * the end of the range (inclusive)
- */
- public void setRange(int start, int end) {
- mStart = start;
- mEnd = end;
- mCurrent = start;
- updateView();
- }
-
- /**
- * Set the range of numbers allowed for the number picker. The current value will be automatically
- * set to the start. Also provide a mapping for values used to display to the user.
- *
- * @param start
- * the start of the range (inclusive)
- * @param end
- * the end of the range (inclusive)
- * @param displayedValues
- * the values displayed to the user.
- */
- public void setRange(int start, int end, String[] displayedValues) {
- mDisplayedValues = displayedValues;
- mStart = start;
- mEnd = end;
- mCurrent = start;
- updateView();
- }
-
- public void setCurrent(int current) {
- mCurrent = current;
- updateView();
- }
-
- /**
- * The speed (in milliseconds) at which the numbers will scroll when the the +/- buttons are
- * longpressed. Default is 300ms.
- */
- public void setSpeed(long speed) {
- mSpeed = speed;
- }
-
- public void onClick(View v) {
- validateInput(mText);
- if (!mText.hasFocus()) {
- mText.requestFocus();
- }
-
- // now perform the increment/decrement
- if (R.id.increment == v.getId()) {
- changeCurrent(mCurrent + 1);
- } else if (R.id.decrement == v.getId()) {
- changeCurrent(mCurrent - 1);
- }
- }
-
- private String formatNumber(int value) {
- return (mFormatter != null) ? mFormatter.toString(value) : String.valueOf(value);
- }
-
- private void changeCurrent(int current) {
-
- // Wrap around the values if we go past the start or end
- if (current > mEnd) {
- current = mStart;
- } else if (current < mStart) {
- current = mEnd;
- }
- mPrevious = mCurrent;
- mCurrent = current;
- notifyChange();
- updateView();
- }
-
- private void notifyChange() {
- if (mListener != null) {
- mListener.onChanged(this, mPrevious, mCurrent);
- }
- }
-
- private void updateView() {
-
- /*
- * If we don't have displayed values then use the current number else find the correct value in
- * the displayed values for the current number.
- */
- if (mDisplayedValues == null) {
- mText.setText(formatNumber(mCurrent));
- } else {
- mText.setText(mDisplayedValues[mCurrent - mStart]);
- }
- mText.setSelection(mText.getText().length());
- }
-
- private void validateCurrentView(CharSequence str) {
- int val = getSelectedPos(str.toString());
- if ((val >= mStart) && (val <= mEnd)) {
- mPrevious = mCurrent;
- mCurrent = val;
- notifyChange();
- }
- updateView();
- }
-
- public void onFocusChange(View v, boolean hasFocus) {
-
- /*
- * When focus is lost check that the text field has valid values.
- */
- if (!hasFocus) {
- validateInput(v);
- }
- }
-
- private void validateInput(View v) {
- String str = String.valueOf(((TextView) v).getText());
- if ("".equals(str)) {
-
- // Restore to the old value as we don't allow empty values
- updateView();
- } else {
-
- // Check the new value and ensure it's in range
- validateCurrentView(str);
- }
- }
-
- /**
- * We start the long click here but rely on the {@link NumberPickerButton} to inform us when the
- * long click has ended.
- */
- public boolean onLongClick(View v) {
-
- /*
- * The text view may still have focus so clear it's focus which will trigger the on focus
- * changed and any typed values to be pulled.
- */
- mText.clearFocus();
-
- if (R.id.increment == v.getId()) {
- mIncrement = true;
- mHandler.post(mRunnable);
- } else if (R.id.decrement == v.getId()) {
- mDecrement = true;
- mHandler.post(mRunnable);
- }
- return true;
- }
-
- public void cancelIncrement() {
- mIncrement = false;
- }
-
- public void cancelDecrement() {
- mDecrement = false;
- }
-
- private static final char[] DIGIT_CHARACTERS =
- new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
-
- private final NumberPickerButton mIncrementButton;
- private final NumberPickerButton mDecrementButton;
-
- private class NumberPickerInputFilter implements InputFilter {
- public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart,
- int dend) {
- if (mDisplayedValues == null) {
- return mNumberInputFilter.filter(source, start, end, dest, dstart, dend);
- }
- CharSequence filtered = String.valueOf(source.subSequence(start, end));
- String result =
- String.valueOf(dest.subSequence(0, dstart)) + filtered
- + dest.subSequence(dend, dest.length());
- String str = String.valueOf(result).toLowerCase();
- for (String val : mDisplayedValues) {
- val = val.toLowerCase();
- if (val.startsWith(str)) {
- return filtered;
- }
- }
- return "";
- }
- }
-
- private class NumberRangeKeyListener extends NumberKeyListener {
-
- // XXX This doesn't allow for range limits when controlled by a
- // soft input method!
- public int getInputType() {
- return InputType.TYPE_CLASS_NUMBER;
- }
-
- @Override
- protected char[] getAcceptedChars() {
- return DIGIT_CHARACTERS;
- }
-
- @Override
- public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart,
- int dend) {
-
- CharSequence filtered = super.filter(source, start, end, dest, dstart, dend);
- if (filtered == null) {
- filtered = source.subSequence(start, end);
- }
-
- String result =
- String.valueOf(dest.subSequence(0, dstart)) + filtered
- + dest.subSequence(dend, dest.length());
-
- if ("".equals(result)) {
- return result;
- }
- int val = getSelectedPos(result);
-
- /*
- * Ensure the user can't type in a value greater than the max allowed. We have to allow less
- * than min as the user might want to delete some numbers and then type a new number.
- */
- if (val > mEnd) {
- return "";
- } else {
- return filtered;
- }
- }
- }
-
- private int getSelectedPos(String str) {
- if (mDisplayedValues == null) {
- return Integer.parseInt(str);
- } else {
- for (int i = 0; i < mDisplayedValues.length; i++) {
-
- /* Don't force the user to type in jan when ja will do */
- str = str.toLowerCase();
- if (mDisplayedValues[i].toLowerCase().startsWith(str)) {
- return mStart + i;
- }
- }
-
- /*
- * The user might have typed in a number into the month field i.e. 10 instead of OCT so
- * support that too.
- */
- try {
- return Integer.parseInt(str);
- } catch (NumberFormatException e) {
-
- /* Ignore as if it's not a number we don't care */
- }
- }
- return mStart;
- }
-
- /**
- * @return the current value.
- */
- public int getCurrent() {
- return mCurrent;
- }
-} \ No newline at end of file
diff --git a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/widget/NumberPickerButton.java b/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/widget/NumberPickerButton.java
deleted file mode 100644
index cb8d184..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/widget/NumberPickerButton.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.googlecode.android_scripting.widget;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.KeyEvent;
-import android.view.MotionEvent;
-import android.widget.ImageButton;
-
-import com.googlecode.android_scripting.R;
-
-/**
- * This class exists purely to cancel long click events.
- */
-public class NumberPickerButton extends ImageButton {
-
- private NumberPicker mNumberPicker;
-
- public NumberPickerButton(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
-
- public NumberPickerButton(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public NumberPickerButton(Context context) {
- super(context);
- }
-
- public void setNumberPicker(NumberPicker picker) {
- mNumberPicker = picker;
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- cancelLongpressIfRequired(event);
- return super.onTouchEvent(event);
- }
-
- @Override
- public boolean onTrackballEvent(MotionEvent event) {
- cancelLongpressIfRequired(event);
- return super.onTrackballEvent(event);
- }
-
- @Override
- public boolean onKeyUp(int keyCode, KeyEvent event) {
- if ((keyCode == KeyEvent.KEYCODE_DPAD_CENTER) || (keyCode == KeyEvent.KEYCODE_ENTER)) {
- cancelLongpress();
- }
- return super.onKeyUp(keyCode, event);
- }
-
- private void cancelLongpressIfRequired(MotionEvent event) {
- if ((event.getAction() == MotionEvent.ACTION_CANCEL)
- || (event.getAction() == MotionEvent.ACTION_UP)) {
- cancelLongpress();
- }
- }
-
- private void cancelLongpress() {
- if (R.id.increment == getId()) {
- mNumberPicker.cancelIncrement();
- } else if (R.id.decrement == getId()) {
- mNumberPicker.cancelDecrement();
- }
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/de/mud/terminal/Precomposer.java b/sl4a/ScriptingLayerForAndroid/src/de/mud/terminal/Precomposer.java
deleted file mode 100644
index edad64c..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/de/mud/terminal/Precomposer.java
+++ /dev/null
@@ -1,1052 +0,0 @@
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package de.mud.terminal;
-
-/**
- * @author Kenny Root
- * This data was taken from xterm's precompose.c
- */
-public class Precomposer {
- public final static char precompositions[][] = {
- { 0x226E, 0x003C, 0x0338},
- { 0x2260, 0x003D, 0x0338},
- { 0x226F, 0x003E, 0x0338},
- { 0x00C0, 0x0041, 0x0300},
- { 0x00C1, 0x0041, 0x0301},
- { 0x00C2, 0x0041, 0x0302},
- { 0x00C3, 0x0041, 0x0303},
- { 0x0100, 0x0041, 0x0304},
- { 0x0102, 0x0041, 0x0306},
- { 0x0226, 0x0041, 0x0307},
- { 0x00C4, 0x0041, 0x0308},
- { 0x1EA2, 0x0041, 0x0309},
- { 0x00C5, 0x0041, 0x030A},
- { 0x01CD, 0x0041, 0x030C},
- { 0x0200, 0x0041, 0x030F},
- { 0x0202, 0x0041, 0x0311},
- { 0x1EA0, 0x0041, 0x0323},
- { 0x1E00, 0x0041, 0x0325},
- { 0x0104, 0x0041, 0x0328},
- { 0x1E02, 0x0042, 0x0307},
- { 0x1E04, 0x0042, 0x0323},
- { 0x1E06, 0x0042, 0x0331},
- { 0x0106, 0x0043, 0x0301},
- { 0x0108, 0x0043, 0x0302},
- { 0x010A, 0x0043, 0x0307},
- { 0x010C, 0x0043, 0x030C},
- { 0x00C7, 0x0043, 0x0327},
- { 0x1E0A, 0x0044, 0x0307},
- { 0x010E, 0x0044, 0x030C},
- { 0x1E0C, 0x0044, 0x0323},
- { 0x1E10, 0x0044, 0x0327},
- { 0x1E12, 0x0044, 0x032D},
- { 0x1E0E, 0x0044, 0x0331},
- { 0x00C8, 0x0045, 0x0300},
- { 0x00C9, 0x0045, 0x0301},
- { 0x00CA, 0x0045, 0x0302},
- { 0x1EBC, 0x0045, 0x0303},
- { 0x0112, 0x0045, 0x0304},
- { 0x0114, 0x0045, 0x0306},
- { 0x0116, 0x0045, 0x0307},
- { 0x00CB, 0x0045, 0x0308},
- { 0x1EBA, 0x0045, 0x0309},
- { 0x011A, 0x0045, 0x030C},
- { 0x0204, 0x0045, 0x030F},
- { 0x0206, 0x0045, 0x0311},
- { 0x1EB8, 0x0045, 0x0323},
- { 0x0228, 0x0045, 0x0327},
- { 0x0118, 0x0045, 0x0328},
- { 0x1E18, 0x0045, 0x032D},
- { 0x1E1A, 0x0045, 0x0330},
- { 0x1E1E, 0x0046, 0x0307},
- { 0x01F4, 0x0047, 0x0301},
- { 0x011C, 0x0047, 0x0302},
- { 0x1E20, 0x0047, 0x0304},
- { 0x011E, 0x0047, 0x0306},
- { 0x0120, 0x0047, 0x0307},
- { 0x01E6, 0x0047, 0x030C},
- { 0x0122, 0x0047, 0x0327},
- { 0x0124, 0x0048, 0x0302},
- { 0x1E22, 0x0048, 0x0307},
- { 0x1E26, 0x0048, 0x0308},
- { 0x021E, 0x0048, 0x030C},
- { 0x1E24, 0x0048, 0x0323},
- { 0x1E28, 0x0048, 0x0327},
- { 0x1E2A, 0x0048, 0x032E},
- { 0x00CC, 0x0049, 0x0300},
- { 0x00CD, 0x0049, 0x0301},
- { 0x00CE, 0x0049, 0x0302},
- { 0x0128, 0x0049, 0x0303},
- { 0x012A, 0x0049, 0x0304},
- { 0x012C, 0x0049, 0x0306},
- { 0x0130, 0x0049, 0x0307},
- { 0x00CF, 0x0049, 0x0308},
- { 0x1EC8, 0x0049, 0x0309},
- { 0x01CF, 0x0049, 0x030C},
- { 0x0208, 0x0049, 0x030F},
- { 0x020A, 0x0049, 0x0311},
- { 0x1ECA, 0x0049, 0x0323},
- { 0x012E, 0x0049, 0x0328},
- { 0x1E2C, 0x0049, 0x0330},
- { 0x0134, 0x004A, 0x0302},
- { 0x1E30, 0x004B, 0x0301},
- { 0x01E8, 0x004B, 0x030C},
- { 0x1E32, 0x004B, 0x0323},
- { 0x0136, 0x004B, 0x0327},
- { 0x1E34, 0x004B, 0x0331},
- { 0x0139, 0x004C, 0x0301},
- { 0x013D, 0x004C, 0x030C},
- { 0x1E36, 0x004C, 0x0323},
- { 0x013B, 0x004C, 0x0327},
- { 0x1E3C, 0x004C, 0x032D},
- { 0x1E3A, 0x004C, 0x0331},
- { 0x1E3E, 0x004D, 0x0301},
- { 0x1E40, 0x004D, 0x0307},
- { 0x1E42, 0x004D, 0x0323},
- { 0x01F8, 0x004E, 0x0300},
- { 0x0143, 0x004E, 0x0301},
- { 0x00D1, 0x004E, 0x0303},
- { 0x1E44, 0x004E, 0x0307},
- { 0x0147, 0x004E, 0x030C},
- { 0x1E46, 0x004E, 0x0323},
- { 0x0145, 0x004E, 0x0327},
- { 0x1E4A, 0x004E, 0x032D},
- { 0x1E48, 0x004E, 0x0331},
- { 0x00D2, 0x004F, 0x0300},
- { 0x00D3, 0x004F, 0x0301},
- { 0x00D4, 0x004F, 0x0302},
- { 0x00D5, 0x004F, 0x0303},
- { 0x014C, 0x004F, 0x0304},
- { 0x014E, 0x004F, 0x0306},
- { 0x022E, 0x004F, 0x0307},
- { 0x00D6, 0x004F, 0x0308},
- { 0x1ECE, 0x004F, 0x0309},
- { 0x0150, 0x004F, 0x030B},
- { 0x01D1, 0x004F, 0x030C},
- { 0x020C, 0x004F, 0x030F},
- { 0x020E, 0x004F, 0x0311},
- { 0x01A0, 0x004F, 0x031B},
- { 0x1ECC, 0x004F, 0x0323},
- { 0x01EA, 0x004F, 0x0328},
- { 0x1E54, 0x0050, 0x0301},
- { 0x1E56, 0x0050, 0x0307},
- { 0x0154, 0x0052, 0x0301},
- { 0x1E58, 0x0052, 0x0307},
- { 0x0158, 0x0052, 0x030C},
- { 0x0210, 0x0052, 0x030F},
- { 0x0212, 0x0052, 0x0311},
- { 0x1E5A, 0x0052, 0x0323},
- { 0x0156, 0x0052, 0x0327},
- { 0x1E5E, 0x0052, 0x0331},
- { 0x015A, 0x0053, 0x0301},
- { 0x015C, 0x0053, 0x0302},
- { 0x1E60, 0x0053, 0x0307},
- { 0x0160, 0x0053, 0x030C},
- { 0x1E62, 0x0053, 0x0323},
- { 0x0218, 0x0053, 0x0326},
- { 0x015E, 0x0053, 0x0327},
- { 0x1E6A, 0x0054, 0x0307},
- { 0x0164, 0x0054, 0x030C},
- { 0x1E6C, 0x0054, 0x0323},
- { 0x021A, 0x0054, 0x0326},
- { 0x0162, 0x0054, 0x0327},
- { 0x1E70, 0x0054, 0x032D},
- { 0x1E6E, 0x0054, 0x0331},
- { 0x00D9, 0x0055, 0x0300},
- { 0x00DA, 0x0055, 0x0301},
- { 0x00DB, 0x0055, 0x0302},
- { 0x0168, 0x0055, 0x0303},
- { 0x016A, 0x0055, 0x0304},
- { 0x016C, 0x0055, 0x0306},
- { 0x00DC, 0x0055, 0x0308},
- { 0x1EE6, 0x0055, 0x0309},
- { 0x016E, 0x0055, 0x030A},
- { 0x0170, 0x0055, 0x030B},
- { 0x01D3, 0x0055, 0x030C},
- { 0x0214, 0x0055, 0x030F},
- { 0x0216, 0x0055, 0x0311},
- { 0x01AF, 0x0055, 0x031B},
- { 0x1EE4, 0x0055, 0x0323},
- { 0x1E72, 0x0055, 0x0324},
- { 0x0172, 0x0055, 0x0328},
- { 0x1E76, 0x0055, 0x032D},
- { 0x1E74, 0x0055, 0x0330},
- { 0x1E7C, 0x0056, 0x0303},
- { 0x1E7E, 0x0056, 0x0323},
- { 0x1E80, 0x0057, 0x0300},
- { 0x1E82, 0x0057, 0x0301},
- { 0x0174, 0x0057, 0x0302},
- { 0x1E86, 0x0057, 0x0307},
- { 0x1E84, 0x0057, 0x0308},
- { 0x1E88, 0x0057, 0x0323},
- { 0x1E8A, 0x0058, 0x0307},
- { 0x1E8C, 0x0058, 0x0308},
- { 0x1EF2, 0x0059, 0x0300},
- { 0x00DD, 0x0059, 0x0301},
- { 0x0176, 0x0059, 0x0302},
- { 0x1EF8, 0x0059, 0x0303},
- { 0x0232, 0x0059, 0x0304},
- { 0x1E8E, 0x0059, 0x0307},
- { 0x0178, 0x0059, 0x0308},
- { 0x1EF6, 0x0059, 0x0309},
- { 0x1EF4, 0x0059, 0x0323},
- { 0x0179, 0x005A, 0x0301},
- { 0x1E90, 0x005A, 0x0302},
- { 0x017B, 0x005A, 0x0307},
- { 0x017D, 0x005A, 0x030C},
- { 0x1E92, 0x005A, 0x0323},
- { 0x1E94, 0x005A, 0x0331},
- { 0x00E0, 0x0061, 0x0300},
- { 0x00E1, 0x0061, 0x0301},
- { 0x00E2, 0x0061, 0x0302},
- { 0x00E3, 0x0061, 0x0303},
- { 0x0101, 0x0061, 0x0304},
- { 0x0103, 0x0061, 0x0306},
- { 0x0227, 0x0061, 0x0307},
- { 0x00E4, 0x0061, 0x0308},
- { 0x1EA3, 0x0061, 0x0309},
- { 0x00E5, 0x0061, 0x030A},
- { 0x01CE, 0x0061, 0x030C},
- { 0x0201, 0x0061, 0x030F},
- { 0x0203, 0x0061, 0x0311},
- { 0x1EA1, 0x0061, 0x0323},
- { 0x1E01, 0x0061, 0x0325},
- { 0x0105, 0x0061, 0x0328},
- { 0x1E03, 0x0062, 0x0307},
- { 0x1E05, 0x0062, 0x0323},
- { 0x1E07, 0x0062, 0x0331},
- { 0x0107, 0x0063, 0x0301},
- { 0x0109, 0x0063, 0x0302},
- { 0x010B, 0x0063, 0x0307},
- { 0x010D, 0x0063, 0x030C},
- { 0x00E7, 0x0063, 0x0327},
- { 0x1E0B, 0x0064, 0x0307},
- { 0x010F, 0x0064, 0x030C},
- { 0x1E0D, 0x0064, 0x0323},
- { 0x1E11, 0x0064, 0x0327},
- { 0x1E13, 0x0064, 0x032D},
- { 0x1E0F, 0x0064, 0x0331},
- { 0x00E8, 0x0065, 0x0300},
- { 0x00E9, 0x0065, 0x0301},
- { 0x00EA, 0x0065, 0x0302},
- { 0x1EBD, 0x0065, 0x0303},
- { 0x0113, 0x0065, 0x0304},
- { 0x0115, 0x0065, 0x0306},
- { 0x0117, 0x0065, 0x0307},
- { 0x00EB, 0x0065, 0x0308},
- { 0x1EBB, 0x0065, 0x0309},
- { 0x011B, 0x0065, 0x030C},
- { 0x0205, 0x0065, 0x030F},
- { 0x0207, 0x0065, 0x0311},
- { 0x1EB9, 0x0065, 0x0323},
- { 0x0229, 0x0065, 0x0327},
- { 0x0119, 0x0065, 0x0328},
- { 0x1E19, 0x0065, 0x032D},
- { 0x1E1B, 0x0065, 0x0330},
- { 0x1E1F, 0x0066, 0x0307},
- { 0x01F5, 0x0067, 0x0301},
- { 0x011D, 0x0067, 0x0302},
- { 0x1E21, 0x0067, 0x0304},
- { 0x011F, 0x0067, 0x0306},
- { 0x0121, 0x0067, 0x0307},
- { 0x01E7, 0x0067, 0x030C},
- { 0x0123, 0x0067, 0x0327},
- { 0x0125, 0x0068, 0x0302},
- { 0x1E23, 0x0068, 0x0307},
- { 0x1E27, 0x0068, 0x0308},
- { 0x021F, 0x0068, 0x030C},
- { 0x1E25, 0x0068, 0x0323},
- { 0x1E29, 0x0068, 0x0327},
- { 0x1E2B, 0x0068, 0x032E},
- { 0x1E96, 0x0068, 0x0331},
- { 0x00EC, 0x0069, 0x0300},
- { 0x00ED, 0x0069, 0x0301},
- { 0x00EE, 0x0069, 0x0302},
- { 0x0129, 0x0069, 0x0303},
- { 0x012B, 0x0069, 0x0304},
- { 0x012D, 0x0069, 0x0306},
- { 0x00EF, 0x0069, 0x0308},
- { 0x1EC9, 0x0069, 0x0309},
- { 0x01D0, 0x0069, 0x030C},
- { 0x0209, 0x0069, 0x030F},
- { 0x020B, 0x0069, 0x0311},
- { 0x1ECB, 0x0069, 0x0323},
- { 0x012F, 0x0069, 0x0328},
- { 0x1E2D, 0x0069, 0x0330},
- { 0x0135, 0x006A, 0x0302},
- { 0x01F0, 0x006A, 0x030C},
- { 0x1E31, 0x006B, 0x0301},
- { 0x01E9, 0x006B, 0x030C},
- { 0x1E33, 0x006B, 0x0323},
- { 0x0137, 0x006B, 0x0327},
- { 0x1E35, 0x006B, 0x0331},
- { 0x013A, 0x006C, 0x0301},
- { 0x013E, 0x006C, 0x030C},
- { 0x1E37, 0x006C, 0x0323},
- { 0x013C, 0x006C, 0x0327},
- { 0x1E3D, 0x006C, 0x032D},
- { 0x1E3B, 0x006C, 0x0331},
- { 0x1E3F, 0x006D, 0x0301},
- { 0x1E41, 0x006D, 0x0307},
- { 0x1E43, 0x006D, 0x0323},
- { 0x01F9, 0x006E, 0x0300},
- { 0x0144, 0x006E, 0x0301},
- { 0x00F1, 0x006E, 0x0303},
- { 0x1E45, 0x006E, 0x0307},
- { 0x0148, 0x006E, 0x030C},
- { 0x1E47, 0x006E, 0x0323},
- { 0x0146, 0x006E, 0x0327},
- { 0x1E4B, 0x006E, 0x032D},
- { 0x1E49, 0x006E, 0x0331},
- { 0x00F2, 0x006F, 0x0300},
- { 0x00F3, 0x006F, 0x0301},
- { 0x00F4, 0x006F, 0x0302},
- { 0x00F5, 0x006F, 0x0303},
- { 0x014D, 0x006F, 0x0304},
- { 0x014F, 0x006F, 0x0306},
- { 0x022F, 0x006F, 0x0307},
- { 0x00F6, 0x006F, 0x0308},
- { 0x1ECF, 0x006F, 0x0309},
- { 0x0151, 0x006F, 0x030B},
- { 0x01D2, 0x006F, 0x030C},
- { 0x020D, 0x006F, 0x030F},
- { 0x020F, 0x006F, 0x0311},
- { 0x01A1, 0x006F, 0x031B},
- { 0x1ECD, 0x006F, 0x0323},
- { 0x01EB, 0x006F, 0x0328},
- { 0x1E55, 0x0070, 0x0301},
- { 0x1E57, 0x0070, 0x0307},
- { 0x0155, 0x0072, 0x0301},
- { 0x1E59, 0x0072, 0x0307},
- { 0x0159, 0x0072, 0x030C},
- { 0x0211, 0x0072, 0x030F},
- { 0x0213, 0x0072, 0x0311},
- { 0x1E5B, 0x0072, 0x0323},
- { 0x0157, 0x0072, 0x0327},
- { 0x1E5F, 0x0072, 0x0331},
- { 0x015B, 0x0073, 0x0301},
- { 0x015D, 0x0073, 0x0302},
- { 0x1E61, 0x0073, 0x0307},
- { 0x0161, 0x0073, 0x030C},
- { 0x1E63, 0x0073, 0x0323},
- { 0x0219, 0x0073, 0x0326},
- { 0x015F, 0x0073, 0x0327},
- { 0x1E6B, 0x0074, 0x0307},
- { 0x1E97, 0x0074, 0x0308},
- { 0x0165, 0x0074, 0x030C},
- { 0x1E6D, 0x0074, 0x0323},
- { 0x021B, 0x0074, 0x0326},
- { 0x0163, 0x0074, 0x0327},
- { 0x1E71, 0x0074, 0x032D},
- { 0x1E6F, 0x0074, 0x0331},
- { 0x00F9, 0x0075, 0x0300},
- { 0x00FA, 0x0075, 0x0301},
- { 0x00FB, 0x0075, 0x0302},
- { 0x0169, 0x0075, 0x0303},
- { 0x016B, 0x0075, 0x0304},
- { 0x016D, 0x0075, 0x0306},
- { 0x00FC, 0x0075, 0x0308},
- { 0x1EE7, 0x0075, 0x0309},
- { 0x016F, 0x0075, 0x030A},
- { 0x0171, 0x0075, 0x030B},
- { 0x01D4, 0x0075, 0x030C},
- { 0x0215, 0x0075, 0x030F},
- { 0x0217, 0x0075, 0x0311},
- { 0x01B0, 0x0075, 0x031B},
- { 0x1EE5, 0x0075, 0x0323},
- { 0x1E73, 0x0075, 0x0324},
- { 0x0173, 0x0075, 0x0328},
- { 0x1E77, 0x0075, 0x032D},
- { 0x1E75, 0x0075, 0x0330},
- { 0x1E7D, 0x0076, 0x0303},
- { 0x1E7F, 0x0076, 0x0323},
- { 0x1E81, 0x0077, 0x0300},
- { 0x1E83, 0x0077, 0x0301},
- { 0x0175, 0x0077, 0x0302},
- { 0x1E87, 0x0077, 0x0307},
- { 0x1E85, 0x0077, 0x0308},
- { 0x1E98, 0x0077, 0x030A},
- { 0x1E89, 0x0077, 0x0323},
- { 0x1E8B, 0x0078, 0x0307},
- { 0x1E8D, 0x0078, 0x0308},
- { 0x1EF3, 0x0079, 0x0300},
- { 0x00FD, 0x0079, 0x0301},
- { 0x0177, 0x0079, 0x0302},
- { 0x1EF9, 0x0079, 0x0303},
- { 0x0233, 0x0079, 0x0304},
- { 0x1E8F, 0x0079, 0x0307},
- { 0x00FF, 0x0079, 0x0308},
- { 0x1EF7, 0x0079, 0x0309},
- { 0x1E99, 0x0079, 0x030A},
- { 0x1EF5, 0x0079, 0x0323},
- { 0x017A, 0x007A, 0x0301},
- { 0x1E91, 0x007A, 0x0302},
- { 0x017C, 0x007A, 0x0307},
- { 0x017E, 0x007A, 0x030C},
- { 0x1E93, 0x007A, 0x0323},
- { 0x1E95, 0x007A, 0x0331},
- { 0x1FED, 0x00A8, 0x0300},
- { 0x0385, 0x00A8, 0x0301},
- { 0x1FC1, 0x00A8, 0x0342},
- { 0x1EA6, 0x00C2, 0x0300},
- { 0x1EA4, 0x00C2, 0x0301},
- { 0x1EAA, 0x00C2, 0x0303},
- { 0x1EA8, 0x00C2, 0x0309},
- { 0x01DE, 0x00C4, 0x0304},
- { 0x01FA, 0x00C5, 0x0301},
- { 0x01FC, 0x00C6, 0x0301},
- { 0x01E2, 0x00C6, 0x0304},
- { 0x1E08, 0x00C7, 0x0301},
- { 0x1EC0, 0x00CA, 0x0300},
- { 0x1EBE, 0x00CA, 0x0301},
- { 0x1EC4, 0x00CA, 0x0303},
- { 0x1EC2, 0x00CA, 0x0309},
- { 0x1E2E, 0x00CF, 0x0301},
- { 0x1ED2, 0x00D4, 0x0300},
- { 0x1ED0, 0x00D4, 0x0301},
- { 0x1ED6, 0x00D4, 0x0303},
- { 0x1ED4, 0x00D4, 0x0309},
- { 0x1E4C, 0x00D5, 0x0301},
- { 0x022C, 0x00D5, 0x0304},
- { 0x1E4E, 0x00D5, 0x0308},
- { 0x022A, 0x00D6, 0x0304},
- { 0x01FE, 0x00D8, 0x0301},
- { 0x01DB, 0x00DC, 0x0300},
- { 0x01D7, 0x00DC, 0x0301},
- { 0x01D5, 0x00DC, 0x0304},
- { 0x01D9, 0x00DC, 0x030C},
- { 0x1EA7, 0x00E2, 0x0300},
- { 0x1EA5, 0x00E2, 0x0301},
- { 0x1EAB, 0x00E2, 0x0303},
- { 0x1EA9, 0x00E2, 0x0309},
- { 0x01DF, 0x00E4, 0x0304},
- { 0x01FB, 0x00E5, 0x0301},
- { 0x01FD, 0x00E6, 0x0301},
- { 0x01E3, 0x00E6, 0x0304},
- { 0x1E09, 0x00E7, 0x0301},
- { 0x1EC1, 0x00EA, 0x0300},
- { 0x1EBF, 0x00EA, 0x0301},
- { 0x1EC5, 0x00EA, 0x0303},
- { 0x1EC3, 0x00EA, 0x0309},
- { 0x1E2F, 0x00EF, 0x0301},
- { 0x1ED3, 0x00F4, 0x0300},
- { 0x1ED1, 0x00F4, 0x0301},
- { 0x1ED7, 0x00F4, 0x0303},
- { 0x1ED5, 0x00F4, 0x0309},
- { 0x1E4D, 0x00F5, 0x0301},
- { 0x022D, 0x00F5, 0x0304},
- { 0x1E4F, 0x00F5, 0x0308},
- { 0x022B, 0x00F6, 0x0304},
- { 0x01FF, 0x00F8, 0x0301},
- { 0x01DC, 0x00FC, 0x0300},
- { 0x01D8, 0x00FC, 0x0301},
- { 0x01D6, 0x00FC, 0x0304},
- { 0x01DA, 0x00FC, 0x030C},
- { 0x1EB0, 0x0102, 0x0300},
- { 0x1EAE, 0x0102, 0x0301},
- { 0x1EB4, 0x0102, 0x0303},
- { 0x1EB2, 0x0102, 0x0309},
- { 0x1EB1, 0x0103, 0x0300},
- { 0x1EAF, 0x0103, 0x0301},
- { 0x1EB5, 0x0103, 0x0303},
- { 0x1EB3, 0x0103, 0x0309},
- { 0x1E14, 0x0112, 0x0300},
- { 0x1E16, 0x0112, 0x0301},
- { 0x1E15, 0x0113, 0x0300},
- { 0x1E17, 0x0113, 0x0301},
- { 0x1E50, 0x014C, 0x0300},
- { 0x1E52, 0x014C, 0x0301},
- { 0x1E51, 0x014D, 0x0300},
- { 0x1E53, 0x014D, 0x0301},
- { 0x1E64, 0x015A, 0x0307},
- { 0x1E65, 0x015B, 0x0307},
- { 0x1E66, 0x0160, 0x0307},
- { 0x1E67, 0x0161, 0x0307},
- { 0x1E78, 0x0168, 0x0301},
- { 0x1E79, 0x0169, 0x0301},
- { 0x1E7A, 0x016A, 0x0308},
- { 0x1E7B, 0x016B, 0x0308},
- { 0x1E9B, 0x017F, 0x0307},
- { 0x1EDC, 0x01A0, 0x0300},
- { 0x1EDA, 0x01A0, 0x0301},
- { 0x1EE0, 0x01A0, 0x0303},
- { 0x1EDE, 0x01A0, 0x0309},
- { 0x1EE2, 0x01A0, 0x0323},
- { 0x1EDD, 0x01A1, 0x0300},
- { 0x1EDB, 0x01A1, 0x0301},
- { 0x1EE1, 0x01A1, 0x0303},
- { 0x1EDF, 0x01A1, 0x0309},
- { 0x1EE3, 0x01A1, 0x0323},
- { 0x1EEA, 0x01AF, 0x0300},
- { 0x1EE8, 0x01AF, 0x0301},
- { 0x1EEE, 0x01AF, 0x0303},
- { 0x1EEC, 0x01AF, 0x0309},
- { 0x1EF0, 0x01AF, 0x0323},
- { 0x1EEB, 0x01B0, 0x0300},
- { 0x1EE9, 0x01B0, 0x0301},
- { 0x1EEF, 0x01B0, 0x0303},
- { 0x1EED, 0x01B0, 0x0309},
- { 0x1EF1, 0x01B0, 0x0323},
- { 0x01EE, 0x01B7, 0x030C},
- { 0x01EC, 0x01EA, 0x0304},
- { 0x01ED, 0x01EB, 0x0304},
- { 0x01E0, 0x0226, 0x0304},
- { 0x01E1, 0x0227, 0x0304},
- { 0x1E1C, 0x0228, 0x0306},
- { 0x1E1D, 0x0229, 0x0306},
- { 0x0230, 0x022E, 0x0304},
- { 0x0231, 0x022F, 0x0304},
- { 0x01EF, 0x0292, 0x030C},
- { 0x0344, 0x0308, 0x0301},
- { 0x1FBA, 0x0391, 0x0300},
- { 0x0386, 0x0391, 0x0301},
- { 0x1FB9, 0x0391, 0x0304},
- { 0x1FB8, 0x0391, 0x0306},
- { 0x1F08, 0x0391, 0x0313},
- { 0x1F09, 0x0391, 0x0314},
- { 0x1FBC, 0x0391, 0x0345},
- { 0x1FC8, 0x0395, 0x0300},
- { 0x0388, 0x0395, 0x0301},
- { 0x1F18, 0x0395, 0x0313},
- { 0x1F19, 0x0395, 0x0314},
- { 0x1FCA, 0x0397, 0x0300},
- { 0x0389, 0x0397, 0x0301},
- { 0x1F28, 0x0397, 0x0313},
- { 0x1F29, 0x0397, 0x0314},
- { 0x1FCC, 0x0397, 0x0345},
- { 0x1FDA, 0x0399, 0x0300},
- { 0x038A, 0x0399, 0x0301},
- { 0x1FD9, 0x0399, 0x0304},
- { 0x1FD8, 0x0399, 0x0306},
- { 0x03AA, 0x0399, 0x0308},
- { 0x1F38, 0x0399, 0x0313},
- { 0x1F39, 0x0399, 0x0314},
- { 0x1FF8, 0x039F, 0x0300},
- { 0x038C, 0x039F, 0x0301},
- { 0x1F48, 0x039F, 0x0313},
- { 0x1F49, 0x039F, 0x0314},
- { 0x1FEC, 0x03A1, 0x0314},
- { 0x1FEA, 0x03A5, 0x0300},
- { 0x038E, 0x03A5, 0x0301},
- { 0x1FE9, 0x03A5, 0x0304},
- { 0x1FE8, 0x03A5, 0x0306},
- { 0x03AB, 0x03A5, 0x0308},
- { 0x1F59, 0x03A5, 0x0314},
- { 0x1FFA, 0x03A9, 0x0300},
- { 0x038F, 0x03A9, 0x0301},
- { 0x1F68, 0x03A9, 0x0313},
- { 0x1F69, 0x03A9, 0x0314},
- { 0x1FFC, 0x03A9, 0x0345},
- { 0x1FB4, 0x03AC, 0x0345},
- { 0x1FC4, 0x03AE, 0x0345},
- { 0x1F70, 0x03B1, 0x0300},
- { 0x03AC, 0x03B1, 0x0301},
- { 0x1FB1, 0x03B1, 0x0304},
- { 0x1FB0, 0x03B1, 0x0306},
- { 0x1F00, 0x03B1, 0x0313},
- { 0x1F01, 0x03B1, 0x0314},
- { 0x1FB6, 0x03B1, 0x0342},
- { 0x1FB3, 0x03B1, 0x0345},
- { 0x1F72, 0x03B5, 0x0300},
- { 0x03AD, 0x03B5, 0x0301},
- { 0x1F10, 0x03B5, 0x0313},
- { 0x1F11, 0x03B5, 0x0314},
- { 0x1F74, 0x03B7, 0x0300},
- { 0x03AE, 0x03B7, 0x0301},
- { 0x1F20, 0x03B7, 0x0313},
- { 0x1F21, 0x03B7, 0x0314},
- { 0x1FC6, 0x03B7, 0x0342},
- { 0x1FC3, 0x03B7, 0x0345},
- { 0x1F76, 0x03B9, 0x0300},
- { 0x03AF, 0x03B9, 0x0301},
- { 0x1FD1, 0x03B9, 0x0304},
- { 0x1FD0, 0x03B9, 0x0306},
- { 0x03CA, 0x03B9, 0x0308},
- { 0x1F30, 0x03B9, 0x0313},
- { 0x1F31, 0x03B9, 0x0314},
- { 0x1FD6, 0x03B9, 0x0342},
- { 0x1F78, 0x03BF, 0x0300},
- { 0x03CC, 0x03BF, 0x0301},
- { 0x1F40, 0x03BF, 0x0313},
- { 0x1F41, 0x03BF, 0x0314},
- { 0x1FE4, 0x03C1, 0x0313},
- { 0x1FE5, 0x03C1, 0x0314},
- { 0x1F7A, 0x03C5, 0x0300},
- { 0x03CD, 0x03C5, 0x0301},
- { 0x1FE1, 0x03C5, 0x0304},
- { 0x1FE0, 0x03C5, 0x0306},
- { 0x03CB, 0x03C5, 0x0308},
- { 0x1F50, 0x03C5, 0x0313},
- { 0x1F51, 0x03C5, 0x0314},
- { 0x1FE6, 0x03C5, 0x0342},
- { 0x1F7C, 0x03C9, 0x0300},
- { 0x03CE, 0x03C9, 0x0301},
- { 0x1F60, 0x03C9, 0x0313},
- { 0x1F61, 0x03C9, 0x0314},
- { 0x1FF6, 0x03C9, 0x0342},
- { 0x1FF3, 0x03C9, 0x0345},
- { 0x1FD2, 0x03CA, 0x0300},
- { 0x0390, 0x03CA, 0x0301},
- { 0x1FD7, 0x03CA, 0x0342},
- { 0x1FE2, 0x03CB, 0x0300},
- { 0x03B0, 0x03CB, 0x0301},
- { 0x1FE7, 0x03CB, 0x0342},
- { 0x1FF4, 0x03CE, 0x0345},
- { 0x03D3, 0x03D2, 0x0301},
- { 0x03D4, 0x03D2, 0x0308},
- { 0x0407, 0x0406, 0x0308},
- { 0x04D0, 0x0410, 0x0306},
- { 0x04D2, 0x0410, 0x0308},
- { 0x0403, 0x0413, 0x0301},
- { 0x0400, 0x0415, 0x0300},
- { 0x04D6, 0x0415, 0x0306},
- { 0x0401, 0x0415, 0x0308},
- { 0x04C1, 0x0416, 0x0306},
- { 0x04DC, 0x0416, 0x0308},
- { 0x04DE, 0x0417, 0x0308},
- { 0x040D, 0x0418, 0x0300},
- { 0x04E2, 0x0418, 0x0304},
- { 0x0419, 0x0418, 0x0306},
- { 0x04E4, 0x0418, 0x0308},
- { 0x040C, 0x041A, 0x0301},
- { 0x04E6, 0x041E, 0x0308},
- { 0x04EE, 0x0423, 0x0304},
- { 0x040E, 0x0423, 0x0306},
- { 0x04F0, 0x0423, 0x0308},
- { 0x04F2, 0x0423, 0x030B},
- { 0x04F4, 0x0427, 0x0308},
- { 0x04F8, 0x042B, 0x0308},
- { 0x04EC, 0x042D, 0x0308},
- { 0x04D1, 0x0430, 0x0306},
- { 0x04D3, 0x0430, 0x0308},
- { 0x0453, 0x0433, 0x0301},
- { 0x0450, 0x0435, 0x0300},
- { 0x04D7, 0x0435, 0x0306},
- { 0x0451, 0x0435, 0x0308},
- { 0x04C2, 0x0436, 0x0306},
- { 0x04DD, 0x0436, 0x0308},
- { 0x04DF, 0x0437, 0x0308},
- { 0x045D, 0x0438, 0x0300},
- { 0x04E3, 0x0438, 0x0304},
- { 0x0439, 0x0438, 0x0306},
- { 0x04E5, 0x0438, 0x0308},
- { 0x045C, 0x043A, 0x0301},
- { 0x04E7, 0x043E, 0x0308},
- { 0x04EF, 0x0443, 0x0304},
- { 0x045E, 0x0443, 0x0306},
- { 0x04F1, 0x0443, 0x0308},
- { 0x04F3, 0x0443, 0x030B},
- { 0x04F5, 0x0447, 0x0308},
- { 0x04F9, 0x044B, 0x0308},
- { 0x04ED, 0x044D, 0x0308},
- { 0x0457, 0x0456, 0x0308},
- { 0x0476, 0x0474, 0x030F},
- { 0x0477, 0x0475, 0x030F},
- { 0x04DA, 0x04D8, 0x0308},
- { 0x04DB, 0x04D9, 0x0308},
- { 0x04EA, 0x04E8, 0x0308},
- { 0x04EB, 0x04E9, 0x0308},
- { 0xFB2E, 0x05D0, 0x05B7},
- { 0xFB2F, 0x05D0, 0x05B8},
- { 0xFB30, 0x05D0, 0x05BC},
- { 0xFB31, 0x05D1, 0x05BC},
- { 0xFB4C, 0x05D1, 0x05BF},
- { 0xFB32, 0x05D2, 0x05BC},
- { 0xFB33, 0x05D3, 0x05BC},
- { 0xFB34, 0x05D4, 0x05BC},
- { 0xFB4B, 0x05D5, 0x05B9},
- { 0xFB35, 0x05D5, 0x05BC},
- { 0xFB36, 0x05D6, 0x05BC},
- { 0xFB38, 0x05D8, 0x05BC},
- { 0xFB1D, 0x05D9, 0x05B4},
- { 0xFB39, 0x05D9, 0x05BC},
- { 0xFB3A, 0x05DA, 0x05BC},
- { 0xFB3B, 0x05DB, 0x05BC},
- { 0xFB4D, 0x05DB, 0x05BF},
- { 0xFB3C, 0x05DC, 0x05BC},
- { 0xFB3E, 0x05DE, 0x05BC},
- { 0xFB40, 0x05E0, 0x05BC},
- { 0xFB41, 0x05E1, 0x05BC},
- { 0xFB43, 0x05E3, 0x05BC},
- { 0xFB44, 0x05E4, 0x05BC},
- { 0xFB4E, 0x05E4, 0x05BF},
- { 0xFB46, 0x05E6, 0x05BC},
- { 0xFB47, 0x05E7, 0x05BC},
- { 0xFB48, 0x05E8, 0x05BC},
- { 0xFB49, 0x05E9, 0x05BC},
- { 0xFB2A, 0x05E9, 0x05C1},
- { 0xFB2B, 0x05E9, 0x05C2},
- { 0xFB4A, 0x05EA, 0x05BC},
- { 0xFB1F, 0x05F2, 0x05B7},
- { 0x0622, 0x0627, 0x0653},
- { 0x0623, 0x0627, 0x0654},
- { 0x0625, 0x0627, 0x0655},
- { 0x0624, 0x0648, 0x0654},
- { 0x0626, 0x064A, 0x0654},
- { 0x06C2, 0x06C1, 0x0654},
- { 0x06D3, 0x06D2, 0x0654},
- { 0x06C0, 0x06D5, 0x0654},
- { 0x0958, 0x0915, 0x093C},
- { 0x0959, 0x0916, 0x093C},
- { 0x095A, 0x0917, 0x093C},
- { 0x095B, 0x091C, 0x093C},
- { 0x095C, 0x0921, 0x093C},
- { 0x095D, 0x0922, 0x093C},
- { 0x0929, 0x0928, 0x093C},
- { 0x095E, 0x092B, 0x093C},
- { 0x095F, 0x092F, 0x093C},
- { 0x0931, 0x0930, 0x093C},
- { 0x0934, 0x0933, 0x093C},
- { 0x09DC, 0x09A1, 0x09BC},
- { 0x09DD, 0x09A2, 0x09BC},
- { 0x09DF, 0x09AF, 0x09BC},
- { 0x09CB, 0x09C7, 0x09BE},
- { 0x09CC, 0x09C7, 0x09D7},
- { 0x0A59, 0x0A16, 0x0A3C},
- { 0x0A5A, 0x0A17, 0x0A3C},
- { 0x0A5B, 0x0A1C, 0x0A3C},
- { 0x0A5E, 0x0A2B, 0x0A3C},
- { 0x0A33, 0x0A32, 0x0A3C},
- { 0x0A36, 0x0A38, 0x0A3C},
- { 0x0B5C, 0x0B21, 0x0B3C},
- { 0x0B5D, 0x0B22, 0x0B3C},
- { 0x0B4B, 0x0B47, 0x0B3E},
- { 0x0B48, 0x0B47, 0x0B56},
- { 0x0B4C, 0x0B47, 0x0B57},
- { 0x0B94, 0x0B92, 0x0BD7},
- { 0x0BCA, 0x0BC6, 0x0BBE},
- { 0x0BCC, 0x0BC6, 0x0BD7},
- { 0x0BCB, 0x0BC7, 0x0BBE},
- { 0x0C48, 0x0C46, 0x0C56},
- { 0x0CC0, 0x0CBF, 0x0CD5},
- { 0x0CCA, 0x0CC6, 0x0CC2},
- { 0x0CC7, 0x0CC6, 0x0CD5},
- { 0x0CC8, 0x0CC6, 0x0CD6},
- { 0x0CCB, 0x0CCA, 0x0CD5},
- { 0x0D4A, 0x0D46, 0x0D3E},
- { 0x0D4C, 0x0D46, 0x0D57},
- { 0x0D4B, 0x0D47, 0x0D3E},
- { 0x0DDA, 0x0DD9, 0x0DCA},
- { 0x0DDC, 0x0DD9, 0x0DCF},
- { 0x0DDE, 0x0DD9, 0x0DDF},
- { 0x0DDD, 0x0DDC, 0x0DCA},
- { 0x0F69, 0x0F40, 0x0FB5},
- { 0x0F43, 0x0F42, 0x0FB7},
- { 0x0F4D, 0x0F4C, 0x0FB7},
- { 0x0F52, 0x0F51, 0x0FB7},
- { 0x0F57, 0x0F56, 0x0FB7},
- { 0x0F5C, 0x0F5B, 0x0FB7},
- { 0x0F73, 0x0F71, 0x0F72},
- { 0x0F75, 0x0F71, 0x0F74},
- { 0x0F81, 0x0F71, 0x0F80},
- { 0x0FB9, 0x0F90, 0x0FB5},
- { 0x0F93, 0x0F92, 0x0FB7},
- { 0x0F9D, 0x0F9C, 0x0FB7},
- { 0x0FA2, 0x0FA1, 0x0FB7},
- { 0x0FA7, 0x0FA6, 0x0FB7},
- { 0x0FAC, 0x0FAB, 0x0FB7},
- { 0x0F76, 0x0FB2, 0x0F80},
- { 0x0F78, 0x0FB3, 0x0F80},
- { 0x1026, 0x1025, 0x102E},
- { 0x1B06, 0x1B05, 0x1B35},
- { 0x1B08, 0x1B07, 0x1B35},
- { 0x1B0A, 0x1B09, 0x1B35},
- { 0x1B0C, 0x1B0B, 0x1B35},
- { 0x1B0E, 0x1B0D, 0x1B35},
- { 0x1B12, 0x1B11, 0x1B35},
- { 0x1B3B, 0x1B3A, 0x1B35},
- { 0x1B3D, 0x1B3C, 0x1B35},
- { 0x1B40, 0x1B3E, 0x1B35},
- { 0x1B41, 0x1B3F, 0x1B35},
- { 0x1B43, 0x1B42, 0x1B35},
- { 0x1E38, 0x1E36, 0x0304},
- { 0x1E39, 0x1E37, 0x0304},
- { 0x1E5C, 0x1E5A, 0x0304},
- { 0x1E5D, 0x1E5B, 0x0304},
- { 0x1E68, 0x1E62, 0x0307},
- { 0x1E69, 0x1E63, 0x0307},
- { 0x1EAC, 0x1EA0, 0x0302},
- { 0x1EB6, 0x1EA0, 0x0306},
- { 0x1EAD, 0x1EA1, 0x0302},
- { 0x1EB7, 0x1EA1, 0x0306},
- { 0x1EC6, 0x1EB8, 0x0302},
- { 0x1EC7, 0x1EB9, 0x0302},
- { 0x1ED8, 0x1ECC, 0x0302},
- { 0x1ED9, 0x1ECD, 0x0302},
- { 0x1F02, 0x1F00, 0x0300},
- { 0x1F04, 0x1F00, 0x0301},
- { 0x1F06, 0x1F00, 0x0342},
- { 0x1F80, 0x1F00, 0x0345},
- { 0x1F03, 0x1F01, 0x0300},
- { 0x1F05, 0x1F01, 0x0301},
- { 0x1F07, 0x1F01, 0x0342},
- { 0x1F81, 0x1F01, 0x0345},
- { 0x1F82, 0x1F02, 0x0345},
- { 0x1F83, 0x1F03, 0x0345},
- { 0x1F84, 0x1F04, 0x0345},
- { 0x1F85, 0x1F05, 0x0345},
- { 0x1F86, 0x1F06, 0x0345},
- { 0x1F87, 0x1F07, 0x0345},
- { 0x1F0A, 0x1F08, 0x0300},
- { 0x1F0C, 0x1F08, 0x0301},
- { 0x1F0E, 0x1F08, 0x0342},
- { 0x1F88, 0x1F08, 0x0345},
- { 0x1F0B, 0x1F09, 0x0300},
- { 0x1F0D, 0x1F09, 0x0301},
- { 0x1F0F, 0x1F09, 0x0342},
- { 0x1F89, 0x1F09, 0x0345},
- { 0x1F8A, 0x1F0A, 0x0345},
- { 0x1F8B, 0x1F0B, 0x0345},
- { 0x1F8C, 0x1F0C, 0x0345},
- { 0x1F8D, 0x1F0D, 0x0345},
- { 0x1F8E, 0x1F0E, 0x0345},
- { 0x1F8F, 0x1F0F, 0x0345},
- { 0x1F12, 0x1F10, 0x0300},
- { 0x1F14, 0x1F10, 0x0301},
- { 0x1F13, 0x1F11, 0x0300},
- { 0x1F15, 0x1F11, 0x0301},
- { 0x1F1A, 0x1F18, 0x0300},
- { 0x1F1C, 0x1F18, 0x0301},
- { 0x1F1B, 0x1F19, 0x0300},
- { 0x1F1D, 0x1F19, 0x0301},
- { 0x1F22, 0x1F20, 0x0300},
- { 0x1F24, 0x1F20, 0x0301},
- { 0x1F26, 0x1F20, 0x0342},
- { 0x1F90, 0x1F20, 0x0345},
- { 0x1F23, 0x1F21, 0x0300},
- { 0x1F25, 0x1F21, 0x0301},
- { 0x1F27, 0x1F21, 0x0342},
- { 0x1F91, 0x1F21, 0x0345},
- { 0x1F92, 0x1F22, 0x0345},
- { 0x1F93, 0x1F23, 0x0345},
- { 0x1F94, 0x1F24, 0x0345},
- { 0x1F95, 0x1F25, 0x0345},
- { 0x1F96, 0x1F26, 0x0345},
- { 0x1F97, 0x1F27, 0x0345},
- { 0x1F2A, 0x1F28, 0x0300},
- { 0x1F2C, 0x1F28, 0x0301},
- { 0x1F2E, 0x1F28, 0x0342},
- { 0x1F98, 0x1F28, 0x0345},
- { 0x1F2B, 0x1F29, 0x0300},
- { 0x1F2D, 0x1F29, 0x0301},
- { 0x1F2F, 0x1F29, 0x0342},
- { 0x1F99, 0x1F29, 0x0345},
- { 0x1F9A, 0x1F2A, 0x0345},
- { 0x1F9B, 0x1F2B, 0x0345},
- { 0x1F9C, 0x1F2C, 0x0345},
- { 0x1F9D, 0x1F2D, 0x0345},
- { 0x1F9E, 0x1F2E, 0x0345},
- { 0x1F9F, 0x1F2F, 0x0345},
- { 0x1F32, 0x1F30, 0x0300},
- { 0x1F34, 0x1F30, 0x0301},
- { 0x1F36, 0x1F30, 0x0342},
- { 0x1F33, 0x1F31, 0x0300},
- { 0x1F35, 0x1F31, 0x0301},
- { 0x1F37, 0x1F31, 0x0342},
- { 0x1F3A, 0x1F38, 0x0300},
- { 0x1F3C, 0x1F38, 0x0301},
- { 0x1F3E, 0x1F38, 0x0342},
- { 0x1F3B, 0x1F39, 0x0300},
- { 0x1F3D, 0x1F39, 0x0301},
- { 0x1F3F, 0x1F39, 0x0342},
- { 0x1F42, 0x1F40, 0x0300},
- { 0x1F44, 0x1F40, 0x0301},
- { 0x1F43, 0x1F41, 0x0300},
- { 0x1F45, 0x1F41, 0x0301},
- { 0x1F4A, 0x1F48, 0x0300},
- { 0x1F4C, 0x1F48, 0x0301},
- { 0x1F4B, 0x1F49, 0x0300},
- { 0x1F4D, 0x1F49, 0x0301},
- { 0x1F52, 0x1F50, 0x0300},
- { 0x1F54, 0x1F50, 0x0301},
- { 0x1F56, 0x1F50, 0x0342},
- { 0x1F53, 0x1F51, 0x0300},
- { 0x1F55, 0x1F51, 0x0301},
- { 0x1F57, 0x1F51, 0x0342},
- { 0x1F5B, 0x1F59, 0x0300},
- { 0x1F5D, 0x1F59, 0x0301},
- { 0x1F5F, 0x1F59, 0x0342},
- { 0x1F62, 0x1F60, 0x0300},
- { 0x1F64, 0x1F60, 0x0301},
- { 0x1F66, 0x1F60, 0x0342},
- { 0x1FA0, 0x1F60, 0x0345},
- { 0x1F63, 0x1F61, 0x0300},
- { 0x1F65, 0x1F61, 0x0301},
- { 0x1F67, 0x1F61, 0x0342},
- { 0x1FA1, 0x1F61, 0x0345},
- { 0x1FA2, 0x1F62, 0x0345},
- { 0x1FA3, 0x1F63, 0x0345},
- { 0x1FA4, 0x1F64, 0x0345},
- { 0x1FA5, 0x1F65, 0x0345},
- { 0x1FA6, 0x1F66, 0x0345},
- { 0x1FA7, 0x1F67, 0x0345},
- { 0x1F6A, 0x1F68, 0x0300},
- { 0x1F6C, 0x1F68, 0x0301},
- { 0x1F6E, 0x1F68, 0x0342},
- { 0x1FA8, 0x1F68, 0x0345},
- { 0x1F6B, 0x1F69, 0x0300},
- { 0x1F6D, 0x1F69, 0x0301},
- { 0x1F6F, 0x1F69, 0x0342},
- { 0x1FA9, 0x1F69, 0x0345},
- { 0x1FAA, 0x1F6A, 0x0345},
- { 0x1FAB, 0x1F6B, 0x0345},
- { 0x1FAC, 0x1F6C, 0x0345},
- { 0x1FAD, 0x1F6D, 0x0345},
- { 0x1FAE, 0x1F6E, 0x0345},
- { 0x1FAF, 0x1F6F, 0x0345},
- { 0x1FB2, 0x1F70, 0x0345},
- { 0x1FC2, 0x1F74, 0x0345},
- { 0x1FF2, 0x1F7C, 0x0345},
- { 0x1FB7, 0x1FB6, 0x0345},
- { 0x1FCD, 0x1FBF, 0x0300},
- { 0x1FCE, 0x1FBF, 0x0301},
- { 0x1FCF, 0x1FBF, 0x0342},
- { 0x1FC7, 0x1FC6, 0x0345},
- { 0x1FF7, 0x1FF6, 0x0345},
- { 0x1FDD, 0x1FFE, 0x0300},
- { 0x1FDE, 0x1FFE, 0x0301},
- { 0x1FDF, 0x1FFE, 0x0342},
- { 0x219A, 0x2190, 0x0338},
- { 0x219B, 0x2192, 0x0338},
- { 0x21AE, 0x2194, 0x0338},
- { 0x21CD, 0x21D0, 0x0338},
- { 0x21CF, 0x21D2, 0x0338},
- { 0x21CE, 0x21D4, 0x0338},
- { 0x2204, 0x2203, 0x0338},
- { 0x2209, 0x2208, 0x0338},
- { 0x220C, 0x220B, 0x0338},
- { 0x2224, 0x2223, 0x0338},
- { 0x2226, 0x2225, 0x0338},
- { 0x2241, 0x223C, 0x0338},
- { 0x2244, 0x2243, 0x0338},
- { 0x2247, 0x2245, 0x0338},
- { 0x2249, 0x2248, 0x0338},
- { 0x226D, 0x224D, 0x0338},
- { 0x2262, 0x2261, 0x0338},
- { 0x2270, 0x2264, 0x0338},
- { 0x2271, 0x2265, 0x0338},
- { 0x2274, 0x2272, 0x0338},
- { 0x2275, 0x2273, 0x0338},
- { 0x2278, 0x2276, 0x0338},
- { 0x2279, 0x2277, 0x0338},
- { 0x2280, 0x227A, 0x0338},
- { 0x2281, 0x227B, 0x0338},
- { 0x22E0, 0x227C, 0x0338},
- { 0x22E1, 0x227D, 0x0338},
- { 0x2284, 0x2282, 0x0338},
- { 0x2285, 0x2283, 0x0338},
- { 0x2288, 0x2286, 0x0338},
- { 0x2289, 0x2287, 0x0338},
- { 0x22E2, 0x2291, 0x0338},
- { 0x22E3, 0x2292, 0x0338},
- { 0x22AC, 0x22A2, 0x0338},
- { 0x22AD, 0x22A8, 0x0338},
- { 0x22AE, 0x22A9, 0x0338},
- { 0x22AF, 0x22AB, 0x0338},
- { 0x22EA, 0x22B2, 0x0338},
- { 0x22EB, 0x22B3, 0x0338},
- { 0x22EC, 0x22B4, 0x0338},
- { 0x22ED, 0x22B5, 0x0338},
- { 0x2ADC, 0x2ADD, 0x0338},
- { 0x3094, 0x3046, 0x3099},
- { 0x304C, 0x304B, 0x3099},
- { 0x304E, 0x304D, 0x3099},
- { 0x3050, 0x304F, 0x3099},
- { 0x3052, 0x3051, 0x3099},
- { 0x3054, 0x3053, 0x3099},
- { 0x3056, 0x3055, 0x3099},
- { 0x3058, 0x3057, 0x3099},
- { 0x305A, 0x3059, 0x3099},
- { 0x305C, 0x305B, 0x3099},
- { 0x305E, 0x305D, 0x3099},
- { 0x3060, 0x305F, 0x3099},
- { 0x3062, 0x3061, 0x3099},
- { 0x3065, 0x3064, 0x3099},
- { 0x3067, 0x3066, 0x3099},
- { 0x3069, 0x3068, 0x3099},
- { 0x3070, 0x306F, 0x3099},
- { 0x3071, 0x306F, 0x309A},
- { 0x3073, 0x3072, 0x3099},
- { 0x3074, 0x3072, 0x309A},
- { 0x3076, 0x3075, 0x3099},
- { 0x3077, 0x3075, 0x309A},
- { 0x3079, 0x3078, 0x3099},
- { 0x307A, 0x3078, 0x309A},
- { 0x307C, 0x307B, 0x3099},
- { 0x307D, 0x307B, 0x309A},
- { 0x309E, 0x309D, 0x3099},
- { 0x30F4, 0x30A6, 0x3099},
- { 0x30AC, 0x30AB, 0x3099},
- { 0x30AE, 0x30AD, 0x3099},
- { 0x30B0, 0x30AF, 0x3099},
- { 0x30B2, 0x30B1, 0x3099},
- { 0x30B4, 0x30B3, 0x3099},
- { 0x30B6, 0x30B5, 0x3099},
- { 0x30B8, 0x30B7, 0x3099},
- { 0x30BA, 0x30B9, 0x3099},
- { 0x30BC, 0x30BB, 0x3099},
- { 0x30BE, 0x30BD, 0x3099},
- { 0x30C0, 0x30BF, 0x3099},
- { 0x30C2, 0x30C1, 0x3099},
- { 0x30C5, 0x30C4, 0x3099},
- { 0x30C7, 0x30C6, 0x3099},
- { 0x30C9, 0x30C8, 0x3099},
- { 0x30D0, 0x30CF, 0x3099},
- { 0x30D1, 0x30CF, 0x309A},
- { 0x30D3, 0x30D2, 0x3099},
- { 0x30D4, 0x30D2, 0x309A},
- { 0x30D6, 0x30D5, 0x3099},
- { 0x30D7, 0x30D5, 0x309A},
- { 0x30D9, 0x30D8, 0x3099},
- { 0x30DA, 0x30D8, 0x309A},
- { 0x30DC, 0x30DB, 0x3099},
- { 0x30DD, 0x30DB, 0x309A},
- { 0x30F7, 0x30EF, 0x3099},
- { 0x30F8, 0x30F0, 0x3099},
- { 0x30F9, 0x30F1, 0x3099},
- { 0x30FA, 0x30F2, 0x3099},
- { 0x30FE, 0x30FD, 0x3099},
- { 0xFB2C, 0xFB49, 0x05C1},
- { 0xFB2D, 0xFB49, 0x05C2},
- };
-
- private static final int UNICODE_SHIFT = 21;
-
- public static char precompose(char base, char comb) {
- int min = 0;
- int max = precompositions.length - 1;
- int mid;
-
- long sought = base << UNICODE_SHIFT | comb;
- long that;
-
- while (max >= min) {
- mid = (min + max) / 2;
- that = precompositions[mid][1] << UNICODE_SHIFT | precompositions[mid][2];
- if (that < sought)
- min = mid + 1;
- else if (that > sought)
- max = mid - 1;
- else
- return precompositions[mid][0];
- }
-
- // No match; return character without combiner
- return base;
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/de/mud/terminal/VDUBuffer.java b/sl4a/ScriptingLayerForAndroid/src/de/mud/terminal/VDUBuffer.java
deleted file mode 100644
index 58cf20b..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/de/mud/terminal/VDUBuffer.java
+++ /dev/null
@@ -1,931 +0,0 @@
-/*
- * This file is part of "JTA - Telnet/SSH for the JAVA(tm) platform".
- *
- * (c) Matthias L. Jugel, Marcus Mei�ner 1996-2005. All Rights Reserved.
- *
- * Please visit http://javatelnet.org/ for updates and contact.
- *
- * --LICENSE NOTICE--
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- * --LICENSE NOTICE--
- *
- */
-
-package de.mud.terminal;
-
-import java.util.Arrays;
-
-/**
- * Implementation of a Video Display Unit (VDU) buffer. This class contains all methods to
- * manipulate the buffer that stores characters and their attributes as well as the regions
- * displayed.
- *
- * @author Matthias L. Jugel, Marcus Meißner
- * @version $Id: VDUBuffer.java 503 2005-10-24 07:34:13Z marcus $
- */
-public class VDUBuffer {
-
- /** The current version id tag */
- public final static String ID = "$Id: VDUBuffer.java 503 2005-10-24 07:34:13Z marcus $";
-
- /** Enable debug messages. */
- public final static int debug = 0;
-
- public int height, width; /* rows and columns */
- public boolean[] update; /* contains the lines that need update */
- public char[][] charArray; /* contains the characters */
- public int[][] charAttributes; /* contains character attrs */
- public int bufSize;
- public int maxBufSize; /* buffer sizes */
- public int screenBase; /* the actual screen start */
- public int windowBase; /* where the start displaying */
- public int scrollMarker; /* marks the last line inserted */
-
- private int topMargin; /* top scroll margin */
- private int bottomMargin; /* bottom scroll margin */
-
- // cursor variables
- protected boolean showcursor = true;
- protected int cursorX, cursorY;
-
- /** Scroll up when inserting a line. */
- public final static boolean SCROLL_UP = false;
- /** Scroll down when inserting a line. */
- public final static boolean SCROLL_DOWN = true;
-
- /*
- * Attributes bit-field usage:
- *
- * 8421 8421 8421 8421 8421 8421 8421 8421 |||| |||| |||| |||| |||| |||| |||| |||`- Bold |||| ||||
- * |||| |||| |||| |||| |||| ||`-- Underline |||| |||| |||| |||| |||| |||| |||| |`--- Invert ||||
- * |||| |||| |||| |||| |||| |||| `---- Low |||| |||| |||| |||| |||| |||| |||`------ Invisible ||||
- * |||| |||| |||| ||`+-++++-+++------- Foreground Color |||| |||| |`++-++++-++------------------
- * Background Color |||| |||| `----------------------------- Fullwidth character
- * `+++-++++------------------------------- Reserved for future use
- */
-
- /** Make character normal. */
- public final static int NORMAL = 0x00;
- /** Make character bold. */
- public final static int BOLD = 0x01;
- /** Underline character. */
- public final static int UNDERLINE = 0x02;
- /** Invert character. */
- public final static int INVERT = 0x04;
- /** Lower intensity character. */
- public final static int LOW = 0x08;
- /** Invisible character. */
- public final static int INVISIBLE = 0x10;
- /** Unicode full-width character (CJK, et al.) */
- public final static int FULLWIDTH = 0x8000000;
-
- /** how much to left shift the foreground color */
- public final static int COLOR_FG_SHIFT = 5;
- /** how much to left shift the background color */
- public final static int COLOR_BG_SHIFT = 14;
- /** color mask */
- public final static int COLOR = 0x7fffe0; /* 0000 0000 0111 1111 1111 1111 1110 0000 */
- /** foreground color mask */
- public final static int COLOR_FG = 0x3fe0; /* 0000 0000 0000 0000 0011 1111 1110 0000 */
- /** background color mask */
- public final static int COLOR_BG = 0x7fc000; /* 0000 0000 0111 1111 1100 0000 0000 0000 */
-
- /**
- * Create a new video display buffer with the passed width and height in characters.
- *
- * @param width
- * the length of the character lines
- * @param height
- * the amount of lines on the screen
- */
- public VDUBuffer(int width, int height) {
- // set the display screen size
- setScreenSize(width, height, false);
- }
-
- /**
- * Create a standard video display buffer with 80 columns and 24 lines.
- */
- public VDUBuffer() {
- this(80, 24);
- }
-
- /**
- * Put a character on the screen with normal font and outline. The character previously on that
- * position will be overwritten. You need to call redraw() to update the screen.
- *
- * @param c
- * x-coordinate (column)
- * @param l
- * y-coordinate (line)
- * @param ch
- * the character to show on the screen
- * @see #insertChar
- * @see #deleteChar
- * @see #redraw
- */
- public void putChar(int c, int l, char ch) {
- putChar(c, l, ch, NORMAL);
- }
-
- /**
- * Put a character on the screen with specific font and outline. The character previously on that
- * position will be overwritten. You need to call redraw() to update the screen.
- *
- * @param c
- * x-coordinate (column)
- * @param l
- * y-coordinate (line)
- * @param ch
- * the character to show on the screen
- * @param attributes
- * the character attributes
- * @see #BOLD
- * @see #UNDERLINE
- * @see #INVERT
- * @see #INVISIBLE
- * @see #NORMAL
- * @see #LOW
- * @see #insertChar
- * @see #deleteChar
- * @see #redraw
- */
-
- public void putChar(int c, int l, char ch, int attributes) {
- charArray[screenBase + l][c] = ch;
- charAttributes[screenBase + l][c] = attributes;
- if (l < height) {
- update[l + 1] = true;
- }
- }
-
- /**
- * Get the character at the specified position.
- *
- * @param c
- * x-coordinate (column)
- * @param l
- * y-coordinate (line)
- * @see #putChar
- */
- public char getChar(int c, int l) {
- return charArray[screenBase + l][c];
- }
-
- /**
- * Get the attributes for the specified position.
- *
- * @param c
- * x-coordinate (column)
- * @param l
- * y-coordinate (line)
- * @see #putChar
- */
- public int getAttributes(int c, int l) {
- return charAttributes[screenBase + l][c];
- }
-
- /**
- * Insert a character at a specific position on the screen. All character right to from this
- * position will be moved one to the right. You need to call redraw() to update the screen.
- *
- * @param c
- * x-coordinate (column)
- * @param l
- * y-coordinate (line)
- * @param ch
- * the character to insert
- * @param attributes
- * the character attributes
- * @see #BOLD
- * @see #UNDERLINE
- * @see #INVERT
- * @see #INVISIBLE
- * @see #NORMAL
- * @see #LOW
- * @see #putChar
- * @see #deleteChar
- * @see #redraw
- */
- public void insertChar(int c, int l, char ch, int attributes) {
- System.arraycopy(charArray[screenBase + l], c, charArray[screenBase + l], c + 1, width - c - 1);
- System.arraycopy(charAttributes[screenBase + l], c, charAttributes[screenBase + l], c + 1,
- width - c - 1);
- putChar(c, l, ch, attributes);
- }
-
- /**
- * Delete a character at a given position on the screen. All characters right to the position will
- * be moved one to the left. You need to call redraw() to update the screen.
- *
- * @param c
- * x-coordinate (column)
- * @param l
- * y-coordinate (line)
- * @see #putChar
- * @see #insertChar
- * @see #redraw
- */
- public void deleteChar(int c, int l) {
- if (c < width - 1) {
- System.arraycopy(charArray[screenBase + l], c + 1, charArray[screenBase + l], c, width - c
- - 1);
- System.arraycopy(charAttributes[screenBase + l], c + 1, charAttributes[screenBase + l], c,
- width - c - 1);
- }
- putChar(width - 1, l, (char) 0);
- }
-
- /**
- * Put a String at a specific position. Any characters previously on that position will be
- * overwritten. You need to call redraw() for screen update.
- *
- * @param c
- * x-coordinate (column)
- * @param l
- * y-coordinate (line)
- * @param s
- * the string to be shown on the screen
- * @see #BOLD
- * @see #UNDERLINE
- * @see #INVERT
- * @see #INVISIBLE
- * @see #NORMAL
- * @see #LOW
- * @see #putChar
- * @see #insertLine
- * @see #deleteLine
- * @see #redraw
- */
- public void putString(int c, int l, String s) {
- putString(c, l, s, NORMAL);
- }
-
- /**
- * Put a String at a specific position giving all characters the same attributes. Any characters
- * previously on that position will be overwritten. You need to call redraw() to update the
- * screen.
- *
- * @param c
- * x-coordinate (column)
- * @param l
- * y-coordinate (line)
- * @param s
- * the string to be shown on the screen
- * @param attributes
- * character attributes
- * @see #BOLD
- * @see #UNDERLINE
- * @see #INVERT
- * @see #INVISIBLE
- * @see #NORMAL
- * @see #LOW
- * @see #putChar
- * @see #insertLine
- * @see #deleteLine
- * @see #redraw
- */
- public void putString(int c, int l, String s, int attributes) {
- for (int i = 0; i < s.length() && c + i < width; i++) {
- putChar(c + i, l, s.charAt(i), attributes);
- }
- }
-
- /**
- * Insert a blank line at a specific position. The current line and all previous lines are
- * scrolled one line up. The top line is lost. You need to call redraw() to update the screen.
- *
- * @param l
- * the y-coordinate to insert the line
- * @see #deleteLine
- * @see #redraw
- */
- public void insertLine(int l) {
- insertLine(l, 1, SCROLL_UP);
- }
-
- /**
- * Insert blank lines at a specific position. You need to call redraw() to update the screen
- *
- * @param l
- * the y-coordinate to insert the line
- * @param n
- * amount of lines to be inserted
- * @see #deleteLine
- * @see #redraw
- */
- public void insertLine(int l, int n) {
- insertLine(l, n, SCROLL_UP);
- }
-
- /**
- * Insert a blank line at a specific position. Scroll text according to the argument. You need to
- * call redraw() to update the screen
- *
- * @param l
- * the y-coordinate to insert the line
- * @param scrollDown
- * scroll down
- * @see #deleteLine
- * @see #SCROLL_UP
- * @see #SCROLL_DOWN
- * @see #redraw
- */
- public void insertLine(int l, boolean scrollDown) {
- insertLine(l, 1, scrollDown);
- }
-
- /**
- * Insert blank lines at a specific position. The current line and all previous lines are scrolled
- * one line up. The top line is lost. You need to call redraw() to update the screen.
- *
- * @param l
- * the y-coordinate to insert the line
- * @param n
- * number of lines to be inserted
- * @param scrollDown
- * scroll down
- * @see #deleteLine
- * @see #SCROLL_UP
- * @see #SCROLL_DOWN
- * @see #redraw
- */
- public synchronized void insertLine(int l, int n, boolean scrollDown) {
- char cbuf[][] = null;
- int abuf[][] = null;
- int offset = 0;
- int oldBase = screenBase;
-
- int newScreenBase = screenBase;
- int newWindowBase = windowBase;
- int newBufSize = bufSize;
-
- if (l > bottomMargin) {
- return;
- }
- int top =
- (l < topMargin ? 0 : (l > bottomMargin ? (bottomMargin + 1 < height ? bottomMargin + 1
- : height - 1) : topMargin));
- int bottom =
- (l > bottomMargin ? height - 1 : (l < topMargin ? (topMargin > 0 ? topMargin - 1 : 0)
- : bottomMargin));
-
- // System.out.println("l is "+l+", top is "+top+", bottom is "+bottom+", bottomargin is "+bottomMargin+", topMargin is "+topMargin);
-
- if (scrollDown) {
- if (n > (bottom - top)) {
- n = (bottom - top);
- }
- int size = bottom - l - (n - 1);
- if (size < 0) {
- size = 0;
- }
- cbuf = new char[size][];
- abuf = new int[size][];
-
- System.arraycopy(charArray, oldBase + l, cbuf, 0, bottom - l - (n - 1));
- System.arraycopy(charAttributes, oldBase + l, abuf, 0, bottom - l - (n - 1));
- System.arraycopy(cbuf, 0, charArray, oldBase + l + n, bottom - l - (n - 1));
- System.arraycopy(abuf, 0, charAttributes, oldBase + l + n, bottom - l - (n - 1));
- cbuf = charArray;
- abuf = charAttributes;
- } else {
- try {
- if (n > (bottom - top) + 1) {
- n = (bottom - top) + 1;
- }
- if (bufSize < maxBufSize) {
- if (bufSize + n > maxBufSize) {
- offset = n - (maxBufSize - bufSize);
- scrollMarker += offset;
- newBufSize = maxBufSize;
- newScreenBase = maxBufSize - height - 1;
- newWindowBase = screenBase;
- } else {
- scrollMarker += n;
- newScreenBase += n;
- newWindowBase += n;
- newBufSize += n;
- }
-
- cbuf = new char[newBufSize][];
- abuf = new int[newBufSize][];
- } else {
- offset = n;
- cbuf = charArray;
- abuf = charAttributes;
- }
- // copy anything from the top of the buffer (+offset) to the new top
- // up to the screenBase.
- if (oldBase > 0) {
- System.arraycopy(charArray, offset, cbuf, 0, oldBase - offset);
- System.arraycopy(charAttributes, offset, abuf, 0, oldBase - offset);
- }
- // copy anything from the top of the screen (screenBase) up to the
- // topMargin to the new screen
- if (top > 0) {
- System.arraycopy(charArray, oldBase, cbuf, newScreenBase, top);
- System.arraycopy(charAttributes, oldBase, abuf, newScreenBase, top);
- }
- // copy anything from the topMargin up to the amount of lines inserted
- // to the gap left over between scrollback buffer and screenBase
- if (oldBase >= 0) {
- System.arraycopy(charArray, oldBase + top, cbuf, oldBase - offset, n);
- System.arraycopy(charAttributes, oldBase + top, abuf, oldBase - offset, n);
- }
- // copy anything from topMargin + n up to the line linserted to the
- // topMargin
- System
- .arraycopy(charArray, oldBase + top + n, cbuf, newScreenBase + top, l - top - (n - 1));
- System.arraycopy(charAttributes, oldBase + top + n, abuf, newScreenBase + top, l - top
- - (n - 1));
- //
- // copy the all lines next to the inserted to the new buffer
- if (l < height - 1) {
- System.arraycopy(charArray, oldBase + l + 1, cbuf, newScreenBase + l + 1, (height - 1)
- - l);
- System.arraycopy(charAttributes, oldBase + l + 1, abuf, newScreenBase + l + 1,
- (height - 1) - l);
- }
- } catch (ArrayIndexOutOfBoundsException e) {
- // this should not happen anymore, but I will leave the code
- // here in case something happens anyway. That code above is
- // so complex I always have a hard time understanding what
- // I did, even though there are comments
- System.err.println("*** Error while scrolling up:");
- System.err.println("--- BEGIN STACK TRACE ---");
- e.printStackTrace();
- System.err.println("--- END STACK TRACE ---");
- System.err.println("bufSize=" + bufSize + ", maxBufSize=" + maxBufSize);
- System.err.println("top=" + top + ", bottom=" + bottom);
- System.err.println("n=" + n + ", l=" + l);
- System.err.println("screenBase=" + screenBase + ", windowBase=" + windowBase);
- System.err.println("newScreenBase=" + newScreenBase + ", newWindowBase=" + newWindowBase);
- System.err.println("oldBase=" + oldBase);
- System.err.println("size.width=" + width + ", size.height=" + height);
- System.err.println("abuf.length=" + abuf.length + ", cbuf.length=" + cbuf.length);
- System.err.println("*** done dumping debug information");
- }
- }
-
- // this is a little helper to mark the scrolling
- scrollMarker -= n;
-
- for (int i = 0; i < n; i++) {
- cbuf[(newScreenBase + l) + (scrollDown ? i : -i)] = new char[width];
- Arrays.fill(cbuf[(newScreenBase + l) + (scrollDown ? i : -i)], ' ');
- abuf[(newScreenBase + l) + (scrollDown ? i : -i)] = new int[width];
- }
-
- charArray = cbuf;
- charAttributes = abuf;
- screenBase = newScreenBase;
- windowBase = newWindowBase;
- bufSize = newBufSize;
-
- if (scrollDown) {
- markLine(l, bottom - l + 1);
- } else {
- markLine(top, l - top + 1);
- }
-
- display.updateScrollBar();
- }
-
- /**
- * Delete a line at a specific position. Subsequent lines will be scrolled up to fill the space
- * and a blank line is inserted at the end of the screen.
- *
- * @param l
- * the y-coordinate to insert the line
- * @see #deleteLine
- */
- public void deleteLine(int l) {
- int bottom = (l > bottomMargin ? height - 1 : (l < topMargin ? topMargin : bottomMargin + 1));
- int numRows = bottom - l - 1;
-
- char[] discardedChars = charArray[screenBase + l];
- int[] discardedAttributes = charAttributes[screenBase + l];
-
- if (numRows > 0) {
- System.arraycopy(charArray, screenBase + l + 1, charArray, screenBase + l, numRows);
- System.arraycopy(charAttributes, screenBase + l + 1, charAttributes, screenBase + l, numRows);
- }
-
- int newBottomRow = screenBase + bottom - 1;
- charArray[newBottomRow] = discardedChars;
- charAttributes[newBottomRow] = discardedAttributes;
- Arrays.fill(charArray[newBottomRow], ' ');
- Arrays.fill(charAttributes[newBottomRow], 0);
-
- markLine(l, bottom - l);
- }
-
- /**
- * Delete a rectangular portion of the screen. You need to call redraw() to update the screen.
- *
- * @param c
- * x-coordinate (column)
- * @param l
- * y-coordinate (row)
- * @param w
- * with of the area in characters
- * @param h
- * height of the area in characters
- * @param curAttr
- * attribute to fill
- * @see #deleteChar
- * @see #deleteLine
- * @see #redraw
- */
- public void deleteArea(int c, int l, int w, int h, int curAttr) {
- int endColumn = c + w;
- int targetRow = screenBase + l;
- for (int i = 0; i < h && l + i < height; i++) {
- Arrays.fill(charAttributes[targetRow], c, endColumn, curAttr);
- Arrays.fill(charArray[targetRow], c, endColumn, ' ');
- targetRow++;
- }
- markLine(l, h);
- }
-
- /**
- * Delete a rectangular portion of the screen. You need to call redraw() to update the screen.
- *
- * @param c
- * x-coordinate (column)
- * @param l
- * y-coordinate (row)
- * @param w
- * with of the area in characters
- * @param h
- * height of the area in characters
- * @see #deleteChar
- * @see #deleteLine
- * @see #redraw
- */
- public void deleteArea(int c, int l, int w, int h) {
- deleteArea(c, l, w, h, 0);
- }
-
- /**
- * Sets whether the cursor is visible or not.
- *
- * @param doshow
- */
- public void showCursor(boolean doshow) {
- showcursor = doshow;
- }
-
- /**
- * Check whether the cursor is currently visible.
- *
- * @return visibility
- */
- public boolean isCursorVisible() {
- return showcursor;
- }
-
- /**
- * Puts the cursor at the specified position.
- *
- * @param c
- * column
- * @param l
- * line
- */
- public void setCursorPosition(int c, int l) {
- cursorX = c;
- cursorY = l;
- }
-
- /**
- * Get the current column of the cursor position.
- */
- public int getCursorColumn() {
- return cursorX;
- }
-
- /**
- * Get the current line of the cursor position.
- */
- public int getCursorRow() {
- return cursorY;
- }
-
- /**
- * Set the current window base. This allows to view the scrollback buffer.
- *
- * @param line
- * the line where the screen window starts
- * @see #setBufferSize
- * @see #getBufferSize
- */
- public void setWindowBase(int line) {
- if (line > screenBase) {
- line = screenBase;
- } else if (line < 0) {
- line = 0;
- }
- windowBase = line;
- update[0] = true;
- redraw();
- }
-
- /**
- * Get the current window base.
- *
- * @see #setWindowBase
- */
- public int getWindowBase() {
- return windowBase;
- }
-
- /**
- * Set the scroll margins simultaneously. If they're out of bounds, trim them.
- *
- * @param l1
- * line that is the top
- * @param l2
- * line that is the bottom
- */
- public void setMargins(int l1, int l2) {
- if (l1 > l2) {
- return;
- }
-
- if (l1 < 0) {
- l1 = 0;
- }
- if (l2 >= height) {
- l2 = height - 1;
- }
-
- topMargin = l1;
- bottomMargin = l2;
- }
-
- /**
- * Set the top scroll margin for the screen. If the current bottom margin is smaller it will
- * become the top margin and the line will become the bottom margin.
- *
- * @param l
- * line that is the margin
- */
- public void setTopMargin(int l) {
- if (l > bottomMargin) {
- topMargin = bottomMargin;
- bottomMargin = l;
- } else {
- topMargin = l;
- }
- if (topMargin < 0) {
- topMargin = 0;
- }
- if (bottomMargin >= height) {
- bottomMargin = height - 1;
- }
- }
-
- /**
- * Get the top scroll margin.
- */
- public int getTopMargin() {
- return topMargin;
- }
-
- /**
- * Set the bottom scroll margin for the screen. If the current top margin is bigger it will become
- * the bottom margin and the line will become the top margin.
- *
- * @param l
- * line that is the margin
- */
- public void setBottomMargin(int l) {
- if (l < topMargin) {
- bottomMargin = topMargin;
- topMargin = l;
- } else {
- bottomMargin = l;
- }
- if (topMargin < 0) {
- topMargin = 0;
- }
- if (bottomMargin >= height) {
- bottomMargin = height - 1;
- }
- }
-
- /**
- * Get the bottom scroll margin.
- */
- public int getBottomMargin() {
- return bottomMargin;
- }
-
- /**
- * Set scrollback buffer size.
- *
- * @param amount
- * new size of the buffer
- */
- public void setBufferSize(int amount) {
- if (amount < height) {
- amount = height;
- }
- if (amount < maxBufSize) {
- char cbuf[][] = new char[amount][width];
- int abuf[][] = new int[amount][width];
- int copyStart = bufSize - amount < 0 ? 0 : bufSize - amount;
- int copyCount = bufSize - amount < 0 ? bufSize : amount;
- if (charArray != null) {
- System.arraycopy(charArray, copyStart, cbuf, 0, copyCount);
- }
- if (charAttributes != null) {
- System.arraycopy(charAttributes, copyStart, abuf, 0, copyCount);
- }
- charArray = cbuf;
- charAttributes = abuf;
- bufSize = copyCount;
- screenBase = bufSize - height;
- windowBase = screenBase;
- }
- maxBufSize = amount;
-
- update[0] = true;
- redraw();
- }
-
- /**
- * Retrieve current scrollback buffer size.
- *
- * @see #setBufferSize
- */
- public int getBufferSize() {
- return bufSize;
- }
-
- /**
- * Retrieve maximum buffer Size.
- *
- * @see #getBufferSize
- */
- public int getMaxBufferSize() {
- return maxBufSize;
- }
-
- /**
- * Change the size of the screen. This will include adjustment of the scrollback buffer.
- *
- * @param w
- * of the screen
- * @param h
- * of the screen
- */
- @SuppressWarnings("unused")
- public void setScreenSize(int w, int h, boolean broadcast) {
- char cbuf[][];
- int abuf[][];
- int maxSize = bufSize;
-
- if (w < 1 || h < 1) {
- return;
- }
-
- if (debug > 0) {
- System.err.println("VDU: screen size [" + w + "," + h + "]");
- }
-
- if (h > maxBufSize) {
- maxBufSize = h;
- }
-
- if (h > bufSize) {
- bufSize = h;
- screenBase = 0;
- windowBase = 0;
- }
-
- if (windowBase + h >= bufSize) {
- windowBase = bufSize - h;
- }
-
- if (screenBase + h >= bufSize) {
- screenBase = bufSize - h;
- }
-
- cbuf = new char[bufSize][w];
- abuf = new int[bufSize][w];
-
- for (int i = 0; i < bufSize; i++) {
- Arrays.fill(cbuf[i], ' ');
- }
-
- if (bufSize < maxSize) {
- maxSize = bufSize;
- }
-
- int rowLength;
- if (charArray != null && charAttributes != null) {
- for (int i = 0; i < maxSize && charArray[i] != null; i++) {
- rowLength = charArray[i].length;
- System.arraycopy(charArray[i], 0, cbuf[i], 0, w < rowLength ? w : rowLength);
- System.arraycopy(charAttributes[i], 0, abuf[i], 0, w < rowLength ? w : rowLength);
- }
- }
-
- int C = getCursorColumn();
- if (C < 0) {
- C = 0;
- } else if (C >= width) {
- C = width - 1;
- }
-
- int R = getCursorRow();
- if (R < 0) {
- R = 0;
- } else if (R >= height) {
- R = height - 1;
- }
-
- setCursorPosition(C, R);
-
- charArray = cbuf;
- charAttributes = abuf;
- width = w;
- height = h;
- topMargin = 0;
- bottomMargin = h - 1;
- update = new boolean[h + 1];
- update[0] = true;
- /*
- * FIXME: ??? if(resizeStrategy == RESIZE_FONT) setBounds(getBounds());
- */
- }
-
- /**
- * Get amount of rows on the screen.
- */
- public int getRows() {
- return height;
- }
-
- /**
- * Get amount of columns on the screen.
- */
- public int getColumns() {
- return width;
- }
-
- /**
- * Mark lines to be updated with redraw().
- *
- * @param l
- * starting line
- * @param n
- * amount of lines to be updated
- * @see #redraw
- */
- public void markLine(int l, int n) {
- for (int i = 0; (i < n) && (l + i < height); i++) {
- update[l + i + 1] = true;
- }
- }
-
- // private static int checkBounds(int value, int lower, int upper) {
- // if (value < lower)
- // return lower;
- // else if (value > upper)
- // return upper;
- // else
- // return value;
- // }
-
- /** a generic display that should redraw on demand */
- protected VDUDisplay display;
-
- public void setDisplay(VDUDisplay display) {
- this.display = display;
- }
-
- /**
- * Trigger a redraw on the display.
- */
- protected void redraw() {
- if (display != null) {
- display.redraw();
- }
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/de/mud/terminal/VDUDisplay.java b/sl4a/ScriptingLayerForAndroid/src/de/mud/terminal/VDUDisplay.java
deleted file mode 100644
index 0fe06f3..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/de/mud/terminal/VDUDisplay.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * This file is part of "JTA - Telnet/SSH for the JAVA(tm) platform".
- *
- * (c) Matthias L. Jugel, Marcus Meißner 1996-2005. All Rights Reserved.
- *
- * Please visit http://javatelnet.org/ for updates and contact.
- *
- * --LICENSE NOTICE--
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- * --LICENSE NOTICE--
- *
- */
-
-package de.mud.terminal;
-
-/**
- * Generic display
- */
-public interface VDUDisplay {
- public void redraw();
- public void updateScrollBar();
-
- public void setVDUBuffer(VDUBuffer buffer);
- public VDUBuffer getVDUBuffer();
-
- public void setColor(int index, int red, int green, int blue);
- public void resetColors();
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/de/mud/terminal/VDUInput.java b/sl4a/ScriptingLayerForAndroid/src/de/mud/terminal/VDUInput.java
deleted file mode 100644
index 43c88de..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/de/mud/terminal/VDUInput.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * This file is part of "JTA - Telnet/SSH for the JAVA(tm) platform".
- *
- * (c) Matthias L. Jugel, Marcus Meißner 1996-2005. All Rights Reserved.
- *
- * Please visit http://javatelnet.org/ for updates and contact.
- *
- * --LICENSE NOTICE--
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- * --LICENSE NOTICE--
- *
- */
-package de.mud.terminal;
-
-import java.util.Properties;
-
-/**
- * An interface for a terminal that accepts input from keyboard and mouse.
- *
- * @author Matthias L. Jugel, Marcus Meißner
- * @version $Id: VDUInput.java 499 2005-09-29 08:24:54Z leo $
- */
-public interface VDUInput {
-
- public final static int KEY_CONTROL = 0x01;
- public final static int KEY_SHIFT = 0x02;
- public final static int KEY_ALT = 0x04;
- public final static int KEY_ACTION = 0x08;
-
-
-
- /**
- * Direct access to writing data ...
- * @param b
- */
- void write(byte b[]);
-
- /**
- * Terminal is mouse-aware and requires (x,y) coordinates of
- * on the terminal (character coordinates) and the button clicked.
- * @param x
- * @param y
- * @param modifiers
- */
- void mousePressed(int x, int y, int modifiers);
-
- /**
- * Terminal is mouse-aware and requires the coordinates and button
- * of the release.
- * @param x
- * @param y
- * @param modifiers
- */
- void mouseReleased(int x, int y, int modifiers);
-
- /**
- * Override the standard key codes used by the terminal emulation.
- * @param codes a properties object containing key code definitions
- */
- void setKeyCodes(Properties codes);
-
- /**
- * main keytyping event handler...
- * @param keyCode the key code
- * @param keyChar the character represented by the key
- * @param modifiers shift/alt/control modifiers
- */
- void keyPressed(int keyCode, char keyChar, int modifiers);
-
- /**
- * Handle key Typed events for the terminal, this will get
- * all normal key types, but no shift/alt/control/numlock.
- * @param keyCode the key code
- * @param keyChar the character represented by the key
- * @param modifiers shift/alt/control modifiers
- */
- void keyTyped(int keyCode, char keyChar, int modifiers);
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/de/mud/terminal/vt320.java b/sl4a/ScriptingLayerForAndroid/src/de/mud/terminal/vt320.java
deleted file mode 100644
index b713228..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/de/mud/terminal/vt320.java
+++ /dev/null
@@ -1,3236 +0,0 @@
-/*
- * This file is part of "JTA - Telnet/SSH for the JAVA(tm) platform".
- *
- * (c) Matthias L. Jugel, Marcus Meiner 1996-2005. All Rights Reserved.
- *
- * Please visit http://javatelnet.org/ for updates and contact.
- *
- * --LICENSE NOTICE--
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- * --LICENSE NOTICE--
- *
- */
-
-package de.mud.terminal;
-
-import java.util.Properties;
-
-/**
- * Implementation of a VT terminal emulation plus ANSI compatible.
- * <P>
- * <B>Maintainer:</B> Marcus Meißner
- *
- * @version $Id: vt320.java 507 2005-10-25 10:14:52Z marcus $
- * @author Matthias L. Jugel, Marcus Meißner
- */
-@SuppressWarnings("unused")
-public abstract class vt320 extends VDUBuffer implements VDUInput {
-
- /**
- * The current version id tag.
- * <P>
- * $Id: vt320.java 507 2005-10-25 10:14:52Z marcus $
- *
- */
- public final static String ID = "$Id: vt320.java 507 2005-10-25 10:14:52Z marcus $";
-
- /** the debug level */
- private final static int debug = 0;
- private StringBuilder debugStr;
-
- public abstract void debug(String notice);
-
- /**
- * Write an answer back to the remote host. This is needed to be able to send terminal answers
- * requests like status and type information.
- *
- * @param b
- * the array of bytes to be sent
- */
- public abstract void write(byte[] b);
-
- /**
- * Write an answer back to the remote host. This is needed to be able to send terminal answers
- * requests like status and type information.
- *
- * @param b
- * the array of bytes to be sent
- */
- public abstract void write(int b);
-
- /**
- * Play the beep sound ...
- */
- public void beep() { /* do nothing by default */
- }
-
- /**
- * Convenience function for putString(char[], int, int)
- */
- public void putString(String s) {
- int len = s.length();
- char[] tmp = new char[len];
- s.getChars(0, len, tmp, 0);
- putString(tmp, null, 0, len);
- }
-
- /**
- * Put string at current cursor position. Moves cursor according to the String. Does NOT wrap.
- *
- * @param s
- * character array
- * @param start
- * place to start in array
- * @param len
- * number of characters to process
- */
- public void putString(char[] s, byte[] fullwidths, int start, int len) {
- if (len > 0) {
- // markLine(R, 1);
- int lastChar = -1;
- char c;
- boolean isWide = false;
-
- for (int i = 0; i < len; i++) {
- c = s[start + i];
- // Shortcut for my favorite ASCII
- if (c <= 0x7F) {
- if (lastChar != -1) {
- putChar((char) lastChar, isWide, false);
- }
- lastChar = c;
- isWide = false;
- } else if (!Character.isLowSurrogate(c) && !Character.isHighSurrogate(c)) {
- if (Character.getType(c) == Character.NON_SPACING_MARK) {
- if (lastChar != -1) {
- char nc = Precomposer.precompose((char) lastChar, c);
- putChar(nc, isWide, false);
- lastChar = -1;
- }
- } else {
- if (lastChar != -1) {
- putChar((char) lastChar, isWide, false);
- }
- lastChar = c;
- if (fullwidths != null) {
- isWide = fullwidths[i] == 1;
- }
- }
- }
- }
-
- if (lastChar != -1) {
- putChar((char) lastChar, isWide, false);
- }
-
- setCursorPosition(C, R);
- redraw();
- }
- }
-
- protected void sendTelnetCommand(byte cmd) {
-
- }
-
- /**
- * Sent the changed window size from the terminal to all listeners.
- */
- protected void setWindowSize(int c, int r) {
- /* To be overridden by Terminal.java */
- }
-
- @Override
- public void setScreenSize(int c, int r, boolean broadcast) {
- // int oldrows = height;
-
- if (debug > 2) {
- if (debugStr == null) {
- debugStr = new StringBuilder();
- }
-
- debugStr.append("setscreensize (").append(c).append(',').append(r).append(',')
- .append(broadcast).append(')');
- debug(debugStr.toString());
- debugStr.setLength(0);
- }
-
- super.setScreenSize(c, r, false);
-
- boolean cursorChanged = false;
-
- // Don't let the cursor go off the screen.
- if (C >= c) {
- C = c - 1;
- cursorChanged = true;
- }
-
- if (R >= r) {
- R = r - 1;
- cursorChanged = true;
- }
-
- if (cursorChanged) {
- setCursorPosition(C, R);
- redraw();
- }
-
- if (broadcast) {
- setWindowSize(c, r); /* broadcast up */
- }
- }
-
- /**
- * Create a new vt320 terminal and intialize it with useful settings.
- */
- public vt320(int width, int height) {
- super(width, height);
-
- debugStr = new StringBuilder();
-
- setVMS(false);
- setIBMCharset(false);
- setTerminalID("vt320");
- setBufferSize(100);
- // setBorder(2, false);
-
- gx = new char[4];
- reset();
-
- /* top row of numpad */
- PF1 = "\u001bOP";
- PF2 = "\u001bOQ";
- PF3 = "\u001bOR";
- PF4 = "\u001bOS";
-
- /* the 3x2 keyblock on PC keyboards */
- Insert = new String[4];
- Remove = new String[4];
- KeyHome = new String[4];
- KeyEnd = new String[4];
- NextScn = new String[4];
- PrevScn = new String[4];
- Escape = new String[4];
- BackSpace = new String[4];
- TabKey = new String[4];
- Insert[0] = Insert[1] = Insert[2] = Insert[3] = "\u001b[2~";
- Remove[0] = Remove[1] = Remove[2] = Remove[3] = "\u001b[3~";
- PrevScn[0] = PrevScn[1] = PrevScn[2] = PrevScn[3] = "\u001b[5~";
- NextScn[0] = NextScn[1] = NextScn[2] = NextScn[3] = "\u001b[6~";
- KeyHome[0] = KeyHome[1] = KeyHome[2] = KeyHome[3] = "\u001b[H";
- KeyEnd[0] = KeyEnd[1] = KeyEnd[2] = KeyEnd[3] = "\u001b[F";
- Escape[0] = Escape[1] = Escape[2] = Escape[3] = "\u001b";
- if (vms) {
- BackSpace[1] = "" + (char) 10; // VMS shift deletes word back
- BackSpace[2] = "\u0018"; // VMS control deletes line back
- BackSpace[0] = BackSpace[3] = "\u007f"; // VMS other is delete
- } else {
- // BackSpace[0] = BackSpace[1] = BackSpace[2] = BackSpace[3] = "\b";
- // ConnectBot modifications.
- BackSpace[0] = "\b";
- BackSpace[1] = "\u007f";
- BackSpace[2] = "\u001b[3~";
- BackSpace[3] = "\u001b[2~";
- }
-
- /* some more VT100 keys */
- Find = "\u001b[1~";
- Select = "\u001b[4~";
- Help = "\u001b[28~";
- Do = "\u001b[29~";
-
- FunctionKey = new String[21];
- FunctionKey[0] = "";
- FunctionKey[1] = PF1;
- FunctionKey[2] = PF2;
- FunctionKey[3] = PF3;
- FunctionKey[4] = PF4;
- /* following are defined differently for vt220 / vt132 ... */
- FunctionKey[5] = "\u001b[15~";
- FunctionKey[6] = "\u001b[17~";
- FunctionKey[7] = "\u001b[18~";
- FunctionKey[8] = "\u001b[19~";
- FunctionKey[9] = "\u001b[20~";
- FunctionKey[10] = "\u001b[21~";
- FunctionKey[11] = "\u001b[23~";
- FunctionKey[12] = "\u001b[24~";
- FunctionKey[13] = "\u001b[25~";
- FunctionKey[14] = "\u001b[26~";
- FunctionKey[15] = Help;
- FunctionKey[16] = Do;
- FunctionKey[17] = "\u001b[31~";
- FunctionKey[18] = "\u001b[32~";
- FunctionKey[19] = "\u001b[33~";
- FunctionKey[20] = "\u001b[34~";
-
- FunctionKeyShift = new String[21];
- FunctionKeyAlt = new String[21];
- FunctionKeyCtrl = new String[21];
-
- for (int i = 0; i < 20; i++) {
- FunctionKeyShift[i] = "";
- FunctionKeyAlt[i] = "";
- FunctionKeyCtrl[i] = "";
- }
- FunctionKeyShift[15] = Find;
- FunctionKeyShift[16] = Select;
-
- TabKey[0] = "\u0009";
- TabKey[1] = "\u001bOP\u0009";
- TabKey[2] = TabKey[3] = "";
-
- KeyUp = new String[4];
- KeyUp[0] = "\u001b[A";
- KeyDown = new String[4];
- KeyDown[0] = "\u001b[B";
- KeyRight = new String[4];
- KeyRight[0] = "\u001b[C";
- KeyLeft = new String[4];
- KeyLeft[0] = "\u001b[D";
- Numpad = new String[10];
- Numpad[0] = "\u001bOp";
- Numpad[1] = "\u001bOq";
- Numpad[2] = "\u001bOr";
- Numpad[3] = "\u001bOs";
- Numpad[4] = "\u001bOt";
- Numpad[5] = "\u001bOu";
- Numpad[6] = "\u001bOv";
- Numpad[7] = "\u001bOw";
- Numpad[8] = "\u001bOx";
- Numpad[9] = "\u001bOy";
- KPMinus = PF4;
- KPComma = "\u001bOl";
- KPPeriod = "\u001bOn";
- KPEnter = "\u001bOM";
-
- NUMPlus = new String[4];
- NUMPlus[0] = "+";
- NUMDot = new String[4];
- NUMDot[0] = ".";
- }
-
- public void setBackspace(int type) {
- switch (type) {
- case DELETE_IS_DEL:
- BackSpace[0] = "\u007f";
- BackSpace[1] = "\b";
- break;
- case DELETE_IS_BACKSPACE:
- BackSpace[0] = "\b";
- BackSpace[1] = "\u007f";
- break;
- }
- }
-
- /**
- * Create a default vt320 terminal with 80 columns and 24 lines.
- */
- public vt320() {
- this(80, 24);
- }
-
- /**
- * Terminal is mouse-aware and requires (x,y) coordinates of on the terminal (character
- * coordinates) and the button clicked.
- *
- * @param x
- * @param y
- * @param modifiers
- */
- public void mousePressed(int x, int y, int modifiers) {
- if (mouserpt == 0) {
- return;
- }
-
- int mods = modifiers;
- mousebut = 3;
- if ((mods & 16) == 16) {
- mousebut = 0;
- }
- if ((mods & 8) == 8) {
- mousebut = 1;
- }
- if ((mods & 4) == 4) {
- mousebut = 2;
- }
-
- int mousecode;
- if (mouserpt == 9) {
- mousecode = 0x20 | mousebut;
- } else {
- mousecode = mousebut | 0x20 | ((mods & 7) << 2);
- }
-
- byte b[] = new byte[6];
-
- b[0] = 27;
- b[1] = (byte) '[';
- b[2] = (byte) 'M';
- b[3] = (byte) mousecode;
- b[4] = (byte) (0x20 + x + 1);
- b[5] = (byte) (0x20 + y + 1);
-
- write(b); // FIXME: writeSpecial here
- }
-
- /**
- * Terminal is mouse-aware and requires the coordinates and button of the release.
- *
- * @param x
- * @param y
- * @param modifiers
- */
- public void mouseReleased(int x, int y, int modifiers) {
- if (mouserpt == 0) {
- return;
- }
-
- /*
- * problem is tht modifiers still have the released button set in them. int mods = modifiers;
- * mousebut = 3; if ((mods & 16)==16) mousebut=0; if ((mods & 8)==8 ) mousebut=1; if ((mods &
- * 4)==4 ) mousebut=2;
- */
-
- int mousecode;
- if (mouserpt == 9) {
- mousecode = 0x20 + mousebut; /* same as press? appears so. */
- } else {
- mousecode = '#';
- }
-
- byte b[] = new byte[6];
- b[0] = 27;
- b[1] = (byte) '[';
- b[2] = (byte) 'M';
- b[3] = (byte) mousecode;
- b[4] = (byte) (0x20 + x + 1);
- b[5] = (byte) (0x20 + y + 1);
- write(b); // FIXME: writeSpecial here
- mousebut = 0;
- }
-
- /** we should do localecho (passed from other modules). false is default */
- private boolean localecho = false;
-
- /**
- * Enable or disable the local echo property of the terminal.
- *
- * @param echo
- * true if the terminal should echo locally
- */
- public void setLocalEcho(boolean echo) {
- localecho = echo;
- }
-
- /**
- * Enable the VMS mode of the terminal to handle some things differently for VMS hosts.
- *
- * @param vms
- * true for vms mode, false for normal mode
- */
- public void setVMS(boolean vms) {
- this.vms = vms;
- }
-
- /**
- * Enable the usage of the IBM character set used by some BBS's. Special graphical character are
- * available in this mode.
- *
- * @param ibm
- * true to use the ibm character set
- */
- public void setIBMCharset(boolean ibm) {
- useibmcharset = ibm;
- }
-
- /**
- * Override the standard key codes used by the terminal emulation.
- *
- * @param codes
- * a properties object containing key code definitions
- */
- public void setKeyCodes(Properties codes) {
- String res, prefixes[] = { "", "S", "C", "A" };
- int i;
-
- for (i = 0; i < 10; i++) {
- res = codes.getProperty("NUMPAD" + i);
- if (res != null) {
- Numpad[i] = unEscape(res);
- }
- }
- for (i = 1; i < 20; i++) {
- res = codes.getProperty("F" + i);
- if (res != null) {
- FunctionKey[i] = unEscape(res);
- }
- res = codes.getProperty("SF" + i);
- if (res != null) {
- FunctionKeyShift[i] = unEscape(res);
- }
- res = codes.getProperty("CF" + i);
- if (res != null) {
- FunctionKeyCtrl[i] = unEscape(res);
- }
- res = codes.getProperty("AF" + i);
- if (res != null) {
- FunctionKeyAlt[i] = unEscape(res);
- }
- }
- for (i = 0; i < 4; i++) {
- res = codes.getProperty(prefixes[i] + "PGUP");
- if (res != null) {
- PrevScn[i] = unEscape(res);
- }
- res = codes.getProperty(prefixes[i] + "PGDOWN");
- if (res != null) {
- NextScn[i] = unEscape(res);
- }
- res = codes.getProperty(prefixes[i] + "END");
- if (res != null) {
- KeyEnd[i] = unEscape(res);
- }
- res = codes.getProperty(prefixes[i] + "HOME");
- if (res != null) {
- KeyHome[i] = unEscape(res);
- }
- res = codes.getProperty(prefixes[i] + "INSERT");
- if (res != null) {
- Insert[i] = unEscape(res);
- }
- res = codes.getProperty(prefixes[i] + "REMOVE");
- if (res != null) {
- Remove[i] = unEscape(res);
- }
- res = codes.getProperty(prefixes[i] + "UP");
- if (res != null) {
- KeyUp[i] = unEscape(res);
- }
- res = codes.getProperty(prefixes[i] + "DOWN");
- if (res != null) {
- KeyDown[i] = unEscape(res);
- }
- res = codes.getProperty(prefixes[i] + "LEFT");
- if (res != null) {
- KeyLeft[i] = unEscape(res);
- }
- res = codes.getProperty(prefixes[i] + "RIGHT");
- if (res != null) {
- KeyRight[i] = unEscape(res);
- }
- res = codes.getProperty(prefixes[i] + "ESCAPE");
- if (res != null) {
- Escape[i] = unEscape(res);
- }
- res = codes.getProperty(prefixes[i] + "BACKSPACE");
- if (res != null) {
- BackSpace[i] = unEscape(res);
- }
- res = codes.getProperty(prefixes[i] + "TAB");
- if (res != null) {
- TabKey[i] = unEscape(res);
- }
- res = codes.getProperty(prefixes[i] + "NUMPLUS");
- if (res != null) {
- NUMPlus[i] = unEscape(res);
- }
- res = codes.getProperty(prefixes[i] + "NUMDECIMAL");
- if (res != null) {
- NUMDot[i] = unEscape(res);
- }
- }
- }
-
- /**
- * Set the terminal id used to identify this terminal.
- *
- * @param terminalID
- * the id string
- */
- public void setTerminalID(String terminalID) {
- this.terminalID = terminalID;
-
- if (terminalID.equals("scoansi")) {
- FunctionKey[1] = "\u001b[M";
- FunctionKey[2] = "\u001b[N";
- FunctionKey[3] = "\u001b[O";
- FunctionKey[4] = "\u001b[P";
- FunctionKey[5] = "\u001b[Q";
- FunctionKey[6] = "\u001b[R";
- FunctionKey[7] = "\u001b[S";
- FunctionKey[8] = "\u001b[T";
- FunctionKey[9] = "\u001b[U";
- FunctionKey[10] = "\u001b[V";
- FunctionKey[11] = "\u001b[W";
- FunctionKey[12] = "\u001b[X";
- FunctionKey[13] = "\u001b[Y";
- FunctionKey[14] = "?";
- FunctionKey[15] = "\u001b[a";
- FunctionKey[16] = "\u001b[b";
- FunctionKey[17] = "\u001b[c";
- FunctionKey[18] = "\u001b[d";
- FunctionKey[19] = "\u001b[e";
- FunctionKey[20] = "\u001b[f";
- PrevScn[0] = PrevScn[1] = PrevScn[2] = PrevScn[3] = "\u001b[I";
- NextScn[0] = NextScn[1] = NextScn[2] = NextScn[3] = "\u001b[G";
- // more theoretically.
- }
- }
-
- public void setAnswerBack(String ab) {
- answerBack = unEscape(ab);
- }
-
- /**
- * Get the terminal id used to identify this terminal.
- */
- public String getTerminalID() {
- return terminalID;
- }
-
- /**
- * A small conveniance method thar converts the string to a byte array for sending.
- *
- * @param s
- * the string to be sent
- */
- private boolean write(String s, boolean doecho) {
- if (debug > 2) {
- debugStr.append("write(|").append(s).append("|,").append(doecho);
- debug(debugStr.toString());
- debugStr.setLength(0);
- }
- if (s == null) {
- return true;
- /*
- * NOTE: getBytes() honours some locale, it *CONVERTS* the string. However, we output only
- * 7bit stuff towards the target, and *some* 8 bit control codes. We must not mess up the
- * latter, so we do hand by hand copy.
- */
- }
-
- byte arr[] = new byte[s.length()];
- for (int i = 0; i < s.length(); i++) {
- arr[i] = (byte) s.charAt(i);
- }
- write(arr);
-
- if (doecho) {
- putString(s);
- }
- return true;
- }
-
- private boolean write(int s, boolean doecho) {
- if (debug > 2) {
- debugStr.append("write(|").append(s).append("|,").append(doecho);
- debug(debugStr.toString());
- debugStr.setLength(0);
- }
-
- write(s);
-
- // TODO check if character is wide
- if (doecho) {
- putChar((char) s, false, false);
- }
- return true;
- }
-
- private boolean write(String s) {
- return write(s, localecho);
- }
-
- // ===================================================================
- // the actual terminal emulation code comes here:
- // ===================================================================
-
- private String terminalID = "vt320";
- private String answerBack = "Use Terminal.answerback to set ...\n";
-
- // X - COLUMNS, Y - ROWS
- int R, C;
- int attributes = 0;
-
- int Sc, Sr, Sa, Stm, Sbm;
- char Sgr, Sgl;
- char Sgx[];
-
- int insertmode = 0;
- int statusmode = 0;
- boolean vt52mode = false;
- boolean keypadmode = false; /* false - numeric, true - application */
- boolean output8bit = false;
- int normalcursor = 0;
- boolean moveoutsidemargins = true;
- boolean wraparound = true;
- boolean sendcrlf = true;
- boolean capslock = false;
- boolean numlock = false;
- int mouserpt = 0;
- byte mousebut = 0;
-
- boolean useibmcharset = false;
-
- int lastwaslf = 0;
- boolean usedcharsets = false;
-
- private final static char ESC = 27;
- private final static char IND = 132;
- private final static char NEL = 133;
- private final static char RI = 141;
- private final static char SS2 = 142;
- private final static char SS3 = 143;
- private final static char DCS = 144;
- private final static char HTS = 136;
- private final static char CSI = 155;
- private final static char OSC = 157;
- private final static int TSTATE_DATA = 0;
- private final static int TSTATE_ESC = 1; /* ESC */
- private final static int TSTATE_CSI = 2; /* ESC [ */
- private final static int TSTATE_DCS = 3; /* ESC P */
- private final static int TSTATE_DCEQ = 4; /* ESC [? */
- private final static int TSTATE_ESCSQUARE = 5; /* ESC # */
- private final static int TSTATE_OSC = 6; /* ESC ] */
- private final static int TSTATE_SETG0 = 7; /* ESC (? */
- private final static int TSTATE_SETG1 = 8; /* ESC )? */
- private final static int TSTATE_SETG2 = 9; /* ESC *? */
- private final static int TSTATE_SETG3 = 10; /* ESC +? */
- private final static int TSTATE_CSI_DOLLAR = 11; /* ESC [ Pn $ */
- private final static int TSTATE_CSI_EX = 12; /* ESC [ ! */
- private final static int TSTATE_ESCSPACE = 13; /* ESC <space> */
- private final static int TSTATE_VT52X = 14;
- private final static int TSTATE_VT52Y = 15;
- private final static int TSTATE_CSI_TICKS = 16;
- private final static int TSTATE_CSI_EQUAL = 17; /* ESC [ = */
- private final static int TSTATE_TITLE = 18; /* xterm title */
-
- /* Keys we support */
- public final static int KEY_PAUSE = 1;
- public final static int KEY_F1 = 2;
- public final static int KEY_F2 = 3;
- public final static int KEY_F3 = 4;
- public final static int KEY_F4 = 5;
- public final static int KEY_F5 = 6;
- public final static int KEY_F6 = 7;
- public final static int KEY_F7 = 8;
- public final static int KEY_F8 = 9;
- public final static int KEY_F9 = 10;
- public final static int KEY_F10 = 11;
- public final static int KEY_F11 = 12;
- public final static int KEY_F12 = 13;
- public final static int KEY_UP = 14;
- public final static int KEY_DOWN = 15;
- public final static int KEY_LEFT = 16;
- public final static int KEY_RIGHT = 17;
- public final static int KEY_PAGE_DOWN = 18;
- public final static int KEY_PAGE_UP = 19;
- public final static int KEY_INSERT = 20;
- public final static int KEY_DELETE = 21;
- public final static int KEY_BACK_SPACE = 22;
- public final static int KEY_HOME = 23;
- public final static int KEY_END = 24;
- public final static int KEY_NUM_LOCK = 25;
- public final static int KEY_CAPS_LOCK = 26;
- public final static int KEY_SHIFT = 27;
- public final static int KEY_CONTROL = 28;
- public final static int KEY_ALT = 29;
- public final static int KEY_ENTER = 30;
- public final static int KEY_NUMPAD0 = 31;
- public final static int KEY_NUMPAD1 = 32;
- public final static int KEY_NUMPAD2 = 33;
- public final static int KEY_NUMPAD3 = 34;
- public final static int KEY_NUMPAD4 = 35;
- public final static int KEY_NUMPAD5 = 36;
- public final static int KEY_NUMPAD6 = 37;
- public final static int KEY_NUMPAD7 = 38;
- public final static int KEY_NUMPAD8 = 39;
- public final static int KEY_NUMPAD9 = 40;
- public final static int KEY_DECIMAL = 41;
- public final static int KEY_ADD = 42;
- public final static int KEY_ESCAPE = 43;
-
- public final static int DELETE_IS_DEL = 0;
- public final static int DELETE_IS_BACKSPACE = 1;
-
- /*
- * The graphics charsets B - default ASCII A - ISO Latin 1 0 - DEC SPECIAL < - User defined ....
- */
- char gx[];
- char gl; // GL (left charset)
- char gr; // GR (right charset)
- int onegl; // single shift override for GL.
-
- // Map from scoansi linedrawing to DEC _and_ unicode (for the stuff which
- // is not in linedrawing). Got from experimenting with scoadmin.
- private final static String scoansi_acs =
- "Tm7k3x4u?kZl@mYjEnB\u2566DqCtAvM\u2550:\u2551N\u2557I\u2554;\u2557H\u255a0a<\u255d";
- // array to store DEC Special -> Unicode mapping
- // Unicode DEC Unicode name (DEC name)
- private static char DECSPECIAL[] = { '\u0040', // 5f blank
- '\u2666', // 60 black diamond
- '\u2592', // 61 grey square
- '\u2409', // 62 Horizontal tab (ht) pict. for control
- '\u240c', // 63 Form Feed (ff) pict. for control
- '\u240d', // 64 Carriage Return (cr) pict. for control
- '\u240a', // 65 Line Feed (lf) pict. for control
- '\u00ba', // 66 Masculine ordinal indicator
- '\u00b1', // 67 Plus or minus sign
- '\u2424', // 68 New Line (nl) pict. for control
- '\u240b', // 69 Vertical Tab (vt) pict. for control
- '\u2518', // 6a Forms light up and left
- '\u2510', // 6b Forms light down and left
- '\u250c', // 6c Forms light down and right
- '\u2514', // 6d Forms light up and right
- '\u253c', // 6e Forms light vertical and horizontal
- '\u2594', // 6f Upper 1/8 block (Scan 1)
- '\u2580', // 70 Upper 1/2 block (Scan 3)
- '\u2500', // 71 Forms light horizontal or ?em dash? (Scan 5)
- '\u25ac', // 72 \u25ac black rect. or \u2582 lower 1/4 (Scan 7)
- '\u005f', // 73 \u005f underscore or \u2581 lower 1/8 (Scan 9)
- '\u251c', // 74 Forms light vertical and right
- '\u2524', // 75 Forms light vertical and left
- '\u2534', // 76 Forms light up and horizontal
- '\u252c', // 77 Forms light down and horizontal
- '\u2502', // 78 vertical bar
- '\u2264', // 79 less than or equal
- '\u2265', // 7a greater than or equal
- '\u00b6', // 7b paragraph
- '\u2260', // 7c not equal
- '\u00a3', // 7d Pound Sign (british)
- '\u00b7' // 7e Middle Dot
- };
-
- /** Strings to send on function key pressing */
- private String Numpad[];
- private String FunctionKey[];
- private String FunctionKeyShift[];
- private String FunctionKeyCtrl[];
- private String FunctionKeyAlt[];
- private String TabKey[];
- private String KeyUp[], KeyDown[], KeyLeft[], KeyRight[];
- private String KPMinus, KPComma, KPPeriod, KPEnter;
- private String PF1, PF2, PF3, PF4;
- private String Help, Do, Find, Select;
-
- private String KeyHome[], KeyEnd[], Insert[], Remove[], PrevScn[], NextScn[];
- private String Escape[], BackSpace[], NUMDot[], NUMPlus[];
-
- private String osc, dcs; /* to memorize OSC & DCS control sequence */
-
- /** vt320 state variable (internal) */
- private int term_state = TSTATE_DATA;
- /** in vms mode, set by Terminal.VMS property */
- private boolean vms = false;
- /** Tabulators */
- private byte[] Tabs;
- /** The list of integers as used by CSI */
- private int[] DCEvars = new int[30];
- private int DCEvar;
-
- /**
- * Replace escape code characters (backslash + identifier) with their respective codes.
- *
- * @param tmp
- * the string to be parsed
- * @return a unescaped string
- */
- static String unEscape(String tmp) {
- int idx = 0, oldidx = 0;
- String cmd;
- // f.println("unescape("+tmp+")");
- cmd = "";
- while ((idx = tmp.indexOf('\\', oldidx)) >= 0 && ++idx <= tmp.length()) {
- cmd += tmp.substring(oldidx, idx - 1);
- if (idx == tmp.length()) {
- return cmd;
- }
- switch (tmp.charAt(idx)) {
- case 'b':
- cmd += "\b";
- break;
- case 'e':
- cmd += "\u001b";
- break;
- case 'n':
- cmd += "\n";
- break;
- case 'r':
- cmd += "\r";
- break;
- case 't':
- cmd += "\t";
- break;
- case 'v':
- cmd += "\u000b";
- break;
- case 'a':
- cmd += "\u0012";
- break;
- default:
- if ((tmp.charAt(idx) >= '0') && (tmp.charAt(idx) <= '9')) {
- int i;
- for (i = idx; i < tmp.length(); i++) {
- if ((tmp.charAt(i) < '0') || (tmp.charAt(i) > '9')) {
- break;
- }
- }
- cmd += (char) Integer.parseInt(tmp.substring(idx, i));
- idx = i - 1;
- } else {
- cmd += tmp.substring(idx, ++idx);
- }
- break;
- }
- oldidx = ++idx;
- }
- if (oldidx <= tmp.length()) {
- cmd += tmp.substring(oldidx);
- }
- return cmd;
- }
-
- /**
- * A small conveniance method thar converts a 7bit string to the 8bit version depending on
- * VT52/Output8Bit mode.
- *
- * @param s
- * the string to be sent
- */
- private boolean writeSpecial(String s) {
- if (s == null) {
- return true;
- }
- if (((s.length() >= 3) && (s.charAt(0) == 27) && (s.charAt(1) == 'O'))) {
- if (vt52mode) {
- if ((s.charAt(2) >= 'P') && (s.charAt(2) <= 'S')) {
- s = "\u001b" + s.substring(2); /* ESC x */
- } else {
- s = "\u001b?" + s.substring(2); /* ESC ? x */
- }
- } else {
- if (output8bit) {
- s = "\u008f" + s.substring(2); /* SS3 x */
- } /* else keep string as it is */
- }
- }
- if (((s.length() >= 3) && (s.charAt(0) == 27) && (s.charAt(1) == '['))) {
- if (output8bit) {
- s = "\u009b" + s.substring(2); /* CSI ... */
- } /* else keep */
- }
- return write(s, false);
- }
-
- /**
- * main keytyping event handler...
- */
- public void keyPressed(int keyCode, char keyChar, int modifiers) {
- boolean control = (modifiers & VDUInput.KEY_CONTROL) != 0;
- boolean shift = (modifiers & VDUInput.KEY_SHIFT) != 0;
- boolean alt = (modifiers & VDUInput.KEY_ALT) != 0;
-
- if (debug > 1) {
- debugStr.append("keyPressed(").append(keyCode).append(", ").append((int) keyChar)
- .append(", ").append(modifiers).append(')');
- debug(debugStr.toString());
- debugStr.setLength(0);
- }
-
- int xind;
- String fmap[];
- xind = 0;
- fmap = FunctionKey;
- if (shift) {
- fmap = FunctionKeyShift;
- xind = 1;
- }
- if (control) {
- fmap = FunctionKeyCtrl;
- xind = 2;
- }
- if (alt) {
- fmap = FunctionKeyAlt;
- xind = 3;
- }
-
- switch (keyCode) {
- case KEY_PAUSE:
- if (shift || control) {
- sendTelnetCommand((byte) 243); // BREAK
- }
- break;
- case KEY_F1:
- writeSpecial(fmap[1]);
- break;
- case KEY_F2:
- writeSpecial(fmap[2]);
- break;
- case KEY_F3:
- writeSpecial(fmap[3]);
- break;
- case KEY_F4:
- writeSpecial(fmap[4]);
- break;
- case KEY_F5:
- writeSpecial(fmap[5]);
- break;
- case KEY_F6:
- writeSpecial(fmap[6]);
- break;
- case KEY_F7:
- writeSpecial(fmap[7]);
- break;
- case KEY_F8:
- writeSpecial(fmap[8]);
- break;
- case KEY_F9:
- writeSpecial(fmap[9]);
- break;
- case KEY_F10:
- writeSpecial(fmap[10]);
- break;
- case KEY_F11:
- writeSpecial(fmap[11]);
- break;
- case KEY_F12:
- writeSpecial(fmap[12]);
- break;
- case KEY_UP:
- writeSpecial(KeyUp[xind]);
- break;
- case KEY_DOWN:
- writeSpecial(KeyDown[xind]);
- break;
- case KEY_LEFT:
- writeSpecial(KeyLeft[xind]);
- break;
- case KEY_RIGHT:
- writeSpecial(KeyRight[xind]);
- break;
- case KEY_PAGE_DOWN:
- writeSpecial(NextScn[xind]);
- break;
- case KEY_PAGE_UP:
- writeSpecial(PrevScn[xind]);
- break;
- case KEY_INSERT:
- writeSpecial(Insert[xind]);
- break;
- case KEY_DELETE:
- writeSpecial(Remove[xind]);
- break;
- case KEY_BACK_SPACE:
- writeSpecial(BackSpace[xind]);
- if (localecho) {
- if (BackSpace[xind] == "\b") {
- putString("\b \b"); // make the last char 'deleted'
- } else {
- putString(BackSpace[xind]); // echo it
- }
- }
- break;
- case KEY_HOME:
- writeSpecial(KeyHome[xind]);
- break;
- case KEY_END:
- writeSpecial(KeyEnd[xind]);
- break;
- case KEY_NUM_LOCK:
- if (vms && control) {
- writeSpecial(PF1);
- }
- if (!control) {
- numlock = !numlock;
- }
- break;
- case KEY_CAPS_LOCK:
- capslock = !capslock;
- return;
- case KEY_SHIFT:
- case KEY_CONTROL:
- case KEY_ALT:
- return;
- default:
- break;
- }
- }
-
- /*
- * public void keyReleased(KeyEvent evt) { if (debug > 1) debug("keyReleased("+evt+")"); // ignore
- * }
- */
- /**
- * Handle key Typed events for the terminal, this will get all normal key types, but no
- * shift/alt/control/numlock.
- */
- public void keyTyped(int keyCode, char keyChar, int modifiers) {
- boolean control = (modifiers & VDUInput.KEY_CONTROL) != 0;
- boolean shift = (modifiers & VDUInput.KEY_SHIFT) != 0;
- boolean alt = (modifiers & VDUInput.KEY_ALT) != 0;
-
- if (debug > 1) {
- debug("keyTyped(" + keyCode + ", " + (int) keyChar + ", " + modifiers + ")");
- }
-
- if (keyChar == '\t') {
- if (shift) {
- write(TabKey[1], false);
- } else {
- if (control) {
- write(TabKey[2], false);
- } else {
- if (alt) {
- write(TabKey[3], false);
- } else {
- write(TabKey[0], false);
- }
- }
- }
- return;
- }
- if (alt) {
- write(((char) (keyChar | 0x80)));
- return;
- }
-
- if (((keyCode == KEY_ENTER) || (keyChar == 10)) && !control) {
- write('\r');
- if (localecho) {
- putString("\r\n"); // bad hack
- }
- return;
- }
-
- if ((keyCode == 10) && !control) {
- debug("Sending \\r");
- write('\r');
- return;
- }
-
- // FIXME: on german PC keyboards you have to use Alt-Ctrl-q to get an @,
- // so we can't just use it here... will probably break some other VMS
- // codes. -Marcus
- // if(((!vms && keyChar == '2') || keyChar == '@' || keyChar == ' ')
- // && control)
- if (((!vms && keyChar == '2') || keyChar == ' ') && control) {
- write(0);
- }
-
- if (vms) {
- if (keyChar == 127 && !control) {
- if (shift) {
- writeSpecial(Insert[0]); // VMS shift delete = insert
- } else {
- writeSpecial(Remove[0]); // VMS delete = remove
- }
- return;
- } else if (control) {
- switch (keyChar) {
- case '0':
- writeSpecial(Numpad[0]);
- return;
- case '1':
- writeSpecial(Numpad[1]);
- return;
- case '2':
- writeSpecial(Numpad[2]);
- return;
- case '3':
- writeSpecial(Numpad[3]);
- return;
- case '4':
- writeSpecial(Numpad[4]);
- return;
- case '5':
- writeSpecial(Numpad[5]);
- return;
- case '6':
- writeSpecial(Numpad[6]);
- return;
- case '7':
- writeSpecial(Numpad[7]);
- return;
- case '8':
- writeSpecial(Numpad[8]);
- return;
- case '9':
- writeSpecial(Numpad[9]);
- return;
- case '.':
- writeSpecial(KPPeriod);
- return;
- case '-':
- case 31:
- writeSpecial(KPMinus);
- return;
- case '+':
- writeSpecial(KPComma);
- return;
- case 10:
- writeSpecial(KPEnter);
- return;
- case '/':
- writeSpecial(PF2);
- return;
- case '*':
- writeSpecial(PF3);
- return;
- /* NUMLOCK handled in keyPressed */
- default:
- break;
- }
- /*
- * Now what does this do and how did it get here. -Marcus if (shift && keyChar < 32) {
- * write(PF1+(char)(keyChar + 64)); return; }
- */
- }
- }
-
- // FIXME: not used?
- // String fmap[];
- int xind;
- xind = 0;
- // fmap = FunctionKey;
- if (shift) {
- // fmap = FunctionKeyShift;
- xind = 1;
- }
- if (control) {
- // fmap = FunctionKeyCtrl;
- xind = 2;
- }
- if (alt) {
- // fmap = FunctionKeyAlt;
- xind = 3;
- }
-
- if (keyCode == KEY_ESCAPE) {
- writeSpecial(Escape[xind]);
- return;
- }
-
- if ((modifiers & VDUInput.KEY_ACTION) != 0) {
- switch (keyCode) {
- case KEY_NUMPAD0:
- writeSpecial(Numpad[0]);
- return;
- case KEY_NUMPAD1:
- writeSpecial(Numpad[1]);
- return;
- case KEY_NUMPAD2:
- writeSpecial(Numpad[2]);
- return;
- case KEY_NUMPAD3:
- writeSpecial(Numpad[3]);
- return;
- case KEY_NUMPAD4:
- writeSpecial(Numpad[4]);
- return;
- case KEY_NUMPAD5:
- writeSpecial(Numpad[5]);
- return;
- case KEY_NUMPAD6:
- writeSpecial(Numpad[6]);
- return;
- case KEY_NUMPAD7:
- writeSpecial(Numpad[7]);
- return;
- case KEY_NUMPAD8:
- writeSpecial(Numpad[8]);
- return;
- case KEY_NUMPAD9:
- writeSpecial(Numpad[9]);
- return;
- case KEY_DECIMAL:
- writeSpecial(NUMDot[xind]);
- return;
- case KEY_ADD:
- writeSpecial(NUMPlus[xind]);
- return;
- }
- }
-
- if (!((keyChar == 8) || (keyChar == 127) || (keyChar == '\r') || (keyChar == '\n'))) {
- write(keyChar);
- return;
- }
- }
-
- private void handle_dcs(String dcs) {
- debugStr.append("DCS: ").append(dcs);
- debug(debugStr.toString());
- debugStr.setLength(0);
- }
-
- private void handle_osc(String osc) {
- if (osc.length() > 2 && osc.substring(0, 2).equals("4;")) {
- // Define color palette
- String[] colorData = osc.split(";");
-
- try {
- int colorIndex = Integer.parseInt(colorData[1]);
-
- if ("rgb:".equals(colorData[2].substring(0, 4))) {
- String[] rgb = colorData[2].substring(4).split("/");
-
- int red = Integer.parseInt(rgb[0].substring(0, 2), 16) & 0xFF;
- int green = Integer.parseInt(rgb[1].substring(0, 2), 16) & 0xFF;
- int blue = Integer.parseInt(rgb[2].substring(0, 2), 16) & 0xFF;
- display.setColor(colorIndex, red, green, blue);
- }
- } catch (Exception e) {
- debugStr.append("OSC: invalid color sequence encountered: ").append(osc);
- debug(debugStr.toString());
- debugStr.setLength(0);
- }
- } else {
- debug("OSC: " + osc);
- }
- }
-
- private final static char unimap[] = {
- // #
- // # Name: cp437_DOSLatinUS to Unicode table
- // # Unicode version: 1.1
- // # Table version: 1.1
- // # Table format: Format A
- // # Date: 03/31/95
- // # Authors: Michel Suignard <michelsu@microsoft.com>
- // # Lori Hoerth <lorih@microsoft.com>
- // # General notes: none
- // #
- // # Format: Three tab-separated columns
- // # Column #1 is the cp1255_WinHebrew code (in hex)
- // # Column #2 is the Unicode (in hex as 0xXXXX)
- // # Column #3 is the Unicode name (follows a comment sign, '#')
- // #
- // # The entries are in cp437_DOSLatinUS order
- // #
-
- 0x0000, // #NULL
- 0x0001, // #START OF HEADING
- 0x0002, // #START OF TEXT
- 0x0003, // #END OF TEXT
- 0x0004, // #END OF TRANSMISSION
- 0x0005, // #ENQUIRY
- 0x0006, // #ACKNOWLEDGE
- 0x0007, // #BELL
- 0x0008, // #BACKSPACE
- 0x0009, // #HORIZONTAL TABULATION
- 0x000a, // #LINE FEED
- 0x000b, // #VERTICAL TABULATION
- 0x000c, // #FORM FEED
- 0x000d, // #CARRIAGE RETURN
- 0x000e, // #SHIFT OUT
- 0x000f, // #SHIFT IN
- 0x0010, // #DATA LINK ESCAPE
- 0x0011, // #DEVICE CONTROL ONE
- 0x0012, // #DEVICE CONTROL TWO
- 0x0013, // #DEVICE CONTROL THREE
- 0x0014, // #DEVICE CONTROL FOUR
- 0x0015, // #NEGATIVE ACKNOWLEDGE
- 0x0016, // #SYNCHRONOUS IDLE
- 0x0017, // #END OF TRANSMISSION BLOCK
- 0x0018, // #CANCEL
- 0x0019, // #END OF MEDIUM
- 0x001a, // #SUBSTITUTE
- 0x001b, // #ESCAPE
- 0x001c, // #FILE SEPARATOR
- 0x001d, // #GROUP SEPARATOR
- 0x001e, // #RECORD SEPARATOR
- 0x001f, // #UNIT SEPARATOR
- 0x0020, // #SPACE
- 0x0021, // #EXCLAMATION MARK
- 0x0022, // #QUOTATION MARK
- 0x0023, // #NUMBER SIGN
- 0x0024, // #DOLLAR SIGN
- 0x0025, // #PERCENT SIGN
- 0x0026, // #AMPERSAND
- 0x0027, // #APOSTROPHE
- 0x0028, // #LEFT PARENTHESIS
- 0x0029, // #RIGHT PARENTHESIS
- 0x002a, // #ASTERISK
- 0x002b, // #PLUS SIGN
- 0x002c, // #COMMA
- 0x002d, // #HYPHEN-MINUS
- 0x002e, // #FULL STOP
- 0x002f, // #SOLIDUS
- 0x0030, // #DIGIT ZERO
- 0x0031, // #DIGIT ONE
- 0x0032, // #DIGIT TWO
- 0x0033, // #DIGIT THREE
- 0x0034, // #DIGIT FOUR
- 0x0035, // #DIGIT FIVE
- 0x0036, // #DIGIT SIX
- 0x0037, // #DIGIT SEVEN
- 0x0038, // #DIGIT EIGHT
- 0x0039, // #DIGIT NINE
- 0x003a, // #COLON
- 0x003b, // #SEMICOLON
- 0x003c, // #LESS-THAN SIGN
- 0x003d, // #EQUALS SIGN
- 0x003e, // #GREATER-THAN SIGN
- 0x003f, // #QUESTION MARK
- 0x0040, // #COMMERCIAL AT
- 0x0041, // #LATIN CAPITAL LETTER A
- 0x0042, // #LATIN CAPITAL LETTER B
- 0x0043, // #LATIN CAPITAL LETTER C
- 0x0044, // #LATIN CAPITAL LETTER D
- 0x0045, // #LATIN CAPITAL LETTER E
- 0x0046, // #LATIN CAPITAL LETTER F
- 0x0047, // #LATIN CAPITAL LETTER G
- 0x0048, // #LATIN CAPITAL LETTER H
- 0x0049, // #LATIN CAPITAL LETTER I
- 0x004a, // #LATIN CAPITAL LETTER J
- 0x004b, // #LATIN CAPITAL LETTER K
- 0x004c, // #LATIN CAPITAL LETTER L
- 0x004d, // #LATIN CAPITAL LETTER M
- 0x004e, // #LATIN CAPITAL LETTER N
- 0x004f, // #LATIN CAPITAL LETTER O
- 0x0050, // #LATIN CAPITAL LETTER P
- 0x0051, // #LATIN CAPITAL LETTER Q
- 0x0052, // #LATIN CAPITAL LETTER R
- 0x0053, // #LATIN CAPITAL LETTER S
- 0x0054, // #LATIN CAPITAL LETTER T
- 0x0055, // #LATIN CAPITAL LETTER U
- 0x0056, // #LATIN CAPITAL LETTER V
- 0x0057, // #LATIN CAPITAL LETTER W
- 0x0058, // #LATIN CAPITAL LETTER X
- 0x0059, // #LATIN CAPITAL LETTER Y
- 0x005a, // #LATIN CAPITAL LETTER Z
- 0x005b, // #LEFT SQUARE BRACKET
- 0x005c, // #REVERSE SOLIDUS
- 0x005d, // #RIGHT SQUARE BRACKET
- 0x005e, // #CIRCUMFLEX ACCENT
- 0x005f, // #LOW LINE
- 0x0060, // #GRAVE ACCENT
- 0x0061, // #LATIN SMALL LETTER A
- 0x0062, // #LATIN SMALL LETTER B
- 0x0063, // #LATIN SMALL LETTER C
- 0x0064, // #LATIN SMALL LETTER D
- 0x0065, // #LATIN SMALL LETTER E
- 0x0066, // #LATIN SMALL LETTER F
- 0x0067, // #LATIN SMALL LETTER G
- 0x0068, // #LATIN SMALL LETTER H
- 0x0069, // #LATIN SMALL LETTER I
- 0x006a, // #LATIN SMALL LETTER J
- 0x006b, // #LATIN SMALL LETTER K
- 0x006c, // #LATIN SMALL LETTER L
- 0x006d, // #LATIN SMALL LETTER M
- 0x006e, // #LATIN SMALL LETTER N
- 0x006f, // #LATIN SMALL LETTER O
- 0x0070, // #LATIN SMALL LETTER P
- 0x0071, // #LATIN SMALL LETTER Q
- 0x0072, // #LATIN SMALL LETTER R
- 0x0073, // #LATIN SMALL LETTER S
- 0x0074, // #LATIN SMALL LETTER T
- 0x0075, // #LATIN SMALL LETTER U
- 0x0076, // #LATIN SMALL LETTER V
- 0x0077, // #LATIN SMALL LETTER W
- 0x0078, // #LATIN SMALL LETTER X
- 0x0079, // #LATIN SMALL LETTER Y
- 0x007a, // #LATIN SMALL LETTER Z
- 0x007b, // #LEFT CURLY BRACKET
- 0x007c, // #VERTICAL LINE
- 0x007d, // #RIGHT CURLY BRACKET
- 0x007e, // #TILDE
- 0x007f, // #DELETE
- 0x00c7, // #LATIN CAPITAL LETTER C WITH CEDILLA
- 0x00fc, // #LATIN SMALL LETTER U WITH DIAERESIS
- 0x00e9, // #LATIN SMALL LETTER E WITH ACUTE
- 0x00e2, // #LATIN SMALL LETTER A WITH CIRCUMFLEX
- 0x00e4, // #LATIN SMALL LETTER A WITH DIAERESIS
- 0x00e0, // #LATIN SMALL LETTER A WITH GRAVE
- 0x00e5, // #LATIN SMALL LETTER A WITH RING ABOVE
- 0x00e7, // #LATIN SMALL LETTER C WITH CEDILLA
- 0x00ea, // #LATIN SMALL LETTER E WITH CIRCUMFLEX
- 0x00eb, // #LATIN SMALL LETTER E WITH DIAERESIS
- 0x00e8, // #LATIN SMALL LETTER E WITH GRAVE
- 0x00ef, // #LATIN SMALL LETTER I WITH DIAERESIS
- 0x00ee, // #LATIN SMALL LETTER I WITH CIRCUMFLEX
- 0x00ec, // #LATIN SMALL LETTER I WITH GRAVE
- 0x00c4, // #LATIN CAPITAL LETTER A WITH DIAERESIS
- 0x00c5, // #LATIN CAPITAL LETTER A WITH RING ABOVE
- 0x00c9, // #LATIN CAPITAL LETTER E WITH ACUTE
- 0x00e6, // #LATIN SMALL LIGATURE AE
- 0x00c6, // #LATIN CAPITAL LIGATURE AE
- 0x00f4, // #LATIN SMALL LETTER O WITH CIRCUMFLEX
- 0x00f6, // #LATIN SMALL LETTER O WITH DIAERESIS
- 0x00f2, // #LATIN SMALL LETTER O WITH GRAVE
- 0x00fb, // #LATIN SMALL LETTER U WITH CIRCUMFLEX
- 0x00f9, // #LATIN SMALL LETTER U WITH GRAVE
- 0x00ff, // #LATIN SMALL LETTER Y WITH DIAERESIS
- 0x00d6, // #LATIN CAPITAL LETTER O WITH DIAERESIS
- 0x00dc, // #LATIN CAPITAL LETTER U WITH DIAERESIS
- 0x00a2, // #CENT SIGN
- 0x00a3, // #POUND SIGN
- 0x00a5, // #YEN SIGN
- 0x20a7, // #PESETA SIGN
- 0x0192, // #LATIN SMALL LETTER F WITH HOOK
- 0x00e1, // #LATIN SMALL LETTER A WITH ACUTE
- 0x00ed, // #LATIN SMALL LETTER I WITH ACUTE
- 0x00f3, // #LATIN SMALL LETTER O WITH ACUTE
- 0x00fa, // #LATIN SMALL LETTER U WITH ACUTE
- 0x00f1, // #LATIN SMALL LETTER N WITH TILDE
- 0x00d1, // #LATIN CAPITAL LETTER N WITH TILDE
- 0x00aa, // #FEMININE ORDINAL INDICATOR
- 0x00ba, // #MASCULINE ORDINAL INDICATOR
- 0x00bf, // #INVERTED QUESTION MARK
- 0x2310, // #REVERSED NOT SIGN
- 0x00ac, // #NOT SIGN
- 0x00bd, // #VULGAR FRACTION ONE HALF
- 0x00bc, // #VULGAR FRACTION ONE QUARTER
- 0x00a1, // #INVERTED EXCLAMATION MARK
- 0x00ab, // #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
- 0x00bb, // #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
- 0x2591, // #LIGHT SHADE
- 0x2592, // #MEDIUM SHADE
- 0x2593, // #DARK SHADE
- 0x2502, // #BOX DRAWINGS LIGHT VERTICAL
- 0x2524, // #BOX DRAWINGS LIGHT VERTICAL AND LEFT
- 0x2561, // #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
- 0x2562, // #BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
- 0x2556, // #BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
- 0x2555, // #BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
- 0x2563, // #BOX DRAWINGS DOUBLE VERTICAL AND LEFT
- 0x2551, // #BOX DRAWINGS DOUBLE VERTICAL
- 0x2557, // #BOX DRAWINGS DOUBLE DOWN AND LEFT
- 0x255d, // #BOX DRAWINGS DOUBLE UP AND LEFT
- 0x255c, // #BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
- 0x255b, // #BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
- 0x2510, // #BOX DRAWINGS LIGHT DOWN AND LEFT
- 0x2514, // #BOX DRAWINGS LIGHT UP AND RIGHT
- 0x2534, // #BOX DRAWINGS LIGHT UP AND HORIZONTAL
- 0x252c, // #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
- 0x251c, // #BOX DRAWINGS LIGHT VERTICAL AND RIGHT
- 0x2500, // #BOX DRAWINGS LIGHT HORIZONTAL
- 0x253c, // #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
- 0x255e, // #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
- 0x255f, // #BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
- 0x255a, // #BOX DRAWINGS DOUBLE UP AND RIGHT
- 0x2554, // #BOX DRAWINGS DOUBLE DOWN AND RIGHT
- 0x2569, // #BOX DRAWINGS DOUBLE UP AND HORIZONTAL
- 0x2566, // #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
- 0x2560, // #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
- 0x2550, // #BOX DRAWINGS DOUBLE HORIZONTAL
- 0x256c, // #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
- 0x2567, // #BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
- 0x2568, // #BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
- 0x2564, // #BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
- 0x2565, // #BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
- 0x2559, // #BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
- 0x2558, // #BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
- 0x2552, // #BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
- 0x2553, // #BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
- 0x256b, // #BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
- 0x256a, // #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
- 0x2518, // #BOX DRAWINGS LIGHT UP AND LEFT
- 0x250c, // #BOX DRAWINGS LIGHT DOWN AND RIGHT
- 0x2588, // #FULL BLOCK
- 0x2584, // #LOWER HALF BLOCK
- 0x258c, // #LEFT HALF BLOCK
- 0x2590, // #RIGHT HALF BLOCK
- 0x2580, // #UPPER HALF BLOCK
- 0x03b1, // #GREEK SMALL LETTER ALPHA
- 0x00df, // #LATIN SMALL LETTER SHARP S
- 0x0393, // #GREEK CAPITAL LETTER GAMMA
- 0x03c0, // #GREEK SMALL LETTER PI
- 0x03a3, // #GREEK CAPITAL LETTER SIGMA
- 0x03c3, // #GREEK SMALL LETTER SIGMA
- 0x00b5, // #MICRO SIGN
- 0x03c4, // #GREEK SMALL LETTER TAU
- 0x03a6, // #GREEK CAPITAL LETTER PHI
- 0x0398, // #GREEK CAPITAL LETTER THETA
- 0x03a9, // #GREEK CAPITAL LETTER OMEGA
- 0x03b4, // #GREEK SMALL LETTER DELTA
- 0x221e, // #INFINITY
- 0x03c6, // #GREEK SMALL LETTER PHI
- 0x03b5, // #GREEK SMALL LETTER EPSILON
- 0x2229, // #INTERSECTION
- 0x2261, // #IDENTICAL TO
- 0x00b1, // #PLUS-MINUS SIGN
- 0x2265, // #GREATER-THAN OR EQUAL TO
- 0x2264, // #LESS-THAN OR EQUAL TO
- 0x2320, // #TOP HALF INTEGRAL
- 0x2321, // #BOTTOM HALF INTEGRAL
- 0x00f7, // #DIVISION SIGN
- 0x2248, // #ALMOST EQUAL TO
- 0x00b0, // #DEGREE SIGN
- 0x2219, // #BULLET OPERATOR
- 0x00b7, // #MIDDLE DOT
- 0x221a, // #SQUARE ROOT
- 0x207f, // #SUPERSCRIPT LATIN SMALL LETTER N
- 0x00b2, // #SUPERSCRIPT TWO
- 0x25a0, // #BLACK SQUARE
- 0x00a0, // #NO-BREAK SPACE
- };
-
- public char map_cp850_unicode(char x) {
- if (x >= 0x100) {
- return x;
- }
- return unimap[x];
- }
-
- private void _SetCursor(int row, int col) {
- int maxr = height - 1;
- int tm = getTopMargin();
-
- R = (row < 0) ? 0 : row;
- C = (col < 0) ? 0 : (col >= width) ? width - 1 : col;
-
- if (!moveoutsidemargins) {
- R += tm;
- maxr = getBottomMargin();
- }
- if (R > maxr) {
- R = maxr;
- }
- }
-
- private void putChar(char c, boolean isWide, boolean doshowcursor) {
- int rows = height; // statusline
- int columns = width;
- // byte msg[];
-
- // if (debug > 4) {
- // debugStr.append("putChar(")
- // .append(c)
- // .append(" [")
- // .append((int) c)
- // .append("]) at R=")
- // .append(R)
- // .append(" , C=")
- // .append(C)
- // .append(", columns=")
- // .append(columns)
- // .append(", rows=")
- // .append(rows);
- // debug(debugStr.toString());
- // debugStr.setLength(0);
- // }
- // markLine(R, 1);
- // if (c > 255) {
- // if (debug > 0)
- // debug("char > 255:" + (int) c);
- // //return;
- // }
-
- switch (term_state) {
- case TSTATE_DATA:
- /*
- * FIXME: we shouldn't use chars with bit 8 set if ibmcharset. probably... but some BBS do
- * anyway...
- */
- if (!useibmcharset) {
- boolean doneflag = true;
- switch (c) {
- case OSC:
- osc = "";
- term_state = TSTATE_OSC;
- break;
- case RI:
- if (R > getTopMargin()) {
- R--;
- } else {
- insertLine(R, 1, SCROLL_DOWN);
- }
- if (debug > 1) {
- debug("RI");
- }
- break;
- case IND:
- if (debug > 2) {
- debugStr.append("IND at ").append(R).append(", tm is ").append(getTopMargin())
- .append(", bm is ").append(getBottomMargin());
- debug(debugStr.toString());
- debugStr.setLength(0);
- }
- if (R == getBottomMargin() || R == rows - 1) {
- insertLine(R, 1, SCROLL_UP);
- } else {
- R++;
- }
- if (debug > 1) {
- debug("IND (at " + R + " )");
- }
- break;
- case NEL:
- if (R == getBottomMargin() || R == rows - 1) {
- insertLine(R, 1, SCROLL_UP);
- } else {
- R++;
- }
- C = 0;
- if (debug > 1) {
- debug("NEL (at " + R + " )");
- }
- break;
- case HTS:
- Tabs[C] = 1;
- if (debug > 1) {
- debug("HTS");
- }
- break;
- case DCS:
- dcs = "";
- term_state = TSTATE_DCS;
- break;
- default:
- doneflag = false;
- break;
- }
- if (doneflag) {
- break;
- }
- }
- switch (c) {
- case SS3:
- onegl = 3;
- break;
- case SS2:
- onegl = 2;
- break;
- case CSI: // should be in the 8bit section, but some BBS use this
- DCEvar = 0;
- DCEvars[0] = 0;
- DCEvars[1] = 0;
- DCEvars[2] = 0;
- DCEvars[3] = 0;
- term_state = TSTATE_CSI;
- break;
- case ESC:
- term_state = TSTATE_ESC;
- lastwaslf = 0;
- break;
- case 5: /* ENQ */
- write(answerBack, false);
- break;
- case 12:
- /* FormFeed, Home for the BBS world */
- deleteArea(0, 0, columns, rows, attributes);
- C = R = 0;
- break;
- case '\b': /* 8 */
- C--;
- if (C < 0) {
- C = 0;
- }
- lastwaslf = 0;
- break;
- case '\t':
- do {
- // Don't overwrite or insert! TABS are not destructive, but movement!
- C++;
- } while (C < columns && (Tabs[C] == 0));
- lastwaslf = 0;
- break;
- case '\r': // 13 CR
- C = 0;
- break;
- case '\n': // 10 LF
- if (debug > 3) {
- debug("R= " + R + ", bm " + getBottomMargin() + ", tm=" + getTopMargin() + ", rows="
- + rows);
- }
- if (!vms) {
- if (lastwaslf != 0 && lastwaslf != c) {
- break;
- }
- lastwaslf = c;
- /* C = 0; */
- }
- if (R == getBottomMargin() || R >= rows - 1) {
- insertLine(R, 1, SCROLL_UP);
- } else {
- R++;
- }
- break;
- case 7:
- beep();
- break;
- case '\016': /* SMACS , as */
- /* ^N, Shift out - Put G1 into GL */
- gl = 1;
- usedcharsets = true;
- break;
- case '\017': /* RMACS , ae */
- /* ^O, Shift in - Put G0 into GL */
- gl = 0;
- usedcharsets = true;
- break;
- default: {
- int thisgl = gl;
-
- if (onegl >= 0) {
- thisgl = onegl;
- onegl = -1;
- }
- lastwaslf = 0;
- if (c < 32) {
- if (c != 0) {
- if (debug > 0) {
- debug("TSTATE_DATA char: " + ((int) c));
- }
- }
- /* break; some BBS really want those characters, like hearst etc. */
- if (c == 0) {
- break;
- }
- }
- if (C >= columns) {
- if (wraparound) {
- int bot = rows;
-
- // If we're in the scroll region, check against the bottom margin
- if (R <= getBottomMargin() && R >= getTopMargin()) {
- bot = getBottomMargin() + 1;
- }
-
- if (R < bot - 1) {
- R++;
- } else {
- if (debug > 3) {
- debug("scrolling due to wrap at " + R);
- }
- insertLine(R, 1, SCROLL_UP);
- }
- C = 0;
- } else {
- // cursor stays on last character.
- C = columns - 1;
- }
- }
-
- boolean mapped = false;
-
- // Mapping if DEC Special is chosen charset
- if (usedcharsets) {
- if (c >= '\u0020' && c <= '\u007f') {
- switch (gx[thisgl]) {
- case '0':
- // Remap SCOANSI line drawing to VT100 line drawing chars
- // for our SCO using customers.
- if (terminalID.equals("scoansi") || terminalID.equals("ansi")) {
- for (int i = 0; i < scoansi_acs.length(); i += 2) {
- if (c == scoansi_acs.charAt(i)) {
- c = scoansi_acs.charAt(i + 1);
- break;
- }
- }
- }
- if (c >= '\u005f' && c <= '\u007e') {
- c = DECSPECIAL[(short) c - 0x5f];
- mapped = true;
- }
- break;
- case '<': // 'user preferred' is currently 'ISO Latin-1 suppl
- c = (char) ((c & 0x7f) | 0x80);
- mapped = true;
- break;
- case 'A':
- case 'B': // Latin-1 , ASCII -> fall through
- mapped = true;
- break;
- default:
- debug("Unsupported GL mapping: " + gx[thisgl]);
- break;
- }
- }
- if (!mapped && (c >= '\u0080' && c <= '\u00ff')) {
- switch (gx[gr]) {
- case '0':
- if (c >= '\u00df' && c <= '\u00fe') {
- c = DECSPECIAL[c - '\u00df'];
- mapped = true;
- }
- break;
- case '<':
- case 'A':
- case 'B':
- mapped = true;
- break;
- default:
- debug("Unsupported GR mapping: " + gx[gr]);
- break;
- }
- }
- }
- if (!mapped && useibmcharset) {
- c = map_cp850_unicode(c);
- }
-
- /* if(true || (statusmode == 0)) { */
- if (isWide) {
- if (C >= columns - 1) {
- if (wraparound) {
- int bot = rows;
-
- // If we're in the scroll region, check against the bottom margin
- if (R <= getBottomMargin() && R >= getTopMargin()) {
- bot = getBottomMargin() + 1;
- }
-
- if (R < bot - 1) {
- R++;
- } else {
- if (debug > 3) {
- debug("scrolling due to wrap at " + R);
- }
- insertLine(R, 1, SCROLL_UP);
- }
- C = 0;
- } else {
- // cursor stays on last wide character.
- C = columns - 2;
- }
- }
- }
-
- if (insertmode == 1) {
- if (isWide) {
- insertChar(C++, R, c, attributes | FULLWIDTH);
- insertChar(C, R, ' ', attributes | FULLWIDTH);
- } else {
- insertChar(C, R, c, attributes);
- }
- } else {
- if (isWide) {
- putChar(C++, R, c, attributes | FULLWIDTH);
- putChar(C, R, ' ', attributes | FULLWIDTH);
- } else {
- putChar(C, R, c, attributes);
- }
- }
-
- /*
- * } else { if (insertmode==1) { insertChar(C, rows, c, attributes); } else { putChar(C,
- * rows, c, attributes); } }
- */
- C++;
- break;
- }
- } /* switch(c) */
- break;
- case TSTATE_OSC:
- if ((c < 0x20) && (c != ESC)) {// NP - No printing character
- handle_osc(osc);
- term_state = TSTATE_DATA;
- break;
- }
- // but check for vt102 ESC \
- if (c == '\\' && osc.charAt(osc.length() - 1) == ESC) {
- handle_osc(osc);
- term_state = TSTATE_DATA;
- break;
- }
- osc = osc + c;
- break;
- case TSTATE_ESCSPACE:
- term_state = TSTATE_DATA;
- switch (c) {
- case 'F': /* S7C1T, Disable output of 8-bit controls, use 7-bit */
- output8bit = false;
- break;
- case 'G': /* S8C1T, Enable output of 8-bit control codes */
- output8bit = true;
- break;
- default:
- debug("ESC <space> " + c + " unhandled.");
- }
- break;
- case TSTATE_ESC:
- term_state = TSTATE_DATA;
- switch (c) {
- case ' ':
- term_state = TSTATE_ESCSPACE;
- break;
- case '#':
- term_state = TSTATE_ESCSQUARE;
- break;
- case 'c':
- /* Hard terminal reset */
- reset();
- break;
- case '[':
- DCEvar = 0;
- DCEvars[0] = 0;
- DCEvars[1] = 0;
- DCEvars[2] = 0;
- DCEvars[3] = 0;
- term_state = TSTATE_CSI;
- break;
- case ']':
- osc = "";
- term_state = TSTATE_OSC;
- break;
- case 'P':
- dcs = "";
- term_state = TSTATE_DCS;
- break;
- case 'A': /* CUU */
- R--;
- if (R < 0) {
- R = 0;
- }
- break;
- case 'B': /* CUD */
- R++;
- if (R >= rows) {
- R = rows - 1;
- }
- break;
- case 'C':
- C++;
- if (C >= columns) {
- C = columns - 1;
- }
- break;
- case 'I': // RI
- insertLine(R, 1, SCROLL_DOWN);
- break;
- case 'E': /* NEL */
- if (R == getBottomMargin() || R == rows - 1) {
- insertLine(R, 1, SCROLL_UP);
- } else {
- R++;
- }
- C = 0;
- if (debug > 1) {
- debug("ESC E (at " + R + ")");
- }
- break;
- case 'D': /* IND */
- if (R == getBottomMargin() || R == rows - 1) {
- insertLine(R, 1, SCROLL_UP);
- } else {
- R++;
- }
- if (debug > 1) {
- debug("ESC D (at " + R + " )");
- }
- break;
- case 'J': /* erase to end of screen */
- if (R < rows - 1) {
- deleteArea(0, R + 1, columns, rows - R - 1, attributes);
- }
- if (C < columns - 1) {
- deleteArea(C, R, columns - C, 1, attributes);
- }
- break;
- case 'K':
- if (C < columns - 1) {
- deleteArea(C, R, columns - C, 1, attributes);
- }
- break;
- case 'M': // RI
- debug("ESC M : R is " + R + ", tm is " + getTopMargin() + ", bm is " + getBottomMargin());
- if (R > getTopMargin()) { // just go up 1 line.
- R--;
- } else { // scroll down
- insertLine(R, 1, SCROLL_DOWN);
- }
- /* else do nothing ; */
- if (debug > 2) {
- debug("ESC M ");
- }
- break;
- case 'H':
- if (debug > 1) {
- debug("ESC H at " + C);
- }
- /* right border probably ... */
- if (C >= columns) {
- C = columns - 1;
- }
- Tabs[C] = 1;
- break;
- case 'N': // SS2
- onegl = 2;
- break;
- case 'O': // SS3
- onegl = 3;
- break;
- case '=':
- /* application keypad */
- if (debug > 0) {
- debug("ESC =");
- }
- keypadmode = true;
- break;
- case '<': /* vt52 mode off */
- vt52mode = false;
- break;
- case '>': /* normal keypad */
- if (debug > 0) {
- debug("ESC >");
- }
- keypadmode = false;
- break;
- case '7': /* DECSC: save cursor, attributes */
- Sc = C;
- Sr = R;
- Sgl = gl;
- Sgr = gr;
- Sa = attributes;
- Sgx = new char[4];
- for (int i = 0; i < 4; i++) {
- Sgx[i] = gx[i];
- }
- if (debug > 1) {
- debug("ESC 7");
- }
- break;
- case '8': /* DECRC: restore cursor, attributes */
- C = Sc;
- R = Sr;
- gl = Sgl;
- gr = Sgr;
- if (Sgx != null) {
- for (int i = 0; i < 4; i++) {
- gx[i] = Sgx[i];
- }
- }
- attributes = Sa;
- if (debug > 1) {
- debug("ESC 8");
- }
- break;
- case '(': /* Designate G0 Character set (ISO 2022) */
- term_state = TSTATE_SETG0;
- usedcharsets = true;
- break;
- case ')': /* Designate G1 character set (ISO 2022) */
- term_state = TSTATE_SETG1;
- usedcharsets = true;
- break;
- case '*': /* Designate G2 Character set (ISO 2022) */
- term_state = TSTATE_SETG2;
- usedcharsets = true;
- break;
- case '+': /* Designate G3 Character set (ISO 2022) */
- term_state = TSTATE_SETG3;
- usedcharsets = true;
- break;
- case '~': /* Locking Shift 1, right */
- gr = 1;
- usedcharsets = true;
- break;
- case 'n': /* Locking Shift 2 */
- gl = 2;
- usedcharsets = true;
- break;
- case '}': /* Locking Shift 2, right */
- gr = 2;
- usedcharsets = true;
- break;
- case 'o': /* Locking Shift 3 */
- gl = 3;
- usedcharsets = true;
- break;
- case '|': /* Locking Shift 3, right */
- gr = 3;
- usedcharsets = true;
- break;
- case 'Y': /* vt52 cursor address mode , next chars are x,y */
- term_state = TSTATE_VT52Y;
- break;
- case '_':
- term_state = TSTATE_TITLE;
- break;
- case '\\':
- // TODO save title
- term_state = TSTATE_DATA;
- break;
- default:
- debug("ESC unknown letter: " + c + " (" + ((int) c) + ")");
- break;
- }
- break;
- case TSTATE_VT52X:
- C = c - 37;
- if (C < 0) {
- C = 0;
- } else if (C >= width) {
- C = width - 1;
- }
- term_state = TSTATE_VT52Y;
- break;
- case TSTATE_VT52Y:
- R = c - 37;
- if (R < 0) {
- R = 0;
- } else if (R >= height) {
- R = height - 1;
- }
- term_state = TSTATE_DATA;
- break;
- case TSTATE_SETG0:
- if (c != '0' && c != 'A' && c != 'B' && c != '<') {
- debug("ESC ( " + c + ": G0 char set? (" + ((int) c) + ")");
- } else {
- if (debug > 2) {
- debug("ESC ( : G0 char set (" + c + " " + ((int) c) + ")");
- }
- gx[0] = c;
- }
- term_state = TSTATE_DATA;
- break;
- case TSTATE_SETG1:
- if (c != '0' && c != 'A' && c != 'B' && c != '<') {
- debug("ESC ) " + c + " (" + ((int) c) + ") :G1 char set?");
- } else {
- if (debug > 2) {
- debug("ESC ) :G1 char set (" + c + " " + ((int) c) + ")");
- }
- gx[1] = c;
- }
- term_state = TSTATE_DATA;
- break;
- case TSTATE_SETG2:
- if (c != '0' && c != 'A' && c != 'B' && c != '<') {
- debug("ESC*:G2 char set? (" + ((int) c) + ")");
- } else {
- if (debug > 2) {
- debug("ESC*:G2 char set (" + c + " " + ((int) c) + ")");
- }
- gx[2] = c;
- }
- term_state = TSTATE_DATA;
- break;
- case TSTATE_SETG3:
- if (c != '0' && c != 'A' && c != 'B' && c != '<') {
- debug("ESC+:G3 char set? (" + ((int) c) + ")");
- } else {
- if (debug > 2) {
- debug("ESC+:G3 char set (" + c + " " + ((int) c) + ")");
- }
- gx[3] = c;
- }
- term_state = TSTATE_DATA;
- break;
- case TSTATE_ESCSQUARE:
- switch (c) {
- case '8':
- for (int i = 0; i < columns; i++) {
- for (int j = 0; j < rows; j++) {
- putChar(i, j, 'E', 0);
- }
- }
- break;
- default:
- debug("ESC # " + c + " not supported.");
- break;
- }
- term_state = TSTATE_DATA;
- break;
- case TSTATE_DCS:
- if (c == '\\' && dcs.charAt(dcs.length() - 1) == ESC) {
- handle_dcs(dcs);
- term_state = TSTATE_DATA;
- break;
- }
- dcs = dcs + c;
- break;
-
- case TSTATE_DCEQ:
- term_state = TSTATE_DATA;
- switch (c) {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- DCEvars[DCEvar] = DCEvars[DCEvar] * 10 + (c) - 48;
- term_state = TSTATE_DCEQ;
- break;
- case ';':
- DCEvar++;
- DCEvars[DCEvar] = 0;
- term_state = TSTATE_DCEQ;
- break;
- case 's': // XTERM_SAVE missing!
- if (true || debug > 1) {
- debug("ESC [ ? " + DCEvars[0] + " s unimplemented!");
- }
- break;
- case 'r': // XTERM_RESTORE
- if (true || debug > 1) {
- debug("ESC [ ? " + DCEvars[0] + " r");
- }
- /* DEC Mode reset */
- for (int i = 0; i <= DCEvar; i++) {
- switch (DCEvars[i]) {
- case 3: /* 80 columns */
- setScreenSize(80, height, true);
- break;
- case 4: /* scrolling mode, smooth */
- break;
- case 5: /* light background */
- break;
- case 6: /* DECOM (Origin Mode) move inside margins. */
- moveoutsidemargins = true;
- break;
- case 7: /* DECAWM: Autowrap Mode */
- wraparound = false;
- break;
- case 12:/* local echo off */
- break;
- case 9: /* X10 mouse */
- case 1000: /* xterm style mouse report on */
- case 1001:
- case 1002:
- case 1003:
- mouserpt = DCEvars[i];
- break;
- default:
- debug("ESC [ ? " + DCEvars[0] + " r, unimplemented!");
- }
- }
- break;
- case 'h': // DECSET
- if (debug > 0) {
- debug("ESC [ ? " + DCEvars[0] + " h");
- }
- /* DEC Mode set */
- for (int i = 0; i <= DCEvar; i++) {
- switch (DCEvars[i]) {
- case 1: /* Application cursor keys */
- KeyUp[0] = "\u001bOA";
- KeyDown[0] = "\u001bOB";
- KeyRight[0] = "\u001bOC";
- KeyLeft[0] = "\u001bOD";
- break;
- case 2: /* DECANM */
- vt52mode = false;
- break;
- case 3: /* 132 columns */
- setScreenSize(132, height, true);
- break;
- case 6: /* DECOM: move inside margins. */
- moveoutsidemargins = false;
- break;
- case 7: /* DECAWM: Autowrap Mode */
- wraparound = true;
- break;
- case 25: /* turn cursor on */
- showCursor(true);
- break;
- case 9: /* X10 mouse */
- case 1000: /* xterm style mouse report on */
- case 1001:
- case 1002:
- case 1003:
- mouserpt = DCEvars[i];
- break;
-
- /* unimplemented stuff, fall through */
- /* 4 - scrolling mode, smooth */
- /* 5 - light background */
- /* 12 - local echo off */
- /* 18 - DECPFF - Printer Form Feed Mode -> On */
- /* 19 - DECPEX - Printer Extent Mode -> Screen */
- default:
- debug("ESC [ ? " + DCEvars[0] + " h, unsupported.");
- break;
- }
- }
- break;
- case 'i': // DEC Printer Control, autoprint, echo screenchars to printer
- // This is different to CSI i!
- // Also: "Autoprint prints a final display line only when the
- // cursor is moved off the line by an autowrap or LF, FF, or
- // VT (otherwise do not print the line)."
- switch (DCEvars[0]) {
- case 1:
- if (debug > 1) {
- debug("CSI ? 1 i : Print line containing cursor");
- }
- break;
- case 4:
- if (debug > 1) {
- debug("CSI ? 4 i : Start passthrough printing");
- }
- break;
- case 5:
- if (debug > 1) {
- debug("CSI ? 4 i : Stop passthrough printing");
- }
- break;
- }
- break;
- case 'l': // DECRST
- /* DEC Mode reset */
- if (debug > 0) {
- debug("ESC [ ? " + DCEvars[0] + " l");
- }
- for (int i = 0; i <= DCEvar; i++) {
- switch (DCEvars[i]) {
- case 1: /* Application cursor keys */
- KeyUp[0] = "\u001b[A";
- KeyDown[0] = "\u001b[B";
- KeyRight[0] = "\u001b[C";
- KeyLeft[0] = "\u001b[D";
- break;
- case 2: /* DECANM */
- vt52mode = true;
- break;
- case 3: /* 80 columns */
- setScreenSize(80, height, true);
- break;
- case 6: /* DECOM: move outside margins. */
- moveoutsidemargins = true;
- break;
- case 7: /* DECAWM: Autowrap Mode OFF */
- wraparound = false;
- break;
- case 25: /* turn cursor off */
- showCursor(false);
- break;
- /* Unimplemented stuff: */
- /* 4 - scrolling mode, jump */
- /* 5 - dark background */
- /* 7 - DECAWM - no wrap around mode */
- /* 12 - local echo on */
- /* 18 - DECPFF - Printer Form Feed Mode -> Off */
- /* 19 - DECPEX - Printer Extent Mode -> Scrolling Region */
- case 9: /* X10 mouse */
- case 1000: /* xterm style mouse report OFF */
- case 1001:
- case 1002:
- case 1003:
- mouserpt = 0;
- break;
- default:
- debug("ESC [ ? " + DCEvars[0] + " l, unsupported.");
- break;
- }
- }
- break;
- case 'n':
- if (debug > 0) {
- debug("ESC [ ? " + DCEvars[0] + " n");
- }
- switch (DCEvars[0]) {
- case 15:
- /* printer? no printer. */
- write((ESC) + "[?13n", false);
- debug("ESC[5n");
- break;
- default:
- debug("ESC [ ? " + DCEvars[0] + " n, unsupported.");
- break;
- }
- break;
- default:
- debug("ESC [ ? " + DCEvars[0] + " " + c + ", unsupported.");
- break;
- }
- break;
- case TSTATE_CSI_EX:
- term_state = TSTATE_DATA;
- switch (c) {
- case ESC:
- term_state = TSTATE_ESC;
- break;
- default:
- debug("Unknown character ESC[! character is " + (int) c);
- break;
- }
- break;
- case TSTATE_CSI_TICKS:
- term_state = TSTATE_DATA;
- switch (c) {
- case 'p':
- debug("Conformance level: " + DCEvars[0] + " (unsupported)," + DCEvars[1]);
- if (DCEvars[0] == 61) {
- output8bit = false;
- break;
- }
- if (DCEvars[1] == 1) {
- output8bit = false;
- } else {
- output8bit = true; /* 0 or 2 */
- }
- break;
- default:
- debug("Unknown ESC [... \"" + c);
- break;
- }
- break;
- case TSTATE_CSI_EQUAL:
- term_state = TSTATE_DATA;
- switch (c) {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- DCEvars[DCEvar] = DCEvars[DCEvar] * 10 + (c) - 48;
- term_state = TSTATE_CSI_EQUAL;
- break;
- case ';':
- DCEvar++;
- DCEvars[DCEvar] = 0;
- term_state = TSTATE_CSI_EQUAL;
- break;
-
- case 'F': /* SCO ANSI foreground */
- {
- int newcolor;
-
- debug("ESC [ = " + DCEvars[0] + " F");
-
- attributes &= ~COLOR_FG;
- newcolor = ((DCEvars[0] & 1) << 2) | (DCEvars[0] & 2) | ((DCEvars[0] & 4) >> 2);
- attributes |= (newcolor + 1) << COLOR_FG_SHIFT;
-
- break;
- }
- case 'G': /* SCO ANSI background */
- {
- int newcolor;
-
- debug("ESC [ = " + DCEvars[0] + " G");
-
- attributes &= ~COLOR_BG;
- newcolor = ((DCEvars[0] & 1) << 2) | (DCEvars[0] & 2) | ((DCEvars[0] & 4) >> 2);
- attributes |= (newcolor + 1) << COLOR_BG_SHIFT;
- break;
- }
-
- default:
- debugStr.append("Unknown ESC [ = ");
- for (int i = 0; i <= DCEvar; i++) {
- debugStr.append(DCEvars[i]).append(',');
- }
- debugStr.append(c);
- debug(debugStr.toString());
- debugStr.setLength(0);
- break;
- }
- break;
- case TSTATE_CSI_DOLLAR:
- term_state = TSTATE_DATA;
- switch (c) {
- case '}':
- debug("Active Status Display now " + DCEvars[0]);
- statusmode = DCEvars[0];
- break;
- /*
- * bad documentation? case '-': debug("Set Status Display now "+DCEvars[0]); break;
- */
- case '~':
- debug("Status Line mode now " + DCEvars[0]);
- break;
- default:
- debug("UNKNOWN Status Display code " + c + ", with Pn=" + DCEvars[0]);
- break;
- }
- break;
- case TSTATE_CSI:
- term_state = TSTATE_DATA;
- switch (c) {
- case '"':
- term_state = TSTATE_CSI_TICKS;
- break;
- case '$':
- term_state = TSTATE_CSI_DOLLAR;
- break;
- case '=':
- term_state = TSTATE_CSI_EQUAL;
- break;
- case '!':
- term_state = TSTATE_CSI_EX;
- break;
- case '?':
- DCEvar = 0;
- DCEvars[0] = 0;
- term_state = TSTATE_DCEQ;
- break;
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- DCEvars[DCEvar] = DCEvars[DCEvar] * 10 + (c) - 48;
- term_state = TSTATE_CSI;
- break;
- case ';':
- DCEvar++;
- DCEvars[DCEvar] = 0;
- term_state = TSTATE_CSI;
- break;
- case 'c':/* send primary device attributes */
- /* send (ESC[?61c) */
-
- String subcode = "";
- if (terminalID.equals("vt320")) {
- subcode = "63;";
- }
- if (terminalID.equals("vt220")) {
- subcode = "62;";
- }
- if (terminalID.equals("vt100")) {
- subcode = "61;";
- }
- write((ESC) + "[?" + subcode + "1;2c", false);
- if (debug > 1) {
- debug("ESC [ " + DCEvars[0] + " c");
- }
- break;
- case 'q':
- if (debug > 1) {
- debug("ESC [ " + DCEvars[0] + " q");
- }
- break;
- case 'g':
- /* used for tabsets */
- switch (DCEvars[0]) {
- case 3:/* clear them */
- Tabs = new byte[width];
- break;
- case 0:
- Tabs[C] = 0;
- break;
- }
- if (debug > 1) {
- debug("ESC [ " + DCEvars[0] + " g");
- }
- break;
- case 'h':
- switch (DCEvars[0]) {
- case 4:
- insertmode = 1;
- break;
- case 20:
- debug("Setting CRLF to TRUE");
- sendcrlf = true;
- break;
- default:
- debug("unsupported: ESC [ " + DCEvars[0] + " h");
- break;
- }
- if (debug > 1) {
- debug("ESC [ " + DCEvars[0] + " h");
- }
- break;
- case 'i': // Printer Controller mode.
- // "Transparent printing sends all output, except the CSI 4 i
- // termination string, to the printer and not the screen,
- // uses an 8-bit channel if no parity so NUL and DEL will be
- // seen by the printer and by the termination recognizer code,
- // and all translation and character set selections are
- // bypassed."
- switch (DCEvars[0]) {
- case 0:
- if (debug > 1) {
- debug("CSI 0 i: Print Screen, not implemented.");
- }
- break;
- case 4:
- if (debug > 1) {
- debug("CSI 4 i: Enable Transparent Printing, not implemented.");
- }
- break;
- case 5:
- if (debug > 1) {
- debug("CSI 4/5 i: Disable Transparent Printing, not implemented.");
- }
- break;
- default:
- debug("ESC [ " + DCEvars[0] + " i, unimplemented!");
- }
- break;
- case 'l':
- switch (DCEvars[0]) {
- case 4:
- insertmode = 0;
- break;
- case 20:
- debug("Setting CRLF to FALSE");
- sendcrlf = false;
- break;
- default:
- debug("ESC [ " + DCEvars[0] + " l, unimplemented!");
- break;
- }
- break;
- case 'A': // CUU
- {
- int limit;
- /* FIXME: xterm only cares about 0 and topmargin */
- if (R >= getTopMargin()) {
- limit = getTopMargin();
- } else {
- limit = 0;
- }
- if (DCEvars[0] == 0) {
- R--;
- } else {
- R -= DCEvars[0];
- }
- if (R < limit) {
- R = limit;
- }
- if (debug > 1) {
- debug("ESC [ " + DCEvars[0] + " A");
- }
- break;
- }
- case 'B': // CUD
- /* cursor down n (1) times */
- {
- int limit;
- if (R <= getBottomMargin()) {
- limit = getBottomMargin();
- } else {
- limit = rows - 1;
- }
- if (DCEvars[0] == 0) {
- R++;
- } else {
- R += DCEvars[0];
- }
- if (R > limit) {
- R = limit;
- } else {
- if (debug > 2) {
- debug("Not limited.");
- }
- }
- if (debug > 2) {
- debug("to: " + R);
- }
- if (debug > 1) {
- debug("ESC [ " + DCEvars[0] + " B (at C=" + C + ")");
- }
- break;
- }
- case 'C':
- if (DCEvars[0] == 0) {
- DCEvars[0] = 1;
- }
- while (DCEvars[0]-- > 0) {
- C++;
- }
- if (C >= columns) {
- C = columns - 1;
- }
- if (debug > 1) {
- debug("ESC [ " + DCEvars[0] + " C");
- }
- break;
- case 'd': // CVA
- R = DCEvars[0];
- if (R < 0) {
- R = 0;
- } else if (R >= height) {
- R = height - 1;
- }
- if (debug > 1) {
- debug("ESC [ " + DCEvars[0] + " d");
- }
- break;
- case 'D':
- if (DCEvars[0] == 0) {
- DCEvars[0] = 1;
- }
- while (DCEvars[0]-- > 0) {
- C--;
- }
- if (C < 0) {
- C = 0;
- }
- if (debug > 1) {
- debug("ESC [ " + DCEvars[0] + " D");
- }
- break;
- case 'r': // DECSTBM
- if (DCEvar > 0) // Ray: Any argument is optional
- {
- R = DCEvars[1] - 1;
- if (R < 0) {
- R = rows - 1;
- } else if (R >= rows) {
- R = rows - 1;
- }
- } else {
- R = rows - 1;
- }
- int bot = R;
- if (R >= DCEvars[0]) {
- R = DCEvars[0] - 1;
- if (R < 0) {
- R = 0;
- }
- }
- setMargins(R, bot);
- _SetCursor(0, 0);
- if (debug > 1) {
- debug("ESC [" + DCEvars[0] + " ; " + DCEvars[1] + " r");
- }
- break;
- case 'G': /* CUP / cursor absolute column */
- C = DCEvars[0];
- if (C < 0) {
- C = 0;
- } else if (C >= width) {
- C = width - 1;
- }
- if (debug > 1) {
- debug("ESC [ " + DCEvars[0] + " G");
- }
- break;
- case 'H': /* CUP / cursor position */
- /* gets 2 arguments */
- _SetCursor(DCEvars[0] - 1, DCEvars[1] - 1);
- if (debug > 2) {
- debug("ESC [ " + DCEvars[0] + ";" + DCEvars[1] + " H, moveoutsidemargins "
- + moveoutsidemargins);
- debug(" -> R now " + R + ", C now " + C);
- }
- break;
- case 'f': /* move cursor 2 */
- /* gets 2 arguments */
- R = DCEvars[0] - 1;
- C = DCEvars[1] - 1;
- if (C < 0) {
- C = 0;
- } else if (C >= width) {
- C = width - 1;
- }
- if (R < 0) {
- R = 0;
- } else if (R >= height) {
- R = height - 1;
- }
- if (debug > 2) {
- debug("ESC [ " + DCEvars[0] + ";" + DCEvars[1] + " f");
- }
- break;
- case 'S': /* ind aka 'scroll forward' */
- if (DCEvars[0] == 0) {
- insertLine(rows - 1, SCROLL_UP);
- } else {
- insertLine(rows - 1, DCEvars[0], SCROLL_UP);
- }
- break;
- case 'L':
- /* insert n lines */
- if (DCEvars[0] == 0) {
- insertLine(R, SCROLL_DOWN);
- } else {
- insertLine(R, DCEvars[0], SCROLL_DOWN);
- }
- if (debug > 1) {
- debug("ESC [ " + DCEvars[0] + "" + (c) + " (at R " + R + ")");
- }
- break;
- case 'T': /* 'ri' aka scroll backward */
- if (DCEvars[0] == 0) {
- insertLine(0, SCROLL_DOWN);
- } else {
- insertLine(0, DCEvars[0], SCROLL_DOWN);
- }
- break;
- case 'M':
- if (debug > 1) {
- debug("ESC [ " + DCEvars[0] + "" + (c) + " at R=" + R);
- }
- if (DCEvars[0] == 0) {
- deleteLine(R);
- } else {
- for (int i = 0; i < DCEvars[0]; i++) {
- deleteLine(R);
- }
- }
- break;
- case 'K':
- if (debug > 1) {
- debug("ESC [ " + DCEvars[0] + " K");
- }
- /* clear in line */
- switch (DCEvars[0]) {
- case 6: /* 97801 uses ESC[6K for delete to end of line */
- case 0:/* clear to right */
- if (C < columns - 1) {
- deleteArea(C, R, columns - C, 1, attributes);
- }
- break;
- case 1:/* clear to the left, including this */
- if (C > 0) {
- deleteArea(0, R, C + 1, 1, attributes);
- }
- break;
- case 2:/* clear whole line */
- deleteArea(0, R, columns, 1, attributes);
- break;
- }
- break;
- case 'J':
- /* clear below current line */
- switch (DCEvars[0]) {
- case 0:
- if (R < rows - 1) {
- deleteArea(0, R + 1, columns, rows - R - 1, attributes);
- }
- if (C < columns - 1) {
- deleteArea(C, R, columns - C, 1, attributes);
- }
- break;
- case 1:
- if (R > 0) {
- deleteArea(0, 0, columns, R, attributes);
- }
- if (C > 0) {
- deleteArea(0, R, C + 1, 1, attributes);// include up to and including current
- }
- break;
- case 2:
- deleteArea(0, 0, columns, rows, attributes);
- break;
- }
- if (debug > 1) {
- debug("ESC [ " + DCEvars[0] + " J");
- }
- break;
- case '@':
- if (debug > 1) {
- debug("ESC [ " + DCEvars[0] + " @");
- }
- for (int i = 0; i < DCEvars[0]; i++) {
- insertChar(C, R, ' ', attributes);
- }
- break;
- case 'X': {
- int toerase = DCEvars[0];
- if (debug > 1) {
- debug("ESC [ " + DCEvars[0] + " X, C=" + C + ",R=" + R);
- }
- if (toerase == 0) {
- toerase = 1;
- }
- if (toerase + C > columns) {
- toerase = columns - C;
- }
- deleteArea(C, R, toerase, 1, attributes);
- // does not change cursor position
- break;
- }
- case 'P':
- if (debug > 1) {
- debug("ESC [ " + DCEvars[0] + " P, C=" + C + ",R=" + R);
- }
- if (DCEvars[0] == 0) {
- DCEvars[0] = 1;
- }
- for (int i = 0; i < DCEvars[0]; i++) {
- deleteChar(C, R);
- }
- break;
- case 'n':
- switch (DCEvars[0]) {
- case 5: /* malfunction? No malfunction. */
- writeSpecial((ESC) + "[0n");
- if (debug > 1) {
- debug("ESC[5n");
- }
- break;
- case 6:
- // DO NOT offset R and C by 1! (checked against /usr/X11R6/bin/resize
- // FIXME check again.
- // FIXME: but vttest thinks different???
- writeSpecial((ESC) + "[" + R + ";" + C + "R");
- if (debug > 1) {
- debug("ESC[6n");
- }
- break;
- default:
- if (debug > 0) {
- debug("ESC [ " + DCEvars[0] + " n??");
- }
- break;
- }
- break;
- case 's': /* DECSC - save cursor */
- Sc = C;
- Sr = R;
- Sa = attributes;
- if (debug > 3) {
- debug("ESC[s");
- }
- break;
- case 'u': /* DECRC - restore cursor */
- C = Sc;
- R = Sr;
- attributes = Sa;
- if (debug > 3) {
- debug("ESC[u");
- }
- break;
- case 'm': /* attributes as color, bold , blink, */
- if (debug > 3) {
- debug("ESC [ ");
- }
- if (DCEvar == 0 && DCEvars[0] == 0) {
- attributes = 0;
- }
- for (int i = 0; i <= DCEvar; i++) {
- switch (DCEvars[i]) {
- case 0:
- if (DCEvar > 0) {
- if (terminalID.equals("scoansi")) {
- attributes &= COLOR; /* Keeps color. Strange but true. */
- } else {
- attributes = 0;
- }
- }
- break;
- case 1:
- attributes |= BOLD;
- attributes &= ~LOW;
- break;
- case 2:
- /* SCO color hack mode */
- if (terminalID.equals("scoansi") && ((DCEvar - i) >= 2)) {
- int ncolor;
- attributes &= ~(COLOR | BOLD);
-
- ncolor = DCEvars[i + 1];
- if ((ncolor & 8) == 8) {
- attributes |= BOLD;
- }
- ncolor = ((ncolor & 1) << 2) | (ncolor & 2) | ((ncolor & 4) >> 2);
- attributes |= ((ncolor) + 1) << COLOR_FG_SHIFT;
- ncolor = DCEvars[i + 2];
- ncolor = ((ncolor & 1) << 2) | (ncolor & 2) | ((ncolor & 4) >> 2);
- attributes |= ((ncolor) + 1) << COLOR_BG_SHIFT;
- i += 2;
- } else {
- attributes |= LOW;
- }
- break;
- case 3: /* italics */
- attributes |= INVERT;
- break;
- case 4:
- attributes |= UNDERLINE;
- break;
- case 7:
- attributes |= INVERT;
- break;
- case 8:
- attributes |= INVISIBLE;
- break;
- case 5: /* blink on */
- break;
- /*
- * 10 - ANSI X3.64-1979, select primary font, don't display control chars, don't set bit 8
- * on output
- */
- case 10:
- gl = 0;
- usedcharsets = true;
- break;
- /*
- * 11 - ANSI X3.64-1979, select second alt. font, display control chars, set bit 8 on
- * output
- */
- case 11: /* SMACS , as */
- case 12:
- gl = 1;
- usedcharsets = true;
- break;
- case 21: /* normal intensity */
- attributes &= ~(LOW | BOLD);
- break;
- case 23: /* italics off */
- attributes &= ~INVERT;
- break;
- case 25: /* blinking off */
- break;
- case 27:
- attributes &= ~INVERT;
- break;
- case 28:
- attributes &= ~INVISIBLE;
- break;
- case 24:
- attributes &= ~UNDERLINE;
- break;
- case 22:
- attributes &= ~BOLD;
- break;
- case 30:
- case 31:
- case 32:
- case 33:
- case 34:
- case 35:
- case 36:
- case 37:
- attributes &= ~COLOR_FG;
- attributes |= ((DCEvars[i] - 30) + 1) << COLOR_FG_SHIFT;
- break;
- case 38:
- if (DCEvars[i + 1] == 5) {
- attributes &= ~COLOR_FG;
- attributes |= ((DCEvars[i + 2]) + 1) << COLOR_FG_SHIFT;
- i += 2;
- }
- break;
- case 39:
- attributes &= ~COLOR_FG;
- break;
- case 40:
- case 41:
- case 42:
- case 43:
- case 44:
- case 45:
- case 46:
- case 47:
- attributes &= ~COLOR_BG;
- attributes |= ((DCEvars[i] - 40) + 1) << COLOR_BG_SHIFT;
- break;
- case 48:
- if (DCEvars[i + 1] == 5) {
- attributes &= ~COLOR_BG;
- attributes |= (DCEvars[i + 2] + 1) << COLOR_BG_SHIFT;
- i += 2;
- }
- break;
- case 49:
- attributes &= ~COLOR_BG;
- break;
- case 90:
- case 91:
- case 92:
- case 93:
- case 94:
- case 95:
- case 96:
- case 97:
- attributes &= ~COLOR_FG;
- attributes |= ((DCEvars[i] - 82) + 1) << COLOR_FG_SHIFT;
- break;
- case 100:
- case 101:
- case 102:
- case 103:
- case 104:
- case 105:
- case 106:
- case 107:
- attributes &= ~COLOR_BG;
- attributes |= ((DCEvars[i] - 92) + 1) << COLOR_BG_SHIFT;
- break;
-
- default:
- debugStr.append("ESC [ ").append(DCEvars[i]).append(" m unknown...");
- debug(debugStr.toString());
- debugStr.setLength(0);
- break;
- }
- if (debug > 3) {
- debugStr.append(DCEvars[i]).append(';');
- debug(debugStr.toString());
- debugStr.setLength(0);
- }
- }
- if (debug > 3) {
- debugStr.append(" (attributes = ").append(attributes).append(")m");
- debug(debugStr.toString());
- debugStr.setLength(0);
- }
- break;
- default:
- debugStr.append("ESC [ unknown letter: ").append(c).append(" (").append((int) c)
- .append(')');
- debug(debugStr.toString());
- debugStr.setLength(0);
- break;
- }
- break;
- case TSTATE_TITLE:
- switch (c) {
- case ESC:
- term_state = TSTATE_ESC;
- break;
- default:
- // TODO save title
- break;
- }
- break;
- default:
- term_state = TSTATE_DATA;
- break;
- }
-
- setCursorPosition(C, R);
- }
-
- /* hard reset the terminal */
- public void reset() {
- gx[0] = 'B';
- gx[1] = 'B';
- gx[2] = 'B';
- gx[3] = 'B';
-
- gl = 0; // default GL to G0
- gr = 2; // default GR to G2
-
- onegl = -1; // Single shift override
-
- /* reset tabs */
- int nw = width;
- if (nw < 132) {
- nw = 132;
- }
- Tabs = new byte[nw];
- for (int i = 0; i < nw; i += 8) {
- Tabs[i] = 1;
- }
-
- deleteArea(0, 0, width, height, attributes);
- setMargins(0, height);
- C = R = 0;
- _SetCursor(0, 0);
-
- if (display != null) {
- display.resetColors();
- }
-
- showCursor(true);
- /* FIXME: */
- term_state = TSTATE_DATA;
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/org/apache/harmony/niochar/charset/additional/IBM437.java b/sl4a/ScriptingLayerForAndroid/src/org/apache/harmony/niochar/charset/additional/IBM437.java
deleted file mode 100644
index 1f01579..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/org/apache/harmony/niochar/charset/additional/IBM437.java
+++ /dev/null
@@ -1,423 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.harmony.niochar.charset.additional;
-
-import java.nio.ByteBuffer;
-import java.nio.CharBuffer;
-import java.nio.charset.Charset;
-import java.nio.charset.CharsetDecoder;
-import java.nio.charset.CharsetEncoder;
-import java.nio.charset.CoderResult;
-
-/* TODO: support direct byte buffers
-import org.apache.harmony.nio.AddressUtil;
-import org.apache.harmony.niochar.CharsetProviderImpl;
-*/
-
-public class IBM437 extends Charset {
-
- public IBM437(String csName, String[] aliases) {
- super(csName, aliases);
- }
-
- public boolean contains(Charset cs) {
- return cs.name().equalsIgnoreCase("IBM367") || cs.name().equalsIgnoreCase("IBM437") || cs.name().equalsIgnoreCase("US-ASCII") ;
- }
-
- public CharsetDecoder newDecoder() {
- return new Decoder(this);
- }
-
- public CharsetEncoder newEncoder() {
- return new Encoder(this);
- }
-
- private static final class Decoder extends CharsetDecoder{
- private Decoder(Charset cs){
- super(cs, 1, 1);
-
- }
-
- private native int nDecode(char[] array, int arrPosition, int remaining, long outAddr, int absolutePos);
-
-
- protected CoderResult decodeLoop(ByteBuffer bb, CharBuffer cb){
- int cbRemaining = cb.remaining();
-/* TODO: support direct byte buffers
- if(CharsetProviderImpl.hasLoadedNatives() && bb.isDirect() && bb.hasRemaining() && cb.hasArray()){
- int toProceed = bb.remaining();
- int cbPos = cb.position();
- int bbPos = bb.position();
- boolean throwOverflow = false;
- if( cbRemaining < toProceed ) {
- toProceed = cbRemaining;
- throwOverflow = true;
- }
- int res = nDecode(cb.array(), cb.arrayOffset()+cbPos, toProceed, AddressUtil.getDirectBufferAddress(bb), bbPos);
- bb.position(bbPos+res);
- cb.position(cbPos+res);
- if(throwOverflow) return CoderResult.OVERFLOW;
- }else{
-*/
- if(bb.hasArray() && cb.hasArray()) {
- int rem = bb.remaining();
- rem = cbRemaining >= rem ? rem : cbRemaining;
- byte[] bArr = bb.array();
- char[] cArr = cb.array();
- int bStart = bb.position();
- int cStart = cb.position();
- int i;
- for(i=bStart; i<bStart+rem; i++) {
- char in = (char)(bArr[i] & 0xFF);
- if(in >= 26){
- int index = (int)in - 26;
- cArr[cStart++] = (char)arr[index];
- }else {
- cArr[cStart++] = (char)(in & 0xFF);
- }
- }
- bb.position(i);
- cb.position(cStart);
- if(rem == cbRemaining && bb.hasRemaining()) return CoderResult.OVERFLOW;
- } else {
- while(bb.hasRemaining()){
- if( cbRemaining == 0 ) return CoderResult.OVERFLOW;
- char in = (char)(bb.get() & 0xFF);
- if(in >= 26){
- int index = (int)in - 26;
- cb.put(arr[index]);
- }else {
- cb.put((char)(in & 0xFF));
- }
- cbRemaining--;
- }
-/*
- }
-*/
- }
- return CoderResult.UNDERFLOW;
- }
-
- final static char[] arr = {
- 0x001C,0x001B,0x007F,0x001D,0x001E,0x001F,
- 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
- 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
- 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
- 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
- 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
- 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
- 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
- 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
- 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
- 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
- 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
- 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x001A,
- 0x00C7,0x00FC,0x00E9,0x00E2,0x00E4,0x00E0,0x00E5,0x00E7,
- 0x00EA,0x00EB,0x00E8,0x00EF,0x00EE,0x00EC,0x00C4,0x00C5,
- 0x00C9,0x00E6,0x00C6,0x00F4,0x00F6,0x00F2,0x00FB,0x00F9,
- 0x00FF,0x00D6,0x00DC,0x00A2,0x00A3,0x00A5,0x20A7,0x0192,
- 0x00E1,0x00ED,0x00F3,0x00FA,0x00F1,0x00D1,0x00AA,0x00BA,
- 0x00BF,0x2310,0x00AC,0x00BD,0x00BC,0x00A1,0x00AB,0x00BB,
- 0x2591,0x2592,0x2593,0x2502,0x2524,0x2561,0x2562,0x2556,
- 0x2555,0x2563,0x2551,0x2557,0x255D,0x255C,0x255B,0x2510,
- 0x2514,0x2534,0x252C,0x251C,0x2500,0x253C,0x255E,0x255F,
- 0x255A,0x2554,0x2569,0x2566,0x2560,0x2550,0x256C,0x2567,
- 0x2568,0x2564,0x2565,0x2559,0x2558,0x2552,0x2553,0x256B,
- 0x256A,0x2518,0x250C,0x2588,0x2584,0x258C,0x2590,0x2580,
- 0x03B1,0x00DF,0x0393,0x03C0,0x03A3,0x03C3,0x03BC,0x03C4,
- 0x03A6,0x0398,0x03A9,0x03B4,0x221E,0x03C6,0x03B5,0x2229,
- 0x2261,0x00B1,0x2265,0x2264,0x2320,0x2321,0x00F7,0x2248,
- 0x00B0,0x2219,0x00B7,0x221A,0x207F,0x00B2,0x25A0,0x00A0
- };
- }
-
- private static final class Encoder extends CharsetEncoder{
- private Encoder(Charset cs){
- super(cs, 1, 1);
- }
-
- private native void nEncode(long outAddr, int absolutePos, char[] array, int arrPosition, int[] res);
-
- protected CoderResult encodeLoop(CharBuffer cb, ByteBuffer bb){
- int bbRemaining = bb.remaining();
-/* TODO: support direct byte buffers
- if(CharsetProviderImpl.hasLoadedNatives() && bb.isDirect() && cb.hasRemaining() && cb.hasArray()){
- int toProceed = cb.remaining();
- int cbPos = cb.position();
- int bbPos = bb.position();
- boolean throwOverflow = false;
- if( bbRemaining < toProceed ) {
- toProceed = bbRemaining;
- throwOverflow = true;
- }
- int[] res = {toProceed, 0};
- nEncode(AddressUtil.getDirectBufferAddress(bb), bbPos, cb.array(), cb.arrayOffset()+cbPos, res);
- if( res[0] <= 0 ) {
- bb.position(bbPos-res[0]);
- cb.position(cbPos-res[0]);
- if(res[1]!=0) {
- if(res[1] < 0)
- return CoderResult.malformedForLength(-res[1]);
- else
- return CoderResult.unmappableForLength(res[1]);
- }
- }else{
- bb.position(bbPos+res[0]);
- cb.position(cbPos+res[0]);
- if(throwOverflow) return CoderResult.OVERFLOW;
- }
- }else{
-*/
- if(bb.hasArray() && cb.hasArray()) {
- byte[] byteArr = bb.array();
- char[] charArr = cb.array();
- int rem = cb.remaining();
- int byteArrStart = bb.position();
- rem = bbRemaining <= rem ? bbRemaining : rem;
- int x;
- for(x = cb.position(); x < cb.position()+rem; x++) {
- char c = charArr[x];
- if(c > (char)0x25A0){
- if (c >= 0xD800 && c <= 0xDFFF) {
- if(x+1 < cb.limit()) {
- char c1 = charArr[x+1];
- if(c1 >= 0xD800 && c1 <= 0xDFFF) {
- cb.position(x); bb.position(byteArrStart);
- return CoderResult.unmappableForLength(2);
- }
- } else {
- cb.position(x); bb.position(byteArrStart);
- return CoderResult.UNDERFLOW;
- }
- cb.position(x); bb.position(byteArrStart);
- return CoderResult.malformedForLength(1);
- }
- cb.position(x); bb.position(byteArrStart);
- return CoderResult.unmappableForLength(1);
- }else{
- if(c < 0x1A) {
- byteArr[byteArrStart++] = (byte)c;
- } else {
- int index = (int)c >> 8;
- index = encodeIndex[index];
- if(index < 0) {
- cb.position(x); bb.position(byteArrStart);
- return CoderResult.unmappableForLength(1);
- }
- index <<= 8;
- index += (int)c & 0xFF;
- if((byte)arr[index] != 0){
- byteArr[byteArrStart++] = (byte)arr[index];
- }else{
- cb.position(x); bb.position(byteArrStart);
- return CoderResult.unmappableForLength(1);
- }
- }
- }
- }
- cb.position(x);
- bb.position(byteArrStart);
- if(rem == bbRemaining && cb.hasRemaining()) {
- return CoderResult.OVERFLOW;
- }
- } else {
- while(cb.hasRemaining()){
- if( bbRemaining == 0 ) return CoderResult.OVERFLOW;
- char c = cb.get();
- if(c > (char)0x25A0){
- if (c >= 0xD800 && c <= 0xDFFF) {
- if(cb.hasRemaining()) {
- char c1 = cb.get();
- if(c1 >= 0xD800 && c1 <= 0xDFFF) {
- cb.position(cb.position()-2);
- return CoderResult.unmappableForLength(2);
- } else {
- cb.position(cb.position()-1);
- }
- } else {
- cb.position(cb.position()-1);
- return CoderResult.UNDERFLOW;
- }
- cb.position(cb.position()-1);
- return CoderResult.malformedForLength(1);
- }
- cb.position(cb.position()-1);
- return CoderResult.unmappableForLength(1);
- }else{
- if(c < 0x1A) {
- bb.put((byte)c);
- } else {
- int index = (int)c >> 8;
- index = encodeIndex[index];
- if(index < 0) {
- cb.position(cb.position()-1);
- return CoderResult.unmappableForLength(1);
- }
- index <<= 8;
- index += (int)c & 0xFF;
- if((byte)arr[index] != 0){
- bb.put((byte)arr[index]);
- }else{
- cb.position(cb.position()-1);
- return CoderResult.unmappableForLength(1);
- }
- }
- bbRemaining--;
- }
- }
-/* TODO: support direct byte buffers
- }
-*/
- }
- return CoderResult.UNDERFLOW;
- }
-
- final static char arr[] = {
-
- 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
- 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x7F,0x1B,0x1A,0x1D,0x1E,0x1F,
- 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
- 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
- 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,
- 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,
- 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
- 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x1C,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0xFF,0xAD,0x9B,0x9C,0x00,0x9D,0x00,0x00,0x00,0x00,0xA6,0xAE,0xAA,0x00,0x00,0x00,
- 0xF8,0xF1,0xFD,0x00,0x00,0x00,0x00,0xFA,0x00,0x00,0xA7,0xAF,0xAC,0xAB,0x00,0xA8,
- 0x00,0x00,0x00,0x00,0x8E,0x8F,0x92,0x80,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0xA5,0x00,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x9A,0x00,0x00,0xE1,
- 0x85,0xA0,0x83,0x00,0x84,0x86,0x91,0x87,0x8A,0x82,0x88,0x89,0x8D,0xA1,0x8C,0x8B,
- 0x00,0xA4,0x95,0xA2,0x93,0x00,0x94,0xF6,0x00,0x97,0xA3,0x96,0x81,0x00,0x00,0x98,
-
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x9F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0xE2,0x00,0x00,0x00,0x00,0xE9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0xE4,0x00,0x00,0xE8,0x00,0x00,0xEA,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0xE0,0x00,0x00,0xEB,0xEE,0x00,0x00,0x00,0x00,0x00,0x00,0xE6,0x00,0x00,0x00,
- 0xE3,0x00,0x00,0xE5,0xE7,0x00,0xED,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF9,0xFB,0x00,0x00,0x00,0xEC,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEF,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0xF0,0x00,0x00,0xF3,0xF2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0xA9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0xF4,0xF5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
- 0xC4,0x00,0xB3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDA,0x00,0x00,0x00,
- 0xBF,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xD9,0x00,0x00,0x00,0xC3,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0xB4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC2,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0xC1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC5,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0xCD,0xBA,0xD5,0xD6,0xC9,0xB8,0xB7,0xBB,0xD4,0xD3,0xC8,0xBE,0xBD,0xBC,0xC6,0xC7,
- 0xCC,0xB5,0xB6,0xB9,0xD1,0xD2,0xCB,0xCF,0xD0,0xCA,0xD8,0xD7,0xCE,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0xDF,0x00,0x00,0x00,0xDC,0x00,0x00,0x00,0xDB,0x00,0x00,0x00,0xDD,0x00,0x00,0x00,
- 0xDE,0xB0,0xB1,0xB2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- };
-
- final static int[] encodeIndex = {
- 0,1,-1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- 3,-1,4,5,-1,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
- };
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/ConsoleActivity.java b/sl4a/ScriptingLayerForAndroid/src/org/connectbot/ConsoleActivity.java
deleted file mode 100644
index bb4490a..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/ConsoleActivity.java
+++ /dev/null
@@ -1,985 +0,0 @@
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * @author modified by raaar
- *
- */
-
-package org.connectbot;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.content.SharedPreferences;
-import android.content.pm.ActivityInfo;
-import android.content.res.Configuration;
-import android.media.AudioManager;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Message;
-import android.os.PowerManager;
-import android.preference.PreferenceManager;
-import android.text.ClipboardManager;
-import android.view.ContextMenu;
-import android.view.ContextMenu.ContextMenuInfo;
-import android.view.GestureDetector;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.View.OnTouchListener;
-import android.view.ViewConfiguration;
-import android.view.WindowManager;
-import android.view.animation.Animation;
-import android.view.animation.AnimationUtils;
-import android.view.inputmethod.InputMethodManager;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.ImageView;
-import android.widget.RelativeLayout;
-import android.widget.TextView;
-import android.widget.Toast;
-import android.widget.ViewFlipper;
-
-import com.googlecode.android_scripting.Constants;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.R;
-import com.googlecode.android_scripting.ScriptProcess;
-import com.googlecode.android_scripting.activity.Preferences;
-import com.googlecode.android_scripting.activity.ScriptingLayerService;
-
-import de.mud.terminal.VDUBuffer;
-import de.mud.terminal.vt320;
-
-import org.connectbot.service.PromptHelper;
-import org.connectbot.service.TerminalBridge;
-import org.connectbot.service.TerminalManager;
-import org.connectbot.util.PreferenceConstants;
-import org.connectbot.util.SelectionArea;
-
-public class ConsoleActivity extends Activity {
-
- protected static final int REQUEST_EDIT = 1;
-
- private static final int CLICK_TIME = 250;
- private static final float MAX_CLICK_DISTANCE = 25f;
- private static final int KEYBOARD_DISPLAY_TIME = 1250;
-
- // Direction to shift the ViewFlipper
- private static final int SHIFT_LEFT = 0;
- private static final int SHIFT_RIGHT = 1;
-
- protected ViewFlipper flip = null;
- protected TerminalManager manager = null;
- protected ScriptingLayerService mService = null;
- protected LayoutInflater inflater = null;
-
- private SharedPreferences prefs = null;
-
- private PowerManager.WakeLock wakelock = null;
-
- protected Integer processID;
-
- protected ClipboardManager clipboard;
-
- private RelativeLayout booleanPromptGroup;
- private TextView booleanPrompt;
- private Button booleanYes, booleanNo;
-
- private Animation slide_left_in, slide_left_out, slide_right_in, slide_right_out,
- fade_stay_hidden, fade_out_delayed;
-
- private Animation keyboard_fade_in, keyboard_fade_out;
- private ImageView keyboardButton;
- private float lastX, lastY;
-
- private int mTouchSlopSquare;
-
- private InputMethodManager inputManager;
-
- protected TerminalBridge copySource = null;
- private int lastTouchRow, lastTouchCol;
-
- private boolean forcedOrientation;
-
- private Handler handler = new Handler();
-
- private static enum MenuId {
- EDIT, PREFS, EMAIL, RESIZE, COPY, PASTE;
- public int getId() {
- return ordinal() + Menu.FIRST;
- }
- }
-
- private final ServiceConnection mConnection = new ServiceConnection() {
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- mService = ((ScriptingLayerService.LocalBinder) service).getService();
- manager = mService.getTerminalManager();
- // let manager know about our event handling services
- manager.setDisconnectHandler(disconnectHandler);
-
- Log.d(String.format("Connected to TerminalManager and found bridges.size=%d", manager
- .getBridgeList().size()));
-
- manager.setResizeAllowed(true);
-
- // clear out any existing bridges and record requested index
- flip.removeAllViews();
-
- int requestedIndex = 0;
-
- TerminalBridge requestedBridge = manager.getConnectedBridge(processID);
-
- // If we didn't find the requested connection, try opening it
- if (processID != null && requestedBridge == null) {
- try {
- Log.d(String.format(
- "We couldnt find an existing bridge with id = %d, so creating one now", processID));
- requestedBridge = manager.openConnection(processID);
- } catch (Exception e) {
- Log.e("Problem while trying to create new requested bridge", e);
- }
- }
-
- // create views for all bridges on this service
- for (TerminalBridge bridge : manager.getBridgeList()) {
-
- final int currentIndex = addNewTerminalView(bridge);
-
- // check to see if this bridge was requested
- if (bridge == requestedBridge) {
- requestedIndex = currentIndex;
- }
- }
-
- setDisplayedTerminal(requestedIndex);
- }
-
- @Override
- public void onServiceDisconnected(ComponentName name) {
- manager = null;
- mService = null;
- }
- };
-
- protected Handler promptHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- // someone below us requested to display a prompt
- updatePromptVisible();
- }
- };
-
- protected Handler disconnectHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- Log.d("Someone sending HANDLE_DISCONNECT to parentHandler");
- TerminalBridge bridge = (TerminalBridge) msg.obj;
- closeBridge(bridge);
- }
- };
-
- /**
- * @param bridge
- */
- private void closeBridge(final TerminalBridge bridge) {
- synchronized (flip) {
- final int flipIndex = getFlipIndex(bridge);
-
- if (flipIndex >= 0) {
- if (flip.getDisplayedChild() == flipIndex) {
- shiftCurrentTerminal(SHIFT_LEFT);
- }
- flip.removeViewAt(flipIndex);
-
- /*
- * TODO Remove this workaround when ViewFlipper is fixed to listen to view removals. Android
- * Issue 1784
- */
- final int numChildren = flip.getChildCount();
- if (flip.getDisplayedChild() >= numChildren && numChildren > 0) {
- flip.setDisplayedChild(numChildren - 1);
- }
- }
-
- // If we just closed the last bridge, go back to the previous activity.
- if (flip.getChildCount() == 0) {
- finish();
- }
- }
- }
-
- protected View findCurrentView(int id) {
- View view = flip.getCurrentView();
- if (view == null) {
- return null;
- }
- return view.findViewById(id);
- }
-
- protected PromptHelper getCurrentPromptHelper() {
- View view = findCurrentView(R.id.console_flip);
- if (!(view instanceof TerminalView)) {
- return null;
- }
- return ((TerminalView) view).bridge.getPromptHelper();
- }
-
- protected void hideAllPrompts() {
- booleanPromptGroup.setVisibility(View.GONE);
- }
-
- @Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- this.setContentView(R.layout.act_console);
-
- clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
- prefs = PreferenceManager.getDefaultSharedPreferences(this);
-
- // hide status bar if requested by user
- if (prefs.getBoolean(PreferenceConstants.FULLSCREEN, false)) {
- getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
- WindowManager.LayoutParams.FLAG_FULLSCREEN);
- }
-
- // TODO find proper way to disable volume key beep if it exists.
- setVolumeControlStream(AudioManager.STREAM_MUSIC);
-
- PowerManager manager = (PowerManager) getSystemService(Context.POWER_SERVICE);
- wakelock = manager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, getPackageName());
-
- // handle requested console from incoming intent
- int id = getIntent().getIntExtra(Constants.EXTRA_PROXY_PORT, -1);
-
- if (id > 0) {
- processID = id;
- }
-
- inflater = LayoutInflater.from(this);
-
- flip = (ViewFlipper) findViewById(R.id.console_flip);
- booleanPromptGroup = (RelativeLayout) findViewById(R.id.console_boolean_group);
- booleanPrompt = (TextView) findViewById(R.id.console_prompt);
-
- booleanYes = (Button) findViewById(R.id.console_prompt_yes);
- booleanYes.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- PromptHelper helper = getCurrentPromptHelper();
- if (helper == null) {
- return;
- }
- helper.setResponse(Boolean.TRUE);
- updatePromptVisible();
- }
- });
-
- booleanNo = (Button) findViewById(R.id.console_prompt_no);
- booleanNo.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- PromptHelper helper = getCurrentPromptHelper();
- if (helper == null) {
- return;
- }
- helper.setResponse(Boolean.FALSE);
- updatePromptVisible();
- }
- });
-
- // preload animations for terminal switching
- slide_left_in = AnimationUtils.loadAnimation(this, R.anim.slide_left_in);
- slide_left_out = AnimationUtils.loadAnimation(this, R.anim.slide_left_out);
- slide_right_in = AnimationUtils.loadAnimation(this, R.anim.slide_right_in);
- slide_right_out = AnimationUtils.loadAnimation(this, R.anim.slide_right_out);
-
- fade_out_delayed = AnimationUtils.loadAnimation(this, R.anim.fade_out_delayed);
- fade_stay_hidden = AnimationUtils.loadAnimation(this, R.anim.fade_stay_hidden);
-
- // Preload animation for keyboard button
- keyboard_fade_in = AnimationUtils.loadAnimation(this, R.anim.keyboard_fade_in);
- keyboard_fade_out = AnimationUtils.loadAnimation(this, R.anim.keyboard_fade_out);
-
- inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
- keyboardButton = (ImageView) findViewById(R.id.keyboard_button);
- keyboardButton.setOnClickListener(new OnClickListener() {
- public void onClick(View view) {
- View flip = findCurrentView(R.id.console_flip);
- if (flip == null) {
- return;
- }
-
- inputManager.showSoftInput(flip, InputMethodManager.SHOW_FORCED);
- keyboardButton.setVisibility(View.GONE);
- }
- });
- if (prefs.getBoolean(PreferenceConstants.HIDE_KEYBOARD, false)) {
- // Force hidden keyboard.
- getWindow().setSoftInputMode(
- WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
- | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
- }
- final ViewConfiguration configuration = ViewConfiguration.get(this);
- int touchSlop = configuration.getScaledTouchSlop();
- mTouchSlopSquare = touchSlop * touchSlop;
-
- // detect fling gestures to switch between terminals
- final GestureDetector detect =
- new GestureDetector(new GestureDetector.SimpleOnGestureListener() {
- private float totalY = 0;
-
- @Override
- public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
-
- final float distx = e2.getRawX() - e1.getRawX();
- final float disty = e2.getRawY() - e1.getRawY();
- final int goalwidth = flip.getWidth() / 2;
-
- // need to slide across half of display to trigger console change
- // make sure user kept a steady hand horizontally
- if (Math.abs(disty) < (flip.getHeight() / 4)) {
- if (distx > goalwidth) {
- shiftCurrentTerminal(SHIFT_RIGHT);
- return true;
- }
-
- if (distx < -goalwidth) {
- shiftCurrentTerminal(SHIFT_LEFT);
- return true;
- }
-
- }
-
- return false;
- }
-
- @Override
- public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
-
- // if copying, then ignore
- if (copySource != null && copySource.isSelectingForCopy()) {
- return false;
- }
-
- if (e1 == null || e2 == null) {
- return false;
- }
-
- // if releasing then reset total scroll
- if (e2.getAction() == MotionEvent.ACTION_UP) {
- totalY = 0;
- }
-
- // activate consider if within x tolerance
- if (Math.abs(e1.getX() - e2.getX()) < ViewConfiguration.getTouchSlop() * 4) {
-
- View flip = findCurrentView(R.id.console_flip);
- if (flip == null) {
- return false;
- }
- TerminalView terminal = (TerminalView) flip;
-
- // estimate how many rows we have scrolled through
- // accumulate distance that doesn't trigger immediate scroll
- totalY += distanceY;
- final int moved = (int) (totalY / terminal.bridge.charHeight);
-
- VDUBuffer buffer = terminal.bridge.getVDUBuffer();
-
- // consume as scrollback only if towards right half of screen
- if (e2.getX() > flip.getWidth() / 2) {
- if (moved != 0) {
- int base = buffer.getWindowBase();
- buffer.setWindowBase(base + moved);
- totalY = 0;
- return true;
- }
- } else {
- // otherwise consume as pgup/pgdown for every 5 lines
- if (moved > 5) {
- ((vt320) buffer).keyPressed(vt320.KEY_PAGE_DOWN, ' ', 0);
- terminal.bridge.tryKeyVibrate();
- totalY = 0;
- return true;
- } else if (moved < -5) {
- ((vt320) buffer).keyPressed(vt320.KEY_PAGE_UP, ' ', 0);
- terminal.bridge.tryKeyVibrate();
- totalY = 0;
- return true;
- }
-
- }
-
- }
-
- return false;
- }
-
- });
-
- flip.setOnCreateContextMenuListener(this);
-
- flip.setOnTouchListener(new OnTouchListener() {
-
- public boolean onTouch(View v, MotionEvent event) {
-
- // when copying, highlight the area
- if (copySource != null && copySource.isSelectingForCopy()) {
- int row = (int) Math.floor(event.getY() / copySource.charHeight);
- int col = (int) Math.floor(event.getX() / copySource.charWidth);
-
- SelectionArea area = copySource.getSelectionArea();
-
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- // recording starting area
- if (area.isSelectingOrigin()) {
- area.setRow(row);
- area.setColumn(col);
- lastTouchRow = row;
- lastTouchCol = col;
- copySource.redraw();
- }
- return true;
- case MotionEvent.ACTION_MOVE:
- /*
- * ignore when user hasn't moved since last time so we can fine-tune with directional
- * pad
- */
- if (row == lastTouchRow && col == lastTouchCol) {
- return true;
- }
- // if the user moves, start the selection for other corner
- area.finishSelectingOrigin();
-
- // update selected area
- area.setRow(row);
- area.setColumn(col);
- lastTouchRow = row;
- lastTouchCol = col;
- copySource.redraw();
- return true;
- case MotionEvent.ACTION_UP:
- /*
- * If they didn't move their finger, maybe they meant to select the rest of the text
- * with the directional pad.
- */
- if (area.getLeft() == area.getRight() && area.getTop() == area.getBottom()) {
- return true;
- }
-
- // copy selected area to clipboard
- String copiedText = area.copyFrom(copySource.getVDUBuffer());
-
- clipboard.setText(copiedText);
- Toast.makeText(ConsoleActivity.this,
- getString(R.string.terminal_copy_done, copiedText.length()), Toast.LENGTH_LONG)
- .show();
- // fall through to clear state
-
- case MotionEvent.ACTION_CANCEL:
- // make sure we clear any highlighted area
- area.reset();
- copySource.setSelectingForCopy(false);
- copySource.redraw();
- return true;
- }
- }
-
- Configuration config = getResources().getConfiguration();
-
- if (event.getAction() == MotionEvent.ACTION_DOWN) {
- lastX = event.getX();
- lastY = event.getY();
- } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
- final int deltaX = (int) (lastX - event.getX());
- final int deltaY = (int) (lastY - event.getY());
- int distance = (deltaX * deltaX) + (deltaY * deltaY);
- if (distance > mTouchSlopSquare) {
- // If currently scheduled long press event is not canceled here,
- // GestureDetector.onScroll is executed, which takes a while, and by the time we are
- // back in the view's dispatchTouchEvent
- // mPendingCheckForLongPress is already executed
- flip.cancelLongPress();
- }
- } else if (event.getAction() == MotionEvent.ACTION_UP) {
- // Same as above, except now GestureDetector.onFling is called.
- flip.cancelLongPress();
- if (config.hardKeyboardHidden != Configuration.KEYBOARDHIDDEN_NO
- && keyboardButton.getVisibility() == View.GONE
- && event.getEventTime() - event.getDownTime() < CLICK_TIME
- && Math.abs(event.getX() - lastX) < MAX_CLICK_DISTANCE
- && Math.abs(event.getY() - lastY) < MAX_CLICK_DISTANCE) {
- keyboardButton.startAnimation(keyboard_fade_in);
- keyboardButton.setVisibility(View.VISIBLE);
-
- handler.postDelayed(new Runnable() {
- public void run() {
- if (keyboardButton.getVisibility() == View.GONE) {
- return;
- }
-
- keyboardButton.startAnimation(keyboard_fade_out);
- keyboardButton.setVisibility(View.GONE);
- }
- }, KEYBOARD_DISPLAY_TIME);
-
- return false;
- }
- }
- // pass any touch events back to detector
- return detect.onTouchEvent(event);
- }
-
- });
-
- }
-
- private void configureOrientation() {
- String rotateDefault;
- if (getResources().getConfiguration().keyboard == Configuration.KEYBOARD_NOKEYS) {
- rotateDefault = PreferenceConstants.ROTATION_PORTRAIT;
- } else {
- rotateDefault = PreferenceConstants.ROTATION_LANDSCAPE;
- }
-
- String rotate = prefs.getString(PreferenceConstants.ROTATION, rotateDefault);
- if (PreferenceConstants.ROTATION_DEFAULT.equals(rotate)) {
- rotate = rotateDefault;
- }
-
- // request a forced orientation if requested by user
- if (PreferenceConstants.ROTATION_LANDSCAPE.equals(rotate)) {
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
- forcedOrientation = true;
- } else if (PreferenceConstants.ROTATION_PORTRAIT.equals(rotate)) {
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
- forcedOrientation = true;
- } else {
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
- forcedOrientation = false;
- }
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- super.onCreateOptionsMenu(menu);
- getMenuInflater().inflate(R.menu.terminal, menu);
- menu.setQwertyMode(true);
- return true;
- }
-
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- super.onPrepareOptionsMenu(menu);
- setVolumeControlStream(AudioManager.STREAM_NOTIFICATION);
- TerminalBridge bridge = ((TerminalView) findCurrentView(R.id.console_flip)).bridge;
- boolean sessionOpen = bridge.isSessionOpen();
- menu.findItem(R.id.terminal_menu_resize).setEnabled(sessionOpen);
- if (bridge.getProcess() instanceof ScriptProcess) {
- menu.findItem(R.id.terminal_menu_exit_and_edit).setEnabled(true);
- }
- bridge.onPrepareOptionsMenu(menu);
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- if (item.getItemId() == R.id.terminal_menu_resize) {
- doResize();
- } else if (item.getItemId() == R.id.terminal_menu_preferences) {
- doPreferences();
- } else if (item.getItemId() == R.id.terminal_menu_send_email) {
- doEmailTranscript();
- } else if (item.getItemId() == R.id.terminal_menu_exit_and_edit) {
- TerminalView terminalView = (TerminalView) findCurrentView(R.id.console_flip);
- TerminalBridge bridge = terminalView.bridge;
- if (manager != null) {
- manager.closeConnection(bridge, true);
- } else {
- Intent intent = new Intent(this, ScriptingLayerService.class);
- intent.setAction(Constants.ACTION_KILL_PROCESS);
- intent.putExtra(Constants.EXTRA_PROXY_PORT, bridge.getId());
- startService(intent);
- Message.obtain(disconnectHandler, -1, bridge).sendToTarget();
- }
- Intent intent = new Intent(Constants.ACTION_EDIT_SCRIPT);
- ScriptProcess process = (ScriptProcess) bridge.getProcess();
- intent.putExtra(Constants.EXTRA_SCRIPT_PATH, process.getPath());
- startActivity(intent);
- finish();
- }
- return super.onOptionsItemSelected(item);
- }
-
- @Override
- public void onOptionsMenuClosed(Menu menu) {
- super.onOptionsMenuClosed(menu);
- setVolumeControlStream(AudioManager.STREAM_MUSIC);
- }
-
- private void doResize() {
- closeOptionsMenu();
- final TerminalView terminalView = (TerminalView) findCurrentView(R.id.console_flip);
- final View resizeView = inflater.inflate(R.layout.dia_resize, null, false);
- new AlertDialog.Builder(ConsoleActivity.this).setView(resizeView)
- .setPositiveButton(R.string.button_resize, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- int width, height;
- try {
- width =
- Integer.parseInt(((EditText) resizeView.findViewById(R.id.width)).getText()
- .toString());
- height =
- Integer.parseInt(((EditText) resizeView.findViewById(R.id.height)).getText()
- .toString());
- } catch (NumberFormatException nfe) {
- return;
- }
- terminalView.forceSize(width, height);
- }
- }).setNegativeButton(android.R.string.cancel, null).create().show();
- }
-
- private void doPreferences() {
- startActivity(new Intent(this, Preferences.class));
- }
-
- private void doEmailTranscript() {
- // Don't really want to supply an address, but currently it's required,
- // otherwise we get an exception.
- TerminalView terminalView = (TerminalView) findCurrentView(R.id.console_flip);
- TerminalBridge bridge = terminalView.bridge;
- // TODO(raaar): Replace with process log.
- VDUBuffer buffer = bridge.getVDUBuffer();
- int height = buffer.getRows();
- int width = buffer.getColumns();
- StringBuilder string = new StringBuilder();
- for (int i = 0; i < height; i++) {
- for (int j = 0; j < width; j++) {
- string.append(buffer.getChar(j, i));
- }
- }
- String addr = "user@example.com";
- Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:" + addr));
- intent.putExtra("body", string.toString().trim());
- startActivity(intent);
- }
-
- @Override
- public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) {
- TerminalBridge bridge = ((TerminalView) findCurrentView(R.id.console_flip)).bridge;
- boolean sessionOpen = bridge.isSessionOpen();
- menu.add(Menu.NONE, MenuId.COPY.getId(), Menu.NONE, R.string.terminal_menu_copy);
- if (clipboard.hasText() && sessionOpen) {
- menu.add(Menu.NONE, MenuId.PASTE.getId(), Menu.NONE, R.string.terminal_menu_paste);
- }
- bridge.onCreateContextMenu(menu, view, menuInfo);
- }
-
- @Override
- public boolean onContextItemSelected(MenuItem item) {
- int itemId = item.getItemId();
- if (itemId == MenuId.COPY.getId()) {
- TerminalView terminalView = (TerminalView) findCurrentView(R.id.console_flip);
- copySource = terminalView.bridge;
- SelectionArea area = copySource.getSelectionArea();
- area.reset();
- area.setBounds(copySource.getVDUBuffer().getColumns(), copySource.getVDUBuffer().getRows());
- copySource.setSelectingForCopy(true);
- // Make sure we show the initial selection
- copySource.redraw();
- Toast.makeText(ConsoleActivity.this, getString(R.string.terminal_copy_start),
- Toast.LENGTH_LONG).show();
- return true;
- } else if (itemId == MenuId.PASTE.getId()) {
- TerminalView terminalView = (TerminalView) findCurrentView(R.id.console_flip);
- TerminalBridge bridge = terminalView.bridge;
- // pull string from clipboard and generate all events to force down
- String clip = clipboard.getText().toString();
- bridge.injectString(clip);
- return true;
- }
- return false;
- }
-
- @Override
- public void onStart() {
- super.onStart();
- // connect with manager service to find all bridges
- // when connected it will insert all views
- bindService(new Intent(this, ScriptingLayerService.class), mConnection, 0);
- }
-
- @Override
- public void onPause() {
- super.onPause();
- Log.d("onPause called");
-
- // Allow the screen to dim and fall asleep.
- if (wakelock != null && wakelock.isHeld()) {
- wakelock.release();
- }
-
- if (forcedOrientation && manager != null) {
- manager.setResizeAllowed(false);
- }
- }
-
- @Override
- public void onResume() {
- super.onResume();
- Log.d("onResume called");
-
- // Make sure we don't let the screen fall asleep.
- // This also keeps the Wi-Fi chipset from disconnecting us.
- if (wakelock != null && prefs.getBoolean(PreferenceConstants.KEEP_ALIVE, true)) {
- wakelock.acquire();
- }
-
- configureOrientation();
-
- if (forcedOrientation && manager != null) {
- manager.setResizeAllowed(true);
- }
- }
-
- /*
- * (non-Javadoc)
- *
- * @see android.app.Activity#onNewIntent(android.content.Intent)
- */
- @Override
- protected void onNewIntent(Intent intent) {
- super.onNewIntent(intent);
-
- Log.d("onNewIntent called");
-
- int id = intent.getIntExtra(Constants.EXTRA_PROXY_PORT, -1);
-
- if (id > 0) {
- processID = id;
- }
-
- if (processID == null) {
- Log.e("Got null intent data in onNewIntent()");
- return;
- }
-
- if (manager == null) {
- Log.e("We're not bound in onNewIntent()");
- return;
- }
-
- TerminalBridge requestedBridge = manager.getConnectedBridge(processID);
- int requestedIndex = 0;
-
- synchronized (flip) {
- if (requestedBridge == null) {
- // If we didn't find the requested connection, try opening it
-
- try {
- Log.d(String.format("We couldnt find an existing bridge with id = %d,"
- + "so creating one now", processID));
- requestedBridge = manager.openConnection(processID);
- } catch (Exception e) {
- Log.e("Problem while trying to create new requested bridge", e);
- }
-
- requestedIndex = addNewTerminalView(requestedBridge);
- } else {
- final int flipIndex = getFlipIndex(requestedBridge);
- if (flipIndex > requestedIndex) {
- requestedIndex = flipIndex;
- }
- }
-
- setDisplayedTerminal(requestedIndex);
- }
- }
-
- @Override
- public void onStop() {
- super.onStop();
- unbindService(mConnection);
- }
-
- protected void shiftCurrentTerminal(final int direction) {
- View overlay;
- synchronized (flip) {
- boolean shouldAnimate = flip.getChildCount() > 1;
-
- // Only show animation if there is something else to go to.
- if (shouldAnimate) {
- // keep current overlay from popping up again
- overlay = findCurrentView(R.id.terminal_overlay);
- if (overlay != null) {
- overlay.startAnimation(fade_stay_hidden);
- }
-
- if (direction == SHIFT_LEFT) {
- flip.setInAnimation(slide_left_in);
- flip.setOutAnimation(slide_left_out);
- flip.showNext();
- } else if (direction == SHIFT_RIGHT) {
- flip.setInAnimation(slide_right_in);
- flip.setOutAnimation(slide_right_out);
- flip.showPrevious();
- }
- }
-
- if (shouldAnimate) {
- // show overlay on new slide and start fade
- overlay = findCurrentView(R.id.terminal_overlay);
- if (overlay != null) {
- overlay.startAnimation(fade_out_delayed);
- }
- }
-
- updatePromptVisible();
- }
- }
-
- /**
- * Show any prompts requested by the currently visible {@link TerminalView}.
- */
- protected void updatePromptVisible() {
- // check if our currently-visible terminalbridge is requesting any prompt services
- View view = findCurrentView(R.id.console_flip);
-
- // Hide all the prompts in case a prompt request was canceled
- hideAllPrompts();
-
- if (!(view instanceof TerminalView)) {
- // we dont have an active view, so hide any prompts
- return;
- }
-
- PromptHelper prompt = ((TerminalView) view).bridge.getPromptHelper();
-
- if (Boolean.class.equals(prompt.promptRequested)) {
- booleanPromptGroup.setVisibility(View.VISIBLE);
- booleanPrompt.setText(prompt.promptHint);
- booleanYes.requestFocus();
- } else {
- hideAllPrompts();
- view.requestFocus();
- }
- }
-
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
-
- Log.d(String.format(
- "onConfigurationChanged; requestedOrientation=%d, newConfig.orientation=%d",
- getRequestedOrientation(), newConfig.orientation));
- if (manager != null) {
- if (forcedOrientation
- && (newConfig.orientation != Configuration.ORIENTATION_LANDSCAPE && getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
- || (newConfig.orientation != Configuration.ORIENTATION_PORTRAIT && getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)) {
- manager.setResizeAllowed(false);
- } else {
- manager.setResizeAllowed(true);
- }
-
- manager
- .setHardKeyboardHidden(newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES);
- }
- }
-
- /**
- * Adds a new TerminalBridge to the current set of views in our ViewFlipper.
- *
- * @param bridge
- * TerminalBridge to add to our ViewFlipper
- * @return the child index of the new view in the ViewFlipper
- */
- private int addNewTerminalView(TerminalBridge bridge) {
- // let them know about our prompt handler services
- bridge.getPromptHelper().setHandler(promptHandler);
-
- // inflate each terminal view
- RelativeLayout view = (RelativeLayout) inflater.inflate(R.layout.item_terminal, flip, false);
-
- // set the terminal overlay text
- TextView overlay = (TextView) view.findViewById(R.id.terminal_overlay);
- overlay.setText(bridge.getName());
-
- // and add our terminal view control, using index to place behind overlay
- TerminalView terminal = new TerminalView(ConsoleActivity.this, bridge);
- terminal.setId(R.id.console_flip);
- view.addView(terminal, 0);
-
- synchronized (flip) {
- // finally attach to the flipper
- flip.addView(view);
- return flip.getChildCount() - 1;
- }
- }
-
- private int getFlipIndex(TerminalBridge bridge) {
- synchronized (flip) {
- final int children = flip.getChildCount();
- for (int i = 0; i < children; i++) {
- final View view = flip.getChildAt(i).findViewById(R.id.console_flip);
-
- if (view == null || !(view instanceof TerminalView)) {
- // How did that happen?
- continue;
- }
-
- final TerminalView tv = (TerminalView) view;
-
- if (tv.bridge == bridge) {
- return i;
- }
- }
- }
-
- return -1;
- }
-
- /**
- * Displays the child in the ViewFlipper at the requestedIndex and updates the prompts.
- *
- * @param requestedIndex
- * the index of the terminal view to display
- */
- private void setDisplayedTerminal(int requestedIndex) {
- synchronized (flip) {
- try {
- // show the requested bridge if found, also fade out overlay
- flip.setDisplayedChild(requestedIndex);
- flip.getCurrentView().findViewById(R.id.terminal_overlay).startAnimation(fade_out_delayed);
- } catch (NullPointerException npe) {
- Log.d("View went away when we were about to display it", npe);
- }
- updatePromptVisible();
- }
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/HelpActivity.java b/sl4a/ScriptingLayerForAndroid/src/org/connectbot/HelpActivity.java
deleted file mode 100644
index 0ec485e..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/HelpActivity.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.connectbot;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.content.res.AssetManager;
-import android.os.Bundle;
-import android.text.method.LinkMovementMethod;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.Button;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.R;
-import com.googlecode.android_scripting.Version;
-
-import java.io.IOException;
-
-/**
- * @author Kenny Root
- *
- */
-public class HelpActivity extends Activity {
- public final static String TAG = "ConnectBot.HelpActivity";
-
- public final static String HELPDIR = "help";
- public final static String SUFFIX = ".html";
-
- @Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- setContentView(R.layout.act_help);
-
- this.setTitle(String.format("%s: %s", getResources().getText(R.string.application_nice_title),
- getResources().getText(R.string.title_help)));
-
- TextView subtitle = (TextView) findViewById(R.id.version);
- subtitle.setText(getText(R.string.application_title) + " r"
- + Version.getVersion(getApplication()));
-
- ((TextView) findViewById(R.id.help_acks_text)).setMovementMethod(LinkMovementMethod
- .getInstance());
-
- AssetManager am = getAssets();
- LinearLayout content = (LinearLayout) findViewById(R.id.topics);
-
- try {
- for (String name : am.list(HELPDIR)) {
- if (name.endsWith(SUFFIX)) {
- Button button = new Button(this);
- final String topic = name.substring(0, name.length() - SUFFIX.length());
- button.setText(topic);
-
- button.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- Intent intent = new Intent(HelpActivity.this, HelpTopicActivity.class);
- intent.putExtra(Intent.EXTRA_TITLE, topic);
- HelpActivity.this.startActivity(intent);
- }
- });
-
- content.addView(button);
- }
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- Log.e("couldn't get list of help assets", e);
- }
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/HelpTopicActivity.java b/sl4a/ScriptingLayerForAndroid/src/org/connectbot/HelpTopicActivity.java
deleted file mode 100644
index 6453607..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/HelpTopicActivity.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.connectbot;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.os.Bundle;
-
-import com.googlecode.android_scripting.R;
-
-import org.connectbot.util.HelpTopicView;
-
-/**
- * @author Kenny Root
- *
- */
-public class HelpTopicActivity extends Activity {
- public final static String TAG = "ConnectBot.HelpActivity";
-
- @Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- setContentView(R.layout.act_help_topic);
-
- String topic = getIntent().getStringExtra(Intent.EXTRA_TITLE);
-
- this.setTitle(String.format("%s: %s - %s", getResources().getText(R.string.application_title),
- getResources().getText(R.string.title_help), topic));
-
- HelpTopicView helpTopic = (HelpTopicView) findViewById(R.id.topic_text);
-
- helpTopic.setTopic(topic);
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/TerminalView.java b/sl4a/ScriptingLayerForAndroid/src/org/connectbot/TerminalView.java
deleted file mode 100644
index dfe231b..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/TerminalView.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.connectbot;
-
-import android.app.Activity;
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Matrix;
-import android.graphics.Paint;
-import android.graphics.Path;
-import android.graphics.PixelXorXfermode;
-import android.graphics.RectF;
-import android.view.View;
-import android.view.ViewGroup.LayoutParams;
-import android.view.inputmethod.BaseInputConnection;
-import android.view.inputmethod.EditorInfo;
-import android.view.inputmethod.InputConnection;
-import android.widget.Toast;
-import de.mud.terminal.VDUBuffer;
-
-import org.connectbot.service.FontSizeChangedListener;
-import org.connectbot.service.TerminalBridge;
-import org.connectbot.service.TerminalKeyListener;
-import org.connectbot.util.SelectionArea;
-
-/**
- * User interface {@link View} for showing a TerminalBridge in an {@link Activity}. Handles drawing
- * bitmap updates and passing keystrokes down to terminal.
- * @author jsharkey
- */
-public class TerminalView extends View implements FontSizeChangedListener {
-
- private final Context context;
- public final TerminalBridge bridge;
- private final Paint paint;
- private final Paint cursorPaint;
- private final Paint cursorStrokePaint;
-
- // Cursor paints to distinguish modes
- private Path ctrlCursor, altCursor, shiftCursor;
- private RectF tempSrc, tempDst;
- private Matrix scaleMatrix;
- private static final Matrix.ScaleToFit scaleType = Matrix.ScaleToFit.FILL;
-
- private Toast notification = null;
- private String lastNotification = null;
- private volatile boolean notifications = true;
-
- public TerminalView(Context context, TerminalBridge bridge) {
- super(context);
-
- this.context = context;
- this.bridge = bridge;
- paint = new Paint();
-
- setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
- setFocusable(true);
- setFocusableInTouchMode(true);
-
- cursorPaint = new Paint();
- cursorPaint.setColor(bridge.getForegroundColor());
- cursorPaint.setXfermode(new PixelXorXfermode(bridge.getBackgroundColor()));
- cursorPaint.setAntiAlias(true);
-
- cursorStrokePaint = new Paint(cursorPaint);
- cursorStrokePaint.setStrokeWidth(0.1f);
- cursorStrokePaint.setStyle(Paint.Style.STROKE);
-
- /*
- * Set up our cursor indicators on a 1x1 Path object which we can later transform to our
- * character width and height
- */
- // TODO make this into a resource somehow
- shiftCursor = new Path();
- shiftCursor.lineTo(0.5f, 0.33f);
- shiftCursor.lineTo(1.0f, 0.0f);
-
- altCursor = new Path();
- altCursor.moveTo(0.0f, 1.0f);
- altCursor.lineTo(0.5f, 0.66f);
- altCursor.lineTo(1.0f, 1.0f);
-
- ctrlCursor = new Path();
- ctrlCursor.moveTo(0.0f, 0.25f);
- ctrlCursor.lineTo(1.0f, 0.5f);
- ctrlCursor.lineTo(0.0f, 0.75f);
-
- // For creating the transform when the terminal resizes
- tempSrc = new RectF();
- tempSrc.set(0.0f, 0.0f, 1.0f, 1.0f);
- tempDst = new RectF();
- scaleMatrix = new Matrix();
-
- bridge.addFontSizeChangedListener(this);
-
- // connect our view up to the bridge
- setOnKeyListener(bridge.getKeyHandler());
- }
-
- public void destroy() {
- // tell bridge to destroy its bitmap
- bridge.parentDestroyed();
- }
-
- @Override
- protected void onSizeChanged(int w, int h, int oldw, int oldh) {
- super.onSizeChanged(w, h, oldw, oldh);
-
- bridge.parentChanged(this);
-
- scaleCursors();
- }
-
- public void onFontSizeChanged(float size) {
- scaleCursors();
- }
-
- private void scaleCursors() {
- // Create a scale matrix to scale our 1x1 representation of the cursor
- tempDst.set(0.0f, 0.0f, bridge.charWidth, bridge.charHeight);
- scaleMatrix.setRectToRect(tempSrc, tempDst, scaleType);
- }
-
- @Override
- public void onDraw(Canvas canvas) {
- if (bridge.getBitmap() != null) {
- // draw the bitmap
- bridge.onDraw();
-
- // draw the bridge bitmap if it exists
- canvas.drawBitmap(bridge.getBitmap(), 0, 0, paint);
-
- VDUBuffer buffer = bridge.getVDUBuffer();
-
- // also draw cursor if visible
- if (buffer.isCursorVisible()) {
-
- int cursorColumn = buffer.getCursorColumn();
- final int cursorRow = buffer.getCursorRow();
-
- final int columns = buffer.getColumns();
-
- if (cursorColumn == columns) {
- cursorColumn = columns - 1;
- }
-
- if (cursorColumn < 0 || cursorRow < 0) {
- return;
- }
-
- int currentAttribute = buffer.getAttributes(cursorColumn, cursorRow);
- boolean onWideCharacter = (currentAttribute & VDUBuffer.FULLWIDTH) != 0;
-
- int x = cursorColumn * bridge.charWidth;
- int y = (buffer.getCursorRow() + buffer.screenBase - buffer.windowBase) * bridge.charHeight;
-
- // Save the current clip and translation
- canvas.save();
-
- canvas.translate(x, y);
- canvas.clipRect(0, 0, bridge.charWidth * (onWideCharacter ? 2 : 1), bridge.charHeight);
- canvas.drawPaint(cursorPaint);
-
- // Make sure we scale our decorations to the correct size.
- canvas.concat(scaleMatrix);
-
- int metaState = bridge.getKeyHandler().getMetaState();
-
- if ((metaState & TerminalKeyListener.META_SHIFT_ON) != 0) {
- canvas.drawPath(shiftCursor, cursorStrokePaint);
- } else if ((metaState & TerminalKeyListener.META_SHIFT_LOCK) != 0) {
- canvas.drawPath(shiftCursor, cursorPaint);
- }
-
- if ((metaState & TerminalKeyListener.META_ALT_ON) != 0) {
- canvas.drawPath(altCursor, cursorStrokePaint);
- } else if ((metaState & TerminalKeyListener.META_ALT_LOCK) != 0) {
- canvas.drawPath(altCursor, cursorPaint);
- }
-
- if ((metaState & TerminalKeyListener.META_CTRL_ON) != 0) {
- canvas.drawPath(ctrlCursor, cursorStrokePaint);
- } else if ((metaState & TerminalKeyListener.META_CTRL_LOCK) != 0) {
- canvas.drawPath(ctrlCursor, cursorPaint);
- }
-
- // Restore previous clip region
- canvas.restore();
- }
-
- // draw any highlighted area
- if (bridge.isSelectingForCopy()) {
- SelectionArea area = bridge.getSelectionArea();
- canvas.save(Canvas.CLIP_SAVE_FLAG);
- canvas.clipRect(area.getLeft() * bridge.charWidth, area.getTop() * bridge.charHeight, (area
- .getRight() + 1)
- * bridge.charWidth, (area.getBottom() + 1) * bridge.charHeight);
- canvas.drawPaint(cursorPaint);
- canvas.restore();
- }
- }
- }
-
- public void notifyUser(String message) {
- if (!notifications) {
- return;
- }
-
- if (notification != null) {
- // Don't keep telling the user the same thing.
- if (lastNotification != null && lastNotification.equals(message)) {
- return;
- }
-
- notification.setText(message);
- notification.show();
- } else {
- notification = Toast.makeText(context, message, Toast.LENGTH_SHORT);
- notification.show();
- }
-
- lastNotification = message;
- }
-
- /**
- * Ask the {@link TerminalBridge} we're connected to to resize to a specific size.
- * @param width
- * @param height
- */
- public void forceSize(int width, int height) {
- bridge.resizeComputed(width, height, getWidth(), getHeight());
- }
-
- /**
- * Sets the ability for the TerminalView to display Toast notifications to the user.
- * @param value
- * whether to enable notifications or not
- */
- public void setNotifications(boolean value) {
- notifications = value;
- }
-
- @Override
- public boolean onCheckIsTextEditor() {
- return true;
- }
-
- @Override
- public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
- outAttrs.imeOptions |=
- EditorInfo.IME_FLAG_NO_EXTRACT_UI | EditorInfo.IME_FLAG_NO_ENTER_ACTION
- | EditorInfo.IME_ACTION_NONE;
- outAttrs.inputType = EditorInfo.TYPE_NULL;
- return new BaseInputConnection(this, false);
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/service/FontSizeChangedListener.java b/sl4a/ScriptingLayerForAndroid/src/org/connectbot/service/FontSizeChangedListener.java
deleted file mode 100644
index eb1c33d..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/service/FontSizeChangedListener.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.connectbot.service;
-
-/**
- * @author Kenny Root
- *
- */
-public interface FontSizeChangedListener {
-
- /**
- * @param size
- * new font size
- */
- void onFontSizeChanged(float size);
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/service/PromptHelper.java b/sl4a/ScriptingLayerForAndroid/src/org/connectbot/service/PromptHelper.java
deleted file mode 100644
index f0a37be..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/service/PromptHelper.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.connectbot.service;
-
-import java.util.concurrent.Semaphore;
-
-import android.os.Handler;
-import android.os.Message;
-
-/**
- * Helps provide a relay for prompts and responses between a possible user
- * interface and some underlying service.
- *
- * @author jsharkey
- */
-public class PromptHelper {
- private final Object tag;
-
- private Handler handler = null;
-
- private Semaphore promptToken;
- private Semaphore promptResponse;
-
- public String promptInstructions = null;
- public String promptHint = null;
- public Object promptRequested = null;
-
- private Object response = null;
-
- public PromptHelper(Object tag) {
- this.tag = tag;
-
- // Threads must acquire this before they can send a prompt.
- promptToken = new Semaphore(1);
-
- // Responses will release this semaphore.
- promptResponse = new Semaphore(0);
- }
-
-
- /**
- * Register a user interface handler, if available.
- */
- public void setHandler(Handler handler) {
- this.handler = handler;
- }
-
- /**
- * Set an incoming value from an above user interface. Will automatically
- * notify any waiting requests.
- */
- public void setResponse(Object value) {
- response = value;
- promptRequested = null;
- promptInstructions = null;
- promptHint = null;
- promptResponse.release();
- }
-
- /**
- * Return the internal response value just before erasing and returning it.
- */
- protected Object popResponse() {
- Object value = response;
- response = null;
- return value;
- }
-
-
- /**
- * Request a prompt response from parent. This is a blocking call until user
- * interface returns a value.
- * Only one thread can call this at a time. cancelPrompt() will force this to
- * immediately return.
- */
- private Object requestPrompt(String instructions, String hint, Object type) throws InterruptedException {
- Object response = null;
-
- promptToken.acquire();
-
- try {
- promptInstructions = instructions;
- promptHint = hint;
- promptRequested = type;
-
- // notify any parent watching for live events
- if (handler != null)
- Message.obtain(handler, -1, tag).sendToTarget();
-
- // acquire lock until user passes back value
- promptResponse.acquire();
-
- response = popResponse();
- } finally {
- promptToken.release();
- }
-
- return response;
- }
-
- /**
- * Request a string response from parent. This is a blocking call until user
- * interface returns a value.
- * @param hint prompt hint for user to answer
- * @return string user has entered
- */
- public String requestStringPrompt(String instructions, String hint) {
- String value = null;
- try {
- value = (String)this.requestPrompt(instructions, hint, String.class);
- } catch(Exception e) {
- }
- return value;
- }
-
- /**
- * Request a boolean response from parent. This is a blocking call until user
- * interface returns a value.
- * @param hint prompt hint for user to answer
- * @return choice user has made (yes/no)
- */
- public Boolean requestBooleanPrompt(String instructions, String hint) {
- Boolean value = null;
- try {
- value = (Boolean)this.requestPrompt(instructions, hint, Boolean.class);
- } catch(Exception e) {
- }
- return value;
- }
-
- /**
- * Cancel an in-progress prompt.
- */
- public void cancelPrompt() {
- if (!promptToken.tryAcquire()) {
- // A thread has the token, so try to interrupt it
- response = null;
- promptResponse.release();
- } else {
- // No threads have acquired the token
- promptToken.release();
- }
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/service/Relay.java b/sl4a/ScriptingLayerForAndroid/src/org/connectbot/service/Relay.java
deleted file mode 100644
index 0925321..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/service/Relay.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.connectbot.service;
-
-import com.googlecode.android_scripting.Log;
-
-import de.mud.terminal.vt320;
-
-import org.apache.harmony.niochar.charset.additional.IBM437;
-import org.connectbot.transport.AbsTransport;
-import org.connectbot.util.EastAsianWidth;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.CharBuffer;
-import java.nio.charset.Charset;
-import java.nio.charset.CharsetDecoder;
-import java.nio.charset.CoderResult;
-import java.nio.charset.CodingErrorAction;
-
-/**
- * @author Kenny Root
- */
-public class Relay implements Runnable {
-
- private static final int BUFFER_SIZE = 4096;
-
- private static boolean useJNI = true;
-
- private TerminalBridge bridge;
-
- private Charset currentCharset;
- private CharsetDecoder decoder;
- private boolean isLegacyEastAsian = false;
-
- private AbsTransport transport;
-
- private vt320 buffer;
-
- private ByteBuffer byteBuffer;
- private CharBuffer charBuffer;
-
- private byte[] byteArray;
- private char[] charArray;
-
- static {
- useJNI = EastAsianWidth.useJNI;
- }
-
- public Relay(TerminalBridge bridge, AbsTransport transport, vt320 buffer, String encoding) {
- setCharset(encoding);
- this.bridge = bridge;
- this.transport = transport;
- this.buffer = buffer;
- }
-
- public void setCharset(String encoding) {
- Log.d("changing charset to " + encoding);
- Charset charset;
- if (encoding.equals("CP437")) {
- charset = new IBM437("IBM437", new String[] { "IBM437", "CP437" });
- } else {
- charset = Charset.forName(encoding);
- }
-
- if (charset == currentCharset || charset == null) {
- return;
- }
-
- CharsetDecoder newCd = charset.newDecoder();
- newCd.onUnmappableCharacter(CodingErrorAction.REPLACE);
- newCd.onMalformedInput(CodingErrorAction.REPLACE);
-
- currentCharset = charset;
- synchronized (this) {
- decoder = newCd;
- }
- }
-
- public void run() {
- byteBuffer = ByteBuffer.allocate(BUFFER_SIZE);
- charBuffer = CharBuffer.allocate(BUFFER_SIZE);
-
- /* for both JNI and non-JNI method */
- byte[] wideAttribute = new byte[BUFFER_SIZE];
-
- /* non-JNI fallback method */
- float[] widths = null;
-
- if (!useJNI) {
- widths = new float[BUFFER_SIZE];
- }
-
- byteArray = byteBuffer.array();
- charArray = charBuffer.array();
-
- CoderResult result;
-
- int bytesRead = 0;
- byteBuffer.limit(0);
- int bytesToRead;
- int offset;
- int charWidth;
-
- try {
- while (true) {
- charWidth = bridge.charWidth;
- bytesToRead = byteBuffer.capacity() - byteBuffer.limit();
- offset = byteBuffer.arrayOffset() + byteBuffer.limit();
- bytesRead = transport.read(byteArray, offset, bytesToRead);
-
- if (bytesRead > 0) {
- byteBuffer.limit(byteBuffer.limit() + bytesRead);
-
- synchronized (this) {
- result = decoder.decode(byteBuffer, charBuffer, false);
- }
-
- if (result.isUnderflow() && byteBuffer.limit() == byteBuffer.capacity()) {
- byteBuffer.compact();
- byteBuffer.limit(byteBuffer.position());
- byteBuffer.position(0);
- }
-
- offset = charBuffer.position();
-
- if (!useJNI) {
- bridge.getPaint().getTextWidths(charArray, 0, offset, widths);
- for (int i = 0; i < offset; i++) {
- wideAttribute[i] = (byte) (((int) widths[i] != charWidth) ? 1 : 0);
- }
- } else {
- EastAsianWidth.measure(charArray, 0, charBuffer.position(), wideAttribute,
- isLegacyEastAsian);
- }
- buffer.putString(charArray, wideAttribute, 0, charBuffer.position());
- charBuffer.clear();
- bridge.redraw();
- }
- }
- } catch (IOException e) {
- Log.e("Problem while handling incoming data in relay thread", e);
- }
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/service/TerminalBridge.java b/sl4a/ScriptingLayerForAndroid/src/org/connectbot/service/TerminalBridge.java
deleted file mode 100644
index 9a5936b..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/service/TerminalBridge.java
+++ /dev/null
@@ -1,889 +0,0 @@
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.connectbot.service;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.Typeface;
-import android.graphics.Bitmap.Config;
-import android.graphics.Paint.FontMetrics;
-import android.text.ClipboardManager;
-import android.view.ContextMenu;
-import android.view.Menu;
-import android.view.View;
-import android.view.ContextMenu.ContextMenuInfo;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.R;
-import com.googlecode.android_scripting.facade.ui.UiFacade;
-import com.googlecode.android_scripting.interpreter.InterpreterProcess;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiverManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiverManagerFactory;
-
-import de.mud.terminal.VDUBuffer;
-import de.mud.terminal.VDUDisplay;
-import de.mud.terminal.vt320;
-
-import java.io.IOException;
-import java.nio.charset.Charset;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.connectbot.TerminalView;
-import org.connectbot.transport.AbsTransport;
-import org.connectbot.util.Colors;
-import org.connectbot.util.PreferenceConstants;
-import org.connectbot.util.SelectionArea;
-
-/**
- * Provides a bridge between a MUD terminal buffer and a possible TerminalView. This separation
- * allows us to keep the TerminalBridge running in a background service. A TerminalView shares down
- * a bitmap that we can use for rendering when available.
- *
- * @author ConnectBot Dev Team
- * @author raaar
- *
- */
-public class TerminalBridge implements VDUDisplay, OnSharedPreferenceChangeListener {
-
- private final static int FONT_SIZE_STEP = 2;
-
- private final int[] color = new int[Colors.defaults.length];
-
- private final TerminalManager manager;
-
- private final InterpreterProcess mProcess;
-
- private int mDefaultFgColor;
- private int mDefaultBgColor;
-
- private int scrollback;
-
- private String delKey;
- private String encoding;
-
- private AbsTransport transport;
-
- private final Paint defaultPaint;
-
- private Relay relay;
-
- private Bitmap bitmap = null;
- private final VDUBuffer buffer;
-
- private TerminalView parent = null;
- private final Canvas canvas = new Canvas();
-
- private boolean forcedSize = false;
- private int columns;
- private int rows;
-
- private final TerminalKeyListener keyListener;
-
- private boolean selectingForCopy = false;
- private final SelectionArea selectionArea;
- private ClipboardManager clipboard;
-
- public int charWidth = -1;
- public int charHeight = -1;
- private int charTop = -1;
-
- private float fontSize = -1;
-
- private final List<FontSizeChangedListener> fontSizeChangedListeners;
-
- /**
- * Flag indicating if we should perform a full-screen redraw during our next rendering pass.
- */
- private boolean fullRedraw = false;
-
- private final PromptHelper promptHelper;
-
- /**
- * Create a new terminal bridge suitable for unit testing.
- */
- public TerminalBridge() {
- buffer = new vt320() {
- @Override
- public void write(byte[] b) {
- }
-
- @Override
- public void write(int b) {
- }
-
- @Override
- public void sendTelnetCommand(byte cmd) {
- }
-
- @Override
- public void setWindowSize(int c, int r) {
- }
-
- @Override
- public void debug(String s) {
- }
- };
-
- manager = null;
-
- defaultPaint = new Paint();
-
- selectionArea = new SelectionArea();
- scrollback = 1;
-
- fontSizeChangedListeners = new LinkedList<FontSizeChangedListener>();
-
- transport = null;
-
- keyListener = new TerminalKeyListener(manager, this, buffer, null);
-
- mProcess = null;
-
- mDefaultFgColor = 0;
- mDefaultBgColor = 0;
- promptHelper = null;
-
- updateCharset();
- }
-
- /**
- * Create new terminal bridge with following parameters.
- */
- public TerminalBridge(final TerminalManager manager, InterpreterProcess process, AbsTransport t)
- throws IOException {
- this.manager = manager;
- transport = t;
- mProcess = process;
-
- String string = manager.getStringParameter(PreferenceConstants.SCROLLBACK, null);
- if (string != null) {
- scrollback = Integer.parseInt(string);
- } else {
- scrollback = PreferenceConstants.DEFAULT_SCROLLBACK;
- }
-
- string = manager.getStringParameter(PreferenceConstants.FONTSIZE, null);
- if (string != null) {
- fontSize = Float.parseFloat(string);
- } else {
- fontSize = PreferenceConstants.DEFAULT_FONT_SIZE;
- }
-
- mDefaultFgColor =
- manager.getIntParameter(PreferenceConstants.COLOR_FG, PreferenceConstants.DEFAULT_FG_COLOR);
- mDefaultBgColor =
- manager.getIntParameter(PreferenceConstants.COLOR_BG, PreferenceConstants.DEFAULT_BG_COLOR);
-
- delKey = manager.getStringParameter(PreferenceConstants.DELKEY, PreferenceConstants.DELKEY_DEL);
-
- // create prompt helper to relay password and hostkey requests up to gui
- promptHelper = new PromptHelper(this);
-
- // create our default paint
- defaultPaint = new Paint();
- defaultPaint.setAntiAlias(true);
- defaultPaint.setTypeface(Typeface.MONOSPACE);
- defaultPaint.setFakeBoldText(true); // more readable?
-
- fontSizeChangedListeners = new LinkedList<FontSizeChangedListener>();
-
- setFontSize(fontSize);
-
- // create terminal buffer and handle outgoing data
- // this is probably status reply information
- buffer = new vt320() {
- @Override
- public void debug(String s) {
- Log.d(s);
- }
-
- @Override
- public void write(byte[] b) {
- try {
- if (b != null && transport != null) {
- transport.write(b);
- }
- } catch (IOException e) {
- Log.e("Problem writing outgoing data in vt320() thread", e);
- }
- }
-
- @Override
- public void write(int b) {
- try {
- if (transport != null) {
- transport.write(b);
- }
- } catch (IOException e) {
- Log.e("Problem writing outgoing data in vt320() thread", e);
- }
- }
-
- // We don't use telnet sequences.
- @Override
- public void sendTelnetCommand(byte cmd) {
- }
-
- // We don't want remote to resize our window.
- @Override
- public void setWindowSize(int c, int r) {
- }
-
- @Override
- public void beep() {
- if (parent.isShown()) {
- manager.playBeep();
- }
- }
- };
-
- // Don't keep any scrollback if a session is not being opened.
-
- buffer.setBufferSize(scrollback);
-
- resetColors();
- buffer.setDisplay(this);
-
- selectionArea = new SelectionArea();
-
- keyListener = new TerminalKeyListener(manager, this, buffer, encoding);
-
- updateCharset();
-
- manager.registerOnSharedPreferenceChangeListener(this);
-
- }
-
- /**
- * Spawn thread to open connection and start login process.
- */
- protected void connect() {
- transport.setBridge(this);
- transport.setManager(manager);
- transport.connect();
-
- ((vt320) buffer).reset();
-
- // previously tried vt100 and xterm for emulation modes
- // "screen" works the best for color and escape codes
- ((vt320) buffer).setAnswerBack("screen");
-
- if (PreferenceConstants.DELKEY_BACKSPACE.equals(delKey)) {
- ((vt320) buffer).setBackspace(vt320.DELETE_IS_BACKSPACE);
- } else {
- ((vt320) buffer).setBackspace(vt320.DELETE_IS_DEL);
- }
-
- // create thread to relay incoming connection data to buffer
- relay = new Relay(this, transport, (vt320) buffer, encoding);
- Thread relayThread = new Thread(relay);
- relayThread.setDaemon(true);
- relayThread.setName("Relay");
- relayThread.start();
-
- // force font-size to make sure we resizePTY as needed
- setFontSize(fontSize);
-
- }
-
- private void updateCharset() {
- encoding =
- manager.getStringParameter(PreferenceConstants.ENCODING, Charset.defaultCharset().name());
- if (relay != null) {
- relay.setCharset(encoding);
- }
- keyListener.setCharset(encoding);
- }
-
- /**
- * Inject a specific string into this terminal. Used for post-login strings and pasting clipboard.
- */
- public void injectString(final String string) {
- if (string == null || string.length() == 0) {
- return;
- }
-
- Thread injectStringThread = new Thread(new Runnable() {
- public void run() {
- try {
- transport.write(string.getBytes(encoding));
- } catch (Exception e) {
- Log.e("Couldn't inject string to remote host: ", e);
- }
- }
- });
- injectStringThread.setName("InjectString");
- injectStringThread.start();
- }
-
- /**
- * @return whether a session is open or not
- */
- public boolean isSessionOpen() {
- if (transport != null) {
- return transport.isSessionOpen();
- }
- return false;
- }
-
- /**
- * Force disconnection of this terminal bridge.
- */
- public void dispatchDisconnect(boolean immediate) {
-
- // Cancel any pending prompts.
- promptHelper.cancelPrompt();
-
- if (immediate) {
- manager.closeConnection(TerminalBridge.this, true);
- } else {
- Thread disconnectPromptThread = new Thread(new Runnable() {
- public void run() {
- String prompt = null;
- if (transport != null && transport.isConnected()) {
- prompt = manager.getResources().getString(R.string.prompt_confirm_exit);
- } else {
- prompt = manager.getResources().getString(R.string.prompt_process_exited);
- }
- Boolean result = promptHelper.requestBooleanPrompt(null, prompt);
-
- if (transport != null && transport.isConnected()) {
- manager.closeConnection(TerminalBridge.this, result != null && result.booleanValue());
- } else if (result != null && result.booleanValue()) {
- manager.closeConnection(TerminalBridge.this, false);
- }
- }
- });
- disconnectPromptThread.setName("DisconnectPrompt");
- disconnectPromptThread.setDaemon(true);
- disconnectPromptThread.start();
- }
- }
-
- public void setSelectingForCopy(boolean selectingForCopy) {
- this.selectingForCopy = selectingForCopy;
- }
-
- public boolean isSelectingForCopy() {
- return selectingForCopy;
- }
-
- public SelectionArea getSelectionArea() {
- return selectionArea;
- }
-
- public synchronized void tryKeyVibrate() {
- manager.tryKeyVibrate();
- }
-
- /**
- * Request a different font size. Will make call to parentChanged() to make sure we resize PTY if
- * needed.
- */
- /* package */final void setFontSize(float size) {
- if (size <= 0.0) {
- return;
- }
-
- defaultPaint.setTextSize(size);
- fontSize = size;
-
- // read new metrics to get exact pixel dimensions
- FontMetrics fm = defaultPaint.getFontMetrics();
- charTop = (int) Math.ceil(fm.top);
-
- float[] widths = new float[1];
- defaultPaint.getTextWidths("X", widths);
- charWidth = (int) Math.ceil(widths[0]);
- charHeight = (int) Math.ceil(fm.descent - fm.top);
-
- // refresh any bitmap with new font size
- if (parent != null) {
- parentChanged(parent);
- }
-
- for (FontSizeChangedListener ofscl : fontSizeChangedListeners) {
- ofscl.onFontSizeChanged(size);
- }
- forcedSize = false;
- }
-
- /**
- * Add an {@link FontSizeChangedListener} to the list of listeners for this bridge.
- *
- * @param listener
- * listener to add
- */
- public void addFontSizeChangedListener(FontSizeChangedListener listener) {
- fontSizeChangedListeners.add(listener);
- }
-
- /**
- * Remove an {@link FontSizeChangedListener} from the list of listeners for this bridge.
- *
- * @param listener
- */
- public void removeFontSizeChangedListener(FontSizeChangedListener listener) {
- fontSizeChangedListeners.remove(listener);
- }
-
- /**
- * Something changed in our parent {@link TerminalView}, maybe it's a new parent, or maybe it's an
- * updated font size. We should recalculate terminal size information and request a PTY resize.
- */
- public final synchronized void parentChanged(TerminalView parent) {
- if (manager != null && !manager.isResizeAllowed()) {
- Log.d("Resize is not allowed now");
- return;
- }
-
- this.parent = parent;
- final int width = parent.getWidth();
- final int height = parent.getHeight();
-
- // Something has gone wrong with our layout; we're 0 width or height!
- if (width <= 0 || height <= 0) {
- return;
- }
-
- clipboard = (ClipboardManager) parent.getContext().getSystemService(Context.CLIPBOARD_SERVICE);
- keyListener.setClipboardManager(clipboard);
-
- if (!forcedSize) {
- // recalculate buffer size
- int newColumns, newRows;
-
- newColumns = width / charWidth;
- newRows = height / charHeight;
-
- // If nothing has changed in the terminal dimensions and not an intial
- // draw then don't blow away scroll regions and such.
- if (newColumns == columns && newRows == rows) {
- return;
- }
-
- columns = newColumns;
- rows = newRows;
- }
-
- // reallocate new bitmap if needed
- boolean newBitmap = (bitmap == null);
- if (bitmap != null) {
- newBitmap = (bitmap.getWidth() != width || bitmap.getHeight() != height);
- }
-
- if (newBitmap) {
- discardBitmap();
- bitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);
- canvas.setBitmap(bitmap);
- }
-
- // clear out any old buffer information
- defaultPaint.setColor(Color.BLACK);
- canvas.drawPaint(defaultPaint);
-
- // Stroke the border of the terminal if the size is being forced;
- if (forcedSize) {
- int borderX = (columns * charWidth) + 1;
- int borderY = (rows * charHeight) + 1;
-
- defaultPaint.setColor(Color.GRAY);
- defaultPaint.setStrokeWidth(0.0f);
- if (width >= borderX) {
- canvas.drawLine(borderX, 0, borderX, borderY + 1, defaultPaint);
- }
- if (height >= borderY) {
- canvas.drawLine(0, borderY, borderX + 1, borderY, defaultPaint);
- }
- }
-
- try {
- // request a terminal pty resize
- synchronized (buffer) {
- buffer.setScreenSize(columns, rows, true);
- }
-
- if (transport != null) {
- transport.setDimensions(columns, rows, width, height);
- }
- } catch (Exception e) {
- Log.e("Problem while trying to resize screen or PTY", e);
- }
-
- // force full redraw with new buffer size
- fullRedraw = true;
- redraw();
-
- parent.notifyUser(String.format("%d x %d", columns, rows));
-
- Log.i(String.format("parentChanged() now width=%d, height=%d", columns, rows));
- }
-
- /**
- * Somehow our parent {@link TerminalView} was destroyed. Now we don't need to redraw anywhere,
- * and we can recycle our internal bitmap.
- */
- public synchronized void parentDestroyed() {
- parent = null;
- discardBitmap();
- }
-
- private void discardBitmap() {
- if (bitmap != null) {
- bitmap.recycle();
- }
- bitmap = null;
- }
-
- public void onDraw() {
- int fg, bg;
- synchronized (buffer) {
- boolean entireDirty = buffer.update[0] || fullRedraw;
- boolean isWideCharacter = false;
-
- // walk through all lines in the buffer
- for (int l = 0; l < buffer.height; l++) {
-
- // check if this line is dirty and needs to be repainted
- // also check for entire-buffer dirty flags
- if (!entireDirty && !buffer.update[l + 1]) {
- continue;
- }
-
- // reset dirty flag for this line
- buffer.update[l + 1] = false;
-
- // walk through all characters in this line
- for (int c = 0; c < buffer.width; c++) {
- int addr = 0;
- int currAttr = buffer.charAttributes[buffer.windowBase + l][c];
- // check if foreground color attribute is set
- if ((currAttr & VDUBuffer.COLOR_FG) != 0) {
- int fgcolor = ((currAttr & VDUBuffer.COLOR_FG) >> VDUBuffer.COLOR_FG_SHIFT) - 1;
- if (fgcolor < 8 && (currAttr & VDUBuffer.BOLD) != 0) {
- fg = color[fgcolor + 8];
- } else {
- fg = color[fgcolor];
- }
- } else {
- fg = mDefaultFgColor;
- }
-
- // check if background color attribute is set
- if ((currAttr & VDUBuffer.COLOR_BG) != 0) {
- bg = color[((currAttr & VDUBuffer.COLOR_BG) >> VDUBuffer.COLOR_BG_SHIFT) - 1];
- } else {
- bg = mDefaultBgColor;
- }
-
- // support character inversion by swapping background and foreground color
- if ((currAttr & VDUBuffer.INVERT) != 0) {
- int swapc = bg;
- bg = fg;
- fg = swapc;
- }
-
- // set underlined attributes if requested
- defaultPaint.setUnderlineText((currAttr & VDUBuffer.UNDERLINE) != 0);
-
- isWideCharacter = (currAttr & VDUBuffer.FULLWIDTH) != 0;
-
- if (isWideCharacter) {
- addr++;
- } else {
- // determine the amount of continuous characters with the same settings and print them
- // all at once
- while (c + addr < buffer.width
- && buffer.charAttributes[buffer.windowBase + l][c + addr] == currAttr) {
- addr++;
- }
- }
-
- // Save the current clip region
- canvas.save(Canvas.CLIP_SAVE_FLAG);
-
- // clear this dirty area with background color
- defaultPaint.setColor(bg);
- if (isWideCharacter) {
- canvas.clipRect(c * charWidth, l * charHeight, (c + 2) * charWidth, (l + 1)
- * charHeight);
- } else {
- canvas.clipRect(c * charWidth, l * charHeight, (c + addr) * charWidth, (l + 1)
- * charHeight);
- }
- canvas.drawPaint(defaultPaint);
-
- // write the text string starting at 'c' for 'addr' number of characters
- defaultPaint.setColor(fg);
- if ((currAttr & VDUBuffer.INVISIBLE) == 0) {
- canvas.drawText(buffer.charArray[buffer.windowBase + l], c, addr, c * charWidth,
- (l * charHeight) - charTop, defaultPaint);
- }
-
- // Restore the previous clip region
- canvas.restore();
-
- // advance to the next text block with different characteristics
- c += addr - 1;
- if (isWideCharacter) {
- c++;
- }
- }
- }
-
- // reset entire-buffer flags
- buffer.update[0] = false;
- }
- fullRedraw = false;
- }
-
- public void redraw() {
- if (parent != null) {
- parent.postInvalidate();
- }
- }
-
- // We don't have a scroll bar.
- public void updateScrollBar() {
- }
-
- /**
- * Resize terminal to fit [rows]x[cols] in screen of size [width]x[height]
- *
- * @param rows
- * @param cols
- * @param width
- * @param height
- */
- public synchronized void resizeComputed(int cols, int rows, int width, int height) {
- float size = 8.0f;
- float step = 8.0f;
- float limit = 0.125f;
-
- int direction;
-
- while ((direction = fontSizeCompare(size, cols, rows, width, height)) < 0) {
- size += step;
- }
-
- if (direction == 0) {
- Log.d(String.format("Fontsize: found match at %f", size));
- return;
- }
-
- step /= 2.0f;
- size -= step;
-
- while ((direction = fontSizeCompare(size, cols, rows, width, height)) != 0 && step >= limit) {
- step /= 2.0f;
- if (direction > 0) {
- size -= step;
- } else {
- size += step;
- }
- }
-
- if (direction > 0) {
- size -= step;
- }
-
- columns = cols;
- this.rows = rows;
- setFontSize(size);
- forcedSize = true;
- }
-
- private int fontSizeCompare(float size, int cols, int rows, int width, int height) {
- // read new metrics to get exact pixel dimensions
- defaultPaint.setTextSize(size);
- FontMetrics fm = defaultPaint.getFontMetrics();
-
- float[] widths = new float[1];
- defaultPaint.getTextWidths("X", widths);
- int termWidth = (int) widths[0] * cols;
- int termHeight = (int) Math.ceil(fm.descent - fm.top) * rows;
-
- Log.d(String.format("Fontsize: font size %f resulted in %d x %d", size, termWidth, termHeight));
-
- // Check to see if it fits in resolution specified.
- if (termWidth > width || termHeight > height) {
- return 1;
- }
-
- if (termWidth == width || termHeight == height) {
- return 0;
- }
-
- return -1;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see de.mud.terminal.VDUDisplay#setVDUBuffer(de.mud.terminal.VDUBuffer)
- */
- @Override
- public void setVDUBuffer(VDUBuffer buffer) {
- }
-
- /*
- * (non-Javadoc)
- *
- * @see de.mud.terminal.VDUDisplay#setColor(byte, byte, byte, byte)
- */
- public void setColor(int index, int red, int green, int blue) {
- // Don't allow the system colors to be overwritten for now. May violate specs.
- if (index < color.length && index >= 16) {
- color[index] = 0xff000000 | red << 16 | green << 8 | blue;
- }
- }
-
- public final void resetColors() {
- System.arraycopy(Colors.defaults, 0, color, 0, Colors.defaults.length);
- }
-
- public TerminalKeyListener getKeyHandler() {
- return keyListener;
- }
-
- public void resetScrollPosition() {
- // if we're in scrollback, scroll to bottom of window on input
- if (buffer.windowBase != buffer.screenBase) {
- buffer.setWindowBase(buffer.screenBase);
- }
- }
-
- public void increaseFontSize() {
- setFontSize(fontSize + FONT_SIZE_STEP);
- }
-
- public void decreaseFontSize() {
- setFontSize(fontSize - FONT_SIZE_STEP);
- }
-
- public int getId() {
- return mProcess.getPort();
- }
-
- public String getName() {
- return mProcess.getName();
- }
-
- public InterpreterProcess getProcess() {
- return mProcess;
- }
-
- public int getForegroundColor() {
- return mDefaultFgColor;
- }
-
- public int getBackgroundColor() {
- return mDefaultBgColor;
- }
-
- public VDUBuffer getVDUBuffer() {
- return buffer;
- }
-
- public PromptHelper getPromptHelper() {
- return promptHelper;
- }
-
- public Bitmap getBitmap() {
- return bitmap;
- }
-
- public AbsTransport getTransport() {
- return transport;
- }
-
- public Paint getPaint() {
- return defaultPaint;
- }
-
- public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
- if (mProcess.isAlive()) {
- RpcReceiverManagerFactory rpcReceiverManagerFactory = mProcess.getRpcReceiverManagerFactory();
- for (RpcReceiverManager manager : rpcReceiverManagerFactory.getRpcReceiverManagers().values()) {
- UiFacade facade = manager.getReceiver(UiFacade.class);
- facade.onCreateContextMenu(menu, v, menuInfo);
- }
- }
- }
-
- public boolean onPrepareOptionsMenu(Menu menu) {
- boolean returnValue = false;
- if (mProcess.isAlive()) {
- RpcReceiverManagerFactory rpcReceiverManagerFactory = mProcess.getRpcReceiverManagerFactory();
- for (RpcReceiverManager manager : rpcReceiverManagerFactory.getRpcReceiverManagers().values()) {
- UiFacade facade = manager.getReceiver(UiFacade.class);
- returnValue = returnValue || facade.onPrepareOptionsMenu(menu);
- }
- return returnValue;
- }
- return false;
- }
-
- public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
- if (PreferenceConstants.ENCODING.equals(key)) {
- updateCharset();
- } else if (PreferenceConstants.FONTSIZE.equals(key)) {
- String string = manager.getStringParameter(PreferenceConstants.FONTSIZE, null);
- if (string != null) {
- fontSize = Float.parseFloat(string);
- } else {
- fontSize = PreferenceConstants.DEFAULT_FONT_SIZE;
- }
- setFontSize(fontSize);
- fullRedraw = true;
- } else if (PreferenceConstants.SCROLLBACK.equals(key)) {
- String string = manager.getStringParameter(PreferenceConstants.SCROLLBACK, null);
- if (string != null) {
- scrollback = Integer.parseInt(string);
- } else {
- scrollback = PreferenceConstants.DEFAULT_SCROLLBACK;
- }
- buffer.setBufferSize(scrollback);
- } else if (PreferenceConstants.COLOR_FG.equals(key)) {
- mDefaultFgColor =
- manager.getIntParameter(PreferenceConstants.COLOR_FG,
- PreferenceConstants.DEFAULT_FG_COLOR);
- fullRedraw = true;
- } else if (PreferenceConstants.COLOR_BG.equals(key)) {
- mDefaultBgColor =
- manager.getIntParameter(PreferenceConstants.COLOR_BG,
- PreferenceConstants.DEFAULT_BG_COLOR);
- fullRedraw = true;
- }
- if (PreferenceConstants.DELKEY.equals(key)) {
- delKey =
- manager.getStringParameter(PreferenceConstants.DELKEY, PreferenceConstants.DELKEY_DEL);
- if (PreferenceConstants.DELKEY_BACKSPACE.equals(delKey)) {
- ((vt320) buffer).setBackspace(vt320.DELETE_IS_BACKSPACE);
- } else {
- ((vt320) buffer).setBackspace(vt320.DELETE_IS_DEL);
- }
- }
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/service/TerminalKeyListener.java b/sl4a/ScriptingLayerForAndroid/src/org/connectbot/service/TerminalKeyListener.java
deleted file mode 100644
index 9fce1e8..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/service/TerminalKeyListener.java
+++ /dev/null
@@ -1,510 +0,0 @@
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2010 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.connectbot.service;
-
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
-import android.content.res.Configuration;
-import android.text.ClipboardManager;
-import android.view.KeyCharacterMap;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.View.OnKeyListener;
-
-import com.googlecode.android_scripting.Log;
-
-import de.mud.terminal.VDUBuffer;
-import de.mud.terminal.vt320;
-
-import java.io.IOException;
-
-import org.connectbot.TerminalView;
-import org.connectbot.transport.AbsTransport;
-import org.connectbot.util.PreferenceConstants;
-import org.connectbot.util.SelectionArea;
-
-/**
- * @author kenny
- * @author modified by raaar
- */
-public class TerminalKeyListener implements OnKeyListener, OnSharedPreferenceChangeListener {
-
- public final static int META_CTRL_ON = 0x01;
- public final static int META_CTRL_LOCK = 0x02;
- public final static int META_ALT_ON = 0x04;
- public final static int META_ALT_LOCK = 0x08;
- public final static int META_SHIFT_ON = 0x10;
- public final static int META_SHIFT_LOCK = 0x20;
- public final static int META_SLASH = 0x40;
- public final static int META_TAB = 0x80;
-
- // The bit mask of momentary and lock states for each
- public final static int META_CTRL_MASK = META_CTRL_ON | META_CTRL_LOCK;
- public final static int META_ALT_MASK = META_ALT_ON | META_ALT_LOCK;
- public final static int META_SHIFT_MASK = META_SHIFT_ON | META_SHIFT_LOCK;
-
- // All the transient key codes
- public final static int META_TRANSIENT = META_CTRL_ON | META_ALT_ON | META_SHIFT_ON;
-
- public final static int KEYBOARD_META_CTRL_ON = 0x1000; // Ctrl key mask for API 11+
- private final TerminalManager manager;
- private final TerminalBridge bridge;
- private final VDUBuffer buffer;
-
- protected KeyCharacterMap keymap = KeyCharacterMap.load(KeyCharacterMap.BUILT_IN_KEYBOARD);
-
- private String keymode = null;
- private boolean hardKeyboard = false;
-
- private int metaState = 0;
-
- private ClipboardManager clipboard = null;
- private boolean selectingForCopy = false;
- private final SelectionArea selectionArea;
-
- private String encoding;
-
- public TerminalKeyListener(TerminalManager manager, TerminalBridge bridge, VDUBuffer buffer,
- String encoding) {
- this.manager = manager;
- this.bridge = bridge;
- this.buffer = buffer;
- this.encoding = encoding;
-
- selectionArea = new SelectionArea();
-
- manager.registerOnSharedPreferenceChangeListener(this);
-
- hardKeyboard =
- (manager.getResources().getConfiguration().keyboard == Configuration.KEYBOARD_QWERTY);
-
- updateKeymode();
- }
-
- /**
- * Handle onKey() events coming down from a {@link TerminalView} above us. Modify the keys to make
- * more sense to a host then pass it to the transport.
- */
- public boolean onKey(View v, int keyCode, KeyEvent event) {
- try {
- final boolean hardKeyboardHidden = manager.isHardKeyboardHidden();
-
- AbsTransport transport = bridge.getTransport();
-
- // Ignore all key-up events except for the special keys
- if (event.getAction() == KeyEvent.ACTION_UP) {
- // There's nothing here for virtual keyboard users.
- if (!hardKeyboard || (hardKeyboard && hardKeyboardHidden)) {
- return false;
- }
-
- // skip keys if we aren't connected yet or have been disconnected
- if (transport == null || !transport.isSessionOpen()) {
- return false;
- }
-
- if (PreferenceConstants.KEYMODE_RIGHT.equals(keymode)) {
- if (keyCode == KeyEvent.KEYCODE_ALT_RIGHT && (metaState & META_SLASH) != 0) {
- metaState &= ~(META_SLASH | META_TRANSIENT);
- transport.write('/');
- return true;
- } else if (keyCode == KeyEvent.KEYCODE_SHIFT_RIGHT && (metaState & META_TAB) != 0) {
- metaState &= ~(META_TAB | META_TRANSIENT);
- transport.write(0x09);
- return true;
- }
- } else if (PreferenceConstants.KEYMODE_LEFT.equals(keymode)) {
- if (keyCode == KeyEvent.KEYCODE_ALT_LEFT && (metaState & META_SLASH) != 0) {
- metaState &= ~(META_SLASH | META_TRANSIENT);
- transport.write('/');
- return true;
- } else if (keyCode == KeyEvent.KEYCODE_SHIFT_LEFT && (metaState & META_TAB) != 0) {
- metaState &= ~(META_TAB | META_TRANSIENT);
- transport.write(0x09);
- return true;
- }
- }
-
- return false;
- }
-
- if (keyCode == KeyEvent.KEYCODE_BACK && transport != null) {
- bridge.dispatchDisconnect(!transport.isSessionOpen());
- return true;
- }
-
- // check for terminal resizing keys
- if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
- bridge.increaseFontSize();
- return true;
- } else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
- bridge.decreaseFontSize();
- return true;
- }
-
- // skip keys if we aren't connected yet or have been disconnected
- if (transport == null || !transport.isSessionOpen()) {
- return false;
- }
-
- bridge.resetScrollPosition();
-
- boolean printing = (keymap.isPrintingKey(keyCode) || keyCode == KeyEvent.KEYCODE_SPACE);
-
- // otherwise pass through to existing session
- // print normal keys
- if (printing) {
- int curMetaState = event.getMetaState();
-
- metaState &= ~(META_SLASH | META_TAB);
-
- if ((metaState & META_SHIFT_MASK) != 0) {
- curMetaState |= KeyEvent.META_SHIFT_ON;
- metaState &= ~META_SHIFT_ON;
- bridge.redraw();
- }
-
- if ((metaState & META_ALT_MASK) != 0) {
- curMetaState |= KeyEvent.META_ALT_ON;
- metaState &= ~META_ALT_ON;
- bridge.redraw();
- }
-
- int key = keymap.get(keyCode, curMetaState);
- if ((curMetaState & KEYBOARD_META_CTRL_ON) != 0) {
- metaState |= META_CTRL_ON;
- key = keymap.get(keyCode, 0);
- }
-
- if ((metaState & META_CTRL_MASK) != 0) {
- metaState &= ~META_CTRL_ON;
- bridge.redraw();
-
- if ((!hardKeyboard || (hardKeyboard && hardKeyboardHidden)) && sendFunctionKey(keyCode)) {
- return true;
- }
-
- // Support CTRL-a through CTRL-z
- if (key >= 0x61 && key <= 0x7A) {
- key -= 0x60;
- } else if (key >= 0x41 && key <= 0x5F) {
- key -= 0x40;
- } else if (key == 0x20) {
- key = 0x00;
- } else if (key == 0x3F) {
- key = 0x7F;
- }
- }
-
- // handle pressing f-keys
- // Doesn't work properly with asus keyboards... may never have worked. RM 09-Apr-2012
- /*
- * if ((hardKeyboard && !hardKeyboardHidden) && (curMetaState & KeyEvent.META_SHIFT_ON) != 0
- * && sendFunctionKey(keyCode)) { return true; }
- */
-
- if (key < 0x80) {
- transport.write(key);
- } else {
- // TODO write encoding routine that doesn't allocate each time
- transport.write(new String(Character.toChars(key)).getBytes(encoding));
- }
-
- return true;
- }
-
- if (keyCode == KeyEvent.KEYCODE_UNKNOWN && event.getAction() == KeyEvent.ACTION_MULTIPLE) {
- byte[] input = event.getCharacters().getBytes(encoding);
- transport.write(input);
- return true;
- }
-
- // try handling keymode shortcuts
- if (hardKeyboard && !hardKeyboardHidden && event.getRepeatCount() == 0) {
- if (PreferenceConstants.KEYMODE_RIGHT.equals(keymode)) {
- switch (keyCode) {
- case KeyEvent.KEYCODE_ALT_RIGHT:
- metaState |= META_SLASH;
- return true;
- case KeyEvent.KEYCODE_SHIFT_RIGHT:
- metaState |= META_TAB;
- return true;
- case KeyEvent.KEYCODE_SHIFT_LEFT:
- metaPress(META_SHIFT_ON);
- return true;
- case KeyEvent.KEYCODE_ALT_LEFT:
- metaPress(META_ALT_ON);
- return true;
- }
- } else if (PreferenceConstants.KEYMODE_LEFT.equals(keymode)) {
- switch (keyCode) {
- case KeyEvent.KEYCODE_ALT_LEFT:
- metaState |= META_SLASH;
- return true;
- case KeyEvent.KEYCODE_SHIFT_LEFT:
- metaState |= META_TAB;
- return true;
- case KeyEvent.KEYCODE_SHIFT_RIGHT:
- metaPress(META_SHIFT_ON);
- return true;
- case KeyEvent.KEYCODE_ALT_RIGHT:
- metaPress(META_ALT_ON);
- return true;
- }
- } else {
- switch (keyCode) {
- case KeyEvent.KEYCODE_ALT_LEFT:
- case KeyEvent.KEYCODE_ALT_RIGHT:
- metaPress(META_ALT_ON);
- return true;
- case KeyEvent.KEYCODE_SHIFT_LEFT:
- case KeyEvent.KEYCODE_SHIFT_RIGHT:
- metaPress(META_SHIFT_ON);
- return true;
- }
- }
- }
-
- // look for special chars
- switch (keyCode) {
- case KeyEvent.KEYCODE_CAMERA:
-
- // check to see which shortcut the camera button triggers
- String camera =
- manager.getStringParameter(PreferenceConstants.CAMERA,
- PreferenceConstants.CAMERA_CTRLA_SPACE);
- if (PreferenceConstants.CAMERA_CTRLA_SPACE.equals(camera)) {
- transport.write(0x01);
- transport.write(' ');
- } else if (PreferenceConstants.CAMERA_CTRLA.equals(camera)) {
- transport.write(0x01);
- } else if (PreferenceConstants.CAMERA_ESC.equals(camera)) {
- ((vt320) buffer).keyTyped(vt320.KEY_ESCAPE, ' ', 0);
- } else if (PreferenceConstants.CAMERA_ESC_A.equals(camera)) {
- ((vt320) buffer).keyTyped(vt320.KEY_ESCAPE, ' ', 0);
- transport.write('a');
- }
-
- break;
-
- case KeyEvent.KEYCODE_DEL:
- ((vt320) buffer).keyPressed(vt320.KEY_BACK_SPACE, ' ', getStateForBuffer());
- metaState &= ~META_TRANSIENT;
- return true;
- case KeyEvent.KEYCODE_ENTER:
- ((vt320) buffer).keyTyped(vt320.KEY_ENTER, ' ', 0);
- metaState &= ~META_TRANSIENT;
- return true;
-
- case KeyEvent.KEYCODE_DPAD_LEFT:
- if (selectingForCopy) {
- selectionArea.decrementColumn();
- bridge.redraw();
- } else {
- ((vt320) buffer).keyPressed(vt320.KEY_LEFT, ' ', getStateForBuffer());
- metaState &= ~META_TRANSIENT;
- bridge.tryKeyVibrate();
- }
- return true;
-
- case KeyEvent.KEYCODE_DPAD_UP:
- if (selectingForCopy) {
- selectionArea.decrementRow();
- bridge.redraw();
- } else {
- ((vt320) buffer).keyPressed(vt320.KEY_UP, ' ', getStateForBuffer());
- metaState &= ~META_TRANSIENT;
- bridge.tryKeyVibrate();
- }
- return true;
-
- case KeyEvent.KEYCODE_DPAD_DOWN:
- if (selectingForCopy) {
- selectionArea.incrementRow();
- bridge.redraw();
- } else {
- ((vt320) buffer).keyPressed(vt320.KEY_DOWN, ' ', getStateForBuffer());
- metaState &= ~META_TRANSIENT;
- bridge.tryKeyVibrate();
- }
- return true;
-
- case KeyEvent.KEYCODE_DPAD_RIGHT:
- if (selectingForCopy) {
- selectionArea.incrementColumn();
- bridge.redraw();
- } else {
- ((vt320) buffer).keyPressed(vt320.KEY_RIGHT, ' ', getStateForBuffer());
- metaState &= ~META_TRANSIENT;
- bridge.tryKeyVibrate();
- }
- return true;
-
- case KeyEvent.KEYCODE_DPAD_CENTER:
- if (selectingForCopy) {
- if (selectionArea.isSelectingOrigin()) {
- selectionArea.finishSelectingOrigin();
- } else {
- if (clipboard != null) {
- // copy selected area to clipboard
- String copiedText = selectionArea.copyFrom(buffer);
-
- clipboard.setText(copiedText);
- // XXX STOPSHIP
- // manager.notifyUser(manager.getString(
- // R.string.console_copy_done,
- // copiedText.length()));
-
- selectingForCopy = false;
- selectionArea.reset();
- }
- }
- } else {
- if ((metaState & META_CTRL_ON) != 0) {
- ((vt320) buffer).keyTyped(vt320.KEY_ESCAPE, ' ', 0);
- metaState &= ~META_CTRL_ON;
- } else {
- metaState |= META_CTRL_ON;
- }
- }
-
- bridge.redraw();
-
- return true;
- }
-
- } catch (IOException e) {
- Log.e("Problem while trying to handle an onKey() event", e);
- try {
- bridge.getTransport().flush();
- } catch (IOException ioe) {
- Log.d("Our transport was closed, dispatching disconnect event");
- bridge.dispatchDisconnect(false);
- }
- } catch (NullPointerException npe) {
- Log.d("Input before connection established ignored.");
- return true;
- }
-
- return false;
- }
-
- /**
- * @param keyCode
- * @return successful
- */
- private boolean sendFunctionKey(int keyCode) {
- switch (keyCode) {
- case KeyEvent.KEYCODE_1:
- ((vt320) buffer).keyPressed(vt320.KEY_F1, ' ', 0);
- return true;
- case KeyEvent.KEYCODE_2:
- ((vt320) buffer).keyPressed(vt320.KEY_F2, ' ', 0);
- return true;
- case KeyEvent.KEYCODE_3:
- ((vt320) buffer).keyPressed(vt320.KEY_F3, ' ', 0);
- return true;
- case KeyEvent.KEYCODE_4:
- ((vt320) buffer).keyPressed(vt320.KEY_F4, ' ', 0);
- return true;
- case KeyEvent.KEYCODE_5:
- ((vt320) buffer).keyPressed(vt320.KEY_F5, ' ', 0);
- return true;
- case KeyEvent.KEYCODE_6:
- ((vt320) buffer).keyPressed(vt320.KEY_F6, ' ', 0);
- return true;
- case KeyEvent.KEYCODE_7:
- ((vt320) buffer).keyPressed(vt320.KEY_F7, ' ', 0);
- return true;
- case KeyEvent.KEYCODE_8:
- ((vt320) buffer).keyPressed(vt320.KEY_F8, ' ', 0);
- return true;
- case KeyEvent.KEYCODE_9:
- ((vt320) buffer).keyPressed(vt320.KEY_F9, ' ', 0);
- return true;
- case KeyEvent.KEYCODE_0:
- ((vt320) buffer).keyPressed(vt320.KEY_F10, ' ', 0);
- return true;
- default:
- return false;
- }
- }
-
- /**
- * Handle meta key presses where the key can be locked on.
- * <p>
- * 1st press: next key to have meta state<br />
- * 2nd press: meta state is locked on<br />
- * 3rd press: disable meta state
- *
- * @param code
- */
- private void metaPress(int code) {
- if ((metaState & (code << 1)) != 0) {
- metaState &= ~(code << 1);
- } else if ((metaState & code) != 0) {
- metaState &= ~code;
- metaState |= code << 1;
- } else {
- metaState |= code;
- }
- bridge.redraw();
- }
-
- public void setTerminalKeyMode(String keymode) {
- this.keymode = keymode;
- }
-
- private int getStateForBuffer() {
- int bufferState = 0;
-
- if ((metaState & META_CTRL_MASK) != 0) {
- bufferState |= vt320.KEY_CONTROL;
- }
- if ((metaState & META_SHIFT_MASK) != 0) {
- bufferState |= vt320.KEY_SHIFT;
- }
- if ((metaState & META_ALT_MASK) != 0) {
- bufferState |= vt320.KEY_ALT;
- }
-
- return bufferState;
- }
-
- public int getMetaState() {
- return metaState;
- }
-
- public void setClipboardManager(ClipboardManager clipboard) {
- this.clipboard = clipboard;
- }
-
- public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
- if (PreferenceConstants.KEYMODE.equals(key)) {
- updateKeymode();
- }
- }
-
- private void updateKeymode() {
- keymode =
- manager.getStringParameter(PreferenceConstants.KEYMODE, PreferenceConstants.KEYMODE_RIGHT);
- }
-
- public void setCharset(String encoding) {
- this.encoding = encoding;
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/service/TerminalManager.java b/sl4a/ScriptingLayerForAndroid/src/org/connectbot/service/TerminalManager.java
deleted file mode 100644
index bc83a92..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/service/TerminalManager.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.connectbot.service;
-
-import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
-import android.content.res.AssetFileDescriptor;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.media.AudioManager;
-import android.media.MediaPlayer;
-import android.media.MediaPlayer.OnCompletionListener;
-import android.os.Handler;
-import android.os.Message;
-import android.os.Vibrator;
-import android.preference.PreferenceManager;
-
-import com.googlecode.android_scripting.Constants;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.R;
-import com.googlecode.android_scripting.activity.ScriptingLayerService;
-import com.googlecode.android_scripting.exception.Sl4aException;
-import com.googlecode.android_scripting.interpreter.InterpreterProcess;
-
-import org.connectbot.transport.ProcessTransport;
-import org.connectbot.util.PreferenceConstants;
-
-import java.io.IOException;
-import java.lang.ref.WeakReference;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-/**
- * Manager for SSH connections that runs as a background service. This service holds a list of
- * currently connected SSH bridges that are ready for connection up to a GUI if needed.
- *
- * @author jsharkey
- * @author modified by raaar
- */
-public class TerminalManager implements OnSharedPreferenceChangeListener {
-
- private static final long VIBRATE_DURATION = 30;
-
- private final List<TerminalBridge> bridges = new CopyOnWriteArrayList<TerminalBridge>();
-
- private final Map<Integer, WeakReference<TerminalBridge>> mHostBridgeMap =
- new ConcurrentHashMap<Integer, WeakReference<TerminalBridge>>();
-
- private Handler mDisconnectHandler = null;
-
- private final Resources mResources;
-
- private final SharedPreferences mPreferences;
-
- private boolean hardKeyboardHidden;
-
- private Vibrator vibrator;
- private boolean wantKeyVibration;
- private boolean wantBellVibration;
- private boolean wantAudible;
- private boolean resizeAllowed = false;
- private MediaPlayer mediaPlayer;
-
- private final ScriptingLayerService mService;
-
- public TerminalManager(ScriptingLayerService service) {
- mService = service;
- mPreferences = PreferenceManager.getDefaultSharedPreferences(mService);
- registerOnSharedPreferenceChangeListener(this);
- mResources = mService.getResources();
- hardKeyboardHidden =
- (mResources.getConfiguration().hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES);
- vibrator = (Vibrator) mService.getSystemService(Context.VIBRATOR_SERVICE);
- wantKeyVibration = mPreferences.getBoolean(PreferenceConstants.BUMPY_ARROWS, true);
- wantBellVibration = mPreferences.getBoolean(PreferenceConstants.BELL_VIBRATE, true);
- wantAudible = mPreferences.getBoolean(PreferenceConstants.BELL, true);
- if (wantAudible) {
- enableMediaPlayer();
- }
- }
-
- /**
- * Disconnect all currently connected bridges.
- */
- private void disconnectAll() {
- TerminalBridge[] bridgesArray = null;
- if (bridges.size() > 0) {
- bridgesArray = bridges.toArray(new TerminalBridge[bridges.size()]);
- }
- if (bridgesArray != null) {
- // disconnect and dispose of any existing bridges
- for (TerminalBridge bridge : bridgesArray) {
- bridge.dispatchDisconnect(true);
- }
- }
- }
-
- /**
- * Open a new session using the given parameters.
- *
- * @throws InterruptedException
- * @throws Sl4aException
- */
- public TerminalBridge openConnection(int id) throws IllegalArgumentException, IOException,
- InterruptedException, Sl4aException {
- // throw exception if terminal already open
- if (getConnectedBridge(id) != null) {
- throw new IllegalArgumentException("Connection already open");
- }
-
- InterpreterProcess process = mService.getProcess(id);
-
- TerminalBridge bridge = new TerminalBridge(this, process, new ProcessTransport(process));
- bridge.connect();
-
- WeakReference<TerminalBridge> wr = new WeakReference<TerminalBridge>(bridge);
- bridges.add(bridge);
- mHostBridgeMap.put(id, wr);
-
- return bridge;
- }
-
- /**
- * Find a connected {@link TerminalBridge} with the given HostBean.
- *
- * @param id
- * the HostBean to search for
- * @return TerminalBridge that uses the HostBean
- */
- public TerminalBridge getConnectedBridge(int id) {
- WeakReference<TerminalBridge> wr = mHostBridgeMap.get(id);
- if (wr != null) {
- return wr.get();
- } else {
- return null;
- }
- }
-
- /**
- * Called by child bridge when somehow it's been disconnected.
- */
- public void closeConnection(TerminalBridge bridge, boolean killProcess) {
- if (killProcess) {
- bridges.remove(bridge);
- mHostBridgeMap.remove(bridge.getId());
- if (mService.getProcess(bridge.getId()).isAlive()) {
- Intent intent = new Intent(mService, mService.getClass());
- intent.setAction(Constants.ACTION_KILL_PROCESS);
- intent.putExtra(Constants.EXTRA_PROXY_PORT, bridge.getId());
- mService.startService(intent);
- }
- }
- if (mDisconnectHandler != null) {
- Message.obtain(mDisconnectHandler, -1, bridge).sendToTarget();
- }
- }
-
- /**
- * Allow {@link TerminalBridge} to resize when the parent has changed.
- *
- * @param resizeAllowed
- */
- public void setResizeAllowed(boolean resizeAllowed) {
- this.resizeAllowed = resizeAllowed;
- }
-
- public boolean isResizeAllowed() {
- return resizeAllowed;
- }
-
- public void stop() {
- resizeAllowed = false;
- disconnectAll();
- disableMediaPlayer();
- }
-
- public int getIntParameter(String key, int defValue) {
- return mPreferences.getInt(key, defValue);
- }
-
- public String getStringParameter(String key, String defValue) {
- return mPreferences.getString(key, defValue);
- }
-
- public void tryKeyVibrate() {
- if (wantKeyVibration) {
- vibrate();
- }
- }
-
- private void vibrate() {
- if (vibrator != null) {
- vibrator.vibrate(VIBRATE_DURATION);
- }
- }
-
- private void enableMediaPlayer() {
- mediaPlayer = new MediaPlayer();
-
- float volume =
- mPreferences.getFloat(PreferenceConstants.BELL_VOLUME,
- PreferenceConstants.DEFAULT_BELL_VOLUME);
-
- mediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
- mediaPlayer.setOnCompletionListener(new BeepListener());
-
- AssetFileDescriptor file = mResources.openRawResourceFd(R.raw.bell);
- try {
- mediaPlayer.setDataSource(file.getFileDescriptor(), file.getStartOffset(), file.getLength());
- file.close();
- mediaPlayer.setVolume(volume, volume);
- mediaPlayer.prepare();
- } catch (IOException e) {
- Log.e("Error setting up bell media player", e);
- }
- }
-
- private void disableMediaPlayer() {
- if (mediaPlayer != null) {
- mediaPlayer.release();
- mediaPlayer = null;
- }
- }
-
- public void playBeep() {
- if (mediaPlayer != null) {
- mediaPlayer.start();
- }
- if (wantBellVibration) {
- vibrate();
- }
- }
-
- private static class BeepListener implements OnCompletionListener {
- public void onCompletion(MediaPlayer mp) {
- mp.seekTo(0);
- }
- }
-
- public boolean isHardKeyboardHidden() {
- return hardKeyboardHidden;
- }
-
- public void setHardKeyboardHidden(boolean b) {
- hardKeyboardHidden = b;
- }
-
- @Override
- public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
- if (PreferenceConstants.BELL.equals(key)) {
- wantAudible = sharedPreferences.getBoolean(PreferenceConstants.BELL, true);
- if (wantAudible && mediaPlayer == null) {
- enableMediaPlayer();
- } else if (!wantAudible && mediaPlayer != null) {
- disableMediaPlayer();
- }
- } else if (PreferenceConstants.BELL_VOLUME.equals(key)) {
- if (mediaPlayer != null) {
- float volume =
- sharedPreferences.getFloat(PreferenceConstants.BELL_VOLUME,
- PreferenceConstants.DEFAULT_BELL_VOLUME);
- mediaPlayer.setVolume(volume, volume);
- }
- } else if (PreferenceConstants.BELL_VIBRATE.equals(key)) {
- wantBellVibration = sharedPreferences.getBoolean(PreferenceConstants.BELL_VIBRATE, true);
- } else if (PreferenceConstants.BUMPY_ARROWS.equals(key)) {
- wantKeyVibration = sharedPreferences.getBoolean(PreferenceConstants.BUMPY_ARROWS, true);
- }
- }
-
- public void setDisconnectHandler(Handler disconnectHandler) {
- mDisconnectHandler = disconnectHandler;
- }
-
- public List<TerminalBridge> getBridgeList() {
- return bridges;
- }
-
- public Resources getResources() {
- return mResources;
- }
-
- public void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) {
- mPreferences.registerOnSharedPreferenceChangeListener(listener);
- }
-
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/transport/AbsTransport.java b/sl4a/ScriptingLayerForAndroid/src/org/connectbot/transport/AbsTransport.java
deleted file mode 100644
index 3d8c943..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/transport/AbsTransport.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.connectbot.transport;
-
-import org.connectbot.service.TerminalBridge;
-import org.connectbot.service.TerminalManager;
-
-import java.io.IOException;
-
-/**
- * @author Kenny Root
- * @author modified by raaar
- */
-public abstract class AbsTransport {
-
- TerminalBridge bridge;
- TerminalManager manager;
-
- /**
- * Causes transport to connect to the target host. After connecting but before a session is
- * started, must call back to {@link TerminalBridge#onConnected()}. After that call a session may
- * be opened.
- */
- public abstract void connect();
-
- /**
- * Reads from the transport. Transport must support reading into a the byte array
- * <code>buffer</code> at the start of <code>offset</code> and a maximum of <code>length</code>
- * bytes. If the remote host disconnects, throw an {@link IOException}.
- *
- * @param buffer
- * byte buffer to store read bytes into
- * @param offset
- * where to start writing in the buffer
- * @param length
- * maximum number of bytes to read
- * @return number of bytes read
- * @throws IOException
- * when remote host disconnects
- */
- public abstract int read(byte[] buffer, int offset, int length) throws IOException;
-
- /**
- * Writes to the transport. If the host is not yet connected, simply return without doing
- * anything. An {@link IOException} should be thrown if there is an error after connection.
- *
- * @param buffer
- * bytes to write to transport
- * @throws IOException
- * when there is a problem writing after connection
- */
- public abstract void write(byte[] buffer) throws IOException;
-
- /**
- * Writes to the transport. See {@link #write(byte[])} for behavior details.
- *
- * @param c
- * character to write to the transport
- * @throws IOException
- * when there is a problem writing after connection
- */
- public abstract void write(int c) throws IOException;
-
- /**
- * Flushes the write commands to the transport.
- *
- * @throws IOException
- * when there is a problem writing after connection
- */
- public abstract void flush() throws IOException;
-
- /**
- * Closes the connection to the terminal. Note that the resulting failure to read should call
- * {@link TerminalBridge#dispatchDisconnect(boolean)}.
- */
- public abstract void close();
-
- /**
- * Tells the transport what dimensions the display is currently
- *
- * @param columns
- * columns of text
- * @param rows
- * rows of text
- * @param width
- * width in pixels
- * @param height
- * height in pixels
- */
- public abstract void setDimensions(int columns, int rows, int width, int height);
-
- public void setBridge(TerminalBridge bridge) {
- this.bridge = bridge;
- }
-
- public void setManager(TerminalManager manager) {
- this.manager = manager;
- }
-
- public abstract boolean isConnected();
-
- public abstract boolean isSessionOpen();
-
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/transport/ProcessTransport.java b/sl4a/ScriptingLayerForAndroid/src/org/connectbot/transport/ProcessTransport.java
deleted file mode 100644
index ff894f0..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/transport/ProcessTransport.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.connectbot.transport;
-
-import com.googlecode.android_scripting.Exec;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.Process;
-
-import java.io.FileDescriptor;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-public class ProcessTransport extends AbsTransport {
-
- private FileDescriptor shellFd;
- private final Process mProcess;
- private InputStream is;
- private OutputStream os;
- private boolean mConnected = false;
-
- public ProcessTransport(Process process) {
- mProcess = process;
- shellFd = process.getFd();
- is = process.getIn();
- os = process.getOut();
- }
-
- @Override
- public void close() {
- mProcess.kill();
- }
-
- @Override
- public void connect() {
- mConnected = true;
- }
-
- @Override
- public void flush() throws IOException {
- os.flush();
- }
-
- @Override
- public boolean isConnected() {
- return mConnected && mProcess.isAlive();
- }
-
- @Override
- public boolean isSessionOpen() {
- return mProcess.isAlive();
- }
-
- @Override
- public int read(byte[] buffer, int start, int len) throws IOException {
- if (is == null) {
- mConnected = false;
- bridge.dispatchDisconnect(false);
- throw new IOException("session closed");
- }
- try {
- return is.read(buffer, start, len);
- } catch (IOException e) {
- mConnected = false;
- bridge.dispatchDisconnect(false);
- throw new IOException("session closed");
- }
- }
-
- @Override
- public void setDimensions(int columns, int rows, int width, int height) {
- try {
- Exec.setPtyWindowSize(shellFd, rows, columns, width, height);
- } catch (Exception e) {
- Log.e("Couldn't resize pty", e);
- }
- }
-
- @Override
- public void write(byte[] buffer) throws IOException {
- if (os != null) {
- os.write(buffer);
- }
- }
-
- @Override
- public void write(int c) throws IOException {
- if (os != null) {
- os.write(c);
- }
- }
-
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/Colors.java b/sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/Colors.java
deleted file mode 100644
index 13310e2..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/Colors.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.connectbot.util;
-
-/**
- * @author Kenny Root
- *
- */
-public class Colors {
- public final static int[] defaults =
- new int[] {
- 0xff000000, // black
- 0xffcc0000, // red
- 0xff00cc00, // green
- 0xffcccc00, // brown
- 0xff0000cc, // blue
- 0xffcc00cc, // purple
- 0xff00cccc, // cyan
- 0xffcccccc, // light grey
- 0xff444444, // dark grey
- 0xffff4444, // light red
- 0xff44ff44, // light green
- 0xffffff44, // yellow
- 0xff4444ff, // light blue
- 0xffff44ff, // light purple
- 0xff44ffff, // light cyan
- 0xffffffff, // white
- 0xff000000, 0xff00005f, 0xff000087, 0xff0000af, 0xff0000d7, 0xff0000ff, 0xff005f00,
- 0xff005f5f, 0xff005f87, 0xff005faf, 0xff005fd7, 0xff005fff, 0xff008700, 0xff00875f,
- 0xff008787, 0xff0087af, 0xff0087d7, 0xff0087ff, 0xff00af00, 0xff00af5f, 0xff00af87,
- 0xff00afaf, 0xff00afd7, 0xff00afff, 0xff00d700, 0xff00d75f, 0xff00d787, 0xff00d7af,
- 0xff00d7d7, 0xff00d7ff, 0xff00ff00, 0xff00ff5f, 0xff00ff87, 0xff00ffaf, 0xff00ffd7,
- 0xff00ffff, 0xff5f0000, 0xff5f005f, 0xff5f0087, 0xff5f00af, 0xff5f00d7, 0xff5f00ff,
- 0xff5f5f00, 0xff5f5f5f, 0xff5f5f87, 0xff5f5faf, 0xff5f5fd7, 0xff5f5fff, 0xff5f8700,
- 0xff5f875f, 0xff5f8787, 0xff5f87af, 0xff5f87d7, 0xff5f87ff, 0xff5faf00, 0xff5faf5f,
- 0xff5faf87, 0xff5fafaf, 0xff5fafd7, 0xff5fafff, 0xff5fd700, 0xff5fd75f, 0xff5fd787,
- 0xff5fd7af, 0xff5fd7d7, 0xff5fd7ff, 0xff5fff00, 0xff5fff5f, 0xff5fff87, 0xff5fffaf,
- 0xff5fffd7, 0xff5fffff, 0xff870000, 0xff87005f, 0xff870087, 0xff8700af, 0xff8700d7,
- 0xff8700ff, 0xff875f00, 0xff875f5f, 0xff875f87, 0xff875faf, 0xff875fd7, 0xff875fff,
- 0xff878700, 0xff87875f, 0xff878787, 0xff8787af, 0xff8787d7, 0xff8787ff, 0xff87af00,
- 0xff87af5f, 0xff87af87, 0xff87afaf, 0xff87afd7, 0xff87afff, 0xff87d700, 0xff87d75f,
- 0xff87d787, 0xff87d7af, 0xff87d7d7, 0xff87d7ff, 0xff87ff00, 0xff87ff5f, 0xff87ff87,
- 0xff87ffaf, 0xff87ffd7, 0xff87ffff, 0xffaf0000, 0xffaf005f, 0xffaf0087, 0xffaf00af,
- 0xffaf00d7, 0xffaf00ff, 0xffaf5f00, 0xffaf5f5f, 0xffaf5f87, 0xffaf5faf, 0xffaf5fd7,
- 0xffaf5fff, 0xffaf8700, 0xffaf875f, 0xffaf8787, 0xffaf87af, 0xffaf87d7, 0xffaf87ff,
- 0xffafaf00, 0xffafaf5f, 0xffafaf87, 0xffafafaf, 0xffafafd7, 0xffafafff, 0xffafd700,
- 0xffafd75f, 0xffafd787, 0xffafd7af, 0xffafd7d7, 0xffafd7ff, 0xffafff00, 0xffafff5f,
- 0xffafff87, 0xffafffaf, 0xffafffd7, 0xffafffff, 0xffd70000, 0xffd7005f, 0xffd70087,
- 0xffd700af, 0xffd700d7, 0xffd700ff, 0xffd75f00, 0xffd75f5f, 0xffd75f87, 0xffd75faf,
- 0xffd75fd7, 0xffd75fff, 0xffd78700, 0xffd7875f, 0xffd78787, 0xffd787af, 0xffd787d7,
- 0xffd787ff, 0xffd7af00, 0xffd7af5f, 0xffd7af87, 0xffd7afaf, 0xffd7afd7, 0xffd7afff,
- 0xffd7d700, 0xffd7d75f, 0xffd7d787, 0xffd7d7af, 0xffd7d7d7, 0xffd7d7ff, 0xffd7ff00,
- 0xffd7ff5f, 0xffd7ff87, 0xffd7ffaf, 0xffd7ffd7, 0xffd7ffff, 0xffff0000, 0xffff005f,
- 0xffff0087, 0xffff00af, 0xffff00d7, 0xffff00ff, 0xffff5f00, 0xffff5f5f, 0xffff5f87,
- 0xffff5faf, 0xffff5fd7, 0xffff5fff, 0xffff8700, 0xffff875f, 0xffff8787, 0xffff87af,
- 0xffff87d7, 0xffff87ff, 0xffffaf00, 0xffffaf5f, 0xffffaf87, 0xffffafaf, 0xffffafd7,
- 0xffffafff, 0xffffd700, 0xffffd75f, 0xffffd787, 0xffffd7af, 0xffffd7d7, 0xffffd7ff,
- 0xffffff00, 0xffffff5f, 0xffffff87, 0xffffffaf, 0xffffffd7, 0xffffffff, 0xff080808,
- 0xff121212, 0xff1c1c1c, 0xff262626, 0xff303030, 0xff3a3a3a, 0xff444444, 0xff4e4e4e,
- 0xff585858, 0xff626262, 0xff6c6c6c, 0xff767676, 0xff808080, 0xff8a8a8a, 0xff949494,
- 0xff9e9e9e, 0xffa8a8a8, 0xffb2b2b2, 0xffbcbcbc, 0xffc6c6c6, 0xffd0d0d0, 0xffdadada,
- 0xffe4e4e4, 0xffeeeeee, };
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/ColorsActivity.java b/sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/ColorsActivity.java
deleted file mode 100644
index 532da35..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/ColorsActivity.java
+++ /dev/null
@@ -1,286 +0,0 @@
-package org.connectbot.util;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.content.res.Configuration;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.os.Bundle;
-import android.preference.PreferenceManager;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.MenuItem.OnMenuItemClickListener;
-import android.view.ViewGroup.LayoutParams;
-import android.widget.AdapterView;
-import android.widget.BaseAdapter;
-import android.widget.GridView;
-import android.widget.LinearLayout;
-import android.widget.AdapterView.OnItemClickListener;
-
-import com.googlecode.android_scripting.R;
-
-import org.connectbot.util.UberColorPickerDialog.OnColorChangedListener;
-
-/**
- * @author modified by raaar
- */
-public class ColorsActivity extends Activity implements OnItemClickListener, OnColorChangedListener {
-
- private SharedPreferences mPreferences;
-
- private static int sLayoutLanscapeWidth = 400;
- private static int sLayoutPortraitWidth = 210;
-
- private GridView mColorGrid;
- private LinearLayout mLayout;
-
- private int mFgColor;
- private int mBgColor;
-
- private int mCurrentColor = 0;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
-
- mFgColor =
- mPreferences.getInt(PreferenceConstants.COLOR_FG, PreferenceConstants.DEFAULT_FG_COLOR);
- mBgColor =
- mPreferences.getInt(PreferenceConstants.COLOR_BG, PreferenceConstants.DEFAULT_BG_COLOR);
-
- setContentView(R.layout.act_colors);
-
- this.setTitle("Terminal Colors");
-
- mLayout = (LinearLayout) findViewById(R.id.color_layout);
-
- mColorGrid = (GridView) findViewById(R.id.color_grid);
- mColorGrid.setOnItemClickListener(this);
- mColorGrid.setSelection(0);
-
- if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
- mColorGrid.setNumColumns(2);
- LayoutParams params = mLayout.getLayoutParams();
- params.height = params.width;
- params.width = LayoutParams.WRAP_CONTENT;
- }
- mColorGrid.setAdapter(new ColorsAdapter(true));
-
- }
-
- private class ColorsAdapter extends BaseAdapter {
- private boolean mSquareViews;
-
- public ColorsAdapter(boolean squareViews) {
- mSquareViews = squareViews;
- }
-
- public View getView(int position, View convertView, ViewGroup parent) {
- ColorView c;
- if (convertView == null) {
- c = new ColorView(ColorsActivity.this, mSquareViews);
- } else {
- c = (ColorView) convertView;
- }
- if (position == 0) {
- c.setColor(mFgColor);
- c.setTitle("Foreground color");
- } else {
- c.setColor(mBgColor);
- c.setTitle("Background color");
- }
- return c;
- }
-
- public int getCount() {
- return 2;
- }
-
- public Object getItem(int position) {
- return (position == 0) ? mFgColor : mBgColor;
- }
-
- public long getItemId(int position) {
- return position;
- }
- }
-
- private class ColorView extends View {
- private boolean mSquare;
-
- private Paint mTextPaint;
- private Paint mShadowPaint;
- // Things we paint
- private int mBackgroundColor;
- private String mText;
-
- private int mAscent;
- private int mWidthCenter;
- private int mHeightCenter;
-
- public ColorView(Context context, boolean square) {
- super(context);
-
- mSquare = square;
-
- mTextPaint = new Paint();
- mTextPaint.setAntiAlias(true);
- mTextPaint.setTextSize(16);
- mTextPaint.setColor(0xFFFFFFFF);
- mTextPaint.setTextAlign(Paint.Align.CENTER);
-
- mShadowPaint = new Paint(mTextPaint);
- mShadowPaint.setStyle(Paint.Style.STROKE);
- mShadowPaint.setStrokeCap(Paint.Cap.ROUND);
- mShadowPaint.setStrokeJoin(Paint.Join.ROUND);
- mShadowPaint.setStrokeWidth(4f);
- mShadowPaint.setColor(0xFF000000);
-
- setPadding(20, 20, 20, 20);
- }
-
- public void setColor(int color) {
- mBackgroundColor = color;
- }
-
- public void setTitle(String title) {
- mText = title;
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int width = measureWidth(widthMeasureSpec);
-
- int height;
- if (mSquare) {
- height = width;
- } else {
- height = measureHeight(heightMeasureSpec);
- }
-
- mAscent = (int) mTextPaint.ascent();
- mWidthCenter = width / 2;
- mHeightCenter = height / 2 - mAscent / 2;
-
- setMeasuredDimension(width, height);
- }
-
- private int measureWidth(int measureSpec) {
- int result = 0;
- int specMode = MeasureSpec.getMode(measureSpec);
- int specSize = MeasureSpec.getSize(measureSpec);
-
- if (specMode == MeasureSpec.EXACTLY) {
- // We were told how big to be
- result = specSize;
- } else {
- // Measure the text
- result = (int) mTextPaint.measureText(mText) + getPaddingLeft() + getPaddingRight();
- if (specMode == MeasureSpec.AT_MOST) {
- // Respect AT_MOST value if that was what is called for by
- // measureSpec
- result = Math.min(result, specSize);
- }
- }
-
- return result;
- }
-
- private int measureHeight(int measureSpec) {
- int result = 0;
- int specMode = MeasureSpec.getMode(measureSpec);
- int specSize = MeasureSpec.getSize(measureSpec);
-
- mAscent = (int) mTextPaint.ascent();
- if (specMode == MeasureSpec.EXACTLY) {
- // We were told how big to be
- result = specSize;
- } else {
- // Measure the text (beware: ascent is a negative number)
- result = (int) (-mAscent + mTextPaint.descent()) + getPaddingTop() + getPaddingBottom();
- if (specMode == MeasureSpec.AT_MOST) {
- // Respect AT_MOST value if that was what is called for by
- // measureSpec
- result = Math.min(result, specSize);
- }
- }
- return result;
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- canvas.drawColor(mBackgroundColor);
- canvas.drawText(mText, mWidthCenter, mHeightCenter, mShadowPaint);
- canvas.drawText(mText, mWidthCenter, mHeightCenter, mTextPaint);
- }
- }
-
- private void editColor(int colorNumber) {
- mCurrentColor = colorNumber;
- new UberColorPickerDialog(this, this, (colorNumber == 0) ? mFgColor : mBgColor).show();
- }
-
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- editColor(position);
- }
-
- public void onNothingSelected(AdapterView<?> arg0) {
- }
-
- public void colorChanged(int value) {
- SharedPreferences.Editor editor = mPreferences.edit();
- if (mCurrentColor == 0) {
- mFgColor = value;
- editor.putInt(PreferenceConstants.COLOR_FG, mFgColor);
- } else {
- mBgColor = value;
- editor.putInt(PreferenceConstants.COLOR_BG, mBgColor);
- }
- editor.commit();
- mColorGrid.invalidateViews();
- }
-
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
- mColorGrid.setNumColumns(2);
- LayoutParams params = mLayout.getLayoutParams();
- params.height = params.width;
- params.width = sLayoutLanscapeWidth;
- } else {
- mColorGrid.setNumColumns(1);
- LayoutParams params = mLayout.getLayoutParams();
- params.height = LayoutParams.WRAP_CONTENT;
- params.width = sLayoutPortraitWidth;
- }
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- super.onCreateOptionsMenu(menu);
- MenuItem reset = menu.add("Reset");
- reset.setAlphabeticShortcut('r');
- reset.setNumericShortcut('1');
- reset.setIcon(android.R.drawable.ic_menu_revert);
- reset.setOnMenuItemClickListener(new OnMenuItemClickListener() {
- public boolean onMenuItemClick(MenuItem arg0) {
- mFgColor = PreferenceConstants.DEFAULT_FG_COLOR;
- mBgColor = PreferenceConstants.DEFAULT_BG_COLOR;
- SharedPreferences.Editor editor = mPreferences.edit();
- editor.putInt(PreferenceConstants.COLOR_FG, mFgColor);
- editor.putInt(PreferenceConstants.COLOR_BG, mBgColor);
- editor.commit();
- mColorGrid.invalidateViews();
- return true;
- }
- });
- return true;
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/EastAsianWidth.java b/sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/EastAsianWidth.java
deleted file mode 100644
index b27cd48..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/EastAsianWidth.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.connectbot.util;
-
-import android.util.Log;
-
-/**
- * @author Kenny Root
- *
- */
-public class EastAsianWidth {
- public static boolean useJNI = false;
- private static final String TAG = "ConnectBot.EastAsianWidth";
-
- /**
- * @param charArray
- * @param i
- * @param position
- * @param wideAttribute
- * @param isLegacyEastAsian
- */
- public native static void measure(char[] charArray, int start, int end,
- byte[] wideAttribute, boolean isLegacyEastAsian);
-
- static {
- try {
- System.loadLibrary("org_connectbot_util_EastAsianWidth");
-
- char[] testInput = {(char)0x4EBA};
- byte[] testResult = new byte[1];
- measure(testInput, 0, 1, testResult, true);
-
- if (testResult[0] == 1)
- useJNI = true;
- else
- Log.d(TAG, "EastAsianWidth JNI measuring not available");
- } catch (Exception e) {
- // Failure
- } catch (UnsatisfiedLinkError e1) {
- // Failure
- }
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/EncodingPreference.java b/sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/EncodingPreference.java
deleted file mode 100644
index 8a6d7aa..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/EncodingPreference.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.connectbot.util;
-
-import android.content.Context;
-import android.preference.ListPreference;
-import android.util.AttributeSet;
-
-import java.nio.charset.Charset;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map.Entry;
-
-public class EncodingPreference extends ListPreference {
-
- public EncodingPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
-
- List<CharSequence> charsetIdsList = new LinkedList<CharSequence>();
- List<CharSequence> charsetNamesList = new LinkedList<CharSequence>();
-
- for (Entry<String, Charset> entry : Charset.availableCharsets().entrySet()) {
- Charset c = entry.getValue();
- if (c.canEncode() && c.isRegistered()) {
- String key = entry.getKey();
- if (key.startsWith("cp")) {
- // Custom CP437 charset changes
- charsetIdsList.add("CP437");
- charsetNamesList.add("CP437");
- }
- charsetIdsList.add(entry.getKey());
- charsetNamesList.add(c.displayName());
- }
- }
-
- this.setEntryValues(charsetIdsList.toArray(new CharSequence[charsetIdsList.size()]));
- this.setEntries(charsetNamesList.toArray(new CharSequence[charsetNamesList.size()]));
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/HelpTopicView.java b/sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/HelpTopicView.java
deleted file mode 100644
index bf6f026..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/HelpTopicView.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.connectbot.util;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.webkit.WebSettings;
-import android.webkit.WebView;
-
-import org.connectbot.HelpActivity;
-
-/**
- * @author Kenny Root
- *
- */
-public class HelpTopicView extends WebView {
- public HelpTopicView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- initialize();
- }
-
- public HelpTopicView(Context context, AttributeSet attrs) {
- super(context, attrs);
- initialize();
- }
-
- public HelpTopicView(Context context) {
- super(context);
- initialize();
- }
-
- private void initialize() {
- WebSettings wSet = getSettings();
- //wSet.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
- wSet.setUseWideViewPort(false);
- }
-
- public HelpTopicView setTopic(String topic) {
- String path =
- String.format("file:///android_asset/%s/%s%s", HelpActivity.HELPDIR, topic,
- HelpActivity.SUFFIX);
- loadUrl(path);
-
- computeScroll();
-
- return this;
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/PreferenceConstants.java b/sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/PreferenceConstants.java
deleted file mode 100644
index d2c54d6..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/PreferenceConstants.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.connectbot.util;
-
-/**
- * @author Kenny Root
- * @author modified by raaar
- */
-public class PreferenceConstants {
-
- public static final String SCROLLBACK = "scrollback";
- public static final String FONTSIZE = "fontsize";
- public static final String KEYMODE = "keymode";
- public static final String ENCODING = "encoding";
-
- public static final String DELKEY = "delkey";
- public static final String DELKEY_BACKSPACE = "backspace";
- public static final String DELKEY_DEL = "del";
-
- public static final String ROTATION = "rotation";
-
- public static final String ROTATION_DEFAULT = "Default";
- public static final String ROTATION_LANDSCAPE = "Force landscape";
- public static final String ROTATION_PORTRAIT = "Force portrait";
- public static final String ROTATION_AUTOMATIC = "Automatic";
-
- public static final String FULLSCREEN = "fullscreen";
-
- public static final String KEYMODE_RIGHT = "Use right-side keys";
- public static final String KEYMODE_LEFT = "Use left-side keys";
-
- public static final String CAMERA = "camera";
-
- public static final String CAMERA_CTRLA_SPACE = "Ctrl+A then Space";
- public static final String CAMERA_CTRLA = "Ctrl+A";
- public static final String CAMERA_ESC = "Esc";
- public static final String CAMERA_ESC_A = "Esc+A";
-
- public static final String KEEP_ALIVE = "keepalive";
-
- public static final String BUMPY_ARROWS = "bumpyarrows";
- public static final String HIDE_KEYBOARD = "hidekeyboard";
-
- public static final String SORT_BY_COLOR = "sortByColor";
-
- public static final String BELL = "bell";
- public static final String BELL_VOLUME = "bellVolume";
- public static final String BELL_VIBRATE = "bellVibrate";
- public static final float DEFAULT_BELL_VOLUME = 0.25f;
-
- public final static int DEFAULT_FG_COLOR = 0xffcccccc;
- public final static int DEFAULT_BG_COLOR = 0xff000000;
- public final static int DEFAULT_SCROLLBACK = 140;
- public final static float DEFAULT_FONT_SIZE = 10;
-
- public final static String COLOR_FG = "color_fg";
- public final static String COLOR_BG = "color_bg";
-
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/SelectionArea.java b/sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/SelectionArea.java
deleted file mode 100644
index 5735e55..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/SelectionArea.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.connectbot.util;
-
-import de.mud.terminal.VDUBuffer;
-
-/**
- * @author Kenny Root
- * Keep track of a selection area for the terminal copying mechanism.
- * If the orientation is flipped one way, swap the bottom and top or
- * left and right to keep it in the correct orientation.
- */
-public class SelectionArea {
- private int top;
- private int bottom;
- private int left;
- private int right;
- private int maxColumns;
- private int maxRows;
- private boolean selectingOrigin;
-
- public SelectionArea() {
- reset();
- }
-
- public final void reset() {
- top = left = bottom = right = 0;
- selectingOrigin = true;
- }
-
- /**
- * @param columns
- * @param rows
- */
- public void setBounds(int columns, int rows) {
- maxColumns = columns - 1;
- maxRows = rows - 1;
- }
-
- private int checkBounds(int value, int max) {
- if (value < 0)
- return 0;
- else if (value > max)
- return max;
- else
- return value;
- }
-
- public boolean isSelectingOrigin() {
- return selectingOrigin;
- }
-
- public void finishSelectingOrigin() {
- selectingOrigin = false;
- }
-
- public void decrementRow() {
- if (selectingOrigin)
- setTop(top - 1);
- else
- setBottom(bottom - 1);
- }
-
- public void incrementRow() {
- if (selectingOrigin)
- setTop(top + 1);
- else
- setBottom(bottom + 1);
- }
-
- public void setRow(int row) {
- if (selectingOrigin)
- setTop(row);
- else
- setBottom(row);
- }
-
- private void setTop(int top) {
- this.top = bottom = checkBounds(top, maxRows);
- }
-
- public int getTop() {
- return Math.min(top, bottom);
- }
-
- private void setBottom(int bottom) {
- this.bottom = checkBounds(bottom, maxRows);
- }
-
- public int getBottom() {
- return Math.max(top, bottom);
- }
-
- public void decrementColumn() {
- if (selectingOrigin)
- setLeft(left - 1);
- else
- setRight(right - 1);
- }
-
- public void incrementColumn() {
- if (selectingOrigin)
- setLeft(left + 1);
- else
- setRight(right + 1);
- }
-
- public void setColumn(int column) {
- if (selectingOrigin)
- setLeft(column);
- else
- setRight(column);
- }
-
- private void setLeft(int left) {
- this.left = right = checkBounds(left, maxColumns);
- }
-
- public int getLeft() {
- return Math.min(left, right);
- }
-
- private void setRight(int right) {
- this.right = checkBounds(right, maxColumns);
- }
-
- public int getRight() {
- return Math.max(left, right);
- }
-
- public String copyFrom(VDUBuffer vb) {
- int size = (getRight() - getLeft() + 1) * (getBottom() - getTop() + 1);
-
- StringBuffer buffer = new StringBuffer(size);
-
- for(int y = getTop(); y <= getBottom(); y++) {
- int lastNonSpace = buffer.length();
-
- for (int x = getLeft(); x <= getRight(); x++) {
- // only copy printable chars
- char c = vb.getChar(x, y);
-
- if (!Character.isDefined(c) ||
- (Character.isISOControl(c) && c != '\t'))
- c = ' ';
-
- if (c != ' ')
- lastNonSpace = buffer.length();
-
- buffer.append(c);
- }
-
- // Don't leave a bunch of spaces in our copy buffer.
- if (buffer.length() > lastNonSpace)
- buffer.delete(lastNonSpace + 1, buffer.length());
-
- if (y != bottom)
- buffer.append("\n");
- }
-
- return buffer.toString();
- }
-
- @Override
- public String toString() {
- StringBuilder buffer = new StringBuilder();
-
- buffer.append("SelectionArea[top=");
- buffer.append(top);
- buffer.append(", bottom=");
- buffer.append(bottom);
- buffer.append(", left=");
- buffer.append(left);
- buffer.append(", right=");
- buffer.append(right);
- buffer.append(", maxColumns=");
- buffer.append(maxColumns);
- buffer.append(", maxRows=");
- buffer.append(maxRows);
- buffer.append(", isSelectingOrigin=");
- buffer.append(isSelectingOrigin());
- buffer.append("]");
-
- return buffer.toString();
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/UberColorPickerDialog.java b/sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/UberColorPickerDialog.java
deleted file mode 100644
index e12307e..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/UberColorPickerDialog.java
+++ /dev/null
@@ -1,982 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * 090408
- * Keith Wiley
- * kwiley@keithwiley.com
- * http://keithwiley.com
- *
- * UberColorPickerDialog v1.1
- *
- * This color picker was implemented as a (significant) extension of the
- * ColorPickerDialog class provided in the Android API Demos. You are free
- * to drop it unchanged into your own projects or to modify it as you see
- * fit. I would appreciate it if this comment block were let intact,
- * merely for credit's sake.
- *
- * Enjoy!
- */
-
-package org.connectbot.util;
-
-import android.app.Dialog;
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.ColorMatrix;
-import android.graphics.ComposeShader;
-import android.graphics.Paint;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffXfermode;
-import android.graphics.RadialGradient;
-import android.graphics.Rect;
-import android.graphics.RectF;
-import android.graphics.Shader;
-import android.graphics.SweepGradient;
-import android.graphics.drawable.GradientDrawable;
-import android.graphics.drawable.GradientDrawable.Orientation;
-import android.os.Bundle;
-import android.util.DisplayMetrics;
-import android.view.MotionEvent;
-import android.view.View;
-
-/**
- * UberColorPickerDialog is a seriously enhanced version of the UberColorPickerDialog
- * class provided in the Android API Demos.<p>
- *
- * NOTE (from Kenny Root): This is a VERY slimmed down version custom for ConnectBot.
- * Visit Keith's site for the full version at the URL listed in the author line.<p>
- *
- * @author Keith Wiley, kwiley@keithwiley.com, http://keithwiley.com
- */
-public class UberColorPickerDialog extends Dialog {
- private OnColorChangedListener mListener;
- private int mInitialColor;
-
- /**
- * Callback to the creator of the dialog, informing the creator of a new color and notifying that the dialog is about to dismiss.
- */
- public interface OnColorChangedListener {
- void colorChanged(int color);
- }
-
- /**
- * Ctor
- * @param context
- * @param listener
- * @param initialColor
- * @param showTitle If true, a title is shown across the top of the dialog. If false a toast is shown instead.
- */
- public UberColorPickerDialog(Context context,
- OnColorChangedListener listener,
- int initialColor) {
- super(context);
-
- mListener = listener;
- mInitialColor = initialColor;
- }
-
- /**
- * Activity entry point
- */
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- OnColorChangedListener l = new OnColorChangedListener() {
- public void colorChanged(int color) {
- mListener.colorChanged(color);
- dismiss();
- }
- };
-
- DisplayMetrics dm = new DisplayMetrics();
- getWindow().getWindowManager().getDefaultDisplay().getMetrics(dm);
- int screenWidth = dm.widthPixels;
- int screenHeight = dm.heightPixels;
-
- setTitle("Pick a color (try the trackball)");
-
- try {
- setContentView(new ColorPickerView(getContext(), l, screenWidth, screenHeight, mInitialColor));
- }
- catch (Exception e) {
- //There is currently only one kind of ctor exception, that where no methods are enabled.
- dismiss(); //This doesn't work! The dialog is still shown (its title at least, the layout is empty from the exception being thrown). <sigh>
- }
- }
-
- /**
- * ColorPickerView is the meat of this color picker (as opposed to the enclosing class).
- * All the heavy lifting is done directly by this View subclass.
- * <P>
- * You can enable/disable whichever color chooser methods you want by modifying the ENABLED_METHODS switches. They *should*
- * do all the work required to properly enable/disable methods without losing track of what goes with what and what maps to what.
- * <P>
- * If you add a new color chooser method, do a text search for "NEW_METHOD_WORK_NEEDED_HERE". That tag indicates all
- * the locations in the code that will have to be amended in order to properly add a new color chooser method.
- * I highly recommend adding new methods to the end of the list. If you want to try to reorder the list, you're on your own.
- */
- private static class ColorPickerView extends View {
- private static int SWATCH_WIDTH = 95;
- private static final int SWATCH_HEIGHT = 60;
-
- private static int PALETTE_POS_X = 0;
- private static int PALETTE_POS_Y = SWATCH_HEIGHT;
- private static final int PALETTE_DIM = SWATCH_WIDTH * 2;
- private static final int PALETTE_RADIUS = PALETTE_DIM / 2;
- private static final int PALETTE_CENTER_X = PALETTE_RADIUS;
- private static final int PALETTE_CENTER_Y = PALETTE_RADIUS;
-
- private static final int SLIDER_THICKNESS = 40;
-
- private static int VIEW_DIM_X = PALETTE_DIM;
- private static int VIEW_DIM_Y = SWATCH_HEIGHT;
-
- //NEW_METHOD_WORK_NEEDED_HERE
- private static final int METHOD_HS_V_PALETTE = 0;
-
- //NEW_METHOD_WORK_NEEDED_HERE
- //Add a new entry to the list for each controller in the new method
- private static final int TRACKED_NONE = -1; //No object on screen is currently being tracked
- private static final int TRACK_SWATCH_OLD = 10;
- private static final int TRACK_SWATCH_NEW = 11;
- private static final int TRACK_HS_PALETTE = 30;
- private static final int TRACK_VER_VALUE_SLIDER = 31;
-
- private static final int TEXT_SIZE = 12;
- private static int[] TEXT_HSV_POS = new int[2];
- private static int[] TEXT_RGB_POS = new int[2];
- private static int[] TEXT_YUV_POS = new int[2];
- private static int[] TEXT_HEX_POS = new int[2];
-
- private static final float PI = 3.141592653589793f;
-
- private int mMethod = METHOD_HS_V_PALETTE;
- private int mTracking = TRACKED_NONE; //What object on screen is currently being tracked for movement
-
- //Zillions of persistant Paint objecs for drawing the View
-
- private Paint mSwatchOld, mSwatchNew;
-
- //NEW_METHOD_WORK_NEEDED_HERE
- //Add Paints to represent the palettes of the new method's UI controllers
- private Paint mOvalHueSat;
-
- private Bitmap mVerSliderBM;
- private Canvas mVerSliderCv;
-
- private Bitmap[] mHorSlidersBM = new Bitmap[3];
- private Canvas[] mHorSlidersCv = new Canvas[3];
-
- private Paint mValDimmer;
-
- //NEW_METHOD_WORK_NEEDED_HERE
- //Add Paints to represent the icon for the new method
- private Paint mOvalHueSatSmall;
-
- private Paint mPosMarker;
- private Paint mText;
-
- private Rect mOldSwatchRect = new Rect();
- private Rect mNewSwatchRect = new Rect();
- private Rect mPaletteRect = new Rect();
- private Rect mVerSliderRect = new Rect();
-
- private int[] mSpectrumColorsRev;
- private int mOriginalColor = 0; //The color passed in at the beginning, which can be reverted to at any time by tapping the old swatch.
- private float[] mHSV = new float[3];
- private int[] mRGB = new int[3];
- private float[] mYUV = new float[3];
- private String mHexStr = "";
- private boolean mHSVenabled = true; //Only true if an HSV method is enabled
- private boolean mRGBenabled = true; //Only true if an RGB method is enabled
- private boolean mYUVenabled = true; //Only true if a YUV method is enabled
- private boolean mHexenabled = true; //Only true if an RGB method is enabled
- private int[] mCoord = new int[3]; //For drawing slider/palette markers
- private int mFocusedControl = -1; //Which control receives trackball events.
- private OnColorChangedListener mListener;
-
- /**
- * Ctor.
- * @param c
- * @param l
- * @param width Used to determine orientation and adjust layout accordingly
- * @param height Used to determine orientation and adjust layout accordingly
- * @param color The initial color
- * @throws Exception
- */
- ColorPickerView(Context c, OnColorChangedListener l, int width, int height, int color)
- throws Exception {
- super(c);
-
- //We need to make the dialog focusable to retrieve trackball events.
- setFocusable(true);
-
- mListener = l;
-
- mOriginalColor = color;
-
- Color.colorToHSV(color, mHSV);
-
- updateAllFromHSV();
-
- //Setup the layout based on whether this is a portrait or landscape orientation.
- if (width <= height) { //Portrait layout
- SWATCH_WIDTH = (PALETTE_DIM + SLIDER_THICKNESS) / 2;
-
- PALETTE_POS_X = 0;
- PALETTE_POS_Y = TEXT_SIZE * 4 + SWATCH_HEIGHT;
-
- //Set more rects, lots of rects
- mOldSwatchRect.set(0, TEXT_SIZE * 4, SWATCH_WIDTH, TEXT_SIZE * 4 + SWATCH_HEIGHT);
- mNewSwatchRect.set(SWATCH_WIDTH, TEXT_SIZE * 4, SWATCH_WIDTH * 2, TEXT_SIZE * 4 + SWATCH_HEIGHT);
- mPaletteRect.set(0, PALETTE_POS_Y, PALETTE_DIM, PALETTE_POS_Y + PALETTE_DIM);
- mVerSliderRect.set(PALETTE_DIM, PALETTE_POS_Y, PALETTE_DIM + SLIDER_THICKNESS, PALETTE_POS_Y + PALETTE_DIM);
-
- TEXT_HSV_POS[0] = 3;
- TEXT_HSV_POS[1] = 0;
- TEXT_RGB_POS[0] = TEXT_HSV_POS[0] + 50;
- TEXT_RGB_POS[1] = TEXT_HSV_POS[1];
- TEXT_YUV_POS[0] = TEXT_HSV_POS[0] + 100;
- TEXT_YUV_POS[1] = TEXT_HSV_POS[1];
- TEXT_HEX_POS[0] = TEXT_HSV_POS[0] + 150;
- TEXT_HEX_POS[1] = TEXT_HSV_POS[1];
-
- VIEW_DIM_X = PALETTE_DIM + SLIDER_THICKNESS;
- VIEW_DIM_Y = SWATCH_HEIGHT + PALETTE_DIM + TEXT_SIZE * 4;
- }
- else { //Landscape layout
- SWATCH_WIDTH = 110;
-
- PALETTE_POS_X = SWATCH_WIDTH;
- PALETTE_POS_Y = 0;
-
- //Set more rects, lots of rects
- mOldSwatchRect.set(0, TEXT_SIZE * 7, SWATCH_WIDTH, TEXT_SIZE * 7 + SWATCH_HEIGHT);
- mNewSwatchRect.set(0, TEXT_SIZE * 7 + SWATCH_HEIGHT, SWATCH_WIDTH, TEXT_SIZE * 7 + SWATCH_HEIGHT * 2);
- mPaletteRect.set(SWATCH_WIDTH, PALETTE_POS_Y, SWATCH_WIDTH + PALETTE_DIM, PALETTE_POS_Y + PALETTE_DIM);
- mVerSliderRect.set(SWATCH_WIDTH + PALETTE_DIM, PALETTE_POS_Y, SWATCH_WIDTH + PALETTE_DIM + SLIDER_THICKNESS, PALETTE_POS_Y + PALETTE_DIM);
-
- TEXT_HSV_POS[0] = 3;
- TEXT_HSV_POS[1] = 0;
- TEXT_RGB_POS[0] = TEXT_HSV_POS[0];
- TEXT_RGB_POS[1] = (int)(TEXT_HSV_POS[1] + TEXT_SIZE * 3.5);
- TEXT_YUV_POS[0] = TEXT_HSV_POS[0] + 50;
- TEXT_YUV_POS[1] = (int)(TEXT_HSV_POS[1] + TEXT_SIZE * 3.5);
- TEXT_HEX_POS[0] = TEXT_HSV_POS[0] + 50;
- TEXT_HEX_POS[1] = TEXT_HSV_POS[1];
-
- VIEW_DIM_X = PALETTE_POS_X + PALETTE_DIM + SLIDER_THICKNESS;
- VIEW_DIM_Y = Math.max(mNewSwatchRect.bottom, PALETTE_DIM);
- }
-
- //Rainbows make everybody happy!
- mSpectrumColorsRev = new int[] {
- 0xFFFF0000, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF,
- 0xFF00FF00, 0xFFFFFF00, 0xFFFF0000,
- };
-
- //Setup all the Paint and Shader objects. There are lots of them!
-
- //NEW_METHOD_WORK_NEEDED_HERE
- //Add Paints to represent the palettes of the new method's UI controllers
-
- mSwatchOld = new Paint(Paint.ANTI_ALIAS_FLAG);
- mSwatchOld.setStyle(Paint.Style.FILL);
- mSwatchOld.setColor(Color.HSVToColor(mHSV));
-
- mSwatchNew = new Paint(Paint.ANTI_ALIAS_FLAG);
- mSwatchNew.setStyle(Paint.Style.FILL);
- mSwatchNew.setColor(Color.HSVToColor(mHSV));
-
- Shader shaderA = new SweepGradient(0, 0, mSpectrumColorsRev, null);
- Shader shaderB = new RadialGradient(0, 0, PALETTE_CENTER_X, 0xFFFFFFFF, 0xFF000000, Shader.TileMode.CLAMP);
- Shader shader = new ComposeShader(shaderA, shaderB, PorterDuff.Mode.SCREEN);
- mOvalHueSat = new Paint(Paint.ANTI_ALIAS_FLAG);
- mOvalHueSat.setShader(shader);
- mOvalHueSat.setStyle(Paint.Style.FILL);
- mOvalHueSat.setDither(true);
-
- mVerSliderBM = Bitmap.createBitmap(SLIDER_THICKNESS, PALETTE_DIM, Bitmap.Config.RGB_565);
- mVerSliderCv = new Canvas(mVerSliderBM);
-
- for (int i = 0; i < 3; i++) {
- mHorSlidersBM[i] = Bitmap.createBitmap(PALETTE_DIM, SLIDER_THICKNESS, Bitmap.Config.RGB_565);
- mHorSlidersCv[i] = new Canvas(mHorSlidersBM[i]);
- }
-
- mValDimmer = new Paint(Paint.ANTI_ALIAS_FLAG);
- mValDimmer.setStyle(Paint.Style.FILL);
- mValDimmer.setDither(true);
- mValDimmer.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));
-
- //Whew, we're done making the big Paints and Shaders for the swatches, palettes, and sliders.
- //Now we need to make the Paints and Shaders that will draw the little method icons in the method selector list.
-
- //NEW_METHOD_WORK_NEEDED_HERE
- //Add Paints to represent the icon for the new method
-
- shaderA = new SweepGradient(0, 0, mSpectrumColorsRev, null);
- shaderB = new RadialGradient(0, 0, PALETTE_DIM / 2, 0xFFFFFFFF, 0xFF000000, Shader.TileMode.CLAMP);
- shader = new ComposeShader(shaderA, shaderB, PorterDuff.Mode.SCREEN);
- mOvalHueSatSmall = new Paint(Paint.ANTI_ALIAS_FLAG);
- mOvalHueSatSmall.setShader(shader);
- mOvalHueSatSmall.setStyle(Paint.Style.FILL);
-
- //Make a simple stroking Paint for drawing markers and borders and stuff like that.
- mPosMarker = new Paint(Paint.ANTI_ALIAS_FLAG);
- mPosMarker.setStyle(Paint.Style.STROKE);
- mPosMarker.setStrokeWidth(2);
-
- //Make a basic text Paint.
- mText = new Paint(Paint.ANTI_ALIAS_FLAG);
- mText.setTextSize(TEXT_SIZE);
- mText.setColor(Color.WHITE);
-
- //Kickstart
- initUI();
- }
-
- /**
- * Draw the entire view (the entire dialog).
- */
- @Override
- protected void onDraw(Canvas canvas) {
- //Draw the old and new swatches
- drawSwatches(canvas);
-
- //Write the text
- writeColorParams(canvas);
-
- //Draw the palette and sliders (the UI)
- if (mMethod == METHOD_HS_V_PALETTE)
- drawHSV1Palette(canvas);
- }
-
- /**
- * Draw the old and new swatches.
- * @param canvas
- */
- private void drawSwatches(Canvas canvas) {
- float[] hsv = new float[3];
-
- mText.setTextSize(16);
-
- //Draw the original swatch
- canvas.drawRect(mOldSwatchRect, mSwatchOld);
- Color.colorToHSV(mOriginalColor, hsv);
- //if (UberColorPickerDialog.isGray(mColor)) //Don't need this right here, but imp't to note
- // hsv[1] = 0;
- if (hsv[2] > .5)
- mText.setColor(Color.BLACK);
- canvas.drawText("Revert", mOldSwatchRect.left + SWATCH_WIDTH / 2 - mText.measureText("Revert") / 2, mOldSwatchRect.top + 16, mText);
- mText.setColor(Color.WHITE);
-
- //Draw the new swatch
- canvas.drawRect(mNewSwatchRect, mSwatchNew);
- if (mHSV[2] > .5)
- mText.setColor(Color.BLACK);
- canvas.drawText("Accept", mNewSwatchRect.left + SWATCH_WIDTH / 2 - mText.measureText("Accept") / 2, mNewSwatchRect.top + 16, mText);
- mText.setColor(Color.WHITE);
-
- mText.setTextSize(TEXT_SIZE);
- }
-
- /**
- * Write the color parametes (HSV, RGB, YUV, Hex, etc.).
- * @param canvas
- */
- private void writeColorParams(Canvas canvas) {
- if (mHSVenabled) {
- canvas.drawText("H: " + Integer.toString((int)(mHSV[0] / 360.0f * 255)), TEXT_HSV_POS[0], TEXT_HSV_POS[1] + TEXT_SIZE, mText);
- canvas.drawText("S: " + Integer.toString((int)(mHSV[1] * 255)), TEXT_HSV_POS[0], TEXT_HSV_POS[1] + TEXT_SIZE * 2, mText);
- canvas.drawText("V: " + Integer.toString((int)(mHSV[2] * 255)), TEXT_HSV_POS[0], TEXT_HSV_POS[1] + TEXT_SIZE * 3, mText);
- }
-
- if (mRGBenabled) {
- canvas.drawText("R: " + mRGB[0], TEXT_RGB_POS[0], TEXT_RGB_POS[1] + TEXT_SIZE, mText);
- canvas.drawText("G: " + mRGB[1], TEXT_RGB_POS[0], TEXT_RGB_POS[1] + TEXT_SIZE * 2, mText);
- canvas.drawText("B: " + mRGB[2], TEXT_RGB_POS[0], TEXT_RGB_POS[1] + TEXT_SIZE * 3, mText);
- }
-
- if (mYUVenabled) {
- canvas.drawText("Y: " + Integer.toString((int)(mYUV[0] * 255)), TEXT_YUV_POS[0], TEXT_YUV_POS[1] + TEXT_SIZE, mText);
- canvas.drawText("U: " + Integer.toString((int)((mYUV[1] + .5f) * 255)), TEXT_YUV_POS[0], TEXT_YUV_POS[1] + TEXT_SIZE * 2, mText);
- canvas.drawText("V: " + Integer.toString((int)((mYUV[2] + .5f) * 255)), TEXT_YUV_POS[0], TEXT_YUV_POS[1] + TEXT_SIZE * 3, mText);
- }
-
- if (mHexenabled)
- canvas.drawText("#" + mHexStr, TEXT_HEX_POS[0], TEXT_HEX_POS[1] + TEXT_SIZE, mText);
- }
-
- /**
- * Place a small circle on the 2D palette to indicate the current values.
- * @param canvas
- * @param markerPosX
- * @param markerPosY
- */
- private void mark2DPalette(Canvas canvas, int markerPosX, int markerPosY) {
- mPosMarker.setColor(Color.BLACK);
- canvas.drawOval(new RectF(markerPosX - 5, markerPosY - 5, markerPosX + 5, markerPosY + 5), mPosMarker);
- mPosMarker.setColor(Color.WHITE);
- canvas.drawOval(new RectF(markerPosX - 3, markerPosY - 3, markerPosX + 3, markerPosY + 3), mPosMarker);
- }
-
- /**
- * Draw a line across the slider to indicate its current value.
- * @param canvas
- * @param markerPos
- */
- private void markVerSlider(Canvas canvas, int markerPos) {
- mPosMarker.setColor(Color.BLACK);
- canvas.drawRect(new Rect(0, markerPos - 2, SLIDER_THICKNESS, markerPos + 3), mPosMarker);
- mPosMarker.setColor(Color.WHITE);
- canvas.drawRect(new Rect(0, markerPos, SLIDER_THICKNESS, markerPos + 1), mPosMarker);
- }
-
- /**
- * Frame the slider to indicate that it has trackball focus.
- * @param canvas
- */
- private void hilightFocusedVerSlider(Canvas canvas) {
- mPosMarker.setColor(Color.WHITE);
- canvas.drawRect(new Rect(0, 0, SLIDER_THICKNESS, PALETTE_DIM), mPosMarker);
- mPosMarker.setColor(Color.BLACK);
- canvas.drawRect(new Rect(2, 2, SLIDER_THICKNESS - 2, PALETTE_DIM - 2), mPosMarker);
- }
-
- /**
- * Frame the 2D palette to indicate that it has trackball focus.
- * @param canvas
- */
- private void hilightFocusedOvalPalette(Canvas canvas) {
- mPosMarker.setColor(Color.WHITE);
- canvas.drawOval(new RectF(-PALETTE_RADIUS, -PALETTE_RADIUS, PALETTE_RADIUS, PALETTE_RADIUS), mPosMarker);
- mPosMarker.setColor(Color.BLACK);
- canvas.drawOval(new RectF(-PALETTE_RADIUS + 2, -PALETTE_RADIUS + 2, PALETTE_RADIUS - 2, PALETTE_RADIUS - 2), mPosMarker);
- }
-
- //NEW_METHOD_WORK_NEEDED_HERE
- //To add a new method, replicate the basic draw functions here. Use the 2D palette or 1D sliders as templates for the new method.
- /**
- * Draw the UI for HSV with angular H and radial S combined in 2D and a 1D V slider.
- * @param canvas
- */
- private void drawHSV1Palette(Canvas canvas) {
- canvas.save();
-
- canvas.translate(PALETTE_POS_X, PALETTE_POS_Y);
-
- //Draw the 2D palette
- canvas.translate(PALETTE_CENTER_X, PALETTE_CENTER_Y);
- canvas.drawOval(new RectF(-PALETTE_RADIUS, -PALETTE_RADIUS, PALETTE_RADIUS, PALETTE_RADIUS), mOvalHueSat);
- canvas.drawOval(new RectF(-PALETTE_RADIUS, -PALETTE_RADIUS, PALETTE_RADIUS, PALETTE_RADIUS), mValDimmer);
- if (mFocusedControl == 0)
- hilightFocusedOvalPalette(canvas);
- mark2DPalette(canvas, mCoord[0], mCoord[1]);
- canvas.translate(-PALETTE_CENTER_X, -PALETTE_CENTER_Y);
-
- //Draw the 1D slider
- canvas.translate(PALETTE_DIM, 0);
- canvas.drawBitmap(mVerSliderBM, 0, 0, null);
- if (mFocusedControl == 1)
- hilightFocusedVerSlider(canvas);
- markVerSlider(canvas, mCoord[2]);
-
- canvas.restore();
- }
-
- /**
- * Initialize the current color chooser's UI (set its color parameters and set its palette and slider values accordingly).
- */
- private void initUI() {
- initHSV1Palette();
-
- //Focus on the first controller (arbitrary).
- mFocusedControl = 0;
- }
-
- //NEW_METHOD_WORK_NEEDED_HERE
- //To add a new method, replicate and extend the last init function shown below
- /**
- * Initialize a color chooser.
- */
- private void initHSV1Palette() {
- setOvalValDimmer();
- setVerValSlider();
-
- float angle = 2*PI - mHSV[0] / (180 / 3.1415927f);
- float radius = mHSV[1] * PALETTE_RADIUS;
- mCoord[0] = (int)(Math.cos(angle) * radius);
- mCoord[1] = (int)(Math.sin(angle) * radius);
-
- mCoord[2] = PALETTE_DIM - (int)(mHSV[2] * PALETTE_DIM);
- }
-
- //NEW_METHOD_WORK_NEEDED_HERE
- //To add a new method, replicate and extend the set functions below, one per UI controller in the new method
- /**
- * Adjust a Paint which, when painted, dims its underlying object to show the effects of varying value (brightness).
- */
- private void setOvalValDimmer() {
- float[] hsv = new float[3];
- hsv[0] = mHSV[0];
- hsv[1] = 0;
- hsv[2] = mHSV[2];
- int gray = Color.HSVToColor(hsv);
- mValDimmer.setColor(gray);
- }
-
- /**
- * Create a linear gradient shader to show variations in value.
- */
- private void setVerValSlider() {
- float[] hsv = new float[3];
- hsv[0] = mHSV[0];
- hsv[1] = mHSV[1];
- hsv[2] = 1;
- int col = Color.HSVToColor(hsv);
-
- int colors[] = new int[2];
- colors[0] = col;
- colors[1] = 0xFF000000;
- GradientDrawable gradDraw = new GradientDrawable(Orientation.TOP_BOTTOM, colors);
- gradDraw.setDither(true);
- gradDraw.setLevel(10000);
- gradDraw.setBounds(0, 0, SLIDER_THICKNESS, PALETTE_DIM);
- gradDraw.draw(mVerSliderCv);
- }
-
- /**
- * Report the correct tightly bounded dimensions of the view.
- */
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- setMeasuredDimension(VIEW_DIM_X, VIEW_DIM_Y);
- }
-
- /**
- * Wrap Math.round(). I'm not a Java expert. Is this the only way to avoid writing "(int)Math.round" everywhere?
- * @param x
- * @return
- */
- private int round(double x) {
- return (int)Math.round(x);
- }
-
- /**
- * Limit a value to the range [0,1].
- * @param n
- * @return
- */
- private float pinToUnit(float n) {
- if (n < 0) {
- n = 0;
- } else if (n > 1) {
- n = 1;
- }
- return n;
- }
-
- /**
- * Limit a value to the range [0,max].
- * @param n
- * @param max
- * @return
- */
- private float pin(float n, float max) {
- if (n < 0) {
- n = 0;
- } else if (n > max) {
- n = max;
- }
- return n;
- }
-
- /**
- * Limit a value to the range [min,max].
- * @param n
- * @param min
- * @param max
- * @return
- */
- private float pin(float n, float min, float max) {
- if (n < min) {
- n = min;
- } else if (n > max) {
- n = max;
- }
- return n;
- }
-
- /**
- * No clue what this does (some sort of average/mean I presume). It came with the original UberColorPickerDialog
- * in the API Demos and wasn't documented. I don't feel like spending any time figuring it out, I haven't looked at it at all.
- * @param s
- * @param d
- * @param p
- * @return
- */
- private int ave(int s, int d, float p) {
- return s + round(p * (d - s));
- }
-
- /**
- * Came with the original UberColorPickerDialog in the API Demos, wasn't documented. I believe it takes an array of
- * colors and a value in the range [0,1] and interpolates a resulting color in a seemingly predictable manner.
- * I haven't looked at it at all.
- * @param colors
- * @param unit
- * @return
- */
- private int interpColor(int colors[], float unit) {
- if (unit <= 0) {
- return colors[0];
- }
- if (unit >= 1) {
- return colors[colors.length - 1];
- }
-
- float p = unit * (colors.length - 1);
- int i = (int)p;
- p -= i;
-
- // now p is just the fractional part [0...1) and i is the index
- int c0 = colors[i];
- int c1 = colors[i+1];
- int a = ave(Color.alpha(c0), Color.alpha(c1), p);
- int r = ave(Color.red(c0), Color.red(c1), p);
- int g = ave(Color.green(c0), Color.green(c1), p);
- int b = ave(Color.blue(c0), Color.blue(c1), p);
-
- return Color.argb(a, r, g, b);
- }
-
- /**
- * A standard point-in-rect routine.
- * @param x
- * @param y
- * @param r
- * @return true if point x,y is in rect r
- */
- public boolean ptInRect(int x, int y, Rect r) {
- return x > r.left && x < r.right && y > r.top && y < r.bottom;
- }
-
- /**
- * Process trackball events. Used mainly for fine-tuned color adjustment, or alternatively to switch between slider controls.
- */
- @Override
- public boolean dispatchTrackballEvent(MotionEvent event) {
- float x = event.getX();
- float y = event.getY();
-
- //A longer event history implies faster trackball movement.
- //Use it to infer a larger jump and therefore faster palette/slider adjustment.
- int jump = event.getHistorySize() + 1;
-
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN: {
- }
- break;
- case MotionEvent.ACTION_MOVE: {
- //NEW_METHOD_WORK_NEEDED_HERE
- //To add a new method, replicate and extend the appropriate entry in this list,
- //depending on whether you use 1D or 2D controllers
- switch (mMethod) {
- case METHOD_HS_V_PALETTE:
- if (mFocusedControl == 0) {
- changeHSPalette(x, y, jump);
- }
- else if (mFocusedControl == 1) {
- if (y < 0)
- changeSlider(mFocusedControl, true, jump);
- else if (y > 0)
- changeSlider(mFocusedControl, false, jump);
- }
- break;
- }
- }
- break;
- case MotionEvent.ACTION_UP: {
- }
- break;
- }
-
- return true;
- }
-
- //NEW_METHOD_WORK_NEEDED_HERE
- //To add a new method, replicate and extend the appropriate functions below,
- //one per UI controller in the new method
- /**
- * Effect a trackball change to a 2D palette.
- * @param x -1: negative x change, 0: no x change, +1: positive x change.
- * @param y -1: negative y change, 0, no y change, +1: positive y change.
- * @param jump the amount by which to change.
- */
- private void changeHSPalette(float x, float y, int jump) {
- int x2 = 0, y2 = 0;
- if (x < 0)
- x2 = -jump;
- else if (x > 0)
- x2 = jump;
- if (y < 0)
- y2 = -jump;
- else if (y > 0)
- y2 = jump;
-
- mCoord[0] += x2;
- mCoord[1] += y2;
-
- if (mCoord[0] < -PALETTE_RADIUS)
- mCoord[0] = -PALETTE_RADIUS;
- else if (mCoord[0] > PALETTE_RADIUS)
- mCoord[0] = PALETTE_RADIUS;
- if (mCoord[1] < -PALETTE_RADIUS)
- mCoord[1] = -PALETTE_RADIUS;
- else if (mCoord[1] > PALETTE_RADIUS)
- mCoord[1] = PALETTE_RADIUS;
-
- float radius = (float)java.lang.Math.sqrt(mCoord[0] * mCoord[0] + mCoord[1] * mCoord[1]);
- if (radius > PALETTE_RADIUS)
- radius = PALETTE_RADIUS;
-
- float angle = (float)java.lang.Math.atan2(mCoord[1], mCoord[0]);
- // need to turn angle [-PI ... PI] into unit [0....1]
- float unit = angle/(2*PI);
- if (unit < 0) {
- unit += 1;
- }
-
- mCoord[0] = round(Math.cos(angle) * radius);
- mCoord[1] = round(Math.sin(angle) * radius);
-
- int c = interpColor(mSpectrumColorsRev, unit);
- float[] hsv = new float[3];
- Color.colorToHSV(c, hsv);
- mHSV[0] = hsv[0];
- mHSV[1] = radius / PALETTE_RADIUS;
- updateAllFromHSV();
- mSwatchNew.setColor(Color.HSVToColor(mHSV));
-
- setVerValSlider();
-
- invalidate();
- }
-
- /**
- * Effect a trackball change to a 1D slider.
- * @param slider id of the slider to be effected
- * @param increase true if the change is an increase, false if a decrease
- * @param jump the amount by which to change in units of the range [0,255]
- */
- private void changeSlider(int slider, boolean increase, int jump) {
- //NEW_METHOD_WORK_NEEDED_HERE
- //It is only necessary to add an entry here for a new method if the new method uses a 1D slider.
- //Note, some sliders are horizontal and others are vertical.
- //They differ a bit, especially in a sign flip on the vertical axis.
- if (mMethod == METHOD_HS_V_PALETTE) {
- //slider *must* equal 1
-
- mHSV[2] += (increase ? jump : -jump) / 256.0f;
- mHSV[2] = pinToUnit(mHSV[2]);
- updateAllFromHSV();
- mCoord[2] = PALETTE_DIM - (int)(mHSV[2] * PALETTE_DIM);
-
- mSwatchNew.setColor(Color.HSVToColor(mHSV));
-
- setOvalValDimmer();
-
- invalidate();
- }
- }
-
- /**
- * Keep all colorspace representations in sync.
- */
- private void updateRGBfromHSV() {
- int color = Color.HSVToColor(mHSV);
- mRGB[0] = Color.red(color);
- mRGB[1] = Color.green(color);
- mRGB[2] = Color.blue(color);
- }
-
- /**
- * Keep all colorspace representations in sync.
- */
- private void updateYUVfromRGB() {
- float r = mRGB[0] / 255.0f;
- float g = mRGB[1] / 255.0f;
- float b = mRGB[2] / 255.0f;
-
- ColorMatrix cm = new ColorMatrix();
- cm.setRGB2YUV();
- final float[] a = cm.getArray();
-
- mYUV[0] = a[0] * r + a[1] * g + a[2] * b;
- mYUV[0] = pinToUnit(mYUV[0]);
- mYUV[1] = a[5] * r + a[6] * g + a[7] * b;
- mYUV[1] = pin(mYUV[1], -.5f, .5f);
- mYUV[2] = a[10] * r + a[11] * g + a[12] * b;
- mYUV[2] = pin(mYUV[2], -.5f, .5f);
- }
-
- /**
- * Keep all colorspace representations in sync.
- */
- private void updateHexFromHSV() {
- //For now, assume 100% opacity
- mHexStr = Integer.toHexString(Color.HSVToColor(mHSV)).toUpperCase();
- mHexStr = mHexStr.substring(2, mHexStr.length());
- }
-
- /**
- * Keep all colorspace representations in sync.
- */
- private void updateAllFromHSV() {
- //Update mRGB
- if (mRGBenabled || mYUVenabled)
- updateRGBfromHSV();
-
- //Update mYUV
- if (mYUVenabled)
- updateYUVfromRGB();
-
- //Update mHexStr
- if (mRGBenabled)
- updateHexFromHSV();
- }
-
- /**
- * Process touch events: down, move, and up
- */
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- float x = event.getX();
- float y = event.getY();
-
- //Generate coordinates which are palette=local with the origin at the upper left of the main 2D palette
- int y2 = (int)(pin(round(y - PALETTE_POS_Y), PALETTE_DIM));
-
- //Generate coordinates which are palette-local with the origin at the center of the main 2D palette
- float circlePinnedX = x - PALETTE_POS_X - PALETTE_CENTER_X;
- float circlePinnedY = y - PALETTE_POS_Y - PALETTE_CENTER_Y;
-
- //Is the event in a swatch?
- boolean inSwatchOld = ptInRect(round(x), round(y), mOldSwatchRect);
- boolean inSwatchNew = ptInRect(round(x), round(y), mNewSwatchRect);
-
- //Get the event's distance from the center of the main 2D palette
- float radius = (float)java.lang.Math.sqrt(circlePinnedX * circlePinnedX + circlePinnedY * circlePinnedY);
-
- //Is the event in a circle-pinned 2D palette?
- boolean inOvalPalette = radius <= PALETTE_RADIUS;
-
- //Pin the radius
- if (radius > PALETTE_RADIUS)
- radius = PALETTE_RADIUS;
-
- //Is the event in a vertical slider to the right of the main 2D palette
- boolean inVerSlider = ptInRect(round(x), round(y), mVerSliderRect);
-
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- mTracking = TRACKED_NONE;
-
- if (inSwatchOld)
- mTracking = TRACK_SWATCH_OLD;
- else if (inSwatchNew)
- mTracking = TRACK_SWATCH_NEW;
-
- //NEW_METHOD_WORK_NEEDED_HERE
- //To add a new method, replicate and extend the last entry in this list
- else if (mMethod == METHOD_HS_V_PALETTE) {
- if (inOvalPalette) {
- mTracking = TRACK_HS_PALETTE;
- mFocusedControl = 0;
- }
- else if (inVerSlider) {
- mTracking = TRACK_VER_VALUE_SLIDER;
- mFocusedControl = 1;
- }
- }
- case MotionEvent.ACTION_MOVE:
- //NEW_METHOD_WORK_NEEDED_HERE
- //To add a new method, replicate and extend the entries in this list,
- //one per UI controller the new method requires.
- if (mTracking == TRACK_HS_PALETTE) {
- float angle = (float)java.lang.Math.atan2(circlePinnedY, circlePinnedX);
- // need to turn angle [-PI ... PI] into unit [0....1]
- float unit = angle/(2*PI);
- if (unit < 0) {
- unit += 1;
- }
-
- mCoord[0] = round(Math.cos(angle) * radius);
- mCoord[1] = round(Math.sin(angle) * radius);
-
- int c = interpColor(mSpectrumColorsRev, unit);
- float[] hsv = new float[3];
- Color.colorToHSV(c, hsv);
- mHSV[0] = hsv[0];
- mHSV[1] = radius / PALETTE_RADIUS;
- updateAllFromHSV();
- mSwatchNew.setColor(Color.HSVToColor(mHSV));
-
- setVerValSlider();
-
- invalidate();
- }
- else if (mTracking == TRACK_VER_VALUE_SLIDER) {
- if (mCoord[2] != y2) {
- mCoord[2] = y2;
- float value = 1.0f - (float)y2 / (float)PALETTE_DIM;
-
- mHSV[2] = value;
- updateAllFromHSV();
- mSwatchNew.setColor(Color.HSVToColor(mHSV));
-
- setOvalValDimmer();
-
- invalidate();
- }
- }
- break;
- case MotionEvent.ACTION_UP:
- //NEW_METHOD_WORK_NEEDED_HERE
- //To add a new method, replicate and extend the last entry in this list.
- if (mTracking == TRACK_SWATCH_OLD && inSwatchOld) {
- Color.colorToHSV(mOriginalColor, mHSV);
- mSwatchNew.setColor(mOriginalColor);
- initUI();
- invalidate();
- }
- else if (mTracking == TRACK_SWATCH_NEW && inSwatchNew) {
- mListener.colorChanged(mSwatchNew.getColor());
- invalidate();
- }
-
- mTracking= TRACKED_NONE;
- break;
- }
-
- return true;
- }
- }
-}
diff --git a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/VolumePreference.java b/sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/VolumePreference.java
deleted file mode 100644
index 2e7f61c..0000000
--- a/sl4a/ScriptingLayerForAndroid/src/org/connectbot/util/VolumePreference.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.connectbot.util;
-
-import android.content.Context;
-import android.preference.DialogPreference;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.SeekBar;
-import android.widget.SeekBar.OnSeekBarChangeListener;
-
-/**
- * @author kenny
- *
- */
-public class VolumePreference extends DialogPreference implements OnSeekBarChangeListener {
- /**
- * @param context
- * @param attrs
- */
- public VolumePreference(Context context, AttributeSet attrs) {
- super(context, attrs);
-
- setupLayout(context, attrs);
- }
-
- public VolumePreference(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
-
- setupLayout(context, attrs);
- }
-
- private void setupLayout(Context context, AttributeSet attrs) {
- setPersistent(true);
- }
-
- @Override
- protected View onCreateDialogView() {
- SeekBar sb = new SeekBar(getContext());
-
- sb.setMax(100);
- sb.setProgress((int)(getPersistedFloat(
- PreferenceConstants.DEFAULT_BELL_VOLUME) * 100));
- sb.setPadding(10, 10, 10, 10);
- sb.setOnSeekBarChangeListener(this);
-
- return sb;
- }
-
- public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
- persistFloat(progress / 100f);
- }
-
- public void onStartTrackingTouch(SeekBar seekBar) { }
-
- public void onStopTrackingTouch(SeekBar seekBar) { }
-}
diff --git a/sl4a/Utils/Android.mk b/sl4a/Utils/Android.mk
deleted file mode 100644
index 5417389..0000000
--- a/sl4a/Utils/Android.mk
+++ /dev/null
@@ -1,27 +0,0 @@
-#
-# Copyright (C) 2016 Google, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at:
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-
-LOCAL_MODULE := sl4a.Utils
-LOCAL_MODULE_OWNER := google
-LOCAL_STATIC_JAVA_LIBRARIES := guava android-common
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/sl4a/Utils/src/com/googlecode/android_scripting/ConvertUtils.java b/sl4a/Utils/src/com/googlecode/android_scripting/ConvertUtils.java
deleted file mode 100644
index 3e6956d..0000000
--- a/sl4a/Utils/src/com/googlecode/android_scripting/ConvertUtils.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-public class ConvertUtils {
- /**
- * Converts a String of comma separated bytes to a byte array
- *
- * @param value The value to convert
- * @return the byte array
- */
- public static byte[] convertStringToByteArray(String value) {
- if (value.equals("")) {
- return new byte[0];
- }
- String[] parseString = value.split(",");
- byte[] byteArray = new byte[parseString.length];
- if (byteArray.length > 0) {
- for (int i = 0; i < parseString.length; i++) {
- byte byteValue = Byte.valueOf(parseString[i].trim());
- byteArray[i] = byteValue;
- }
- }
- return byteArray;
- }
-
- /**
- * Converts a byte array to a comma separated String
- *
- * @param byteArray
- * @return comma separated string of bytes
- */
- public static String convertByteArrayToString(byte[] byteArray) {
- String ret = "";
- if (byteArray != null) {
- for (int i = 0; i < byteArray.length; i++) {
- if ((i + 1) != byteArray.length) {
- ret = ret + Byte.valueOf(byteArray[i]) + ",";
- }
- else {
- ret = ret + Byte.valueOf(byteArray[i]);
- }
- }
- }
- return ret;
- }
-
-}
diff --git a/sl4a/Utils/src/com/googlecode/android_scripting/FileUtils.java b/sl4a/Utils/src/com/googlecode/android_scripting/FileUtils.java
deleted file mode 100644
index 91abc2c..0000000
--- a/sl4a/Utils/src/com/googlecode/android_scripting/FileUtils.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-import android.content.Context;
-import android.content.res.AssetManager;
-import android.os.Environment;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.lang.reflect.Method;
-
-/**
- * Utility functions for handling files.
- *
- * @author Damon Kohler (damonkohler@gmail.com)
- */
-public class FileUtils {
-
- private FileUtils() {
- // Utility class.
- }
-
- static public boolean externalStorageMounted() {
- String state = Environment.getExternalStorageState();
- return Environment.MEDIA_MOUNTED.equals(state)
- || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state);
- }
-
- public static int chmod(File path, int mode) throws Exception {
- Class<?> fileUtils = Class.forName("android.os.FileUtils");
- Method setPermissions =
- fileUtils.getMethod("setPermissions", String.class, int.class, int.class, int.class);
- return (Integer) setPermissions.invoke(null, path.getAbsolutePath(), mode, -1, -1);
- }
-
- public static boolean recursiveChmod(File root, int mode) throws Exception {
- boolean success = chmod(root, mode) == 0;
- for (File path : root.listFiles()) {
- if (path.isDirectory()) {
- success = recursiveChmod(path, mode);
- }
- success &= (chmod(path, mode) == 0);
- }
- return success;
- }
-
- public static boolean delete(File path) {
- boolean result = true;
- if (path.exists()) {
- if (path.isDirectory()) {
- for (File child : path.listFiles()) {
- result &= delete(child);
- }
- result &= path.delete(); // Delete empty directory.
- }
- if (path.isFile()) {
- result &= path.delete();
- }
- if (!result) {
- Log.e("Delete failed;");
- }
- return result;
- } else {
- Log.e("File does not exist.");
- return false;
- }
- }
-
- public static File copyFromStream(String name, InputStream input) {
- if (name == null || name.length() == 0) {
- Log.e("No script name specified.");
- return null;
- }
- File file = new File(name);
- if (!makeDirectories(file.getParentFile(), 0755)) {
- return null;
- }
- try {
- OutputStream output = new FileOutputStream(file);
- IoUtils.copy(input, output);
- } catch (Exception e) {
- Log.e(e);
- return null;
- }
- return file;
- }
-
- public static boolean makeDirectories(File directory, int mode) {
- File parent = directory;
- while (parent.getParentFile() != null && !parent.exists()) {
- parent = parent.getParentFile();
- }
- if (!directory.exists()) {
- Log.v("Creating directory: " + directory.getName());
- if (!directory.mkdirs()) {
- Log.e("Failed to create directory.");
- return false;
- }
- }
- try {
- recursiveChmod(parent, mode);
- } catch (Exception e) {
- Log.e(e);
- return false;
- }
- return true;
- }
-
- public static File getExternalDownload() {
- try {
- Class<?> c = Class.forName("android.os.Environment");
- Method m = c.getDeclaredMethod("getExternalStoragePublicDirectory", String.class);
- String download = c.getDeclaredField("DIRECTORY_DOWNLOADS").get(null).toString();
- return (File) m.invoke(null, download);
- } catch (Exception e) {
- return new File(Environment.getExternalStorageDirectory(), "Download");
- }
- }
-
- public static boolean rename(File file, String name) {
- return file.renameTo(new File(file.getParent(), name));
- }
-
- public static String readToString(File file) throws IOException {
- if (file == null || !file.exists()) {
- return null;
- }
- FileReader reader = new FileReader(file);
- StringBuilder out = new StringBuilder();
- char[] buffer = new char[1024 * 4];
- int numRead = 0;
- while ((numRead = reader.read(buffer)) > -1) {
- out.append(String.valueOf(buffer, 0, numRead));
- }
- reader.close();
- return out.toString();
- }
-
- public static String readFromAssetsFile(Context context, String name) throws IOException {
- AssetManager am = context.getAssets();
- BufferedReader reader = new BufferedReader(new InputStreamReader(am.open(name)));
- String line;
- StringBuilder builder = new StringBuilder();
- while ((line = reader.readLine()) != null) {
- builder.append(line);
- }
- reader.close();
- return builder.toString();
- }
-
-}
diff --git a/sl4a/Utils/src/com/googlecode/android_scripting/ForegroundService.java b/sl4a/Utils/src/com/googlecode/android_scripting/ForegroundService.java
deleted file mode 100644
index 64fbe24..0000000
--- a/sl4a/Utils/src/com/googlecode/android_scripting/ForegroundService.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-import android.app.Notification;
-import android.app.NotificationManager;
-import android.app.Service;
-
-import java.lang.reflect.Method;
-
-public abstract class ForegroundService extends Service {
- private static final Class<?>[] mStartForegroundSignature =
- new Class[] { int.class, Notification.class };
- private static final Class<?>[] mStopForegroundSignature = new Class[] { boolean.class };
-
- private final int mNotificationId;
-
- private NotificationManager mNotificationManager;
- private Method mStartForeground;
- private Method mStopForeground;
- private Object[] mStartForegroundArgs = new Object[2];
- private Object[] mStopForegroundArgs = new Object[1];
-
- public ForegroundService(int id) {
- mNotificationId = id;
- }
-
- protected abstract Notification createNotification();
-
- /**
- * This is a wrapper around the new startForeground method, using the older APIs if it is not
- * available.
- */
- private void startForegroundCompat(Notification notification) {
- // If we have the new startForeground API, then use it.
- if (mStartForeground != null) {
- mStartForegroundArgs[0] = Integer.valueOf(mNotificationId);
- mStartForegroundArgs[1] = notification;
- try {
- mStartForeground.invoke(this, mStartForegroundArgs);
- } catch (Exception e) {
- Log.e(e);
- }
- return;
- }
-
- // Fall back on the old API.
- setForeground(true);
- if (notification != null) {
- mNotificationManager.notify(mNotificationId, notification);
- }
- }
-
- /**
- * This is a wrapper around the new stopForeground method, using the older APIs if it is not
- * available.
- */
- private void stopForegroundCompat() {
- // If we have the new stopForeground API, then use it.
- if (mStopForeground != null) {
- mStopForegroundArgs[0] = Boolean.TRUE;
- try {
- mStopForeground.invoke(this, mStopForegroundArgs);
- } catch (Exception e) {
- Log.e(e);
- }
- return;
- }
-
- // Fall back on the old API. Note to cancel BEFORE changing the
- // foreground state, since we could be killed at that point.
- mNotificationManager.cancel(mNotificationId);
- setForeground(false);
- }
-
- @Override
- public void onCreate() {
- mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
- try {
- mStartForeground = getClass().getMethod("startForeground", mStartForegroundSignature);
- mStopForeground = getClass().getMethod("stopForeground", mStopForegroundSignature);
- } catch (NoSuchMethodException e) {
- // Running on an older platform.
- mStartForeground = mStopForeground = null;
- }
- startForegroundCompat(createNotification());
- }
-
- @Override
- public void onDestroy() {
- // Make sure our notification is gone.
- stopForegroundCompat();
- }
-}
diff --git a/sl4a/Utils/src/com/googlecode/android_scripting/IoUtils.java b/sl4a/Utils/src/com/googlecode/android_scripting/IoUtils.java
deleted file mode 100644
index 0fd0ca0..0000000
--- a/sl4a/Utils/src/com/googlecode/android_scripting/IoUtils.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-public class IoUtils {
- private static final int BUFFER_SIZE = 1024 * 8;
-
- private IoUtils() {
- // Utility class.
- }
-
- public static int copy(InputStream input, OutputStream output) throws Exception, IOException {
- byte[] buffer = new byte[BUFFER_SIZE];
-
- BufferedInputStream in = new BufferedInputStream(input, BUFFER_SIZE);
- BufferedOutputStream out = new BufferedOutputStream(output, BUFFER_SIZE);
- int count = 0, n = 0;
- try {
- while ((n = in.read(buffer, 0, BUFFER_SIZE)) != -1) {
- out.write(buffer, 0, n);
- count += n;
- }
- out.flush();
- } finally {
- try {
- out.close();
- } catch (IOException e) {
- Log.e(e.getMessage(), e);
- }
- try {
- in.close();
- } catch (IOException e) {
- Log.e(e.getMessage(), e);
- }
- }
- return count;
- }
-
-}
diff --git a/sl4a/Utils/src/com/googlecode/android_scripting/Log.java b/sl4a/Utils/src/com/googlecode/android_scripting/Log.java
deleted file mode 100644
index 4947a0c..0000000
--- a/sl4a/Utils/src/com/googlecode/android_scripting/Log.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-import android.app.AlertDialog;
-import android.app.Notification;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.widget.Toast;
-
-public class Log {
- private Log() {
- // Utility class.
- }
-
- private static String getTag() {
- StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
- String fullClassName = stackTraceElements[4].getClassName();
- String className = fullClassName.substring(fullClassName.lastIndexOf(".") + 1);
- int lineNumber = stackTraceElements[4].getLineNumber();
- return "sl4a." + className + ":" + lineNumber;
- }
-
- private static void toast(Context context, String message) {
- Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
- }
-
- public static void notify(Context context, String title, String contentTitle, String message) {
- android.util.Log.v(getTag(), String.format("%s %s", contentTitle, message));
-
- String packageName = context.getPackageName();
- int iconId = context.getResources().getIdentifier("stat_sys_warning", "drawable", packageName);
- NotificationManager notificationManager =
- (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
- Notification.Builder builder = new Notification.Builder(context);
- builder.setSmallIcon(iconId > 0 ? iconId : -1)
- .setTicker(title)
- .setWhen(0)
- .setContentTitle(contentTitle)
- .setContentText(message)
- .setContentIntent(PendingIntent.getService(context, 0, null, 0));
- Notification note = builder.build();
- note.contentView.getLayoutId();
- notificationManager.notify(NotificationIdFactory.create(), note);
- }
-
- public static void showDialog(final Context context, final String title, final String message) {
- android.util.Log.v(getTag(), String.format("%s %s", title, message));
-
- MainThread.run(context, new Runnable() {
- @Override
- public void run() {
- AlertDialog.Builder builder = new AlertDialog.Builder(context);
- builder.setTitle(title);
- builder.setMessage(message);
-
- DialogInterface.OnClickListener buttonListener = new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dialog.dismiss();
- }
- };
- builder.setPositiveButton("Ok", buttonListener);
- builder.show();
- }
- });
- }
-
- public static void v(String message) {
- android.util.Log.v(getTag(), message);
- }
-
- public static void v(String message, Throwable e) {
- android.util.Log.v(getTag(), message, e);
- }
-
- public static void v(Context context, String message) {
- toast(context, message);
- android.util.Log.v(getTag(), message);
- }
-
- public static void v(Context context, String message, Throwable e) {
- toast(context, message);
- android.util.Log.v(getTag(), message, e);
- }
-
- public static void e(Throwable e) {
- android.util.Log.e(getTag(), "Error", e);
- }
-
- public static void e(String message) {
- android.util.Log.e(getTag(), message);
- }
-
- public static void e(String message, Throwable e) {
- android.util.Log.e(getTag(), message, e);
- }
-
- public static void e(Context context, String message) {
- toast(context, message);
- android.util.Log.e(getTag(), message);
- }
-
- public static void e(Context context, String message, Throwable e) {
- toast(context, message);
- android.util.Log.e(getTag(), message, e);
- }
-
- public static void w(Throwable e) {
- android.util.Log.w(getTag(), "Warning", e);
- }
-
- public static void w(String message) {
- android.util.Log.w(getTag(), message);
- }
-
- public static void w(String message, Throwable e) {
- android.util.Log.w(getTag(), message, e);
- }
-
- public static void w(Context context, String message) {
- toast(context, message);
- android.util.Log.w(getTag(), message);
- }
-
- public static void w(Context context, String message, Throwable e) {
- toast(context, message);
- android.util.Log.w(getTag(), message, e);
- }
-
- public static void d(String message) {
- android.util.Log.d(getTag(), message);
- }
-
- public static void d(String message, Throwable e) {
- android.util.Log.d(getTag(), message, e);
- }
-
- public static void d(Context context, String message) {
- toast(context, message);
- android.util.Log.d(getTag(), message);
- }
-
- public static void d(Context context, String message, Throwable e) {
- toast(context, message);
- android.util.Log.d(getTag(), message, e);
- }
-
- public static void i(String message) {
- android.util.Log.i(getTag(), message);
- }
-
- public static void i(String message, Throwable e) {
- android.util.Log.i(getTag(), message, e);
- }
-
- public static void i(Context context, String message) {
- toast(context, message);
- android.util.Log.i(getTag(), message);
- }
-
- public static void i(Context context, String message, Throwable e) {
- toast(context, message);
- android.util.Log.i(getTag(), message, e);
- }
-}
diff --git a/sl4a/Utils/src/com/googlecode/android_scripting/MainThread.java b/sl4a/Utils/src/com/googlecode/android_scripting/MainThread.java
deleted file mode 100644
index 840c1e7..0000000
--- a/sl4a/Utils/src/com/googlecode/android_scripting/MainThread.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-import android.content.Context;
-import android.os.Handler;
-
-import com.googlecode.android_scripting.future.FutureResult;
-
-import java.util.concurrent.Callable;
-
-public class MainThread {
-
- private MainThread() {
- // Utility class.
- }
-
- /**
- * Executed in the main thread, returns the result of an execution. Anything that runs here should
- * finish quickly to avoid hanging the UI thread.
- */
- public static <T> T run(Context context, final Callable<T> task) {
- final FutureResult<T> result = new FutureResult<T>();
- Handler handler = new Handler(context.getMainLooper());
- handler.post(new Runnable() {
- @Override
- public void run() {
- try {
- result.set(task.call());
- } catch (Exception e) {
- Log.e(e);
- result.set(null);
- }
- }
- });
- try {
- return result.get();
- } catch (InterruptedException e) {
- Log.e(e);
- }
- return null;
- }
-
- public static void run(Context context, final Runnable task) {
- Handler handler = new Handler(context.getMainLooper());
- handler.post(new Runnable() {
- @Override
- public void run() {
- task.run();
- }
- });
- }
-}
diff --git a/sl4a/Utils/src/com/googlecode/android_scripting/NotificationIdFactory.java b/sl4a/Utils/src/com/googlecode/android_scripting/NotificationIdFactory.java
deleted file mode 100644
index c87d94d..0000000
--- a/sl4a/Utils/src/com/googlecode/android_scripting/NotificationIdFactory.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * Creates unique ids to identify the notifications created by the android scripting service and the
- * trigger service.
- *
- * @author Felix Arends (felix.arends@gmail.com)
- *
- */
-public final class NotificationIdFactory {
- private static final AtomicInteger mNextId = new AtomicInteger(0);
-
- public static int create() {
- return mNextId.incrementAndGet();
- }
-
- private NotificationIdFactory() {
- }
-}
diff --git a/sl4a/Utils/src/com/googlecode/android_scripting/SimpleServer.java b/sl4a/Utils/src/com/googlecode/android_scripting/SimpleServer.java
deleted file mode 100644
index b93b6cb..0000000
--- a/sl4a/Utils/src/com/googlecode/android_scripting/SimpleServer.java
+++ /dev/null
@@ -1,368 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-import com.google.common.collect.Lists;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.PrintWriter;
-import java.net.BindException;
-import java.net.Inet4Address;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.NetworkInterface;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.net.SocketException;
-import java.net.UnknownHostException;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.concurrent.ConcurrentHashMap;
-//import com.googlecode.android_scripting.jsonrpc.RpcReceiverManager;
-
-/**
- * A simple server.
- * @author Damon Kohler (damonkohler@gmail.com)
- */
-public abstract class SimpleServer {
- private static int threadIndex = 0;
- private final ConcurrentHashMap<Integer, ConnectionThread> mConnectionThreads =
- new ConcurrentHashMap<Integer, ConnectionThread>();
- private final List<SimpleServerObserver> mObservers = Lists.newArrayList();
- private volatile boolean mStopServer = false;
- private ServerSocket mServer;
- private Thread mServerThread;
-
- public interface SimpleServerObserver {
- public void onConnect();
- public void onDisconnect();
- }
-
- protected abstract void handleConnection(Socket socket) throws Exception;
- protected abstract void handleRPCConnection(Socket socket,
- Integer UID,
- BufferedReader reader,
- PrintWriter writer) throws Exception;
-
- /** Adds an observer. */
- public void addObserver(SimpleServerObserver observer) {
- mObservers.add(observer);
- }
-
- /** Removes an observer. */
- public void removeObserver(SimpleServerObserver observer) {
- mObservers.remove(observer);
- }
-
- private void notifyOnConnect() {
- for (SimpleServerObserver observer : mObservers) {
- observer.onConnect();
- }
- }
-
- private void notifyOnDisconnect() {
- for (SimpleServerObserver observer : mObservers) {
- observer.onDisconnect();
- }
- }
-
- private final class ConnectionThread extends Thread {
- private final Socket mmSocket;
- private final BufferedReader reader;
- private final PrintWriter writer;
- private final Integer UID;
- private final boolean isRpc;
-
- private ConnectionThread(Socket socket, boolean rpc, Integer uid, BufferedReader reader, PrintWriter writer) {
- setName("SimpleServer ConnectionThread " + getId());
- mmSocket = socket;
- this.UID = uid;
- this.reader = reader;
- this.writer = writer;
- this.isRpc = rpc;
- }
-
- @Override
- public void run() {
- Log.v("Server thread " + getId() + " started.");
- try {
- if(isRpc) {
- Log.d("Handling RPC connection in "+getId());
- handleRPCConnection(mmSocket, UID, reader, writer);
- }else{
- Log.d("Handling Non-RPC connection in "+getId());
- handleConnection(mmSocket);
- }
- } catch (Exception e) {
- if (!mStopServer) {
- Log.e("Server error.", e);
- }
- } finally {
- close();
- mConnectionThreads.remove(this.UID);
- notifyOnDisconnect();
- Log.v("Server thread " + getId() + " stopped.");
- }
- }
-
- private void close() {
- if (mmSocket != null) {
- try {
- mmSocket.close();
- } catch (IOException e) {
- Log.e(e.getMessage(), e);
- }
- }
- }
- }
-
- /** Returns the number of active connections to this server. */
- public int getNumberOfConnections() {
- return mConnectionThreads.size();
- }
-
- public static InetAddress getPrivateInetAddress() throws UnknownHostException, SocketException {
-
- InetAddress candidate = null;
- Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
- for (NetworkInterface netint : Collections.list(nets)) {
- if (!netint.isLoopback() || !netint.isUp()) { // Ignore if localhost or not active
- continue;
- }
- Enumeration<InetAddress> addresses = netint.getInetAddresses();
- for (InetAddress address : Collections.list(addresses)) {
- if (address instanceof Inet4Address) {
- Log.d("local address " + address);
- return address; // Prefer ipv4
- }
- candidate = address; // Probably an ipv6
- }
- }
- if (candidate != null) {
- return candidate; // return ipv6 address if no suitable ipv6
- }
- return InetAddress.getLocalHost(); // No damn matches. Give up, return local host.
- }
-
- public static InetAddress getPublicInetAddress() throws UnknownHostException, SocketException {
-
- InetAddress candidate = null;
- Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
- for (NetworkInterface netint : Collections.list(nets)) {
- if (netint.isLoopback() || !netint.isUp()) { // Ignore if localhost or not active
- continue;
- }
- Enumeration<InetAddress> addresses = netint.getInetAddresses();
- for (InetAddress address : Collections.list(addresses)) {
- if (address instanceof Inet4Address) {
- return address; // Prefer ipv4
- }
- candidate = address; // Probably an ipv6
- }
- }
- if (candidate != null) {
- return candidate; // return ipv6 address if no suitable ipv6
- }
- return InetAddress.getLocalHost(); // No damn matches. Give up, return local host.
- }
-
- /**
- * Starts the RPC server bound to the localhost address.
- *
- * @param port
- * the port to bind to or 0 to pick any unused port
- *
- * @return the port that the server is bound to
- * @throws IOException
- */
- public InetSocketAddress startLocal(int port) {
- InetAddress address;
- try {
- // address = InetAddress.getLocalHost();
- address = getPrivateInetAddress();
- mServer = new ServerSocket(port, 5, address);
- } catch (BindException e) {
- Log.e("Port " + port + " already in use.");
- try {
- address = getPrivateInetAddress();
- mServer = new ServerSocket(0, 5, address);
- } catch (IOException e1) {
- e1.printStackTrace();
- return null;
- }
- } catch (Exception e) {
- Log.e("Failed to start server.", e);
- return null;
- }
- int boundPort = start();
- return InetSocketAddress.createUnresolved(mServer.getInetAddress().getHostAddress(), boundPort);
- }
-
- /**
- * data Starts the RPC server bound to the public facing address.
- *
- * @param port
- * the port to bind to or 0 to pick any unused port
- *
- * @return the port that the server is bound to
- */
- public InetSocketAddress startPublic(int port) {
- InetAddress address;
- try {
- // address = getPublicInetAddress();
- address = null;
- mServer = new ServerSocket(port, 5 /* backlog */, address);
- } catch (Exception e) {
- Log.e("Failed to start server.", e);
- return null;
- }
- int boundPort = start();
- return InetSocketAddress.createUnresolved(mServer.getInetAddress().getHostAddress(), boundPort);
- }
-
- /**
- * data Starts the RPC server bound to all interfaces
- *
- * @param port
- * the port to bind to or 0 to pick any unused port
- *
- * @return the port that the server is bound to
- */
- public InetSocketAddress startAllInterfaces(int port) {
- try {
- mServer = new ServerSocket(port, 5 /* backlog */);
- } catch (Exception e) {
- Log.e("Failed to start server.", e);
- return null;
- }
- int boundPort = start();
- return InetSocketAddress.createUnresolved(mServer.getInetAddress().getHostAddress(), boundPort);
- }
-
- private int start() {
- mServerThread = new Thread() {
- @Override
- public void run() {
- while (!mStopServer) {
- try {
- Socket sock = mServer.accept();
- if (!mStopServer) {
- startConnectionThread(sock);
- } else {
- sock.close();
- }
- } catch (IOException e) {
- if (!mStopServer) {
- Log.e("Failed to accept connection.", e);
- }
- } catch (JSONException e) {
- if (!mStopServer) {
- Log.e("Failed to parse request.", e);
- }
- }
- }
- }
- };
- mServerThread.start();
- Log.v("Bound to " + mServer.getInetAddress());
- return mServer.getLocalPort();
- }
-
- private void startConnectionThread(final Socket sock) throws IOException, JSONException {
- BufferedReader reader =
- new BufferedReader(new InputStreamReader(sock.getInputStream()), 8192);
- PrintWriter writer = new PrintWriter(sock.getOutputStream(), true);
- String data;
- if((data = reader.readLine()) != null) {
- Log.v("Received: " + data);
- JSONObject request = new JSONObject(data);
- if(request.has("cmd") && request.has("uid")) {
- String cmd = request.getString("cmd");
- int uid = request.getInt("uid");
- JSONObject result = new JSONObject();
- if(cmd.equals("initiate")) {
- Log.d("Initiate a new session");
- threadIndex += 1;
- int mUID = threadIndex;
- ConnectionThread networkThread = new ConnectionThread(sock,true,mUID,reader,writer);
- mConnectionThreads.put(mUID, networkThread);
- networkThread.start();
- notifyOnConnect();
- result.put("uid", mUID);
- result.put("status",true);
- result.put("error", null);
- }else if(cmd.equals("continue")) {
- Log.d("Continue an existing session");
- Log.d("keys: "+mConnectionThreads.keySet().toString());
- if(!mConnectionThreads.containsKey(uid)) {
- result.put("uid", uid);
- result.put("status",false);
- result.put("error", "Session does not exist.");
- }else{
- ConnectionThread networkThread = new ConnectionThread(sock,true,uid,reader,writer);
- mConnectionThreads.put(uid, networkThread);
- networkThread.start();
- notifyOnConnect();
- result.put("uid", uid);
- result.put("status",true);
- result.put("error", null);
- }
- }else {
- result.put("uid", uid);
- result.put("status",false);
- result.put("error", "Unrecognized command.");
- }
- writer.write(result + "\n");
- writer.flush();
- Log.v("Sent: " + result);
- }else{
- ConnectionThread networkThread = new ConnectionThread(sock,false,0,reader,writer);
- mConnectionThreads.put(0, networkThread);
- networkThread.start();
- notifyOnConnect();
- }
- }
- }
-
- public void shutdown() {
- // Stop listening on the server socket to ensure that
- // beyond this point there are no incoming requests.
- mStopServer = true;
- try {
- mServer.close();
- } catch (IOException e) {
- Log.e("Failed to close server socket.", e);
- }
- // Since the server is not running, the mNetworkThreads set can only
- // shrink from this point onward. We can just stop all of the running helper
- // threads. In the worst case, one of the running threads will already have
- // shut down. Since this is a CopyOnWriteList, we don't have to worry about
- // concurrency issues while iterating over the set of threads.
- for (ConnectionThread connectionThread : mConnectionThreads.values()) {
- connectionThread.close();
- }
- for (SimpleServerObserver observer : mObservers) {
- removeObserver(observer);
- }
- }
-}
diff --git a/sl4a/Utils/src/com/googlecode/android_scripting/SingleThreadExecutor.java b/sl4a/Utils/src/com/googlecode/android_scripting/SingleThreadExecutor.java
deleted file mode 100644
index 7c5b1c5..0000000
--- a/sl4a/Utils/src/com/googlecode/android_scripting/SingleThreadExecutor.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting;
-
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-
-public class SingleThreadExecutor extends ThreadPoolExecutor {
-
- public SingleThreadExecutor() {
- super(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
- }
-
- @Override
- protected void afterExecute(Runnable r, Throwable t) {
- if (t != null) {
- throw new RuntimeException(t);
- }
- }
-} \ No newline at end of file
diff --git a/sl4a/Utils/src/com/googlecode/android_scripting/exception/Sl4aException.java b/sl4a/Utils/src/com/googlecode/android_scripting/exception/Sl4aException.java
deleted file mode 100644
index 2f85b4b..0000000
--- a/sl4a/Utils/src/com/googlecode/android_scripting/exception/Sl4aException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.exception;
-
-@SuppressWarnings("serial")
-public class Sl4aException extends Exception {
-
- public Sl4aException(Exception e) {
- super(e);
- }
-
- public Sl4aException(String message) {
- super(message);
- }
-
- public Sl4aException(String message, Exception e) {
- super(message, e);
- }
-
-}
diff --git a/sl4a/Utils/src/com/googlecode/android_scripting/future/FutureResult.java b/sl4a/Utils/src/com/googlecode/android_scripting/future/FutureResult.java
deleted file mode 100644
index 573424c..0000000
--- a/sl4a/Utils/src/com/googlecode/android_scripting/future/FutureResult.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.future;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-
-/**
- * FutureResult represents an eventual execution result for asynchronous operations.
- *
- * @author Damon Kohler (damonkohler@gmail.com)
- */
-public class FutureResult<T> implements Future<T> {
-
- private final CountDownLatch mLatch = new CountDownLatch(1);
- private volatile T mResult = null;
-
- public void set(T result) {
- mResult = result;
- mLatch.countDown();
- }
-
- @Override
- public boolean cancel(boolean mayInterruptIfRunning) {
- return false;
- }
-
- @Override
- public T get() throws InterruptedException {
- mLatch.await();
- return mResult;
- }
-
- @Override
- public T get(long timeout, TimeUnit unit) throws InterruptedException {
- mLatch.await(timeout, unit);
- return mResult;
- }
-
- @Override
- public boolean isCancelled() {
- return false;
- }
-
- @Override
- public boolean isDone() {
- return mResult != null;
- }
-
-}
diff --git a/sl4a/Utils/src/com/googlecode/android_scripting/interpreter/ExternalClassLoader.java b/sl4a/Utils/src/com/googlecode/android_scripting/interpreter/ExternalClassLoader.java
deleted file mode 100644
index 3bbe349..0000000
--- a/sl4a/Utils/src/com/googlecode/android_scripting/interpreter/ExternalClassLoader.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.interpreter;
-
-import dalvik.system.DexClassLoader;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-public class ExternalClassLoader {
-
- public Object load(Collection<String> dexPaths, Collection<String> nativePaths, String className)
- throws Exception {
- String dexOutputDir = "/sdcard/dexoutput";
- String joinedDexPaths = join(dexPaths, ":");
- String joinedNativeLibPaths = nativePaths != null ? join(nativePaths, ":") : null;
- DexClassLoader loader =
- new DexClassLoader(joinedDexPaths, dexOutputDir, joinedNativeLibPaths, this.getClass()
- .getClassLoader());
- Class<?> classToLoad = Class.forName(className, true, loader);
- return classToLoad.newInstance();
- }
-
- private static String join(Collection<String> collection, String delimiter) {
- StringBuffer buffer = new StringBuffer();
- Iterator<String> iter = collection.iterator();
- while (iter.hasNext()) {
- buffer.append(iter.next());
- if (iter.hasNext()) {
- buffer.append(delimiter);
- }
- }
- return buffer.toString();
- }
-} \ No newline at end of file
diff --git a/sl4a/Utils/src/com/googlecode/android_scripting/interpreter/InterpreterConstants.java b/sl4a/Utils/src/com/googlecode/android_scripting/interpreter/InterpreterConstants.java
deleted file mode 100644
index cf4667a..0000000
--- a/sl4a/Utils/src/com/googlecode/android_scripting/interpreter/InterpreterConstants.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.interpreter;
-
-import android.os.Environment;
-
-/**
- * A collection of constants required for installation/removal of an interpreter.
- *
- * @author Damon Kohler (damonkohler@gmail.com)
- * @author Alexey Reznichenko (alexey.reznichenko@gmail.com)
- */
-public interface InterpreterConstants {
-
- public static final String SDCARD_ROOT =
- Environment.getExternalStorageDirectory().getAbsolutePath() + "/";
-
- public static final String SDCARD_SL4A_ROOT = SDCARD_ROOT + "sl4a/";
-
- public static final String SCRIPTS_ROOT = SDCARD_SL4A_ROOT + "scripts/";
-
- public static final String SDCARD_SL4A_DOC = SDCARD_SL4A_ROOT + "doc/";
-
- public static final String SL4A_DALVIK_CACHE_ROOT = "/dalvik-cache/";
-
- public static final String INTERPRETER_EXTRAS_ROOT = "/extras/";
-
- // Interpreters discovery mechanism.
- public static final String ACTION_DISCOVER_INTERPRETERS =
- "com.googlecode.android_scripting.DISCOVER_INTERPRETERS";
-
- // Interpreters broadcasts.
- public static final String ACTION_INTERPRETER_ADDED =
- "com.googlecode.android_scripting.INTERPRETER_ADDED";
- public static final String ACTION_INTERPRETER_REMOVED =
- "com.googlecode.android_scripting.INTERPRETER_REMOVED";
-
- // Interpreter content provider.
- public static final String PROVIDER_PROPERTIES = "com.googlecode.android_scripting.base";
- public static final String PROVIDER_ENVIRONMENT_VARIABLES =
- "com.googlecode.android_scripting.env";
- public static final String PROVIDER_ARGUMENTS = "com.googlecode.android_scripting.args";
-
- public static final String INSTALLED_PREFERENCE_KEY = "SL4A.interpreter.installed";
-
- public static final String MIME = "script/";
-}
diff --git a/sl4a/Utils/src/com/googlecode/android_scripting/interpreter/InterpreterDescriptor.java b/sl4a/Utils/src/com/googlecode/android_scripting/interpreter/InterpreterDescriptor.java
deleted file mode 100644
index 519798c..0000000
--- a/sl4a/Utils/src/com/googlecode/android_scripting/interpreter/InterpreterDescriptor.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.interpreter;
-
-import android.content.Context;
-
-import java.io.File;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Provides interpreter-specific info for execution/installation/removal purposes.
- *
- * @author Alexey Reznichenko (alexey.reznichenko@gmail.com)
- */
-public interface InterpreterDescriptor {
-
- /**
- * Returns unique name of the interpreter.
- */
- public String getName();
-
- /**
- * Returns display name of the interpreter.
- */
- public String getNiceName();
-
- /**
- * Returns supported script-file extension.
- */
- public String getExtension();
-
- /**
- * Returns interpreter version number.
- */
- public int getVersion();
-
- /**
- * Returns the binary as a File object. Context is the InterpreterProvider's {@link Context} and
- * is provided to find the interpreter installation directory.
- */
- public File getBinary(Context context);
-
- /**
- * Returns execution parameters in case when script name is not provided (when interpreter is
- * started in a shell mode);
- */
- public String getInteractiveCommand(Context context);
-
- /**
- * Returns command line arguments to execute a with a given script (format string with one
- * argument).
- */
- public String getScriptCommand(Context context);
-
- /**
- * Returns an array of command line arguments required to execute the interpreter (it's essential
- * that the order in the array is consistent with order of arguments in the command line).
- */
- public List<String> getArguments(Context context);
-
- /**
- * Should return a map of environment variables names and their values (or null if interpreter
- * does not require any environment variables).
- */
- public Map<String, String> getEnvironmentVariables(Context context);
-
- /**
- * Returns true if interpreter has an archive.
- */
- public boolean hasInterpreterArchive();
-
- /**
- * Returns true if interpreter has an extras archive.
- */
- public boolean hasExtrasArchive();
-
- /**
- * Returns true if interpreter comes with a scripts archive.
- */
- public boolean hasScriptsArchive();
-
- /**
- * Returns file name of the interpreter archive.
- */
- public String getInterpreterArchiveName();
-
- /**
- * Returns file name of the extras archive.
- */
- public String getExtrasArchiveName();
-
- /**
- * Returns file name of the scripts archive.
- */
- public String getScriptsArchiveName();
-
- /**
- * Returns URL location of the interpreter archive.
- */
- public String getInterpreterArchiveUrl();
-
- /**
- * Returns URL location of the scripts archive.
- */
- public String getScriptsArchiveUrl();
-
- /**
- * Returns URL location of the extras archive.
- */
- public String getExtrasArchiveUrl();
-
- /**
- * Returns true if interpreter can be executed in interactive mode.
- */
- public boolean hasInteractiveMode();
-}
diff --git a/sl4a/Utils/src/com/googlecode/android_scripting/interpreter/InterpreterPropertyNames.java b/sl4a/Utils/src/com/googlecode/android_scripting/interpreter/InterpreterPropertyNames.java
deleted file mode 100644
index b8995a7..0000000
--- a/sl4a/Utils/src/com/googlecode/android_scripting/interpreter/InterpreterPropertyNames.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.interpreter;
-
-/**
- * A collection of {@link String} keys for querying an InterpreterProvider.
- *
- * @author Alexey Reznichenko (alexey.reznichenko@gmail.com)
- */
-public interface InterpreterPropertyNames {
-
- /**
- * Unique name of the interpreter.
- */
- public static final String NAME = "name";
-
- /**
- * Display name of the interpreter.
- */
- public static final String NICE_NAME = "niceName";
-
- /**
- * Supported script file extension.
- */
- public static final String EXTENSION = "extension";
-
- /**
- * Absolute path of the interpreter executable.
- */
- public static final String BINARY = "binary";
-
- /**
- * Final argument to interpreter binary when running the interpreter interactively.
- */
- public static final String INTERACTIVE_COMMAND = "interactiveCommand";
-
- /**
- * Final argument to interpreter binary when running a script.
- */
- public static final String SCRIPT_COMMAND = "scriptCommand";
-
- /**
- * Interpreter interactive mode flag.
- */
- public static final String HAS_INTERACTIVE_MODE = "hasInteractiveMode";
-
-}
diff --git a/sl4a/Utils/src/com/googlecode/android_scripting/interpreter/InterpreterUtils.java b/sl4a/Utils/src/com/googlecode/android_scripting/interpreter/InterpreterUtils.java
deleted file mode 100644
index df81261..0000000
--- a/sl4a/Utils/src/com/googlecode/android_scripting/interpreter/InterpreterUtils.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.interpreter;
-
-import android.content.Context;
-
-import java.io.File;
-
-public class InterpreterUtils {
-
- private InterpreterUtils() {
- // Utility class
- }
-
- public static File getInterpreterRoot(Context context) {
- return context.getFilesDir();
- }
-
- public static File getInterpreterRoot(Context context, String interpreterName) {
- return new File(getInterpreterRoot(context), interpreterName);
- }
-}
diff --git a/sl4a/Utils/src/com/trilead/ssh2/StreamGobbler.java b/sl4a/Utils/src/com/trilead/ssh2/StreamGobbler.java
deleted file mode 100644
index 2d67337..0000000
--- a/sl4a/Utils/src/com/trilead/ssh2/StreamGobbler.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Copyright (C) 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.trilead.ssh2;
-
-import com.googlecode.android_scripting.Log;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * A <code>StreamGobbler</code> is an InputStream that uses an internal worker thread to constantly
- * consume input from another InputStream. It uses a buffer to store the consumed data. The buffer
- * size is automatically adjusted, if needed.
- * <p>
- * This class is sometimes very convenient - if you wrap a session's STDOUT and STDERR InputStreams
- * with instances of this class, then you don't have to bother about the shared window of STDOUT and
- * STDERR in the low level SSH-2 protocol, since all arriving data will be immediatelly consumed by
- * the worker threads. Also, as a side effect, the streams will be buffered (e.g., single byte
- * read() operations are faster).
- * <p>
- * Other SSH for Java libraries include this functionality by default in their STDOUT and STDERR
- * InputStream implementations, however, please be aware that this approach has also a downside:
- * <p>
- * If you do not call the StreamGobbler's <code>read()</code> method often enough and the peer is
- * constantly sending huge amounts of data, then you will sooner or later encounter a low memory
- * situation due to the aggregated data (well, it also depends on the Java heap size). Joe Average
- * will like this class anyway - a paranoid programmer would never use such an approach.
- * <p>
- * The term "StreamGobbler" was taken from an article called "When Runtime.exec() won't", see
- * http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html.
- *
- * @author Christian Plattner, plattner@trilead.com
- * @version $Id: StreamGobbler.java,v 1.1 2007/10/15 12:49:56 cplattne Exp $
- */
-
-public class StreamGobbler extends InputStream {
- class GobblerThread extends Thread {
- @Override
- public void run() {
-
- while (true) {
- try {
- byte[] saveBuffer = null;
-
- int avail = is.read(buffer, write_pos, buffer.length - write_pos);
-
- synchronized (synchronizer) {
- if (avail <= 0) {
- isEOF = true;
- synchronizer.notifyAll();
- break;
- }
- write_pos += avail;
-
- int space_available = buffer.length - write_pos;
-
- if (space_available == 0) {
- if (read_pos > 0) {
- saveBuffer = new byte[read_pos];
- System.arraycopy(buffer, 0, saveBuffer, 0, read_pos);
- System.arraycopy(buffer, read_pos, buffer, 0, buffer.length - read_pos);
- write_pos -= read_pos;
- read_pos = 0;
- } else {
- write_pos = 0;
- saveBuffer = buffer;
- }
- }
-
- synchronizer.notifyAll();
- }
-
- writeToFile(saveBuffer);
-
- } catch (IOException e) {
- synchronized (synchronizer) {
- exception = e;
- synchronizer.notifyAll();
- break;
- }
- }
- }
- }
- }
-
- private InputStream is;
- private GobblerThread t;
-
- private Object synchronizer = new Object();
-
- private boolean isEOF = false;
- private boolean isClosed = false;
- private IOException exception = null;
-
- private byte[] buffer;
- private int read_pos = 0;
- private int write_pos = 0;
- private final FileOutputStream mLogStream;
- private final int mBufferSize;
-
- public StreamGobbler(InputStream is, File log, int buffer_size) {
- this.is = is;
- mBufferSize = buffer_size;
- FileOutputStream out = null;
- try {
- out = new FileOutputStream(log, false);
- } catch (IOException e) {
- Log.e(e);
- }
- mLogStream = out;
- buffer = new byte[mBufferSize];
- t = new GobblerThread();
- t.setDaemon(true);
- t.start();
- }
-
- public void writeToFile(byte[] buffer) {
- if (mLogStream != null && buffer != null) {
- try {
- mLogStream.write(buffer);
- } catch (IOException e) {
- Log.e(e);
- }
- }
- }
-
- @Override
- public int read() throws IOException {
- synchronized (synchronizer) {
- if (isClosed) {
- throw new IOException("This StreamGobbler is closed.");
- }
-
- while (read_pos == write_pos) {
- if (exception != null) {
- throw exception;
- }
-
- if (isEOF) {
- return -1;
- }
-
- try {
- synchronizer.wait();
- } catch (InterruptedException e) {
- }
- }
-
- int b = buffer[read_pos++] & 0xff;
-
- return b;
- }
- }
-
- @Override
- public int available() throws IOException {
- synchronized (synchronizer) {
- if (isClosed) {
- throw new IOException("This StreamGobbler is closed.");
- }
-
- return write_pos - read_pos;
- }
- }
-
- @Override
- public int read(byte[] b) throws IOException {
- return read(b, 0, b.length);
- }
-
- @Override
- public void close() throws IOException {
- synchronized (synchronizer) {
- if (isClosed) {
- return;
- }
- isClosed = true;
- isEOF = true;
- synchronizer.notifyAll();
- is.close();
- }
- }
-
- @Override
- public int read(byte[] b, int off, int len) throws IOException {
- if (b == null) {
- throw new NullPointerException();
- }
-
- if ((off < 0) || (len < 0) || ((off + len) > b.length) || ((off + len) < 0) || (off > b.length)) {
- throw new IndexOutOfBoundsException();
- }
-
- if (len == 0) {
- return 0;
- }
-
- synchronized (synchronizer) {
- if (isClosed) {
- throw new IOException("This StreamGobbler is closed.");
- }
-
- while (read_pos == write_pos) {
- if (exception != null) {
- throw exception;
- }
-
- if (isEOF) {
- return -1;
- }
-
- try {
- synchronizer.wait();
- } catch (InterruptedException e) {
- }
- }
-
- int avail = write_pos - read_pos;
-
- avail = (avail > len) ? len : avail;
-
- System.arraycopy(buffer, read_pos, b, off, avail);
-
- read_pos += avail;
-
- return avail;
- }
- }
-}