From 2ae91c398edd18e7b3fed6d9ee23a6be7219d2b4 Mon Sep 17 00:00:00 2001 From: Matthew Kennedy Date: Wed, 22 Feb 2023 13:25:26 -0800 Subject: [PATCH 1/2] no android --- .github/workflows/build-android.yaml.disable | 73 ---- android/.gitignore | 14 - android/.idea/codeStyles/Project.xml | 116 ------ android/.idea/gradle.xml | 28 -- android/.idea/jarRepositories.xml | 30 -- android/.idea/misc.xml | 9 - android/.idea/runConfigurations.xml | 12 - android/.idea/vcs.xml | 6 - android/app/build.gradle | 81 ---- android/app/lib/dfu_java.jar | Bin 36539 -> 0 bytes .../usb-serial-for-android-v2.2.3-sources.jar | Bin 31554 -> 0 bytes .../app/lib/usb-serial-for-android-v2.2.3.aar | Bin 39772 -> 0 bytes .../app/lib/usb-serial-for-android-v2.2.3.pom | 40 -- .../rusefi/app/ExampleInstrumentedTest.java | 26 -- android/app/src/main/AndroidManifest.xml | 40 -- .../main/java/com/rusefi/app/DfuUpload.java | 92 ----- .../rusefi/app/PermissionGrantedAction.java | 6 - .../com/rusefi/app/RusefiApplication.java | 34 -- .../java/com/rusefi/app/SerialService.java | 26 -- .../java/com/rusefi/app/SoundBroadcast.java | 57 --- .../src/main/java/com/rusefi/app/rusEFI.java | 350 ------------------ .../com/rusefi/app/serial/AndroidSerial.java | 110 ------ .../java/com/rusefi/app/util/AndroidUtil.java | 20 - .../app/src/main/res/layout/activity_usb.xml | 100 ----- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 3157 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 1762 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 3981 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 7003 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 10752 -> 0 bytes .../app/src/main/res/values-v21/styles.xml | 8 - android/app/src/main/res/values/strings.xml | 4 - android/app/src/main/res/values/styles.xml | 4 - .../app/src/main/res/xml/device_filter.xml | 24 -- android/build.gradle | 36 -- android/certs/rusEFI.jks | Bin 2222 -> 0 bytes android/dependencies.gradle | 4 - android/gradle.properties | 5 - android/gradle/wrapper/gradle-wrapper.jar | Bin 58695 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - android/gradlew | 183 --------- android/gradlew.bat | 100 ----- android/readme.md | 15 - android/settings.gradle | 17 - java_console/io/build.gradle | 1 - java_console/shared_io/build.gradle | 2 - java_tools/readme.md | 2 +- 46 files changed, 1 insertion(+), 1679 deletions(-) delete mode 100644 .github/workflows/build-android.yaml.disable delete mode 100644 android/.gitignore delete mode 100644 android/.idea/codeStyles/Project.xml delete mode 100644 android/.idea/gradle.xml delete mode 100644 android/.idea/jarRepositories.xml delete mode 100644 android/.idea/misc.xml delete mode 100644 android/.idea/runConfigurations.xml delete mode 100644 android/.idea/vcs.xml delete mode 100644 android/app/build.gradle delete mode 100644 android/app/lib/dfu_java.jar delete mode 100644 android/app/lib/usb-serial-for-android-v2.2.3-sources.jar delete mode 100644 android/app/lib/usb-serial-for-android-v2.2.3.aar delete mode 100644 android/app/lib/usb-serial-for-android-v2.2.3.pom delete mode 100644 android/app/src/androidTest/java/com/rusefi/app/ExampleInstrumentedTest.java delete mode 100644 android/app/src/main/AndroidManifest.xml delete mode 100644 android/app/src/main/java/com/rusefi/app/DfuUpload.java delete mode 100644 android/app/src/main/java/com/rusefi/app/PermissionGrantedAction.java delete mode 100644 android/app/src/main/java/com/rusefi/app/RusefiApplication.java delete mode 100644 android/app/src/main/java/com/rusefi/app/SerialService.java delete mode 100644 android/app/src/main/java/com/rusefi/app/SoundBroadcast.java delete mode 100644 android/app/src/main/java/com/rusefi/app/rusEFI.java delete mode 100644 android/app/src/main/java/com/rusefi/app/serial/AndroidSerial.java delete mode 100644 android/app/src/main/java/com/rusefi/app/util/AndroidUtil.java delete mode 100644 android/app/src/main/res/layout/activity_usb.xml delete mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/values-v21/styles.xml delete mode 100644 android/app/src/main/res/values/strings.xml delete mode 100644 android/app/src/main/res/values/styles.xml delete mode 100644 android/app/src/main/res/xml/device_filter.xml delete mode 100644 android/build.gradle delete mode 100644 android/certs/rusEFI.jks delete mode 100644 android/dependencies.gradle delete mode 100644 android/gradle.properties delete mode 100644 android/gradle/wrapper/gradle-wrapper.jar delete mode 100644 android/gradle/wrapper/gradle-wrapper.properties delete mode 100755 android/gradlew delete mode 100644 android/gradlew.bat delete mode 100644 android/readme.md delete mode 100644 android/settings.gradle diff --git a/.github/workflows/build-android.yaml.disable b/.github/workflows/build-android.yaml.disable deleted file mode 100644 index ed99e39dbe..0000000000 --- a/.github/workflows/build-android.yaml.disable +++ /dev/null @@ -1,73 +0,0 @@ -name: Android - -on: [push,pull_request] - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - - name: Checkout Submodules - run: | - git submodule update --init --depth=1 unit_tests/googletest - git submodule update --init --depth=1 firmware/libfirmware - git submodule update --init --depth=1 firmware/ext/lua - git submodule update --init --depth=1 firmware/controllers/lua/luaaa - git submodule update --init --depth=1 firmware/controllers/can/wideband_firmware - - - uses: actions/setup-java@v3 - with: - distribution: 'zulu' - java-version: '8' - - - name: Install Tools - working-directory: ./.github/workflows/ - run: | - sudo ./add-ubuntu-latest-apt-mirrors.sh - sudo apt-get install mtools - - - name: Generate Configs, Enums & Live Documentation - working-directory: ./firmware/ - run: ./gen_default_everything.sh - - - name: Test Compiler - run: javac -version - - - name: Print GCC version - working-directory: . - run: gcc -v - - - name: Build Android - env: - RUSEFI_ANDROID_KEYPASS: ${{ secrets.RUSEFI_ANDROID_KEYPASS }} - working-directory: ./android - run: | - if [ "${{github.event_name}}" == "push" ]; then - bash ./gradlew build - else - bash ./gradlew bundleDebug test - fi - - - name: Upload APK - release - if: ${{ github.event_name == 'push' }} - uses: actions/upload-artifact@v3 - with: - name: rusEFI-release - path: ./android/app/build/outputs/apk/release/rusEFI-release.apk - - - name: Upload APK - unsigned - if: ${{ github.event_name != 'push' }} - uses: actions/upload-artifact@v3 - with: - name: rusEFI-release-unsigned - path: ./android/app/build/outputs/bundle/debug/rusEFI-debug.aab - - - name: Install Tools - run: sudo apt-get install sshpass - - - name: Upload rusEFI Android application - if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} - working-directory: . - run: java_console/upload_file.sh ${{ secrets.RUSEFI_SSH_USER }} ${{ secrets.RUSEFI_SSH_PASS }} ${{ secrets.RUSEFI_SSH_SERVER }} build_server android/app/build/outputs/apk/release/rusEFI-release.apk diff --git a/android/.gitignore b/android/.gitignore deleted file mode 100644 index 603b140773..0000000000 --- a/android/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -*.iml -.gradle -/local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml -.DS_Store -/build -/captures -.externalNativeBuild -.cxx diff --git a/android/.idea/codeStyles/Project.xml b/android/.idea/codeStyles/Project.xml deleted file mode 100644 index 681f41ae2a..0000000000 --- a/android/.idea/codeStyles/Project.xml +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - -
- - - - xmlns:android - - ^$ - - - -
-
- - - - xmlns:.* - - ^$ - - - BY_NAME - -
-
- - - - .*:id - - http://schemas.android.com/apk/res/android - - - -
-
- - - - .*:name - - http://schemas.android.com/apk/res/android - - - -
-
- - - - name - - ^$ - - - -
-
- - - - style - - ^$ - - - -
-
- - - - .* - - ^$ - - - BY_NAME - -
-
- - - - .* - - http://schemas.android.com/apk/res/android - - - ANDROID_ATTRIBUTE_ORDER - -
-
- - - - .* - - .* - - - BY_NAME - -
-
-
-
-
-
\ No newline at end of file diff --git a/android/.idea/gradle.xml b/android/.idea/gradle.xml deleted file mode 100644 index 550056c80d..0000000000 --- a/android/.idea/gradle.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/android/.idea/jarRepositories.xml b/android/.idea/jarRepositories.xml deleted file mode 100644 index 2370474020..0000000000 --- a/android/.idea/jarRepositories.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/android/.idea/misc.xml b/android/.idea/misc.xml deleted file mode 100644 index 7bfef59df1..0000000000 --- a/android/.idea/misc.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/android/.idea/runConfigurations.xml b/android/.idea/runConfigurations.xml deleted file mode 100644 index 7f68460d8b..0000000000 --- a/android/.idea/runConfigurations.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/android/.idea/vcs.xml b/android/.idea/vcs.xml deleted file mode 100644 index 6c0b863585..0000000000 --- a/android/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/android/app/build.gradle b/android/app/build.gradle deleted file mode 100644 index f92198ff83..0000000000 --- a/android/app/build.gradle +++ /dev/null @@ -1,81 +0,0 @@ -apply plugin: 'com.android.application' - -apply from: '../../android/dependencies.gradle' - -android { - packagingOptions { - exclude 'META-INF/DEPENDENCIES' - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - - compileSdkVersion 30 - buildToolsVersion "30.0.2" - project.archivesBaseName = "rusEFI"; - - defaultConfig { - applicationId "com.rusefi.app" - // API level 19 = Android 4.4 () Samsung S4 is nicely rootable with KingRoot - // API level 21 = Android_5.0_Lollipop - minSdkVersion 19 - targetSdkVersion 29 - versionCode 1 - versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - signingConfigs { - release { - storeFile file("../certs/rusEFI.jks") - storePassword System.getenv("RUSEFI_ANDROID_KEYPASS") - keyAlias "key0" - keyPassword System.getenv("RUSEFI_ANDROID_KEYPASS") - } - } - - buildTypes { - debug { - minifyEnabled false - } - release { - minifyEnabled false - signingConfig signingConfigs.release - } - } -} - -dependencies { - implementation project(':ecu_io') - implementation project(':logging-api') - implementation project(':models') - implementation global_libs.annotations - - def acraVersion = '5.7.0' - implementation "ch.acra:acra-http:$acraVersion" - implementation "ch.acra:acra-mail:$acraVersion" - implementation "ch.acra:acra-dialog:$acraVersion" - implementation "ch.acra:acra-toast:$acraVersion" - - implementation files('lib/dfu_java.jar') -// implementation 'com.github.mik3y:usb-serial-for-android:v2.2.3' - implementation 'com.github.mik3y:usb-serial-for-android:v3.1.0' - implementation fileTree(dir: "libs", include: ["*.jar"]) - implementation 'androidx.appcompat:appcompat:1.1.0' - implementation 'com.google.android.material:material:1.1.0' - implementation 'androidx.constraintlayout:constraintlayout:1.1.3' - implementation 'androidx.navigation:navigation-fragment:2.1.0' - implementation 'androidx.navigation:navigation-ui:2.1.0' - implementation 'androidx.coordinatorlayout:coordinatorlayout:1.1.0' - - androidTestImplementation 'androidx.test.ext:junit:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' -} - -/* -gradle.taskGraph.afterTask { task -> - project.logger.lifecycle("Password " + System.getenv('RUSEFI_ANDROID_KEYPASS')); -} - */ diff --git a/android/app/lib/dfu_java.jar b/android/app/lib/dfu_java.jar deleted file mode 100644 index 510b639df6703dedc877bf0ccffdf8762768f088..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36539 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 diff --git a/android/app/lib/usb-serial-for-android-v2.2.3-sources.jar b/android/app/lib/usb-serial-for-android-v2.2.3-sources.jar deleted file mode 100644 index 538c455414ea9ab882d79aaea8bd9b58a6de1d9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31554 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 VP_RFagZ=vX_)2!P&VT&%{{fD4W1av2 diff --git a/android/app/lib/usb-serial-for-android-v2.2.3.aar b/android/app/lib/usb-serial-for-android-v2.2.3.aar deleted file mode 100644 index 949e44de8e19c453a9b30a020cfbd7300ffe8bc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39772 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%0AQKGYs{G;L00B-97xL0ctW!(xSHSuE7hKnXJSp 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 z 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 U%4q2S$)moE-4}0~@t@iM0}qrmv;Y7A diff --git a/android/app/lib/usb-serial-for-android-v2.2.3.pom b/android/app/lib/usb-serial-for-android-v2.2.3.pom deleted file mode 100644 index bf223016eb..0000000000 --- a/android/app/lib/usb-serial-for-android-v2.2.3.pom +++ /dev/null @@ -1,40 +0,0 @@ - - - 4.0.0 - com.github.mik3y - usb-serial-for-android - v2.2.3 - aar - mik3y/usb-serial-for-android - Android USB host serial driver library for CDC, FTDI, Arduino and other devices. - https://github.com/mik3y/usb-serial-for-android - 2013 - - - GNU Lesser General Public License v2.1 - https://api.github.com/licenses/lgpl-2.1 - repo - - - - - mik3y - mike w - - - - - scm:git://github.com/mik3y/usb-serial-for-android.git - scm:git://github.com/mik3y/usb-serial-for-android.git - git://github.com/mik3y/usb-serial-for-android.git - - - - junit - junit - 4.12 - test - - - diff --git a/android/app/src/androidTest/java/com/rusefi/app/ExampleInstrumentedTest.java b/android/app/src/androidTest/java/com/rusefi/app/ExampleInstrumentedTest.java deleted file mode 100644 index 77920a593f..0000000000 --- a/android/app/src/androidTest/java/com/rusefi/app/ExampleInstrumentedTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.rusefi.app; - -import android.content.Context; - -import androidx.test.platform.app.InstrumentationRegistry; -import androidx.test.ext.junit.runners.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); - assertEquals("com.rusefi.app", appContext.getPackageName()); - } -} \ No newline at end of file diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 4bc5dfd319..0000000000 --- a/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/app/src/main/java/com/rusefi/app/DfuUpload.java b/android/app/src/main/java/com/rusefi/app/DfuUpload.java deleted file mode 100644 index e9dce6f950..0000000000 --- a/android/app/src/main/java/com/rusefi/app/DfuUpload.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.rusefi.app; - -import android.content.ContextWrapper; -import android.widget.TextView; - -import com.rusefi.Listener; -import com.rusefi.dfu.DfuImage; -import com.rusefi.core.net.ConnectionAndMeta; -import com.rusefi.core.FileUtil; - -import java.io.File; -import java.io.IOException; -import java.security.KeyManagementException; -import java.security.NoSuchAlgorithmException; - -public class DfuUpload { - private static final String BUNDLE_FILE = "rusefi_bundle_autoupdate.zip"; - //public static final String FILE = "rusefi_bundle_mre_f4_autoupdate.zip"; - //private static final String DFU_FILE_NAME = "rusefi_mre_f4.dfu"; - private static final String DFU_FILE_NAME = "rusefi_.dfu"; - - public final String localDfuImageFileName; - public final String localFullFile; - public final File localFolder; - - public DfuUpload(ContextWrapper context) { - localFolder = context.getExternalFilesDir(null); - localFullFile = localFolder + File.separator + BUNDLE_FILE; - localDfuImageFileName = localFolder + File.separator + DFU_FILE_NAME; - } - - void downloadFileIfNotPresent(final TextView mResultView) { - if (new File(this.localFullFile).exists()) { - mResultView.append(BUNDLE_FILE + " found!\n"); - uncompressFile(this.localFullFile, this.localFolder, this.localDfuImageFileName, mResultView); - } else { - mResultView.append(BUNDLE_FILE + " not found!\n"); - - new Thread(new Runnable() { - @Override - public void run() { - try { - ConnectionAndMeta c = new ConnectionAndMeta(BUNDLE_FILE).invoke(ConnectionAndMeta.BASE_URL_LATEST); - ConnectionAndMeta.downloadFile(localFullFile, c, new ConnectionAndMeta.DownloadProgressListener() { - @Override - public void onPercentage(final int currentPercentage) { - mResultView.post(() -> mResultView.append("Downloaded " + currentPercentage + "%\n")); - } - }); - mResultView.post(() -> mResultView.append("Downloaded! " + "\n")); - uncompressFile(localFullFile, localFolder, localDfuImageFileName, mResultView); - - } catch (IOException e) { - mResultView.post(() -> mResultView.append("Error downloading " + e + "\n")); - } - } - }).start(); - } - } - - public void uncompressFile(final String localFullFile, final File localFolder, final String localDfuImageFileName, final TextView mResultView) { - final Listener onSuccess = new Listener() { - @Override - public void onResult(final Integer size) { - mResultView.post(new Runnable() { - @Override - public void run() { - mResultView.append(localDfuImageFileName + " File size: " + size + "\n"); - } - }); - DfuImage dfuImage = new DfuImage(); - try { - dfuImage.read(localDfuImageFileName); - } catch (Throwable e) { - mResultView.post(() -> mResultView.append("Error reading " + e)); - } - } - }; - - new Thread(() -> { - try { - FileUtil.unzip(localFullFile, localFolder); - final int size = (int) new File(localDfuImageFileName).length(); - onSuccess.onResult(size); - - } catch (final IOException e) { - mResultView.post(() -> mResultView.append("Error uncompressing " + e + "\n")); - } - - }).start(); - } -} diff --git a/android/app/src/main/java/com/rusefi/app/PermissionGrantedAction.java b/android/app/src/main/java/com/rusefi/app/PermissionGrantedAction.java deleted file mode 100644 index 0b6212eb8c..0000000000 --- a/android/app/src/main/java/com/rusefi/app/PermissionGrantedAction.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.rusefi.app; - -public enum PermissionGrantedAction { - DFU, - DASHBOARD, -} diff --git a/android/app/src/main/java/com/rusefi/app/RusefiApplication.java b/android/app/src/main/java/com/rusefi/app/RusefiApplication.java deleted file mode 100644 index 7f8dcb69b1..0000000000 --- a/android/app/src/main/java/com/rusefi/app/RusefiApplication.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.rusefi.app; - -import android.app.Application; - -import org.acra.ACRA; -import org.acra.config.CoreConfigurationBuilder; -import org.acra.config.MailSenderConfigurationBuilder; -import org.acra.config.ToastConfigurationBuilder; - -public class RusefiApplication extends Application { - static { - /** - * We better not touch real classes in order not to trigger class loading - * - * Logging#LOG_CLASS_NAME - * @see ConsoleLogger - */ - System.setProperty("log.className", "com.devexperts.logging.ConsoleLogger"); - } - - @Override - public void onCreate() { - super.onCreate(); - - CoreConfigurationBuilder builder = new CoreConfigurationBuilder(this); - builder.getPluginConfigurationBuilder(MailSenderConfigurationBuilder.class) - .setMailTo("rusefillc@gmail.com") - .setSubject("Android Crash") - .setEnabled(true); - - builder.getPluginConfigurationBuilder(ToastConfigurationBuilder.class); - ACRA.init(this, builder); - } -} diff --git a/android/app/src/main/java/com/rusefi/app/SerialService.java b/android/app/src/main/java/com/rusefi/app/SerialService.java deleted file mode 100644 index ac30346146..0000000000 --- a/android/app/src/main/java/com/rusefi/app/SerialService.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.rusefi.app; - -import android.app.Service; -import android.content.Intent; -import android.os.Binder; -import android.os.IBinder; - -import androidx.annotation.Nullable; - -public class SerialService extends Service { - class SerialBinder extends Binder { -/* - SerialService getService() { - return SerialService.this; - } -*/ - } - - private final IBinder binder = new SerialBinder(); - - @Nullable - @Override - public IBinder onBind(Intent intent) { - return binder; - } -} diff --git a/android/app/src/main/java/com/rusefi/app/SoundBroadcast.java b/android/app/src/main/java/com/rusefi/app/SoundBroadcast.java deleted file mode 100644 index e06a456ecd..0000000000 --- a/android/app/src/main/java/com/rusefi/app/SoundBroadcast.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.rusefi.app; - -import android.Manifest; -import android.app.Activity; -import android.content.pm.PackageManager; -import android.media.AudioFormat; -import android.media.AudioRecord; -import android.media.MediaRecorder; -import android.media.audiofx.AcousticEchoCanceler; -import android.media.audiofx.NoiseSuppressor; - -import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; - -public class SoundBroadcast { - private static final int sampleRate = 16000; // 44100 for music - private static final int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO; - private static final int audioFormat = AudioFormat.ENCODING_PCM_16BIT; - private static final int minBufSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat) + 2048; - private byte[] buffer = new byte[minBufSize]; - - static void checkOrRequestPermission(Activity context) { - if (ContextCompat.checkSelfPermission(context, Manifest.permission.RECORD_AUDIO) - != PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(context, - new String[]{Manifest.permission.RECORD_AUDIO}, - 1234); - } - } - - public void start() { - Thread streamThread = new Thread(new Runnable() { - @Override - public void run() { -/* - AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate, channelConfig, audioFormat, minBufSize * 10); - if (NoiseSuppressor.isAvailable()) { - NoiseSuppressor.create(recorder.getAudioSessionId()).setEnabled(true); - } - if (AcousticEchoCanceler.isAvailable()) { - AcousticEchoCanceler.create(recorder.getAudioSessionId()).setEnabled(true); - } - - recorder.startRecording(); - - while (true) { - - int bytes = recorder.read(buffer, 0, buffer.length); - - } -*/ - } - }); - streamThread.start(); - } - -} diff --git a/android/app/src/main/java/com/rusefi/app/rusEFI.java b/android/app/src/main/java/com/rusefi/app/rusEFI.java deleted file mode 100644 index ea03b6e469..0000000000 --- a/android/app/src/main/java/com/rusefi/app/rusEFI.java +++ /dev/null @@ -1,350 +0,0 @@ -/* - * Copyright 2017, 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.rusefi.app; - -import android.annotation.SuppressLint; -import android.app.Activity; -import android.app.PendingIntent; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.SharedPreferences; -import android.hardware.usb.UsbDevice; -import android.hardware.usb.UsbManager; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.text.Editable; -import android.text.TextWatcher; -import android.text.util.Linkify; -import android.view.View; -import android.view.WindowManager; -import android.widget.Button; -import android.widget.EditText; -import android.widget.TextView; - -import com.devexperts.logging.Logging; -import com.google.android.material.snackbar.BaseTransientBottomBar; -import com.google.android.material.snackbar.Snackbar; -import com.rusefi.Callable; -import com.rusefi.Timeouts; -import com.rusefi.app.serial.AndroidSerial; -import com.rusefi.app.util.AndroidUtil; -import com.rusefi.auth.AuthTokenUtil; -import com.rusefi.binaryprotocol.BinaryProtocol; -import com.rusefi.dfu.DfuConnection; -import com.rusefi.dfu.DfuImage; -import com.rusefi.dfu.DfuLogic; -import com.rusefi.dfu.android.AndroidDfuConnection; -import com.rusefi.dfu.android.DfuDeviceLocator; -import com.rusefi.io.ConnectionStateListener; -import com.rusefi.io.DfuHelper; -import com.rusefi.io.IoStream; -import com.rusefi.io.LinkManager; -import com.rusefi.io.commands.ErrorInfoCommand; -import com.rusefi.io.serial.StreamConnector; -import com.rusefi.io.tcp.BinaryProtocolProxy; -import com.rusefi.proxy.NetworkConnector; -import com.rusefi.proxy.NetworkConnectorContext; -import com.rusefi.ui.StatusConsumer; - -import java.io.IOException; -import java.util.Date; - -public class rusEFI extends Activity { - private final static Logging log = Logging.getLogging(rusEFI.class); - private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION"; - -// private static final byte REQUEST_TYPE_CLASS = 32; -// private static final byte RECIPIENT_INTERFACE = 0x01; -// -// protected static final int DFU_DETACH_TIMEOUT = 1000; - - private static final String VERSION = "rusEFI app v0.20220524\n"; - - private static final int LOCAL_PORT = 29001; - - /* UI elements */ - private TextView mStatusView; - private TextView mResultView; // global dump of all messages - private TextView broadcastStatus; - private TextView authStatusMessage; - private TextView authStatusClickableUrl; - - private UsbManager usbManager; - private DfuUpload dfuUpload; - private SoundBroadcast soundBroadcast = new SoundBroadcast(); - private PermissionGrantedAction onPermissionGrantedAction; - - @SuppressLint("SetTextI18n") - @Override - protected void onCreate(Bundle savedInstanceState) { - log.info("onCreate"); - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_usb); - - /** - * We need to make sure that WiFi is available for us, this might be related to screen on? - */ - getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); - - findViewById(R.id.buttonSound).setVisibility(View.GONE); - findViewById(R.id.buttonDfu).setVisibility(View.GONE); - - Button view = findViewById(R.id.localBroadcast); - view.setText("Local broadcast on " + LOCAL_PORT); - - broadcastStatus = findViewById(R.id.broadcastStatus); - broadcastStatus.setVisibility(View.GONE); - - usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); - - // turn on screen while ADB debugging idle phone - AndroidUtil.turnScreenOn(this); - - mStatusView = findViewById(R.id.text_status); - mResultView = findViewById(R.id.text_result); - - authStatusMessage = findViewById(R.id.authStatus1); - authStatusClickableUrl = findViewById(R.id.authStatus2); - authStatusClickableUrl.setText(AuthTokenUtil.TOKEN_PROFILE_URL); - Linkify.addLinks(authStatusClickableUrl, Linkify.WEB_URLS); - - IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); - registerReceiver(mUsbReceiver, filter); - - visibleLogAppend(VERSION); - - dfuUpload = new DfuUpload(this); - - //dfuUpload.downloadFileIfNotPresent(mResultView); - - String authToken = ""; - int visibility = AuthTokenUtil.isToken(authToken) ? View.GONE : View.VISIBLE; - authStatusMessage.setVisibility(visibility); - authStatusClickableUrl.setVisibility(visibility); - -// switchOrProgramDfu(); - -// SoundBroadcast.checkOrRequestPermission(this); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - unregisterReceiver(mUsbReceiver); - } - - private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { - public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - if (ACTION_USB_PERMISSION.equals(action)) { - synchronized (this) { - if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { - if (onPermissionGrantedAction == PermissionGrantedAction.DFU) { - - UsbDevice dfuDevice = DfuDeviceLocator.findDevice(usbManager); - doDfuUpdate(dfuDevice); - } else if (onPermissionGrantedAction == PermissionGrantedAction.DASHBOARD) { - connectDashboard(); - } - } - } - } - } - }; - - private void switchOrProgramDfu() { - UsbDevice dfuDevice = DfuDeviceLocator.findDevice(usbManager); - if (dfuDevice == null) { - visibleLogAppend("No DFU device\n"); - switchToDfu(); - // once device is in DFU mode we expect what exactly to happen? - } else if (!usbManager.hasPermission(dfuDevice)) { - requestUsbPermission(dfuDevice, PermissionGrantedAction.DFU); - } else { - doDfuUpdate(dfuDevice); - } - } - - public void visibleLogAppend(String s) { - CharSequence current = mResultView.getText(); - mResultView.setText(s + "\n" + current); - } - - @SuppressLint("SetTextI18n") - private void switchToDfu() { - AndroidSerial serial = AndroidSerial.getAndroidSerial(this, mStatusView, usbManager); - if (serial == null) { - // error already reported to mStatusView - return; - } - - visibleLogAppend("Switching to DFU\n"); - DfuHelper.sendDfuRebootCommand(serial, StatusConsumer.VOID); - } - - public void requestUsbPermission(UsbDevice usbDevice, PermissionGrantedAction action) { - // why do we not have similar 'request serial USB permission'? - onPermissionGrantedAction = action; - PendingIntent mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); - usbManager.requestPermission(usbDevice, mPermissionIntent); - } - - @SuppressLint("SetTextI18n") - private void doDfuUpdate(UsbDevice dfuDevice) { - mStatusView.setText("rusEFI: DFU detected"); - DfuDeviceLocator.Result dfu = new DfuDeviceLocator().openDfu(usbManager, dfuDevice); - - DfuImage dfuImage = new DfuImage(); - dfuImage.read(dfuUpload.localDfuImageFileName); - visibleLogAppend("Image size " + dfuImage.getImageSize() + "\n"); - - DfuConnection connection = new AndroidDfuConnection(dfu.getConnection(), dfu.getInterfaceIndex(), dfu.getTransferSize(), dfu.getFlashRange()); - - DfuLogic.Logger logger = DfuLogic.Logger.CONSOLE; - try { -// DfuCommandGetStatus.State state = DfuCommandGetStatus.read(c); -// mResultView.append("State " + state + "\n"); - - DfuLogic.uploadImage(logger, connection, dfuImage, dfu.getFlashRange()); - } catch (IllegalStateException e) { - visibleLogAppend("Error " + e + "\n"); - } - } - - public void onConnectButton(View view) { - connectDashboard(); - } - - /** - * MRE + USB cable + Android + WiFi I get about 8Hz Runtime Data Rate :( - */ - public void onLocalBroadcast(View view) { - AndroidSerial serial = AndroidSerial.getAndroidSerial(this, mStatusView, usbManager); - if (serial == null) { - // error already reported to mStatusView - return; - } - try { - BinaryProtocolProxy.createProxy(serial, LOCAL_PORT, new BinaryProtocolProxy.ClientApplicationActivityListener() { - @Override - public void onActivity() { - - } - }, StatusConsumer.ANONYMOUS); - visibleLogAppend("Running TCP/IP proxy on " + LOCAL_PORT); - } catch (IOException e) { - e.printStackTrace(); - } - } - - /** - * Called when the user touches a button - */ - public void sendMessage(View view) { - if (view.getId() == R.id.buttonDfu) { - switchOrProgramDfu(); - } else if (view.getId() == R.id.buttonSound) { - soundBroadcast.start(); - } else if (view.getId() == R.id.buttonBroadcast) { - startService(new Intent(this, SerialService.class)); - - AndroidSerial serial = AndroidSerial.getAndroidSerial(this, mStatusView, usbManager); - if (serial == null) { - // error already reported to mStatusView - Snackbar mySnackbar = Snackbar.make(view, "No ECU detected", BaseTransientBottomBar.LENGTH_LONG); - mySnackbar.show(); - return; - } - - LinkManager linkManager = new LinkManager(); - linkManager.setConnector(new StreamConnector(linkManager, new Callable() { - @Override - public IoStream call() { - return serial; - } - })); - linkManager.getConnector().connectAndReadConfiguration(new BinaryProtocol.Arguments(true), - new ConnectionStateListener() { - @Override - public void onConnectionEstablished() { - mResultView.post(() -> visibleLogAppend(new Date() + " On connection established\n")); - - NetworkConnectorContext context = new NetworkConnectorContext(); - NetworkConnector.ActivityListener oncePerSecondStatistics = new NetworkConnector.ActivityListener() { - long previousTime; - - @Override - public void onActivity(IoStream targetEcuSocket) { - long now = System.currentTimeMillis(); - if (now - previousTime < Timeouts.SECOND) { - // only update status once per second - return; - } - previousTime = now; - broadcastStatus.post(() -> broadcastStatus.setText(targetEcuSocket.getBytesIn() + "/" + targetEcuSocket.getBytesOut())); - } - }; - NetworkConnector.NetworkConnectorResult result = new NetworkConnector().start(NetworkConnector.Implementation.Android, - readPersistedAuthToken(), context, new NetworkConnector.ReconnectListener() { - @Override - public void onReconnect() { - } - }, linkManager, oncePerSecondStatistics); - - mResultView.post(() -> visibleLogAppend(new Date() + " Broadcast: " + result + "\n")); - - } - - @Override - public void onConnectionFailed(String errorMessage) { - mResultView.post(() -> visibleLogAppend("Connection failed " + errorMessage + " \n")); - } - }); - - Snackbar mySnackbar = Snackbar.make(view, "Broadcasting with " + readPersistedAuthToken(), BaseTransientBottomBar.LENGTH_LONG); - mySnackbar.show(); - - - } - } - - private void connectDashboard() { - AndroidSerial serial = AndroidSerial.getAndroidSerial(this, mStatusView, usbManager); - if (serial == null) { - // error already reported to mStatusView - return; - } - try { - String signature = BinaryProtocol.getSignature(serial); - visibleLogAppend("Connected to " + signature); - ErrorInfoCommand.send(serial); - String configError = ErrorInfoCommand.getResponse(serial.getDataBuffer()); - if (configError != null) - visibleLogAppend("[CRITICAL] " + configError); - - } catch (IOException e) { - e.printStackTrace(); - } - - } - - @Override - protected void onNewIntent(Intent intent) { - } -} diff --git a/android/app/src/main/java/com/rusefi/app/serial/AndroidSerial.java b/android/app/src/main/java/com/rusefi/app/serial/AndroidSerial.java deleted file mode 100644 index 8f0bdec122..0000000000 --- a/android/app/src/main/java/com/rusefi/app/serial/AndroidSerial.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.rusefi.app.serial; - -import android.annotation.SuppressLint; -import android.hardware.usb.UsbDevice; -import android.hardware.usb.UsbDeviceConnection; -import android.hardware.usb.UsbManager; -import android.widget.TextView; - -import com.hoho.android.usbserial.driver.CdcAcmSerialDriver; -import com.hoho.android.usbserial.driver.ProbeTable; -import com.hoho.android.usbserial.driver.UsbSerialDriver; -import com.hoho.android.usbserial.driver.UsbSerialPort; -import com.hoho.android.usbserial.driver.UsbSerialProber; -import com.opensr5.io.DataListener; -import com.rusefi.app.PermissionGrantedAction; -import com.rusefi.app.rusEFI; -import com.rusefi.binaryprotocol.IncomingDataBuffer; -import com.rusefi.dfu.DfuLogic; -import com.rusefi.io.ByteReader; -import com.rusefi.io.serial.AbstractIoStream; - -import org.jetbrains.annotations.Nullable; - -import java.io.IOException; -import java.util.Date; -import java.util.List; - -public class AndroidSerial extends AbstractIoStream { - private static final int ST_CDC = 0x5740; - private final IncomingDataBuffer dataBuffer; - - private UsbSerialPort usbSerialPort; - - public static List findUsbSerial(UsbManager usbManager) { - ProbeTable customTable = UsbSerialProber.getDefaultProbeTable(); - customTable.addProduct(DfuLogic.ST_VENDOR, ST_CDC, CdcAcmSerialDriver.class); - UsbSerialProber prober = new UsbSerialProber(customTable); - - return prober.findAllDrivers(usbManager); - } - - public AndroidSerial(UsbSerialPort usbSerialPort) { - this.usbSerialPort = usbSerialPort; - dataBuffer = createDataBuffer(""); - } - - private static UsbSerialDriver getSerialDriver(rusEFI rusEFI, TextView mStatusView, UsbManager usbManager, PermissionGrantedAction action) { - List availableDrivers = findUsbSerial(usbManager); - if (availableDrivers.isEmpty()) { - mStatusView.setText("Serial not found"); - rusEFI.visibleLogAppend("No serial devices " + new Date() + "\n"); - return null; - } - mStatusView.setText("rusEFI: " + availableDrivers.size() + " device(s)"); - - UsbSerialDriver driver = availableDrivers.get(0); - - UsbDevice usbDevice = driver.getDevice(); - if (!usbManager.hasPermission(usbDevice)) { - mStatusView.setText("Need permission"); - rusEFI.requestUsbPermission(usbDevice, action); - return null; - } - return driver; - } - - @SuppressLint("SetTextI18n") - @Nullable - public static AndroidSerial getAndroidSerial(rusEFI rusEFI, TextView mStatusView, UsbManager usbManager) { - // todo: should support separate actions not default to dashboard! - UsbSerialDriver driver = getSerialDriver(rusEFI, mStatusView, usbManager, PermissionGrantedAction.DASHBOARD); - if (driver == null) { - // error already reported to UI or permission request was fired - return null; - } - UsbDeviceConnection connection = usbManager.openDevice(driver.getDevice()); - if (connection == null) { - // add UsbManager.requestPermission(driver.getDevice(), ..) handling here - mStatusView.setText("Unable to open serial"); - return null; - } - - UsbSerialPort port = driver.getPorts().get(0); // Most devices have just one port (port 0) - try { - port.open(connection); - port.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE); - } catch (IOException e) { - mStatusView.append("Error opening " + e); - return null; - } - - return new AndroidSerial(port); - } - - @Override - public IncomingDataBuffer getDataBuffer() { - return dataBuffer; - } - - @Override - public void setInputListener(DataListener listener) { - ByteReader reader = buffer -> usbSerialPort.read(buffer, 5000); - ByteReader.runReaderLoop("", listener, reader, this); - } - - @Override - public void write(byte[] bytes) throws IOException { - usbSerialPort.write(bytes, 1000); - } -} diff --git a/android/app/src/main/java/com/rusefi/app/util/AndroidUtil.java b/android/app/src/main/java/com/rusefi/app/util/AndroidUtil.java deleted file mode 100644 index e05f554b65..0000000000 --- a/android/app/src/main/java/com/rusefi/app/util/AndroidUtil.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.rusefi.app.util; - -import android.app.Activity; -import android.os.Build; -import android.view.Window; -import android.view.WindowManager; - -public class AndroidUtil { - private AndroidUtil() { - } - - public static void turnScreenOn(Activity rusEFI) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { - rusEFI.setTurnScreenOn(true); - } else { - Window window = rusEFI.getWindow(); - window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); - } - } -} diff --git a/android/app/src/main/res/layout/activity_usb.xml b/android/app/src/main/res/layout/activity_usb.xml deleted file mode 100644 index 862ad53317..0000000000 --- a/android/app/src/main/res/layout/activity_usb.xml +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - -