├── .github └── workflows │ ├── release.yml │ └── tests.yml ├── .gitignore ├── CHANGELOG.mkd ├── CONTRIBUTING.mkd ├── CONTRIBUTORS ├── LICENSE ├── README.mkd ├── __pycache__ └── fabfile.cpython-36.pyc ├── build.gradle ├── docs └── sequences │ ├── 1_JSON_data_receive.png │ ├── 1_JSON_data_receive.txt │ ├── 2_Propagating_via_AIDL.png │ ├── 2_Propagating_via_AIDL.txt │ ├── 3_Manager_sends_to_listeners.png │ ├── 3_Manager_sends_to_listeners.txt │ ├── Makefile │ ├── README.mkd │ └── generate_sequence_diagram.py ├── enabler ├── build.gradle ├── libs │ ├── bugsnag-android-3.2.2.jar │ └── support-v4-19.1.0.jar ├── proguard-rules.txt └── src │ ├── androidTest │ ├── java │ │ └── com │ │ │ └── openxc │ │ │ ├── SupportSettingsUtilsTests.java │ │ │ ├── TestUtils.java │ │ │ ├── VehicleInterfaceTests.java │ │ │ ├── VehicleLocationProviderTest.java │ │ │ ├── VehicleManagerTest.java │ │ │ ├── remote │ │ │ └── VehicleServiceTest.java │ │ │ ├── sources │ │ │ └── trace │ │ │ │ └── TraceVehicleDataSourceTest.java │ │ │ └── ui │ │ │ ├── DTCUITests.java │ │ │ ├── DashboardFragmentUITests.java │ │ │ ├── DiagnosticUITests.java │ │ │ └── StatusFragmentUITests.java │ └── res │ │ ├── layout │ │ └── main.xml │ │ └── values │ │ └── strings.xml │ └── main │ ├── AndroidManifest.xml │ ├── ic_launcher-web.png │ ├── java │ └── com │ │ └── openxc │ │ └── enabler │ │ ├── BluetoothReceiver.java │ │ ├── BootupReceiver.java │ │ ├── CanMessageAdapter.java │ │ ├── CanMessageDetailActivity.java │ │ ├── CanMessageViewFragment.java │ │ ├── DTCRequestFragment.java │ │ ├── DataThroughputTask.java │ │ ├── DiagnosticRequestFragment.java │ │ ├── DiagnosticResponseAdapter.java │ │ ├── KeyedMessageAdapter.java │ │ ├── LocalLogcat.java │ │ ├── OpenXCApplication.java │ │ ├── OpenXcEnablerActivity.java │ │ ├── PipelineStatusUpdateTask.java │ │ ├── SendCanMessageFragment.java │ │ ├── SendCommandMessageFragment.java │ │ ├── SettingsActivity.java │ │ ├── SimpleVehicleMessageAdapter.java │ │ ├── StatusFragment.java │ │ ├── ThreadPreconditions.java │ │ ├── VehicleDashboardFragment.java │ │ ├── VehicleMessageAdapter.java │ │ ├── preferences │ │ ├── BluetoothPreferenceManager.java │ │ ├── DweetingPreferenceManager.java │ │ ├── FileRecordingPreferenceManager.java │ │ ├── GpsOverwritePreferenceManager.java │ │ ├── NativeGpsPreferenceManager.java │ │ ├── NetworkPreferenceManager.java │ │ ├── PhoneSensorSourcePreferenceManager.java │ │ ├── PreferenceManagerService.java │ │ ├── TraceSourcePreferenceManager.java │ │ ├── UploadingPreferenceManager.java │ │ ├── UsbPreferenceManager.java │ │ ├── VehicleInterfacePreferenceManager.java │ │ └── VehiclePreferenceManager.java │ │ └── viewTraces.java │ ├── play │ ├── contact-email.txt │ ├── contact-website.txt │ ├── default-language.txt │ └── listings │ │ └── en-US │ │ ├── featureGraphic │ │ └── feature-image.jpg │ │ ├── full-description.txt │ │ ├── icon │ │ └── openxc-icon-hi-res.png │ │ ├── phoneScreenshots │ │ ├── device-2014-11-16-210030.png │ │ ├── device-2014-11-16-210038.png │ │ ├── device-2014-11-16-210047.png │ │ ├── device-2014-11-16-210126.png │ │ ├── device-2014-11-16-210153.png │ │ ├── device-2014-11-16-210205.png │ │ └── device-2014-11-16-210215.png │ │ ├── sevenInchScreenshots │ │ └── 7inch-tablet-messages.png │ │ ├── short-description.txt │ │ └── title.txt │ └── res │ ├── drawable-hdpi │ ├── ic_action_bluetooth.png │ ├── ic_action_bluetooth_connected.png │ ├── ic_action_bluetooth_searching.png │ ├── ic_action_network_wifi.png │ ├── ic_action_storage.png │ ├── ic_action_usb.png │ └── ic_action_warning.png │ ├── drawable-mdpi │ ├── ic_action_bluetooth.png │ ├── ic_action_bluetooth_connected.png │ ├── ic_action_bluetooth_searching.png │ ├── ic_action_network_wifi.png │ ├── ic_action_storage.png │ ├── ic_action_usb.png │ └── ic_action_warning.png │ ├── drawable-xhdpi │ ├── ic_action_bluetooth.png │ ├── ic_action_bluetooth_connected.png │ ├── ic_action_bluetooth_searching.png │ ├── ic_action_network_wifi.png │ ├── ic_action_storage.png │ ├── ic_action_usb.png │ └── ic_action_warning.png │ ├── drawable-xxhdpi │ ├── ic_action_bluetooth.png │ ├── ic_action_bluetooth_connected.png │ ├── ic_action_bluetooth_searching.png │ ├── ic_action_network_wifi.png │ ├── ic_action_storage.png │ ├── ic_action_usb.png │ └── ic_action_warning.png │ ├── drawable │ └── open_xc_launcher_icon_black.png │ ├── layout │ ├── can_message_details.xml │ ├── can_message_list_fragment.xml │ ├── can_message_list_item.xml │ ├── command_request_list_item.xml │ ├── dashboard_list_item.xml │ ├── diagnostic_request_fragment.xml │ ├── diagnostic_request_list_item.xml │ ├── dtc_request_fragment.xml │ ├── license.xml │ ├── license_button.xml │ ├── main.xml │ ├── prompt.xml │ ├── send_can_message_fragment.xml │ ├── send_command_message_fragment.xml │ ├── status_fragment.xml │ ├── vehicle_dashboard.xml │ └── view_saved_data.xml │ ├── menu │ └── main.xml │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ └── ic_launcher_round.xml │ ├── mipmap-hdpi │ ├── ic_launcher.png │ ├── ic_launcher_foreground.png │ └── ic_launcher_round.png │ ├── mipmap-mdpi │ ├── ic_launcher.png │ ├── ic_launcher_foreground.png │ └── ic_launcher_round.png │ ├── mipmap-xhdpi │ ├── ic_launcher.png │ ├── ic_launcher_foreground.png │ └── ic_launcher_round.png │ ├── mipmap-xxhdpi │ ├── ic_launcher.png │ ├── ic_launcher_foreground.png │ └── ic_launcher_round.png │ ├── mipmap-xxxhdpi │ ├── ic_launcher.png │ ├── ic_launcher_foreground.png │ └── ic_launcher_round.png │ ├── raw │ ├── slowtrace │ ├── tracejson │ └── tracetxt │ ├── values │ ├── boolean_array.xml │ ├── commands_array.xml │ ├── data_format.xml │ ├── diag_request_buses.xml │ ├── format_array.xml │ ├── ic_launcher_background.xml │ ├── strings.xml │ ├── styles.xml │ └── vehicle_interfaces.xml │ └── xml │ ├── about_preferences.xml │ ├── data_source_preferences.xml │ ├── device_filter.xml │ ├── notification_preferences.xml │ ├── output_preferences.xml │ ├── preference_headers.xml │ ├── preference_headers_legacy.xml │ └── recording_preferences.xml ├── fabfile.py ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── keys ├── debug.keystore ├── play-store.p12 └── release.keystore ├── library ├── build.gradle ├── build.gradle.local └── src │ ├── main │ ├── AndroidManifest.xml │ ├── aidl │ │ └── com │ │ │ └── openxc │ │ │ ├── interfaces │ │ │ └── VehicleInterfaceDescriptor.aidl │ │ │ ├── messages │ │ │ ├── MessageKey.aidl │ │ │ └── VehicleMessage.aidl │ │ │ └── remote │ │ │ ├── VehicleServiceInterface.aidl │ │ │ ├── VehicleServiceListener.aidl │ │ │ └── ViConnectionListener.aidl │ ├── assets │ │ ├── adjectives.txt │ │ └── nouns.txt │ ├── java │ │ └── com │ │ │ ├── buglabs │ │ │ └── dweetlib │ │ │ │ └── DweetLib.java │ │ │ └── openxc │ │ │ ├── BinaryMessages.java │ │ │ ├── DataPipeline.java │ │ │ ├── NoValueException.java │ │ │ ├── VehicleLocationProvider.java │ │ │ ├── VehicleManager.java │ │ │ ├── interfaces │ │ │ ├── TestVehicleInterface.java │ │ │ ├── UriBasedVehicleInterfaceMixin.java │ │ │ ├── VehicleInterface.java │ │ │ ├── VehicleInterfaceDescriptor.java │ │ │ ├── VehicleInterfaceException.java │ │ │ ├── VehicleInterfaceFactory.java │ │ │ ├── bluetooth │ │ │ │ ├── BLEInputStream.java │ │ │ │ ├── BluetoothException.java │ │ │ │ ├── BluetoothVehicleInterface.java │ │ │ │ ├── DeviceManager.java │ │ │ │ ├── GattCallback.java │ │ │ │ └── package-info.java │ │ │ ├── network │ │ │ │ ├── NetworkSourceException.java │ │ │ │ ├── NetworkVehicleInterface.java │ │ │ │ └── package-info.java │ │ │ ├── package-info.java │ │ │ └── usb │ │ │ │ ├── UsbDeviceAttachmentActivity.java │ │ │ │ ├── UsbDeviceException.java │ │ │ │ ├── UsbDeviceUtilities.java │ │ │ │ ├── UsbVehicleInterface.java │ │ │ │ └── package-info.java │ │ │ ├── measurements │ │ │ ├── AcceleratorPedalPosition.java │ │ │ ├── BaseMeasurement.java │ │ │ ├── BrakePedalStatus.java │ │ │ ├── EngineSpeed.java │ │ │ ├── EventedMeasurement.java │ │ │ ├── FuelConsumed.java │ │ │ ├── FuelLevel.java │ │ │ ├── HeadlampStatus.java │ │ │ ├── HighBeamStatus.java │ │ │ ├── IgnitionStatus.java │ │ │ ├── Latitude.java │ │ │ ├── Longitude.java │ │ │ ├── Measurement.java │ │ │ ├── Odometer.java │ │ │ ├── ParkingBrakeStatus.java │ │ │ ├── SteeringWheelAngle.java │ │ │ ├── TorqueAtTransmission.java │ │ │ ├── TransmissionGearPosition.java │ │ │ ├── TurnSignalStatus.java │ │ │ ├── UnrecognizedMeasurementTypeException.java │ │ │ ├── VehicleButtonEvent.java │ │ │ ├── VehicleDoorStatus.java │ │ │ ├── VehicleSpeed.java │ │ │ ├── WindshieldWiperStatus.java │ │ │ └── package-info.java │ │ │ ├── messages │ │ │ ├── CanMessage.java │ │ │ ├── Command.java │ │ │ ├── CommandResponse.java │ │ │ ├── CustomCommand.java │ │ │ ├── CustomCommandResponse.java │ │ │ ├── DiagnosticMessage.java │ │ │ ├── DiagnosticRequest.java │ │ │ ├── DiagnosticResponse.java │ │ │ ├── EventedSimpleVehicleMessage.java │ │ │ ├── ExactKeyMatcher.java │ │ │ ├── FilterVehicleMessageWithVariance.java │ │ │ ├── KeyMatcher.java │ │ │ ├── KeyedMessage.java │ │ │ ├── MessageKey.java │ │ │ ├── MultiFrameResponse.java │ │ │ ├── NamedVehicleMessage.java │ │ │ ├── SerializationException.java │ │ │ ├── SimpleVehicleMessage.java │ │ │ ├── UnrecognizedMessageTypeException.java │ │ │ ├── VehicleMessage.java │ │ │ ├── formatters │ │ │ │ ├── BinaryFormatter.java │ │ │ │ ├── ByteAdapter.java │ │ │ │ ├── CustomCommandSerializer.java │ │ │ │ ├── JsonFormatter.java │ │ │ │ ├── LowercaseEnumTypeAdapterFactory.java │ │ │ │ ├── MultiFrameStitcher.java │ │ │ │ ├── binary │ │ │ │ │ ├── BinaryDeserializer.java │ │ │ │ │ └── BinarySerializer.java │ │ │ │ └── package-info.java │ │ │ └── streamers │ │ │ │ ├── BinaryStreamer.java │ │ │ │ ├── JsonStreamer.java │ │ │ │ └── VehicleMessageStreamer.java │ │ │ ├── package-info.java │ │ │ ├── remote │ │ │ ├── VehicleService.java │ │ │ ├── VehicleServiceException.java │ │ │ └── package-info.java │ │ │ ├── sinks │ │ │ ├── AbstractQueuedCallbackSink.java │ │ │ ├── ContextualVehicleDataSink.java │ │ │ ├── DataSinkException.java │ │ │ ├── DweetSink.java │ │ │ ├── FileRecorderSink.java │ │ │ ├── MessageListenerSink.java │ │ │ ├── RemoteCallbackSink.java │ │ │ ├── TestSink.java │ │ │ ├── UploaderSink.java │ │ │ ├── UserSink.java │ │ │ ├── VehicleDataSink.java │ │ │ └── package-info.java │ │ │ ├── sources │ │ │ ├── ApplicationSource.java │ │ │ ├── BaseVehicleDataSource.java │ │ │ ├── BytestreamConnectingTask.java │ │ │ ├── BytestreamDataSource.java │ │ │ ├── ContextualVehicleDataSource.java │ │ │ ├── DataSourceException.java │ │ │ ├── DataSourceResourceException.java │ │ │ ├── NativeLocationSource.java │ │ │ ├── PhoneSensorSource.java │ │ │ ├── RemoteListenerSource.java │ │ │ ├── SourceCallback.java │ │ │ ├── SourceLogger.java │ │ │ ├── TestSource.java │ │ │ ├── VehicleDataSource.java │ │ │ ├── WakeLockManager.java │ │ │ ├── package-info.java │ │ │ └── trace │ │ │ │ ├── TraceVehicleDataSource.java │ │ │ │ └── package-info.java │ │ │ ├── units │ │ │ ├── Boolean.java │ │ │ ├── Degree.java │ │ │ ├── Kilometer.java │ │ │ ├── KilometersPerHour.java │ │ │ ├── Liter.java │ │ │ ├── Meter.java │ │ │ ├── NewtonMeter.java │ │ │ ├── Percentage.java │ │ │ ├── Quantity.java │ │ │ ├── RotationsPerMinute.java │ │ │ ├── State.java │ │ │ ├── Unit.java │ │ │ └── package-info.java │ │ │ └── util │ │ │ ├── AgingData.java │ │ │ ├── AndroidFileOpener.java │ │ │ ├── FileOpener.java │ │ │ ├── Range.java │ │ │ ├── SupportSettingsUtils.java │ │ │ └── package-info.java │ └── res │ │ ├── drawable-hdpi-v11 │ │ └── openxc_notification_icon_small_white.png │ │ ├── drawable-hdpi │ │ └── openxc_notification_icon_small_white.png │ │ ├── drawable-mdpi-v11 │ │ └── openxc_notification_icon_small_white.png │ │ ├── drawable-mdpi │ │ └── openxc_notification_icon_small_white.png │ │ ├── drawable-xhdpi-v11 │ │ └── openxc_notification_icon_small_white.png │ │ ├── drawable-xhdpi │ │ └── openxc_notification_icon_small_white.png │ │ ├── drawable-xxhdpi-v11 │ │ └── openxc_notification_icon_small_white.png │ │ ├── drawable-xxhdpi │ │ └── openxc_notification_icon_small_white.png │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── openxc │ ├── BaseMeasurementTest.java │ ├── DataPipelineTest.java │ ├── MeasurementTest.java │ ├── MeasurementsTest.java │ ├── NoRangeMeasurementTest.java │ ├── TestUtils.java │ ├── UnitsTest.java │ ├── VehicleManagerJvmTest.java │ ├── interfaces │ ├── network │ │ └── NetworkVehicleInterfaceTest.java │ └── usb │ │ └── UsbVehicleInterfaceTest.java │ ├── measurements │ ├── AcceleratorPedalPositionTest.java │ ├── BrakePedalStatusTest.java │ ├── EngineSpeedTest.java │ ├── FuelConsumedTest.java │ ├── FuelLevelTest.java │ ├── HeadlampStatusTest.java │ ├── HighBeamStatusTest.java │ ├── LatitudeTest.java │ ├── LongitudeTest.java │ ├── OdometerTest.java │ ├── ParkingBrakeStatusTest.java │ ├── SteeringWheelAngleTest.java │ ├── TorqueAtTransmissionTest.java │ ├── TransmissionGearPositionTest.java │ ├── TurnSignalStatusTest.java │ ├── VehicleSpeedTest.java │ └── WindshieldWiperStatusTest.java │ ├── messages │ ├── CanMessageTest.java │ ├── CommandResponseTest.java │ ├── CommandTest.java │ ├── CustomCommandTest.java │ ├── DiagnosticRequestTest.java │ ├── DiagnosticResponseTest.java │ ├── EventedSimpleVehicleMessageTest.java │ ├── KeyMatcherTest.java │ ├── MessageKeyTest.java │ ├── MultiFrameResponseTest.java │ ├── NamedVehicleMessageTest.java │ ├── SimpleVehicleMessageTest.java │ ├── VehicleMessageTest.java │ ├── formatters │ │ ├── AbstractFormatterTestBase.java │ │ ├── BinaryFormatterTest.java │ │ ├── ByteAdapterTest.java │ │ └── JsonFormatterTest.java │ └── streamers │ │ ├── BinaryStreamerTest.java │ │ └── JsonStreamerTest.java │ ├── sinks │ ├── ContextualVehicleDataSinkTest.java │ ├── FileRecorderSinkTest.java │ ├── MessageListenerSinkTest.java │ ├── RemoteCallbackSinkTest.java │ └── UploaderSinkTest.java │ ├── sources │ ├── BaseVehicleDataSourceTest.java │ └── BytestreamDataSourceTest.java │ ├── units │ ├── BooleanTest.java │ ├── QuantityTest.java │ └── StateTest.java │ └── util │ ├── AgingDataTest.java │ └── RangeTest.java ├── scripts ├── deploy.sh └── push-javadoc.sh ├── secret.json.enc └── settings.gradle /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | 8 | jobs: 9 | build: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - uses: actions/checkout@v2 14 | 15 | - name: Build Release 16 | uses: Raul6469/android-gradle-action@2.0.0 17 | env: 18 | keystorePassword: ${{secrets.keystorePassword}} 19 | keyAlias: ${{secrets.KEYNAME}} 20 | keyPassword: ${{secrets.KEY_ALIAS_PASSWORD}} 21 | with: 22 | # The gradle command you wish to run (required) 23 | # Here, `./gradlew test` will be run 24 | script: "assembleRelease" 25 | 26 | # In some cases, you may need to provide 27 | # Android licence agreement id 28 | # You can find it on your own machine under `$ANDROID_HOME/license`, 29 | # and add the file content as a GitHub secret named `$ANDROID_LICENCE`. 30 | android-licence: ${{ secrets.ANDROID_LICENCE }} 31 | 32 | - name: Copy Finished APK 33 | run: | 34 | cp ./enabler/build/outputs/apk/release/enabler-release.apk /tmp/enabler-release.apk 35 | 36 | - name: Publish Artifact 37 | uses: actions/upload-artifact@v2 38 | with: 39 | name: Open XC Enabler 40 | path: /tmp/enabler-release.apk 41 | 42 | - name: Publish To Play Store 43 | uses: r0adkll/upload-google-play@v1 44 | with: 45 | serviceAccountJson: ${{ secrets.SERVICE_ACCOUNT_JSON }} 46 | packageName: com.openxcplatform.enabler 47 | releaseFile: /tmp/enabler-release.apk 48 | track: prodction 49 | -------------------------------------------------------------------------------- /.github/workflows/tests.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: [push] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | 9 | steps: 10 | - uses: actions/checkout@v2 11 | 12 | - uses: actions/setup-java@v1 13 | with: 14 | java-version: '8' # The JDK version to make available on the path. 15 | java-package: jdk # (jre, jdk, or jdk+fx) - defaults to jdk 16 | architecture: x64 # (x64 or x86) - defaults to x64 17 | 18 | - name: Build Test 19 | run: ./gradlew test 20 | 21 | - name: Test Debug 22 | run: ./gradlew testDebug 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | target 2 | bin 3 | gen 4 | .DS_Store 5 | /com/ 6 | reference 7 | *.asc 8 | .settings 9 | .project 10 | .classpath 11 | *.releaseBackup 12 | release.properties 13 | release 14 | tokens.xml 15 | local.properties 16 | 17 | # Built application files 18 | *.apk 19 | *.ap_ 20 | 21 | # Files for the Dalvik VM 22 | *.dex 23 | 24 | # Java class files 25 | *.class 26 | 27 | # Generated files 28 | bin/ 29 | gen/ 30 | 31 | # Android Studio / Gradle files 32 | .idea/ 33 | .gradle 34 | /*/local.properties 35 | /*/out 36 | /*/*/production 37 | *.iml 38 | *.iws 39 | *.ipr 40 | *~ 41 | *.swp 42 | .gradle/ 43 | build/ 44 | /*/build/ 45 | */app/build/ 46 | 47 | # Local configuration file (sdk path, etc) 48 | local.properties 49 | 50 | # Proguard folder generated by Eclipse 51 | proguard/ 52 | 53 | # Log Files 54 | *.log 55 | -------------------------------------------------------------------------------- /CONTRIBUTING.mkd: -------------------------------------------------------------------------------- 1 | # How to contribute 2 | 3 | 4 | Contributions are welcome - we want to keep it as easy as possible to contribute 5 | changes that get things working in your environment. There are a few guidelines 6 | that we need contributors to follow so that we can have a chance of keeping on 7 | top of things. 8 | 9 | ## Reporting an Issue 10 | 11 | * Make sure you have a [GitHub account](https://github.com/signup/free) 12 | * Check if a ticket already exists for your issue on [GitHub](gh-issues). 13 | * If one does not already exist, [create a new ticket](gh-issues) 14 | * Clearly describe the issue including steps to reproduce when it is a bug. 15 | * Make sure you include in the earliest version that you know has the issue. 16 | 17 | ## Making Changes 18 | 19 | * If you haven't already, create a new issue on [GitHub](gh-issues) for your bug 20 | fix or new feature. 21 | * Fork the repository on GitHub 22 | * Create a topic branch from where you want to base your work. 23 | * This is usually the master branch. 24 | * Only target release branches if you are certain your fix must be on that 25 | branch. 26 | * To quickly create a topic branch based on master; `git checkout -b 27 | fix/master/my_contribution master`. Please avoid working directly on the 28 | `master` branch. 29 | * Make commits of logical units. 30 | * Check for unnecessary whitespace with `git diff --check` before committing. 31 | * Make sure your commit messages are in the [proper format](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). 32 | * Make sure you have added the necessary tests for your changes in the 33 | `openxc-it` sub-project 34 | * Run the full test suite to assure nothing else was accidentally broken. 35 | 36 | ## Submitting Changes 37 | 38 | * Push your changes to a topic branch in your fork of the repository. 39 | * Sign the [Contributor License 40 | Agreement](http://openxcplatform.com/contributor-license-agreement.html) (CLA) 41 | * Submit a pull request to the repository in the openxc organization. 42 | 43 | # Additional Resources 44 | 45 | * [General GitHub documentation](http://help.github.com/) 46 | * [GitHub pull request documentation](http://help.github.com/send-pull-requests/) 47 | 48 | [gh-issues]: https://github.com/openxc/openxc-android/issues 49 | -------------------------------------------------------------------------------- /CONTRIBUTORS: -------------------------------------------------------------------------------- 1 | Chris Peplin cpeplin@ford.com 2 | Dave Melcher dmelche6@ford.com 3 | Jayanthi Rao jrao1@ford.com 4 | Samantha Skinger sskinger@ford.com 5 | T.J. Giuli tgiuli@ford.com 6 | Jairo Avalos 7 | Ewgenij Sokolovski esokolo4@ford.com 8 | Zac Nelson, znelson1@ford.com 9 | Robert Rembold, Robert.Rembold@de.bertrandt.com 10 | Colin Mayer, colinm1@ford.com 11 | Nick Thorne, nthorne5@ford.com 12 | Alok Kumar, akuma128@ford.com 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2012 Ford Motor Company 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | * Redistributions of source code must retain the above copyright 7 | notice, this list of conditions and the following disclaimer. 8 | * Redistributions in binary form must reproduce the above copyright 9 | notice, this list of conditions and the following disclaimer in the 10 | documentation and/or other materials provided with the distribution. 11 | * Neither the name of the nor the 12 | names of its contributors may be used to endorse or promote products 13 | derived from this software without specific prior written permission. 14 | 15 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 16 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 | DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY 19 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 20 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 21 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 22 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 24 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 | -------------------------------------------------------------------------------- /__pycache__/fabfile.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/__pycache__/fabfile.cpython-36.pyc -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | mavenCentral() 6 | jcenter() 7 | google() 8 | } 9 | 10 | dependencies { 11 | classpath 'com.android.tools.build:gradle:4.0.2' 12 | classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1' 13 | classpath 'com.bugsnag:bugsnag-android-gradle-plugin:3.5.0' 14 | classpath 'com.github.triplet.gradle:play-publisher:2.0.0-rc1' 15 | } 16 | } 17 | 18 | plugins { 19 | id "org.sonarqube" version "2.7" 20 | } 21 | 22 | allprojects { 23 | repositories { 24 | google() 25 | mavenCentral() 26 | jcenter() 27 | } 28 | } 29 | 30 | 31 | ext { 32 | compileSdkVersion = 29 33 | buildToolsVersion = "29.0.2" 34 | minSdkVersion = 18 35 | targetSdkVersion = 29 36 | 37 | versionMajor = 7 38 | versionMinor = 1 39 | versionPatch = 0 40 | 41 | versionCode = versionMajor * 1000000 + versionMinor * 1000 + versionPatch 42 | versionName = "${versionMajor}.${versionMinor}.${versionPatch}" 43 | 44 | def Properties properties = new Properties() 45 | if(file('local.properties').exists()) 46 | properties.load(project.rootProject.file('local.properties').newDataInputStream()) 47 | 48 | keystorePassword = getValue(properties, "KEYSTORE_PASS") 49 | keyAlias = getValue(properties, "ALIAS_NAME") 50 | keyPassword = getValue(properties, "ALIAS_PASS") 51 | 52 | bugsnagToken = getValue(properties, "BUGSNAG_TOKEN") 53 | serviceAccountEmail = getValue(properties, "SERVICE_EMAIL") 54 | 55 | bintrayUser = getValue(properties, "BINTRAY_USER") 56 | bintrayPassword = getValue(properties, "BINTRAY_API_KEY") 57 | } 58 | 59 | def getValue(def props, def name){ 60 | if(props && props[name]) 61 | return props[name] 62 | else if(System.getenv(name)) 63 | return System.getenv(name) 64 | else { 65 | logger.log(LogLevel.ERROR, name + " has not been provided, add it to your local.properties file") 66 | return "DEFAULT" 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /docs/sequences/1_JSON_data_receive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/docs/sequences/1_JSON_data_receive.png -------------------------------------------------------------------------------- /docs/sequences/1_JSON_data_receive.txt: -------------------------------------------------------------------------------- 1 | title JSON Data Received in VehicleService from Bluetooth 2 | 3 | BytestreamDataSource -> BluetoothVehicleInterface: read() 4 | BluetoothVehicleInterface -> BytestreamDataSource: bytes 5 | BytestreamDataSource -> JsonStreamer: receive(bytes) 6 | note over JsonStreamer: Stores bytes in a private buffer 7 | loop while there are messages left in buffer 8 | BytestreamDataSource -> JsonStreamer: parseNextMessage() 9 | 10 | note over JsonStreamer: Reads line from buffer 11 | JsonStreamer -> JsonFormatter: deserialize(line) 12 | JsonFormatter -> JsonStreamer: VehicleMessage 13 | JsonStreamer -> BytestreamDataSource: VehicleMessage 14 | BytestreamDataSource -> BaseVehicleDataSource: handleMessage(message) 15 | BaseVehicleDataSource -> DataPipeline: receive(message) 16 | alt if message has a 'name' field 17 | note over DataPipeline: store locally for retreival by name 18 | end 19 | loop for each sink on the pipeline 20 | DataPipeline -> VehicleDataSink: receive(message); 21 | end 22 | end 23 | 24 | -------------------------------------------------------------------------------- /docs/sequences/2_Propagating_via_AIDL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/docs/sequences/2_Propagating_via_AIDL.png -------------------------------------------------------------------------------- /docs/sequences/2_Propagating_via_AIDL.txt: -------------------------------------------------------------------------------- 1 | title Propagating message from Service to Manager via AIDL 2 | 3 | DataPipeline (Service) -> RemoteCallbackSink: receive(message); 4 | RemoteCallbackSink -> AbstractQueuedCallbackSink: receive(message) 5 | note over AbstractQueuedCallbackSink: stores message in a synchronized list 6 | AbstractQueuedCallbackSink -> RemoteCallbackSink: propagateMessage(mesage) 7 | loop for each OpenXC app's connected VehicleManager 8 | RemoteCallbackSink -> RemoteListenerSource: receive(message) 9 | note over RemoteCallbackSink,RemoteListenerSource: Crosses AIDL 10 | RemoteListenerSource -> BaseVehicleDataSource: handleMessage(message) 11 | BaseVehicleDataSource -> DataPipeline (Manager): receive(message) 12 | alt if message has a 'name' field 13 | note over DataPipeline (Manager): store locally for retreival by name 14 | end 15 | loop for each sink on the pipeline 16 | DataPipeline (Manager) -> VehicleDataSink: receive(message); 17 | end 18 | end 19 | 20 | -------------------------------------------------------------------------------- /docs/sequences/3_Manager_sends_to_listeners.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/docs/sequences/3_Manager_sends_to_listeners.png -------------------------------------------------------------------------------- /docs/sequences/3_Manager_sends_to_listeners.txt: -------------------------------------------------------------------------------- 1 | title VehicleManager propagates received message to listeners 2 | 3 | DataPipeline -> MeasurementListenerSink: receive(message) 4 | MeasurementListenerSink -> AbstractQueuedCallbackSink: receive(message) 5 | note right of AbstractQueuedCallbackSink: stores message in a synchronized list 6 | AbstractQueuedCallbackSink -> MeasurementListenerSink: propagateMessage(mesage) 7 | alt if message has a 'name' field 8 | MeasurementListenerSink -> BaseMeasurement: getMeasurementFromMessage(message) 9 | BaseMeasurement -> MeasurementListenerSink: Measurement 10 | loop for each listener register for this Measurement's type 11 | MeasurementListenerSink -> Measurement.Listener: receive(Measurement) 12 | end 13 | else TODO propagate other types, or just a generic VehicleMessage 14 | end 15 | 16 | -------------------------------------------------------------------------------- /docs/sequences/Makefile: -------------------------------------------------------------------------------- 1 | DIAGRAMS_SOURCES = $(wildcard *.txt) 2 | DIAGRAMS = $(DIAGRAMS_SOURCES:.txt=.png) 3 | all: $(DIAGRAMS) 4 | 5 | %.png: %.txt 6 | ./generate_sequence_diagram.py $^ $@ 7 | -------------------------------------------------------------------------------- /docs/sequences/README.mkd: -------------------------------------------------------------------------------- 1 | Sequence Diagrams 2 | ================= 3 | 4 | These are sequence diagrams stored in plaintext that can be visualized with at 5 | [websequencediagrams.com](https://www.websequencediagrams.com). 6 | -------------------------------------------------------------------------------- /docs/sequences/generate_sequence_diagram.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Generate a sequence diagram using websequencediagrams.com 3 | 4 | Thanks to websequencediagrams.com for the sample Python code for accessing their 5 | API! 6 | 7 | Usage: 8 | 9 | python generate_sequence_diagram.py input.txt output.png 10 | """ 11 | from __future__ import print_function 12 | try: 13 | from urllib import urlencode 14 | except ImportError: 15 | from urllib.parse import urlencode 16 | 17 | try: 18 | from urllib import urlopen, urlretrieve 19 | except ImportError: 20 | from urllib.request import urlopen, urlretrieve 21 | 22 | import urllib 23 | import re 24 | import sys 25 | 26 | def request_diagram(text, output_file, style='default'): 27 | request = {} 28 | request["message"] = text 29 | request["style"] = style 30 | request["apiVersion"] = "1" 31 | 32 | url = urlencode(request) 33 | url = url.encode('ascii') 34 | 35 | f = urlopen("http://www.websequencediagrams.com/", url) 36 | line = f.readline() 37 | f.close() 38 | 39 | expr = re.compile("(\?(img|pdf|png|svg)=[a-zA-Z0-9]+)") 40 | m = expr.search(line.decode('ascii')) 41 | 42 | if m == None: 43 | print("Invalid response from server.") 44 | return False 45 | 46 | urlretrieve("http://www.websequencediagrams.com/" + m.group(0), 47 | output_file) 48 | return True 49 | 50 | 51 | def generate_diagram(input_filename, output_filename): 52 | with open(input_filename) as input_file: 53 | text = '\n'.join((line for line in input_file)) 54 | request_diagram(text, output_filename, style="RoundGreen") 55 | 56 | 57 | if __name__ == '__main__': 58 | generate_diagram(sys.argv[1], sys.argv[2]) 59 | -------------------------------------------------------------------------------- /enabler/libs/bugsnag-android-3.2.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/libs/bugsnag-android-3.2.2.jar -------------------------------------------------------------------------------- /enabler/libs/support-v4-19.1.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/libs/support-v4-19.1.0.jar -------------------------------------------------------------------------------- /enabler/proguard-rules.txt: -------------------------------------------------------------------------------- 1 | -dontwarn javax.annotation.** 2 | -dontwarn org.checkerframework.** 3 | -dontwarn afu.org.checkerframework.** 4 | -dontwarn javax.inject.** 5 | -dontwarn sun.misc.Unsafe 6 | -dontwarn com.google.common.util.** 7 | -dontwarn com.google.errorprone.** 8 | -dontwarn org.apache.http.** 9 | -dontnote com.google.** 10 | -dontnote com.bugsnag.** 11 | -dontnote net.hockeyapp.** 12 | # Keep all public and protected class methods on all OpenXC classes. 13 | -keep public class com.openxc.** { 14 | public protected *; 15 | } 16 | -------------------------------------------------------------------------------- /enabler/src/androidTest/java/com/openxc/SupportSettingsUtilsTests.java: -------------------------------------------------------------------------------- 1 | package com.openxc; 2 | 3 | import java.util.HashSet; 4 | import java.util.Set; 5 | 6 | import android.content.SharedPreferences; 7 | import android.preference.PreferenceManager; 8 | import android.test.ServiceTestCase; 9 | import android.test.suitebuilder.annotation.SmallTest; 10 | 11 | import com.openxc.util.SupportSettingsUtils; 12 | 13 | public class SupportSettingsUtilsTests extends ServiceTestCase { 14 | SharedPreferences preferences; 15 | Set value; 16 | String key = "mykey"; 17 | 18 | public SupportSettingsUtilsTests() { 19 | super(VehicleManager.class); 20 | } 21 | 22 | @Override 23 | protected void setUp() throws Exception { 24 | super.setUp(); 25 | preferences = PreferenceManager.getDefaultSharedPreferences(getContext()); 26 | SharedPreferences.Editor editor = preferences.edit(); 27 | editor.clear(); 28 | editor.commit(); 29 | value = new HashSet(); 30 | value.add("abcd"); 31 | value.add("1234"); 32 | value.add("zxy"); 33 | } 34 | 35 | @SmallTest 36 | public void testStoreRetreiveStringSet() { 37 | SharedPreferences.Editor editor = preferences.edit(); 38 | SupportSettingsUtils.putStringSet(editor, key, value); 39 | editor.commit(); 40 | assertEquals(value, SupportSettingsUtils.getStringSet( 41 | preferences, key, new HashSet())); 42 | } 43 | 44 | @SmallTest 45 | public void testRetreiveInvalidKeyStringSet() { 46 | assertEquals(new HashSet(), SupportSettingsUtils.getStringSet( 47 | preferences, key, new HashSet())); 48 | } 49 | } 50 | 51 | -------------------------------------------------------------------------------- /enabler/src/androidTest/java/com/openxc/TestUtils.java: -------------------------------------------------------------------------------- 1 | package com.openxc; 2 | 3 | import android.content.Context; 4 | 5 | import org.apache.commons.io.FileUtils; 6 | 7 | import java.io.File; 8 | import java.io.IOException; 9 | import java.net.URI; 10 | import java.net.URISyntaxException; 11 | 12 | import static org.junit.Assert.fail; 13 | 14 | public class TestUtils { 15 | public static void pause(int millis) { 16 | //libraries such as Awaitility instead of thread sleep 17 | try { 18 | Thread.sleep(millis); 19 | } catch(InterruptedException e) { 20 | 21 | } 22 | 23 | } 24 | 25 | public static URI copyToStorage(Context context, int resource, 26 | String filename) { 27 | URI uri = null; 28 | try { 29 | uri = new URI("file:///sdcard/com.openxc/" + filename); 30 | } catch(URISyntaxException e) { 31 | fail("Couldn't construct resource URIs: " + e); 32 | } 33 | 34 | try { 35 | FileUtils.copyInputStreamToFile( 36 | context.getResources().openRawResource(resource), 37 | new File(uri)); 38 | } catch(IOException e) { 39 | fail("Couldn't copy trace files to SD card" + e); 40 | } 41 | return uri; 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /enabler/src/androidTest/java/com/openxc/remote/VehicleServiceTest.java: -------------------------------------------------------------------------------- 1 | package com.openxc.remote; 2 | 3 | import android.content.Intent; 4 | import android.test.ServiceTestCase; 5 | import android.test.suitebuilder.annotation.MediumTest; 6 | 7 | public class VehicleServiceTest extends ServiceTestCase { 8 | Intent startIntent; 9 | 10 | public VehicleServiceTest() { 11 | super(VehicleService.class); 12 | } 13 | 14 | @Override 15 | protected void setUp() throws Exception { 16 | super.setUp(); 17 | startIntent = new Intent(); 18 | startIntent.setClass(getContext(), VehicleServiceInterface.class); 19 | VehicleService.sIsUnderTest = true; 20 | } 21 | 22 | @MediumTest 23 | public void testUsingUsbSource() { 24 | assertNotNull(bindService(startIntent)); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /enabler/src/androidTest/java/com/openxc/ui/DashboardFragmentUITests.java: -------------------------------------------------------------------------------- 1 | package com.openxc.ui; 2 | 3 | import android.test.suitebuilder.annotation.LargeTest; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import com.openxc.enabler.OpenXcEnablerActivity; 7 | import com.openxcplatform.enabler.R; 8 | 9 | import org.junit.Rule; 10 | import org.junit.Test; 11 | import org.junit.runner.RunWith; 12 | 13 | import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner; 14 | import androidx.test.rule.ActivityTestRule; 15 | 16 | import static androidx.test.espresso.Espresso.onView; 17 | import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist; 18 | import static androidx.test.espresso.matcher.ViewMatchers.withText; 19 | import static org.junit.Assert.assertNotNull; 20 | 21 | @LargeTest 22 | @RunWith(AndroidJUnit4ClassRunner.class) 23 | public class DashboardFragmentUITests { 24 | 25 | @Rule 26 | public ActivityTestRule mActivityTestRule = new ActivityTestRule<>(OpenXcEnablerActivity.class); 27 | 28 | @Test 29 | public void check_for_view_layout_data(){ 30 | View v=LayoutInflater.from(mActivityTestRule.getActivity()).inflate(R.layout.vehicle_dashboard,null); 31 | assertNotNull(v); 32 | } 33 | 34 | @Test 35 | public void check_for_toast_data_not_displayed(){ 36 | onView(withText("VI Power Droped")).check(doesNotExist()); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /enabler/src/androidTest/java/com/openxc/ui/DiagnosticUITests.java: -------------------------------------------------------------------------------- 1 | package com.openxc.ui; 2 | 3 | import android.test.suitebuilder.annotation.LargeTest; 4 | 5 | import com.android21buttons.fragmenttestrule.FragmentTestRule; 6 | import com.openxc.enabler.DiagnosticRequestFragment; 7 | import com.openxc.enabler.OpenXcEnablerActivity; 8 | import com.openxcplatform.enabler.R; 9 | 10 | import org.junit.Before; 11 | import org.junit.Rule; 12 | import org.junit.Test; 13 | import org.junit.runner.RunWith; 14 | 15 | import androidx.test.espresso.action.ViewActions; 16 | import androidx.test.espresso.matcher.ViewMatchers; 17 | import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner; 18 | import androidx.test.rule.ActivityTestRule; 19 | 20 | import static androidx.test.espresso.Espresso.onView; 21 | import static androidx.test.espresso.action.ViewActions.closeSoftKeyboard; 22 | import static androidx.test.espresso.action.ViewActions.typeText; 23 | import static androidx.test.espresso.assertion.ViewAssertions.matches; 24 | import static androidx.test.espresso.matcher.ViewMatchers.withId; 25 | import static androidx.test.espresso.matcher.ViewMatchers.withText; 26 | 27 | @LargeTest 28 | @RunWith(AndroidJUnit4ClassRunner.class) 29 | public class DiagnosticUITests { 30 | 31 | //* 32 | private String stringToBetyped; 33 | 34 | @Rule 35 | public ActivityTestRule mActivityTestRule = new ActivityTestRule<>(OpenXcEnablerActivity.class); 36 | 37 | @Before 38 | public void initValidString() { 39 | // Specify a valid string. 40 | stringToBetyped = "BB8"; 41 | } 42 | 43 | @Test 44 | public void changeText_sameActivity() { 45 | 46 | //DiagnosticRequestFragment 47 | onView(ViewMatchers.withId(R.id.pager_title_strip)).perform(ViewActions.swipeLeft()); 48 | onView(ViewMatchers.withId(R.id.pager_title_strip)).perform(ViewActions.swipeLeft()); 49 | onView(ViewMatchers.withId(R.id.pager_title_strip)).perform(ViewActions.swipeLeft()); 50 | 51 | // Type text 52 | onView(withId(R.id.diag_request_id)).perform(typeText(stringToBetyped), closeSoftKeyboard()); 53 | 54 | // Validate text 55 | onView(withId(R.id.diag_request_id)).check(matches(withText(stringToBetyped))); 56 | } 57 | //*/ 58 | } 59 | -------------------------------------------------------------------------------- /enabler/src/androidTest/res/layout/main.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | -------------------------------------------------------------------------------- /enabler/src/androidTest/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | OpenXC 4 | 5 | -------------------------------------------------------------------------------- /enabler/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /enabler/src/main/java/com/openxc/enabler/BluetoothReceiver.java: -------------------------------------------------------------------------------- 1 | package com.openxc.enabler; 2 | 3 | import android.bluetooth.BluetoothDevice; 4 | import android.content.BroadcastReceiver; 5 | import android.content.Context; 6 | import android.content.Intent; 7 | import android.util.Log; 8 | 9 | import com.openxc.VehicleManager; 10 | import com.openxc.enabler.preferences.PreferenceManagerService; 11 | import com.openxc.interfaces.bluetooth.BluetoothVehicleInterface; 12 | 13 | public class BluetoothReceiver extends BroadcastReceiver { 14 | private static String Bluetooth_Receiver = BluetoothReceiver.class.getSimpleName(); 15 | 16 | private final boolean isVehicleInterface(BluetoothDevice device) { 17 | return device != null && device.getName() != null && 18 | device.getName().contains( 19 | BluetoothVehicleInterface.DEVICE_NAME_PREFIX); 20 | } 21 | 22 | @Override 23 | public void onReceive(Context context, Intent intent) { 24 | BluetoothDevice bluetoothDevice = (BluetoothDevice) 25 | intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 26 | if(isVehicleInterface(bluetoothDevice)) { 27 | if(intent.getAction().compareTo( 28 | BluetoothDevice.ACTION_ACL_CONNECTED) == 0){ 29 | Log.d(Bluetooth_Receiver, "A Bluetooth OpenXC VI connected: " + bluetoothDevice.getName()); 30 | context.startService(new Intent(context, VehicleManager.class)); 31 | context.startService(new Intent(context, 32 | PreferenceManagerService.class)); 33 | } else { 34 | Log.d(Bluetooth_Receiver, "A Bluetooth OpenXC VI disconnected: " + bluetoothDevice.getName()); 35 | } 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /enabler/src/main/java/com/openxc/enabler/BootupReceiver.java: -------------------------------------------------------------------------------- 1 | package com.openxc.enabler; 2 | 3 | import android.content.BroadcastReceiver; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | import android.util.Log; 7 | 8 | import com.openxc.enabler.preferences.PreferenceManagerService; 9 | 10 | /** 11 | * Receive the BOOT_COMPLETED signal and start the VehicleManager. 12 | * 13 | * The reason to do this in a central location is to centralize USB permissions 14 | * management. 15 | */ 16 | public class BootupReceiver extends BroadcastReceiver { 17 | private static String Bootup_Receiver = BootupReceiver.class.getSimpleName(); 18 | 19 | @Override 20 | public void onReceive(Context context, Intent intent) { 21 | Log.i(Bootup_Receiver, "Loading configured vehicle services on bootup"); 22 | context.startService(new Intent(context, PreferenceManagerService.class)); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /enabler/src/main/java/com/openxc/enabler/CanMessageAdapter.java: -------------------------------------------------------------------------------- 1 | package com.openxc.enabler; 2 | 3 | import android.content.Context; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.TextView; 8 | 9 | import com.openxc.messages.CanMessage; 10 | import com.openxc.messages.formatters.ByteAdapter; 11 | import com.openxcplatform.enabler.R; 12 | 13 | public class CanMessageAdapter extends KeyedMessageAdapter { 14 | private Context mContext; 15 | 16 | public CanMessageAdapter(Context context) { 17 | super(); 18 | mContext = context; 19 | } 20 | 21 | @Override 22 | public CanMessage getItem(int position) { 23 | return mValues.get(position).asCanMessage(); 24 | } 25 | 26 | @Override 27 | public View getView(int position, View convertView, ViewGroup parent) { 28 | if(convertView == null) { 29 | convertView = LayoutInflater.from(mContext) 30 | .inflate(R.layout.can_message_list_item, parent, false); 31 | } 32 | 33 | CanMessage message = getItem(position); 34 | 35 | TextView timestampView = (TextView) 36 | convertView.findViewById(R.id.timestamp); 37 | timestampView.setText(formatTimestamp(message)); 38 | 39 | TextView busView = (TextView) convertView.findViewById(R.id.bus); 40 | busView.setText("" + message.getBusId()); 41 | 42 | TextView idView = (TextView) convertView.findViewById(R.id.id); 43 | idView.setText("0x" + Integer.toHexString(message.getId())); 44 | 45 | TextView dataView = (TextView) convertView.findViewById(R.id.data); 46 | dataView.setText("0x" + ByteAdapter.byteArrayToHexString( 47 | message.getData())); 48 | 49 | return convertView; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /enabler/src/main/java/com/openxc/enabler/CanMessageDetailActivity.java: -------------------------------------------------------------------------------- 1 | package com.openxc.enabler; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | import android.widget.TextView; 6 | 7 | import com.openxc.messages.CanMessage; 8 | import com.openxc.messages.formatters.ByteAdapter; 9 | import com.openxcplatform.enabler.R; 10 | 11 | public class CanMessageDetailActivity extends Activity { 12 | public final static String EXTRA_CAN_MESSAGE = "EXTRA_CAN_MESSAGE"; 13 | 14 | @Override 15 | public void onCreate(Bundle savedInstanceState) { 16 | super.onCreate(savedInstanceState); 17 | setContentView(R.layout.can_message_details); 18 | 19 | Bundle extras = getIntent().getExtras(); 20 | if (extras != null) { 21 | CanMessage message = extras.getParcelable(EXTRA_CAN_MESSAGE); 22 | 23 | TextView timestampView = (TextView) findViewById(R.id.timestamp); 24 | timestampView.setText("" + message.getTimestamp()); 25 | 26 | TextView busView = (TextView) findViewById(R.id.bus); 27 | busView.setText("" + message.getBusId()); 28 | 29 | TextView idView = (TextView) findViewById(R.id.id); 30 | idView.setText("0x" + Integer.toHexString(message.getId())); 31 | 32 | TextView dataView = (TextView) findViewById(R.id.data); 33 | dataView.setText("0x" + ByteAdapter.byteArrayToHexString( 34 | message.getData())); 35 | } else { 36 | finish(); 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /enabler/src/main/java/com/openxc/enabler/OpenXCApplication.java: -------------------------------------------------------------------------------- 1 | package com.openxc.enabler; 2 | 3 | import android.app.Application; 4 | 5 | import com.openxc.sources.trace.TraceVehicleDataSource; 6 | 7 | public class OpenXCApplication extends Application { 8 | 9 | private static TraceVehicleDataSource mTraceSource = null; 10 | 11 | 12 | @Override 13 | public void onCreate() { 14 | super.onCreate(); 15 | 16 | LocalLogcat.initLogcat(getApplicationContext()); 17 | } 18 | 19 | 20 | public static TraceVehicleDataSource getTraceSource() { 21 | return mTraceSource; 22 | } 23 | 24 | public static void setTraceSource(TraceVehicleDataSource traceVehicleDataSource) { 25 | mTraceSource = traceVehicleDataSource; 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /enabler/src/main/java/com/openxc/enabler/ThreadPreconditions.java: -------------------------------------------------------------------------------- 1 | package com.openxc.enabler; 2 | 3 | import android.os.Looper; 4 | 5 | import com.openxcplatform.enabler.BuildConfig; 6 | 7 | public class ThreadPreconditions { 8 | private ThreadPreconditions(){ 9 | 10 | } 11 | public static void checkOnMainThread() { 12 | if (BuildConfig.DEBUG && Thread.currentThread() != Looper.getMainLooper().getThread()) { 13 | throw new IllegalStateException("This method should be called from the Main Thread"); 14 | } 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /enabler/src/main/java/com/openxc/enabler/VehicleMessageAdapter.java: -------------------------------------------------------------------------------- 1 | package com.openxc.enabler; 2 | 3 | import java.text.SimpleDateFormat; 4 | import java.util.ArrayList; 5 | import java.util.List; 6 | import java.util.Locale; 7 | 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | import android.widget.BaseAdapter; 11 | 12 | import com.openxc.messages.VehicleMessage; 13 | 14 | public abstract class VehicleMessageAdapter extends BaseAdapter { 15 | protected List mValues = new ArrayList<>(); 16 | 17 | public void add(VehicleMessage message) { 18 | ThreadPreconditions.checkOnMainThread(); 19 | // No need to sort as the list will maintain assertion order, which will 20 | // be the same as sorting by timestamp. 21 | mValues.add(0, message); 22 | notifyDataSetChanged(); 23 | } 24 | 25 | protected static String formatTimestamp(VehicleMessage message) { 26 | if(message.isTimestamped()) { 27 | SimpleDateFormat sDateFormatter = 28 | new SimpleDateFormat( "HH:mm:ss.S", Locale.US); 29 | return sDateFormatter.format(message.getDate()); 30 | } 31 | return ""; 32 | } 33 | 34 | @Override 35 | public int getCount() { 36 | return mValues.size(); 37 | } 38 | 39 | @Override 40 | public VehicleMessage getItem(int position) { 41 | return mValues.get(position); 42 | } 43 | 44 | @Override 45 | public long getItemId(int position) { 46 | return position; 47 | } 48 | 49 | public abstract View getView(int position, View convertView, ViewGroup parent); 50 | } 51 | -------------------------------------------------------------------------------- /enabler/src/main/java/com/openxc/enabler/preferences/NativeGpsPreferenceManager.java: -------------------------------------------------------------------------------- 1 | package com.openxc.enabler.preferences; 2 | 3 | import android.content.Context; 4 | import android.util.Log; 5 | import com.openxcplatform.enabler.R; 6 | 7 | /** 8 | * Enable or disable reading GPS from the native Android stack. 9 | */ 10 | public class NativeGpsPreferenceManager extends VehiclePreferenceManager { 11 | private final static String TAG = "VehiclePreferenceManager"; 12 | public NativeGpsPreferenceManager(Context context) { 13 | super(context); 14 | } 15 | @Override 16 | public void close() { 17 | super.close(); 18 | if(getVehicleManager()!=null) { 19 | getVehicleManager().setNativeGpsStatus(false); 20 | } 21 | } 22 | protected PreferenceListener createPreferenceListener() { 23 | return new PreferenceListenerImpl(this); 24 | } 25 | /** 26 | * Internal implementation of the {@link VehiclePreferenceManager.PreferenceListener} 27 | * interface. 28 | */ 29 | private static final class PreferenceListenerImpl extends PreferenceListener { 30 | 31 | private final static int[] WATCHED_PREFERENCE_KEY_IDS = { 32 | R.string.native_gps_checkbox_key 33 | }; 34 | 35 | /** 36 | * Main constructor. 37 | * 38 | * @param reference Reference to the enclosing class. 39 | */ 40 | private PreferenceListenerImpl(final VehiclePreferenceManager reference) { 41 | super(reference); 42 | } 43 | 44 | @Override 45 | protected void readStoredPreferences() { 46 | final NativeGpsPreferenceManager reference 47 | = (NativeGpsPreferenceManager) getEnclosingReference(); 48 | if (reference == null) { 49 | Log.w(TAG, "Can not read stored preferences, enclosing instance is null"); 50 | return; 51 | } 52 | 53 | reference.getVehicleManager().setNativeGpsStatus(reference.getPreferences().getBoolean( 54 | reference.getString(R.string.native_gps_checkbox_key), false)); 55 | } 56 | 57 | @Override 58 | protected int[] getWatchedPreferenceKeyIds() { 59 | return WATCHED_PREFERENCE_KEY_IDS; 60 | } 61 | } 62 | 63 | } 64 | -------------------------------------------------------------------------------- /enabler/src/main/play/contact-email.txt: -------------------------------------------------------------------------------- 1 | openxc@googlegroups.com 2 | -------------------------------------------------------------------------------- /enabler/src/main/play/contact-website.txt: -------------------------------------------------------------------------------- 1 | http://openxcplatform.com 2 | -------------------------------------------------------------------------------- /enabler/src/main/play/default-language.txt: -------------------------------------------------------------------------------- 1 | en-US -------------------------------------------------------------------------------- /enabler/src/main/play/listings/en-US/featureGraphic/feature-image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/play/listings/en-US/featureGraphic/feature-image.jpg -------------------------------------------------------------------------------- /enabler/src/main/play/listings/en-US/full-description.txt: -------------------------------------------------------------------------------- 1 | OpenXC™ is an open source, data-focused API for your car. By installing a small hardware module, the vehicle's data becomes accessible to Android or other desktop applications using the OpenXC library. 2 | 3 | The Enabler takes care of a lot of boilerplate code, so your app's code can be simpler. It also includes a basic GUI for most functionality of the Android library. 4 | 5 | The Enabler also has views that allow you to: 6 | 7 | - Display all received simple vehicle messages from the VI. 8 | 9 | - Display all received low-level CAN messages from the VI, if that functionality is enabled in the firmware. 10 | 11 | - Send an arbitrary CAN message to the vehicle through the VI (requires firmware that supports this feature). 12 | 13 | - Send a diagnostic request to the vehicle through the VI. 14 | 15 | More information on getting started with OpenXC on Android is available at http://openxcplatform.com 16 | 17 | This app sends crash reporting data to Bugsnag for the purposes of assisting the OpenXC maintainers with debugging. If you do not wish to have your crashes reported, please compile the app from the sources. 18 | 19 | The source code for the OpenXC Enabler is available at https://github.com/openxc/openxc-android and is provided under the BSD license. 20 | -------------------------------------------------------------------------------- /enabler/src/main/play/listings/en-US/icon/openxc-icon-hi-res.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/play/listings/en-US/icon/openxc-icon-hi-res.png -------------------------------------------------------------------------------- /enabler/src/main/play/listings/en-US/phoneScreenshots/device-2014-11-16-210030.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/play/listings/en-US/phoneScreenshots/device-2014-11-16-210030.png -------------------------------------------------------------------------------- /enabler/src/main/play/listings/en-US/phoneScreenshots/device-2014-11-16-210038.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/play/listings/en-US/phoneScreenshots/device-2014-11-16-210038.png -------------------------------------------------------------------------------- /enabler/src/main/play/listings/en-US/phoneScreenshots/device-2014-11-16-210047.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/play/listings/en-US/phoneScreenshots/device-2014-11-16-210047.png -------------------------------------------------------------------------------- /enabler/src/main/play/listings/en-US/phoneScreenshots/device-2014-11-16-210126.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/play/listings/en-US/phoneScreenshots/device-2014-11-16-210126.png -------------------------------------------------------------------------------- /enabler/src/main/play/listings/en-US/phoneScreenshots/device-2014-11-16-210153.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/play/listings/en-US/phoneScreenshots/device-2014-11-16-210153.png -------------------------------------------------------------------------------- /enabler/src/main/play/listings/en-US/phoneScreenshots/device-2014-11-16-210205.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/play/listings/en-US/phoneScreenshots/device-2014-11-16-210205.png -------------------------------------------------------------------------------- /enabler/src/main/play/listings/en-US/phoneScreenshots/device-2014-11-16-210215.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/play/listings/en-US/phoneScreenshots/device-2014-11-16-210215.png -------------------------------------------------------------------------------- /enabler/src/main/play/listings/en-US/sevenInchScreenshots/7inch-tablet-messages.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/play/listings/en-US/sevenInchScreenshots/7inch-tablet-messages.png -------------------------------------------------------------------------------- /enabler/src/main/play/listings/en-US/short-description.txt: -------------------------------------------------------------------------------- 1 | Vehicle interface connector and utility for the open source OpenXC Platform. 2 | -------------------------------------------------------------------------------- /enabler/src/main/play/listings/en-US/title.txt: -------------------------------------------------------------------------------- 1 | OpenXC Enabler 2 | -------------------------------------------------------------------------------- /enabler/src/main/res/drawable-hdpi/ic_action_bluetooth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable-hdpi/ic_action_bluetooth.png -------------------------------------------------------------------------------- /enabler/src/main/res/drawable-hdpi/ic_action_bluetooth_connected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable-hdpi/ic_action_bluetooth_connected.png -------------------------------------------------------------------------------- /enabler/src/main/res/drawable-hdpi/ic_action_bluetooth_searching.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable-hdpi/ic_action_bluetooth_searching.png -------------------------------------------------------------------------------- /enabler/src/main/res/drawable-hdpi/ic_action_network_wifi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable-hdpi/ic_action_network_wifi.png -------------------------------------------------------------------------------- /enabler/src/main/res/drawable-hdpi/ic_action_storage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable-hdpi/ic_action_storage.png -------------------------------------------------------------------------------- /enabler/src/main/res/drawable-hdpi/ic_action_usb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable-hdpi/ic_action_usb.png -------------------------------------------------------------------------------- /enabler/src/main/res/drawable-hdpi/ic_action_warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable-hdpi/ic_action_warning.png -------------------------------------------------------------------------------- /enabler/src/main/res/drawable-mdpi/ic_action_bluetooth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable-mdpi/ic_action_bluetooth.png -------------------------------------------------------------------------------- /enabler/src/main/res/drawable-mdpi/ic_action_bluetooth_connected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable-mdpi/ic_action_bluetooth_connected.png -------------------------------------------------------------------------------- /enabler/src/main/res/drawable-mdpi/ic_action_bluetooth_searching.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable-mdpi/ic_action_bluetooth_searching.png -------------------------------------------------------------------------------- /enabler/src/main/res/drawable-mdpi/ic_action_network_wifi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable-mdpi/ic_action_network_wifi.png -------------------------------------------------------------------------------- /enabler/src/main/res/drawable-mdpi/ic_action_storage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable-mdpi/ic_action_storage.png -------------------------------------------------------------------------------- /enabler/src/main/res/drawable-mdpi/ic_action_usb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable-mdpi/ic_action_usb.png -------------------------------------------------------------------------------- /enabler/src/main/res/drawable-mdpi/ic_action_warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable-mdpi/ic_action_warning.png -------------------------------------------------------------------------------- /enabler/src/main/res/drawable-xhdpi/ic_action_bluetooth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable-xhdpi/ic_action_bluetooth.png -------------------------------------------------------------------------------- /enabler/src/main/res/drawable-xhdpi/ic_action_bluetooth_connected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable-xhdpi/ic_action_bluetooth_connected.png -------------------------------------------------------------------------------- /enabler/src/main/res/drawable-xhdpi/ic_action_bluetooth_searching.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable-xhdpi/ic_action_bluetooth_searching.png -------------------------------------------------------------------------------- /enabler/src/main/res/drawable-xhdpi/ic_action_network_wifi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable-xhdpi/ic_action_network_wifi.png -------------------------------------------------------------------------------- /enabler/src/main/res/drawable-xhdpi/ic_action_storage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable-xhdpi/ic_action_storage.png -------------------------------------------------------------------------------- /enabler/src/main/res/drawable-xhdpi/ic_action_usb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable-xhdpi/ic_action_usb.png -------------------------------------------------------------------------------- /enabler/src/main/res/drawable-xhdpi/ic_action_warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable-xhdpi/ic_action_warning.png -------------------------------------------------------------------------------- /enabler/src/main/res/drawable-xxhdpi/ic_action_bluetooth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable-xxhdpi/ic_action_bluetooth.png -------------------------------------------------------------------------------- /enabler/src/main/res/drawable-xxhdpi/ic_action_bluetooth_connected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable-xxhdpi/ic_action_bluetooth_connected.png -------------------------------------------------------------------------------- /enabler/src/main/res/drawable-xxhdpi/ic_action_bluetooth_searching.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable-xxhdpi/ic_action_bluetooth_searching.png -------------------------------------------------------------------------------- /enabler/src/main/res/drawable-xxhdpi/ic_action_network_wifi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable-xxhdpi/ic_action_network_wifi.png -------------------------------------------------------------------------------- /enabler/src/main/res/drawable-xxhdpi/ic_action_storage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable-xxhdpi/ic_action_storage.png -------------------------------------------------------------------------------- /enabler/src/main/res/drawable-xxhdpi/ic_action_usb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable-xxhdpi/ic_action_usb.png -------------------------------------------------------------------------------- /enabler/src/main/res/drawable-xxhdpi/ic_action_warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable-xxhdpi/ic_action_warning.png -------------------------------------------------------------------------------- /enabler/src/main/res/drawable/open_xc_launcher_icon_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openxc/openxc-android/aa2c046b92c7fd1401d20757b85a49ebcf3199a1/enabler/src/main/res/drawable/open_xc_launcher_icon_black.png -------------------------------------------------------------------------------- /enabler/src/main/res/layout/can_message_details.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 15 | 16 | 22 | 23 | 29 | 30 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /enabler/src/main/res/layout/can_message_list_fragment.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 7 | 11 | 14 | 18 | 19 | 20 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /enabler/src/main/res/layout/can_message_list_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 17 | 18 | 24 | 25 | 31 | 32 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /enabler/src/main/res/layout/command_request_list_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 17 | 18 | 24 | 25 | 31 | 32 | 38 | 39 | 45 | 46 | 52 | 53 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /enabler/src/main/res/layout/dashboard_list_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 17 | 18 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /enabler/src/main/res/layout/diagnostic_request_list_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 17 | 18 | 24 | 25 | 31 | 32 | 38 | 39 | 45 | 46 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /enabler/src/main/res/layout/license.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 15 | 16 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /enabler/src/main/res/layout/license_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 17 | 18 | -------------------------------------------------------------------------------- /enabler/src/main/res/layout/main.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | 24 | 25 | 26 | 27 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /enabler/src/main/res/layout/prompt.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | 16 | 21 | 22 |