├── .gitignore ├── LICENSE ├── README.md ├── app ├── .gitignore ├── build.gradle ├── debug │ └── output.json ├── proguard-rules.pro └── src │ ├── debug │ └── res │ │ ├── values-en │ │ └── strings.xml │ │ └── values │ │ └── strings.xml │ ├── main │ ├── AndroidManifest.xml │ ├── assets │ │ ├── hash-suffix.h.sample │ │ ├── licenseandroidsupportlibrary.txt │ │ ├── licenseapachecommons.txt │ │ ├── licensefbase.txt │ │ ├── licensegson.txt │ │ ├── licensejavaxactivation.txt │ │ ├── licensejersey.txt │ │ ├── licensejetty.txt │ │ ├── licenselogback.txt │ │ ├── licenseokhttp.txt │ │ ├── licenseosmbonuspack.txt │ │ ├── licenseosmdroid.txt │ │ ├── licenserangeseekbar.txt │ │ ├── licenseslf4japi.txt │ │ ├── licenseslf4jsimple.txt │ │ ├── licensesmpandroidchart.txt │ │ ├── server.cer │ │ └── simRa_regions.config │ ├── java │ │ └── de │ │ │ └── tuberlin │ │ │ └── mcc │ │ │ └── simra │ │ │ └── app │ │ │ ├── SimraApplication.java │ │ │ ├── activities │ │ │ ├── AboutActivity.java │ │ │ ├── ContactActivity.java │ │ │ ├── CreditsActivity.java │ │ │ ├── FeedbackActivity.java │ │ │ ├── HistoryActivity.java │ │ │ ├── LicenseActivity.java │ │ │ ├── MainActivity.java │ │ │ ├── OpenBikeSensorActivity.kt │ │ │ ├── ProfileActivity.java │ │ │ ├── SettingsActivity.java │ │ │ ├── ShowRouteActivity.java │ │ │ ├── SingleRideStatisticsActivity.java │ │ │ ├── StartActivity.java │ │ │ ├── StatisticsActivity.java │ │ │ └── WebActivity.java │ │ │ ├── annotation │ │ │ ├── GeoPointWrapper.java │ │ │ ├── IncidentPopUpActivity.java │ │ │ ├── MarkerFunct.java │ │ │ └── MyInfoWindow.java │ │ │ ├── entities │ │ │ ├── DataLog.java │ │ │ ├── DataLogEntry.java │ │ │ ├── IncidentLog.java │ │ │ ├── IncidentLogEntry.java │ │ │ ├── MetaData.java │ │ │ ├── MetaDataEntry.java │ │ │ ├── Profile.java │ │ │ └── Ride.java │ │ │ ├── services │ │ │ ├── DebugUploadService.java │ │ │ ├── RecorderService.java │ │ │ └── UploadService.java │ │ │ ├── update │ │ │ └── VersionUpdater.java │ │ │ └── util │ │ │ ├── BaseActivity.java │ │ │ ├── ConnectionManager.kt │ │ │ ├── Constants.java │ │ │ ├── ForegroundServiceNotificationManager.java │ │ │ ├── IOUtils.java │ │ │ ├── IncidentBroadcaster.java │ │ │ ├── LogHelper.java │ │ │ ├── LoggingExceptionActivity.java │ │ │ ├── PermissionHelper.java │ │ │ ├── SharedPref.java │ │ │ ├── SimRAuthenticator.java │ │ │ ├── UnitHelper.java │ │ │ ├── UpdateHelper.java │ │ │ ├── Utils.java │ │ │ └── ble │ │ │ ├── BleExtensions.kt │ │ │ └── ConnectionEventListener.kt │ ├── res │ │ ├── drawable-hdpi │ │ │ ├── dashboard_icon.png │ │ │ ├── edit_event_blue.png │ │ │ ├── edit_event_green.png │ │ │ ├── edited_event_blue.png │ │ │ ├── edited_event_green.png │ │ │ ├── globe_icon.png │ │ │ ├── ic_route.png │ │ │ ├── racingflagblack.png │ │ │ ├── racingflagwhite.png │ │ │ ├── startblack.png │ │ │ ├── startwhite.png │ │ │ └── twitter_black.png │ │ ├── drawable-mdpi │ │ │ ├── dashboard_icon.png │ │ │ ├── edit_event_blue.png │ │ │ ├── edit_event_green.png │ │ │ ├── edited_event_blue.png │ │ │ ├── edited_event_green.png │ │ │ ├── globe_icon.png │ │ │ ├── ic_route.png │ │ │ ├── racingflagblack.png │ │ │ ├── racingflagwhite.png │ │ │ ├── startblack.png │ │ │ ├── startwhite.png │ │ │ └── twitter_black.png │ │ ├── drawable-v24 │ │ │ ├── ic_launcher_foreground.xml │ │ │ └── person.png │ │ ├── drawable-xhdpi │ │ │ ├── dashboard_icon.png │ │ │ ├── edit_event_blue.png │ │ │ ├── edit_event_green.png │ │ │ ├── edited_event_blue.png │ │ │ ├── edited_event_green.png │ │ │ ├── globe_icon.png │ │ │ ├── ic_route.png │ │ │ ├── racingflagblack.png │ │ │ ├── racingflagwhite.png │ │ │ ├── startblack.png │ │ │ ├── startwhite.png │ │ │ └── twitter_black.png │ │ ├── drawable-xxhdpi │ │ │ ├── dashboard_icon.png │ │ │ ├── edit_event_blue.png │ │ │ ├── edit_event_green.png │ │ │ ├── edited_event_blue.png │ │ │ ├── edited_event_green.png │ │ │ ├── globe_icon.png │ │ │ ├── ic_route.png │ │ │ ├── racingflagblack.png │ │ │ ├── racingflagwhite.png │ │ │ ├── startblack.png │ │ │ ├── startwhite.png │ │ │ └── twitter_black.png │ │ ├── drawable-xxxhdpi │ │ │ ├── dashboard_icon.png │ │ │ ├── edit_event_blue.png │ │ │ ├── edit_event_green.png │ │ │ ├── edited_event_blue.png │ │ │ ├── edited_event_green.png │ │ │ ├── globe_icon.png │ │ │ ├── ic_route.png │ │ │ ├── racingflagblack.png │ │ │ ├── racingflagwhite.png │ │ │ ├── startblack.png │ │ │ ├── startwhite.png │ │ │ └── twitter_black.png │ │ ├── drawable │ │ │ ├── border.xml │ │ │ ├── button_pressed.xml │ │ │ ├── button_unpressed.xml │ │ │ ├── cancel_icon_640.png │ │ │ ├── co2.png │ │ │ ├── ic_access_time_black_24dp.xml │ │ │ ├── ic_alt_route_24.xml │ │ │ ├── ic_arrow_back_black_24dp.xml │ │ │ ├── ic_arrow_back_blue_24dp.xml │ │ │ ├── ic_baseline_connect_without_contact_24.xml │ │ │ ├── ic_baseline_email_24.xml │ │ │ ├── ic_baseline_feedback_24.xml │ │ │ ├── ic_baseline_touch_app_24.xml │ │ │ ├── ic_baseline_web_24.xml │ │ │ ├── ic_bluetooth.xml │ │ │ ├── ic_bluetooth_connected.xml │ │ │ ├── ic_bluetooth_disabled.xml │ │ │ ├── ic_bluetooth_searching.xml │ │ │ ├── ic_cancel.xml │ │ │ ├── ic_cloud_done_black_24dp.xml │ │ │ ├── ic_co2.xml │ │ │ ├── ic_content_paste_black_24dp.xml │ │ │ ├── ic_copyright_black_24dp.xml │ │ │ ├── ic_directions_car_24.xml │ │ │ ├── ic_face_black_24dp.xml │ │ │ ├── ic_file_upload_black_24dp.xml │ │ │ ├── ic_help_outline_black_24dp.xml │ │ │ ├── ic_help_outline_blue_24dp.xml │ │ │ ├── ic_help_outline_white_24dp.xml │ │ │ ├── ic_info_black_24dp.xml │ │ │ ├── ic_instagram_logo.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── ic_list_black_24dp.xml │ │ │ ├── ic_nav_helmet.xml │ │ │ ├── ic_nav_mcc.xml │ │ │ ├── ic_phone_android_black_24dp.xml │ │ │ ├── ic_save.xml │ │ │ ├── ic_save_black_24dp.xml │ │ │ ├── ic_security_black_24dp.xml │ │ │ ├── ic_settings_black_24dp.xml │ │ │ ├── ic_tachometer.xml │ │ │ ├── ic_timer_black_24dp.xml │ │ │ ├── ic_today_black_24dp.xml │ │ │ ├── ic_traffic_light_red.xml │ │ │ ├── ic_twitter_logo_blue.xml │ │ │ ├── ic_undo.xml │ │ │ ├── mcc_ecdf.PNG │ │ │ ├── my_center.png │ │ │ ├── ok_icon_640.png │ │ │ ├── profile_region_border.xml │ │ │ ├── racingflag.png │ │ │ ├── racingflagwhite.png │ │ │ ├── ripple_effect.xml │ │ │ ├── rounded_white.xml │ │ │ ├── route.png │ │ │ ├── shadow_gradient.xml │ │ │ ├── simra_logo.png │ │ │ ├── start.png │ │ │ ├── startwhite.png │ │ │ ├── stop.png │ │ │ ├── tap.png │ │ │ ├── tap_64.png │ │ │ ├── tap_blck.png │ │ │ ├── tap_blck_64.png │ │ │ ├── traffic_light_in_red_signal.png │ │ │ ├── tu_logo.png │ │ │ └── tutorial.gif │ │ ├── font │ │ │ ├── assistant_extralight.ttf │ │ │ └── bungee_shade.xml │ │ ├── layout │ │ │ ├── activity_about.xml │ │ │ ├── activity_contact.xml │ │ │ ├── activity_credits.xml │ │ │ ├── activity_feedback.xml │ │ │ ├── activity_help.xml │ │ │ ├── activity_history.xml │ │ │ ├── activity_license.xml │ │ │ ├── activity_main.xml │ │ │ ├── activity_openbikesensor.xml │ │ │ ├── activity_profile.xml │ │ │ ├── activity_ride_settings.xml │ │ │ ├── activity_settings.xml │ │ │ ├── activity_show_route.xml │ │ │ ├── activity_single_ride_statistics.xml │ │ │ ├── activity_start.xml │ │ │ ├── activity_statistics.xml │ │ │ ├── activity_web.xml │ │ │ ├── app_bar_main.xml │ │ │ ├── bonuspack_bubble.xml │ │ │ ├── checkbox.xml │ │ │ ├── content_contact.xml │ │ │ ├── content_credits.xml │ │ │ ├── content_main.xml │ │ │ ├── content_profile.xml │ │ │ ├── content_ride_settings.xml │ │ │ ├── content_statistics.xml │ │ │ ├── incident_bubble.xml │ │ │ ├── incident_popup_layout.xml │ │ │ ├── incident_popup_layout_uneditable_incident.xml │ │ │ ├── nav_header_main.xml │ │ │ ├── new_update_prompt.xml │ │ │ ├── news_popup.xml │ │ │ ├── row.xml │ │ │ ├── row_icons.xml │ │ │ ├── show_license_dialog.xml │ │ │ ├── spinner.xml │ │ │ ├── spinner_item.xml │ │ │ └── toolbar.xml │ │ ├── menu │ │ │ └── menu_main_drawer.xml │ │ ├── mipmap-anydpi-v26 │ │ │ ├── simra_launcher.xml │ │ │ └── simra_launcher_round.xml │ │ ├── mipmap-hdpi │ │ │ ├── simra_launcher.png │ │ │ ├── simra_launcher_foreground.png │ │ │ └── simra_launcher_round.png │ │ ├── mipmap-mdpi │ │ │ ├── simra_launcher.png │ │ │ ├── simra_launcher_foreground.png │ │ │ └── simra_launcher_round.png │ │ ├── mipmap-xhdpi │ │ │ ├── simra_launcher.png │ │ │ ├── simra_launcher_foreground.png │ │ │ └── simra_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ │ ├── simra_launcher.png │ │ │ ├── simra_launcher_foreground.png │ │ │ └── simra_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ │ ├── simra_launcher.png │ │ │ ├── simra_launcher_foreground.png │ │ │ └── simra_launcher_round.png │ │ ├── values-en │ │ │ ├── arrays.xml │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── font_certs.xml │ │ │ ├── preloaded_fonts.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── values │ │ │ ├── arrays.xml │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── font_certs.xml │ │ │ ├── preloaded_fonts.xml │ │ │ ├── simra_launcher_background.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ └── simra_launcher-web.png │ └── qa │ └── res │ ├── values-en │ └── strings.xml │ └── values │ └── strings.xml ├── azure-pipelines.yml ├── build.gradle ├── config ├── checkstyle.xml └── version-updater-import-control.xml ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── metadata └── android │ ├── de-DE │ ├── changelogs │ │ ├── 58.txt │ │ └── default.txt │ ├── full_description.txt │ ├── images │ │ ├── featureGraphic.png │ │ ├── icon.png │ │ └── phoneScreenshots │ │ │ ├── 1_de-DE.jpg │ │ │ ├── 2_de-DE.jpg │ │ │ ├── 3_de-DE.jpg │ │ │ ├── 4_de-DE.jpg │ │ │ ├── 5_de-DE.jpg │ │ │ └── 6_de-DE.jpg │ ├── short_description.txt │ ├── title.txt │ └── video.txt │ └── en-US │ ├── changelogs │ ├── 58.txt │ └── default.txt │ ├── full_description.txt │ ├── images │ ├── featureGraphic.png │ ├── icon.png │ └── phoneScreenshots │ │ ├── 1_de-DE.jpg │ │ ├── 2_de-DE.jpg │ │ ├── 3_de-DE.jpg │ │ ├── 4_de-DE.jpg │ │ ├── 5_de-DE.jpg │ │ └── 6_de-DE.jpg │ ├── short_description.txt │ ├── title.txt │ └── video.txt └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | .DS_Store 5 | /build 6 | /captures 7 | .externalNativeBuild 8 | *.ser 9 | hash-suffix.h 10 | *.apk 11 | .idea/* 12 | *.properties 13 | app/qa 14 | app/release 15 | lint-report.html 16 | .project 17 | .settings 18 | .classpath 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SimRa Android App 2 | 3 | [![CodeFactor](https://www.codefactor.io/repository/github/simra-project/simra-android/badge)](https://www.codefactor.io/repository/github/simra-project/simra-android) 4 | 5 | This project is part of the SimRa research project which includes the following subprojects: 6 | - [simra-android](https://github.com/simra-project/simra-android/): The SimRa app for Android. 7 | - [simra-ios](https://github.com/simra-project/simra-ios): The SimRa app for iOS. 8 | - [backend](https://github.com/simra-project/backend): The SimRa backend software. 9 | - [dataset](https://github.com/simra-project/dataset): Result data from the SimRa project. 10 | - [screenshots](https://github.com/simra-project/screenshots): Screenshots of both the iOS and Android app. 11 | - [SimRa-Visualization](https://github.com/simra-project/SimRa-Visualization): Web application for visualizing the dataset. 12 | 13 | In this project, we collect – with a strong focus on data protection and privacy – data on such near crashes to identify when and where bicyclists are especially at risk. We also aim to identify the main routes of bicycle traffic in Berlin. To obtain such data, we have developed a smartphone app that uses GPS information to track routes of bicyclists and the built-in acceleration sensors to pre-categorize near crashes. After their trip, users are asked to annotate and upload the collected data, pseudonymized per trip. 14 | For more information see [our website](https://www.digital-future.berlin/en/research/projects/simra/). 15 | 16 | ## Instructions 17 | 18 | The suffix used in the `clientHash` to protect the upload is not part of the source code. 19 | To compile the project: 20 | 21 | - copy the file `Hash-Suffix.h.sample` to `Hash-Suffix.h` 22 | - replace the sample suffix `mcc_simra` with the suffix provided from the backend operator 23 | - compile 24 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'kotlin-android' 3 | id 'com.android.application' 4 | id 'org.jetbrains.kotlin.android' 5 | } 6 | 7 | def ENV_VARIABLE_PREFIX = "SIMRA_" 8 | def API_ENDPOINT = "API_ENDPOINT" 9 | def API_VERSION = "API_VERSION" 10 | 11 | android { 12 | compileSdkVersion 34 13 | defaultConfig { 14 | applicationId "de.tuberlin.mcc.simra.app" 15 | minSdkVersion 23 16 | targetSdkVersion 34 17 | versionCode 100 18 | versionName "100.0" 19 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 20 | 21 | // defining the build date 22 | buildConfigField "long", "BUILD_DATE", System.currentTimeMillis() + "L" 23 | 24 | // Load `local.properties` (from root) for development configuration 25 | Properties properties = new Properties() 26 | if (project.rootProject.file('local.properties').exists()) { 27 | properties.load(project.rootProject.file('local.properties').newDataInputStream()) 28 | } 29 | 30 | 31 | buildConfigField "String", API_ENDPOINT, properties.getProperty(API_ENDPOINT) ?: "\"https://vm2.mcc.tu-berlin.de:8082/\"" 32 | buildConfigField "String", API_VERSION, properties.getProperty(API_VERSION) ?: "\"13/\"" 33 | 34 | } 35 | buildTypes { 36 | 37 | release { 38 | minifyEnabled false 39 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 40 | 41 | // Allow loading the configuration Settings from environment variables 42 | def VAR_API_ENDPOINT = System.getenv(ENV_VARIABLE_PREFIX + API_ENDPOINT) 43 | if (VAR_API_ENDPOINT != null) { 44 | buildConfigField "String", API_ENDPOINT, "\"" + VAR_API_ENDPOINT + "\"" 45 | } 46 | def VAR_API_VERSION = System.getenv(ENV_VARIABLE_PREFIX + API_VERSION) 47 | if (VAR_API_VERSION != null) { 48 | buildConfigField "String", API_VERSION, "\"" + VAR_API_VERSION + "\"" 49 | } 50 | } 51 | qa { 52 | initWith buildTypes.release 53 | } 54 | } 55 | buildFeatures { 56 | viewBinding = true 57 | } 58 | compileOptions { 59 | sourceCompatibility = '17' 60 | targetCompatibility = '17' 61 | sourceCompatibility JavaVersion.VERSION_17 62 | targetCompatibility JavaVersion.VERSION_17 63 | } 64 | namespace 'de.tuberlin.mcc.simra.app' 65 | } 66 | 67 | dependencies { 68 | implementation fileTree(include: ['*.jar'], dir: 'libs') 69 | implementation 'androidx.appcompat:appcompat:1.3.0' 70 | implementation 'androidx.constraintlayout:constraintlayout:2.1.4' 71 | 72 | implementation "androidx.lifecycle:lifecycle-service:2.3.1" 73 | implementation 'androidx.legacy:legacy-support-v4:1.0.0' 74 | implementation 'com.google.android.material:material:1.4.0' 75 | api 'org.osmdroid:osmdroid-android:6.1.10' 76 | api 'com.github.MKergall:osmbonuspack:6.7.0' 77 | implementation 'com.github.Jay-Goo:RangeSeekBar:v2.0.4' 78 | implementation 'com.github.PhilJay:MPAndroidChart:v2.2.4' 79 | implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.17' 80 | 81 | // RingBuffer 82 | implementation 'org.apache.commons:commons-collections4:4.4' 83 | implementation 'androidx.core:core-ktx:1.10.1' 84 | 85 | // Tests 86 | testImplementation 'junit:junit:4.13' 87 | testImplementation "org.assertj:assertj-core:3.16.1" 88 | 89 | // "Backporting" Java 8 streams for Android < 24 90 | implementation 'net.sourceforge.streamsupport:android-retrostreams:1.7.2' 91 | 92 | // Kotlin 93 | implementation 'androidx.core:core-ktx:1.10.1' 94 | implementation "org.jetbrains.kotlin:kotlin-stdlib:1.8.21" 95 | 96 | } 97 | -------------------------------------------------------------------------------- /app/debug/output.json: -------------------------------------------------------------------------------- 1 | [{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":49,"versionName":"49.0","enabled":true,"outputFile":"app-debug.apk","fullName":"debug","baseName":"debug"},"path":"app-debug.apk","properties":{}}] -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/debug/res/values-en/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | SimRa 4 | 5 | -------------------------------------------------------------------------------- /app/src/debug/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | SimRa 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/assets/hash-suffix.h.sample: -------------------------------------------------------------------------------- 1 | mcc_simra 2 | -------------------------------------------------------------------------------- /app/src/main/assets/licenselogback.txt: -------------------------------------------------------------------------------- 1 | Logback: the reliable, generic, fast and flexible logging framework. Copyright (C) 1999-2017, QOS.ch. 2 | All rights reserved. This program and the accompanying materials are dual-licensed under either the 3 | terms of the Eclipse Public License v1.0 as published by the Eclipse Foundation or (per the 4 | licensee's choosing) under the terms of the GNU Lesser General Public License version 2.1 as 5 | published by the Free Software Foundation. -------------------------------------------------------------------------------- /app/src/main/assets/licenseokhttp.txt: -------------------------------------------------------------------------------- 1 | Copyright 2016 Square, Inc. 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. -------------------------------------------------------------------------------- /app/src/main/assets/licenseslf4japi.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2004-2017 QOS.ch All rights reserved. Permission is hereby granted, 2 | free of charge, to any person obtaining a copy of this software and associated documentation 3 | files (the "Software"), to deal in the Software without restriction, including without 4 | limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 5 | sell copies of the Software, and to permit persons to whom the Software is furnished to do so, 6 | subject to the following conditions: The above copyright notice and this permission notice shall 7 | be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED 8 | "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE 9 | WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 10 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 11 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 12 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /app/src/main/assets/licenseslf4jsimple.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2004-2017 QOS.ch All rights reserved. Permission is hereby granted, 2 | free of charge, to any person obtaining a copy of this software and associated documentation 3 | files (the "Software"), to deal in the Software without restriction, including without 4 | limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 5 | sell copies of the Software, and to permit persons to whom the Software is furnished to do so, 6 | subject to the following conditions: The above copyright notice and this permission notice shall 7 | be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED 8 | "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE 9 | WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 10 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 11 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 12 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /app/src/main/assets/server.cer: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/assets/server.cer -------------------------------------------------------------------------------- /app/src/main/java/de/tuberlin/mcc/simra/app/SimraApplication.java: -------------------------------------------------------------------------------- 1 | package de.tuberlin.mcc.simra.app; 2 | 3 | import android.app.Application; 4 | 5 | /** 6 | * Simra Main Application Class. 7 | */ 8 | public class SimraApplication extends Application { 9 | public void onCreate() { 10 | super.onCreate(); 11 | } 12 | } -------------------------------------------------------------------------------- /app/src/main/java/de/tuberlin/mcc/simra/app/activities/AboutActivity.java: -------------------------------------------------------------------------------- 1 | package de.tuberlin.mcc.simra.app.activities; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.view.LayoutInflater; 6 | import android.widget.ArrayAdapter; 7 | import android.widget.Toast; 8 | 9 | import androidx.appcompat.widget.Toolbar; 10 | 11 | import de.tuberlin.mcc.simra.app.R; 12 | import de.tuberlin.mcc.simra.app.databinding.ActivityAboutBinding; 13 | import de.tuberlin.mcc.simra.app.util.BaseActivity; 14 | 15 | /** 16 | * About Activity displaying information about licenses and privacy policies. 17 | */ 18 | public class AboutActivity extends BaseActivity { 19 | 20 | /** 21 | * Layout Binding. 22 | */ 23 | ActivityAboutBinding binding; 24 | 25 | @Override 26 | protected void onCreate(Bundle savedInstanceState) { 27 | super.onCreate(savedInstanceState); 28 | 29 | binding = ActivityAboutBinding.inflate(LayoutInflater.from(this)); 30 | setContentView(binding.getRoot()); 31 | 32 | Toolbar toolbar = findViewById(R.id.toolbar); 33 | setSupportActionBar(toolbar); 34 | getSupportActionBar().setDisplayShowTitleEnabled(false); 35 | toolbar.setTitle(""); 36 | toolbar.setSubtitle(""); 37 | binding.toolbar.toolbarTitle.setText(R.string.title_activity_about_simra); 38 | 39 | binding.toolbar.backButton.setOnClickListener(v -> finish()); 40 | 41 | String[] items = getResources().getStringArray(R.array.aboutSimraItems); 42 | binding.listView.setAdapter(new ArrayAdapter<>(AboutActivity.this, 43 | android.R.layout.simple_list_item_1, items)); 44 | binding.listView.setOnItemClickListener((parent, view, position, id) -> { 45 | Intent intent = null; 46 | switch (position) { 47 | case 0: 48 | intent = new Intent(AboutActivity.this, WebActivity.class); 49 | intent.putExtra("URL", getString(R.string.link_simra_Page)); 50 | break; 51 | case 1: 52 | intent = new Intent(AboutActivity.this, WebActivity.class); 53 | intent.putExtra("URL", getString(R.string.privacyLink)); 54 | 55 | break; 56 | case 2: 57 | intent = new Intent(AboutActivity.this, LicenseActivity.class); 58 | break; 59 | case 3: 60 | intent = new Intent(AboutActivity.this, CreditsActivity.class); 61 | break; 62 | default: 63 | Toast.makeText(AboutActivity.this, R.string.notReady, Toast.LENGTH_SHORT).show(); 64 | } 65 | if (intent != null) { 66 | startActivity(intent); 67 | } 68 | 69 | 70 | }); 71 | 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /app/src/main/java/de/tuberlin/mcc/simra/app/activities/CreditsActivity.java: -------------------------------------------------------------------------------- 1 | package de.tuberlin.mcc.simra.app.activities; 2 | 3 | import android.os.Bundle; 4 | import android.view.LayoutInflater; 5 | 6 | import androidx.appcompat.app.AppCompatActivity; 7 | 8 | import de.tuberlin.mcc.simra.app.R; 9 | import de.tuberlin.mcc.simra.app.databinding.ActivityCreditsBinding; 10 | 11 | public class CreditsActivity extends AppCompatActivity { 12 | 13 | /** 14 | * Layout Binding. 15 | */ 16 | ActivityCreditsBinding binding; 17 | 18 | @Override 19 | protected void onCreate(Bundle savedInstanceState) { 20 | super.onCreate(savedInstanceState); 21 | 22 | binding = ActivityCreditsBinding.inflate(LayoutInflater.from(this)); 23 | setContentView(binding.getRoot()); 24 | 25 | setSupportActionBar(binding.toolbar.toolbar); 26 | getSupportActionBar().setDisplayShowTitleEnabled(false); 27 | binding.toolbar.toolbar.setTitle(""); 28 | binding.toolbar.toolbar.setSubtitle(""); 29 | binding.toolbar.toolbarTitle.setText(R.string.title_activity_credits); 30 | 31 | binding.toolbar.backButton.setOnClickListener(v -> finish()); 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/de/tuberlin/mcc/simra/app/activities/FeedbackActivity.java: -------------------------------------------------------------------------------- 1 | package de.tuberlin.mcc.simra.app.activities; 2 | 3 | import android.content.Intent; 4 | import android.net.Uri; 5 | import android.os.Bundle; 6 | import android.view.LayoutInflater; 7 | import android.widget.ArrayAdapter; 8 | import android.widget.Toast; 9 | 10 | import androidx.appcompat.app.AppCompatActivity; 11 | import androidx.appcompat.widget.Toolbar; 12 | import de.tuberlin.mcc.simra.app.BuildConfig; 13 | import de.tuberlin.mcc.simra.app.R; 14 | import de.tuberlin.mcc.simra.app.databinding.ActivityFeedbackBinding; 15 | 16 | public class FeedbackActivity extends AppCompatActivity { 17 | 18 | /** 19 | * Layout Binding. 20 | */ 21 | ActivityFeedbackBinding binding; 22 | 23 | @Override 24 | protected void onCreate(Bundle savedInstanceState) { 25 | super.onCreate(savedInstanceState); 26 | //setContentView(R.layout.activity_feedback); 27 | 28 | 29 | binding = ActivityFeedbackBinding.inflate(LayoutInflater.from(this)); 30 | setContentView(binding.getRoot()); 31 | 32 | 33 | Toolbar toolbar = findViewById(R.id.toolbar); 34 | setSupportActionBar(toolbar); 35 | getSupportActionBar().setDisplayShowTitleEnabled(false); 36 | toolbar.setTitle(""); 37 | toolbar.setSubtitle(""); 38 | binding.toolbar.toolbarTitle.setText(R.string.title_activity_about_simra); 39 | 40 | binding.toolbar.backButton.setOnClickListener(v -> finish()); 41 | 42 | String[] items = getResources().getStringArray(R.array.ContactItems); 43 | binding.listView.setAdapter(new ArrayAdapter<>(de.tuberlin.mcc.simra.app.activities.FeedbackActivity.this, 44 | android.R.layout.simple_list_item_1, items)); 45 | binding.listView.setOnItemClickListener((parent, view, position, id) -> { 46 | Intent intent = null; 47 | switch (position) { 48 | case 0: 49 | intent = new Intent(FeedbackActivity.this, WebActivity.class); 50 | intent.putExtra("URL", getString(R.string.link_simra_Page)); 51 | break; 52 | case 1: 53 | intent = new Intent(Intent.ACTION_SEND); 54 | intent.setType("message/rfc822"); 55 | intent.putExtra(Intent.EXTRA_EMAIL, new String[]{getString(R.string.feedbackReceiver)}); 56 | intent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.feedbackHeader)); 57 | intent.putExtra(Intent.EXTRA_TEXT, (getString(R.string.feedbackReceiver)) + System.lineSeparator() 58 | + "App Version: " + BuildConfig.VERSION_CODE + System.lineSeparator() + "Android Version: "); 59 | try { 60 | startActivity(Intent.createChooser(intent, "Send mail...")); 61 | } catch (android.content.ActivityNotFoundException ex) { 62 | Toast.makeText(FeedbackActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show(); 63 | } 64 | break; 65 | case 2: 66 | intent = new Intent(Intent.ACTION_VIEW); 67 | //intent = new Intent(SocialMediaActivity.this, WebActivity.class); 68 | intent.setData(Uri.parse(getString(R.string.link_to_twitter))); 69 | startActivity(intent); 70 | break; 71 | case 3: 72 | intent = new Intent(Intent.ACTION_VIEW); 73 | //intent = new Intent(SocialMediaActivity.this, WebActivity.class); 74 | intent.setData(Uri.parse(getString(R.string.link_to_instagram))); 75 | startActivity(intent); 76 | break; 77 | default: 78 | Toast.makeText(FeedbackActivity.this, R.string.notReady, Toast.LENGTH_SHORT).show(); 79 | } 80 | if (intent != null) { 81 | startActivity(intent); 82 | } 83 | 84 | 85 | }); 86 | 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /app/src/main/java/de/tuberlin/mcc/simra/app/activities/WebActivity.java: -------------------------------------------------------------------------------- 1 | package de.tuberlin.mcc.simra.app.activities; 2 | 3 | import android.os.Bundle; 4 | import android.webkit.WebView; 5 | 6 | import de.tuberlin.mcc.simra.app.R; 7 | import de.tuberlin.mcc.simra.app.util.BaseActivity; 8 | 9 | public class WebActivity extends BaseActivity { 10 | 11 | @Override 12 | protected void onCreate(Bundle savedInstanceState) { 13 | super.onCreate(savedInstanceState); 14 | setContentView(R.layout.activity_web); 15 | WebView myWebView = new WebView(getBaseContext()); 16 | setContentView(myWebView); 17 | String URL = getString(R.string.link_mcc_Page); 18 | URL = getIntent().getStringExtra("URL"); 19 | myWebView.loadUrl(URL); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/de/tuberlin/mcc/simra/app/annotation/GeoPointWrapper.java: -------------------------------------------------------------------------------- 1 | package de.tuberlin.mcc.simra.app.annotation; 2 | 3 | import org.osmdroid.util.GeoPoint; 4 | 5 | import de.tuberlin.mcc.simra.app.entities.DataLogEntry; 6 | 7 | // This class wraps two GeoPoints and their distance (difference between their summed 8 | // lats & lons). 9 | // => PURPOSE: ensure that when users add incidents manually, they cannot include locations 10 | // which where not a part of the route in question. 11 | // So every manually added location gets replaced by the closest location included 12 | // in the route. 13 | 14 | public class GeoPointWrapper { 15 | 16 | public GeoPoint wrappedGeoPoint; 17 | 18 | public GeoPoint referencePoint; 19 | 20 | public double distToReference; 21 | public DataLogEntry dataLogEntry; 22 | 23 | public GeoPointWrapper(GeoPoint wrappedGeoPoint, GeoPoint referenceGeoPoint, DataLogEntry dataLogEntry) { 24 | this.wrappedGeoPoint = wrappedGeoPoint; 25 | this.referencePoint = referenceGeoPoint; 26 | this.dataLogEntry = dataLogEntry; 27 | this.distToReference = calcDistToReference(); 28 | } 29 | 30 | public double calcDistToReference() { 31 | 32 | long earthRadiusKm = 6371; 33 | 34 | double dLat = Math.toRadians(referencePoint.getLatitude() 35 | - wrappedGeoPoint.getLatitude()); 36 | 37 | double dLon = Math.toRadians(referencePoint.getLongitude() 38 | - wrappedGeoPoint.getLongitude()); 39 | 40 | double lat1 = Math.toRadians(wrappedGeoPoint.getLatitude()); 41 | double lat2 = Math.toRadians(referencePoint.getLatitude()); 42 | 43 | double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + 44 | Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2); 45 | double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); 46 | 47 | return earthRadiusKm * c; 48 | 49 | } 50 | 51 | } 52 | -------------------------------------------------------------------------------- /app/src/main/java/de/tuberlin/mcc/simra/app/annotation/MyInfoWindow.java: -------------------------------------------------------------------------------- 1 | package de.tuberlin.mcc.simra.app.annotation; 2 | 3 | import android.text.format.DateUtils; 4 | import android.view.View; 5 | import android.widget.LinearLayout; 6 | import android.widget.TextView; 7 | 8 | import org.osmdroid.views.MapView; 9 | import org.osmdroid.views.overlay.infowindow.InfoWindow; 10 | 11 | import de.tuberlin.mcc.simra.app.R; 12 | import de.tuberlin.mcc.simra.app.activities.ShowRouteActivity; 13 | import de.tuberlin.mcc.simra.app.entities.IncidentLogEntry; 14 | 15 | public class MyInfoWindow extends InfoWindow { 16 | private ShowRouteActivity motherActivity; 17 | private int state; 18 | private IncidentLogEntry incidentLogEntry; 19 | 20 | 21 | public MyInfoWindow(int layoutResId, MapView mapView, ShowRouteActivity motherActivity, 22 | int state, IncidentLogEntry incidentLogEntry) { 23 | 24 | super(layoutResId, mapView); 25 | this.motherActivity = motherActivity; 26 | this.incidentLogEntry = incidentLogEntry; 27 | this.state = state; 28 | } 29 | 30 | public void onClose() { 31 | } 32 | 33 | public void onOpen(Object item) { 34 | LinearLayout layout = mView.findViewById(R.id.bubble_layout); 35 | TextView txtTitle = mView.findViewById(R.id.bubble_title); 36 | TextView txtDescription = mView.findViewById(R.id.bubble_description); 37 | 38 | txtTitle.setText(motherActivity.getString(R.string.incidentDetected)); 39 | long millis = this.incidentLogEntry.timestamp; 40 | String time = ""; 41 | if (millis > 1337) { 42 | time = DateUtils.formatDateTime(motherActivity, millis, DateUtils.FORMAT_SHOW_TIME); 43 | } 44 | 45 | txtDescription.setText(time); 46 | 47 | layout.setOnClickListener((View v) -> { 48 | IncidentPopUpActivity.startIncidentPopUpActivity(incidentLogEntry, state, motherActivity); 49 | close(); 50 | }); 51 | } 52 | } -------------------------------------------------------------------------------- /app/src/main/java/de/tuberlin/mcc/simra/app/entities/MetaDataEntry.java: -------------------------------------------------------------------------------- 1 | package de.tuberlin.mcc.simra.app.entities; 2 | 3 | public class MetaDataEntry { 4 | public Integer rideId; 5 | public Long startTime; 6 | public Long endTime; 7 | public Integer state; 8 | public Integer numberOfIncidents; 9 | public Long waitedTime; 10 | public Long distance; 11 | public Integer numberOfScaryIncidents; 12 | public Integer region; 13 | 14 | public MetaDataEntry(Integer rideId, Long startTime, Long endTime, Integer state, Integer numberOfIncidents, Long waitedTime, Long distance, Integer numberOfScaryIncidents, Integer region) { 15 | this.rideId = rideId; 16 | this.startTime = startTime; 17 | this.endTime = endTime; 18 | this.state = state != null ? state : MetaData.STATE.JUST_RECORDED; 19 | this.numberOfIncidents = numberOfIncidents != null ? numberOfIncidents : 0; 20 | this.waitedTime = waitedTime != null ? waitedTime : 0; 21 | this.distance = distance != null ? distance : 0; 22 | this.numberOfScaryIncidents = numberOfScaryIncidents != null ? numberOfScaryIncidents : 0; 23 | this.region = region != null ? region : 0; 24 | } 25 | 26 | public static MetaDataEntry parseEntryFromLine(String string) { 27 | String[] dataLogLine = string.split(",", -1); 28 | return new MetaDataEntry( 29 | Integer.parseInt(dataLogLine[0]), 30 | Long.parseLong(dataLogLine[1]), 31 | Long.parseLong(dataLogLine[2]), 32 | Integer.parseInt(dataLogLine[3]), 33 | Integer.parseInt(dataLogLine[4]), 34 | Long.parseLong(dataLogLine[5]), 35 | Long.parseLong(dataLogLine[6]), 36 | Integer.parseInt(dataLogLine[7]), 37 | Integer.parseInt(dataLogLine[8]) 38 | ); 39 | } 40 | 41 | 42 | /** 43 | * Stringifies the MetaDataEntry Object to a CSV Log Line 44 | * 45 | * @return Log Line without new line separator 46 | */ 47 | public String stringifyMetaDataEntry() { 48 | return rideId + "," + startTime + "," + endTime + "," + state + "," + numberOfIncidents + "," + waitedTime + "," + distance + "," + numberOfScaryIncidents + "," + region; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/src/main/java/de/tuberlin/mcc/simra/app/entities/Ride.java: -------------------------------------------------------------------------------- 1 | package de.tuberlin.mcc.simra.app.entities; 2 | 3 | /** 4 | * A Ride contains both the Log Entries, as well as the incidents and settings associated with it. 5 | */ 6 | public class Ride { 7 | public int rideID; 8 | public int bike; 9 | public int child; 10 | public int trailer; 11 | public int pLoc; 12 | 13 | public Ride(int rideID, int bike, int child, int trailer, int pLoc) { 14 | this.rideID = rideID; 15 | this.bike = bike; 16 | this.child = child; 17 | this.trailer = trailer; 18 | this.pLoc = pLoc; 19 | } 20 | 21 | public static void saveRide() { 22 | 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/de/tuberlin/mcc/simra/app/util/BaseActivity.java: -------------------------------------------------------------------------------- 1 | package de.tuberlin.mcc.simra.app.util; 2 | 3 | import android.os.Bundle; 4 | 5 | import androidx.appcompat.app.AppCompatActivity; 6 | 7 | import de.tuberlin.mcc.simra.app.BuildConfig; 8 | 9 | public abstract class BaseActivity extends AppCompatActivity { 10 | 11 | @Override 12 | protected void onCreate(Bundle savedInstanceState) { 13 | super.onCreate(savedInstanceState); 14 | if (BuildConfig.DEBUG) { 15 | return; 16 | } 17 | new LoggingExceptionActivity(BaseActivity.this); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/de/tuberlin/mcc/simra/app/util/Constants.java: -------------------------------------------------------------------------------- 1 | package de.tuberlin.mcc.simra.app.util; 2 | 3 | public class Constants { 4 | 5 | public static final int ZOOM_LEVEL = 19; 6 | 7 | // Accelerometer data gets recorded 50 times per second (every 20 millisecs). 8 | public static final int ACCELEROMETER_FREQUENCY = 20; 9 | 10 | /** 11 | * Step size for accelerometer moving average 12 | */ 13 | public static final int MVG_AVG_STEP = 5; 14 | 15 | /** 16 | * GPS-Trace: one recording every 3 secs = every 3000 millisecs. 17 | */ 18 | public static final int GPS_FREQUENCY = 3000; 19 | 20 | /** 21 | * Every GPS fix has to be at least this accurate to be taken into account. 22 | */ 23 | public static final double GPS_ACCURACY_THRESHOLD = 30.0; 24 | 25 | public static final String PROFILE_HEADER = "birth,gender,region,experience,numberOfRides,duration,numberOfIncidents,waitedTime,distance,co2,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,behaviour,numberOfScary" + System.lineSeparator(); 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/de/tuberlin/mcc/simra/app/util/ForegroundServiceNotificationManager.java: -------------------------------------------------------------------------------- 1 | package de.tuberlin.mcc.simra.app.util; 2 | 3 | import android.app.Notification; 4 | import android.app.NotificationChannel; 5 | import android.app.NotificationManager; 6 | import android.app.PendingIntent; 7 | import android.content.Context; 8 | import android.content.Intent; 9 | import android.os.Build; 10 | 11 | import androidx.core.app.NotificationCompat; 12 | import androidx.core.app.NotificationManagerCompat; 13 | 14 | import de.tuberlin.mcc.simra.app.R; 15 | import de.tuberlin.mcc.simra.app.activities.MainActivity; 16 | 17 | public class ForegroundServiceNotificationManager { 18 | 19 | private static final int NOTIFICATION_ID = 1094; 20 | private static final String CHANNEL_ID = "ForegroundServiceNotificationChannel"; 21 | 22 | public static Notification createOrUpdateNotification(Context ctx, String title, String text) { 23 | NotificationManagerCompat notificationManager = NotificationManagerCompat.from(ctx); 24 | Intent mainActivityIntent = new Intent(ctx, MainActivity.class); 25 | mainActivityIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 26 | 27 | PendingIntent pendingIntent = PendingIntent.getActivity(ctx, 0, mainActivityIntent, PendingIntent.FLAG_IMMUTABLE); 28 | 29 | // From API 26+ onwards a NotificationChannel has to be created 30 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { 31 | NotificationChannel channel = new NotificationChannel(CHANNEL_ID, "Ride Information", NotificationManager.IMPORTANCE_LOW); 32 | channel.setDescription("SimRa Channel"); 33 | notificationManager.createNotificationChannel(channel); 34 | } 35 | 36 | // Set the intent that will fire when the user taps the notification 37 | Notification notification = new NotificationCompat.Builder(ctx, CHANNEL_ID) 38 | .setSmallIcon(R.drawable.simra_logo) 39 | .setContentTitle(title) 40 | .setContentText(text) 41 | .setPriority(NotificationCompat.PRIORITY_LOW) 42 | // Set the intent that will fire when the user taps the notification 43 | .setContentIntent(pendingIntent) 44 | .addAction(R.drawable.ic_bluetooth, ctx.getResources().getString(R.string.foregroundNotificationButtonBack), 45 | pendingIntent) 46 | .build(); 47 | notificationManager.notify(NOTIFICATION_ID, notification); 48 | 49 | return notification; 50 | } 51 | 52 | public static int getNotificationId() { 53 | return NOTIFICATION_ID; 54 | } 55 | 56 | public static void cancelNotification(Context ctx) { 57 | NotificationManagerCompat notificationManager = NotificationManagerCompat.from(ctx); 58 | notificationManager.cancel(NOTIFICATION_ID); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /app/src/main/java/de/tuberlin/mcc/simra/app/util/IncidentBroadcaster.java: -------------------------------------------------------------------------------- 1 | package de.tuberlin.mcc.simra.app.util; 2 | 3 | 4 | import android.content.BroadcastReceiver; 5 | import android.content.Context; 6 | import android.content.Intent; 7 | import android.content.IntentFilter; 8 | 9 | import androidx.localbroadcastmanager.content.LocalBroadcastManager; 10 | 11 | import de.tuberlin.mcc.simra.app.entities.IncidentLogEntry; 12 | 13 | 14 | public class IncidentBroadcaster { 15 | 16 | private static final String MANUAL_INCIDENT = "de.tuberlin.mcc.simra.app.incidentbroadcaster.manualincident"; 17 | private static final String EXTRA_INCIDENT_TYPE = "EXTRA_INCIDENT_TYPE"; 18 | 19 | public static void broadcastIncident(Context ctx, int type) { 20 | Intent intent = new Intent(ctx, IncidentBroadcaster.class); 21 | intent.setAction(MANUAL_INCIDENT); 22 | intent.putExtra(EXTRA_INCIDENT_TYPE, type); 23 | LocalBroadcastManager.getInstance(ctx).sendBroadcast(intent); 24 | } 25 | 26 | public static BroadcastReceiver receiveIncidents(Context ctx, IncidentCallbacks callbacks) { 27 | BroadcastReceiver receiver = new BroadcastReceiver() { 28 | @Override 29 | public void onReceive(Context context, Intent intent) { 30 | callbacks.onManualIncident(intent.getIntExtra(EXTRA_INCIDENT_TYPE, IncidentLogEntry.INCIDENT_TYPE.NOTHING)); 31 | } 32 | }; 33 | LocalBroadcastManager.getInstance(ctx).registerReceiver(receiver, new IntentFilter(MANUAL_INCIDENT)); 34 | return receiver; 35 | } 36 | 37 | public abstract static class IncidentCallbacks { 38 | public void onManualIncident(int incidentType) { 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/de/tuberlin/mcc/simra/app/util/LogHelper.java: -------------------------------------------------------------------------------- 1 | package de.tuberlin.mcc.simra.app.util; 2 | 3 | import android.content.Context; 4 | import android.content.SharedPreferences; 5 | import android.util.Log; 6 | 7 | import java.io.BufferedReader; 8 | import java.io.FileInputStream; 9 | import java.io.IOException; 10 | import java.io.InputStreamReader; 11 | import java.util.Arrays; 12 | 13 | /** 14 | * Log Helper Methods for easier debugging 15 | */ 16 | public class LogHelper { 17 | 18 | private static final String TAG = "LogHelper"; 19 | 20 | public static void showKeyPrefs(Context context) { 21 | SharedPreferences keyPrefs = context.getApplicationContext() 22 | .getSharedPreferences("keyPrefs", Context.MODE_PRIVATE); 23 | Log.d(TAG, "===========================V=keyPrefs=V==========================="); 24 | Object[] keyPrefsArray = keyPrefs.getAll().entrySet().toArray(); 25 | for (Object keyPrefsEntry : keyPrefsArray) { 26 | Log.d(TAG, keyPrefsEntry + ""); 27 | } 28 | Log.d(TAG, "===========================Λ=keyPrefs=Λ==========================="); 29 | } 30 | 31 | public static void showDataDirectory(Context context) { 32 | Log.d(TAG, "===========================V=Directory=V==========================="); 33 | String[] fileList = context.fileList(); 34 | for (String fileName : fileList) { 35 | Log.d(TAG, fileName); 36 | } 37 | Log.d(TAG, "===========================Λ=Directory=Λ==========================="); 38 | } 39 | 40 | public static void showMetadata(Context context) { 41 | Log.d(TAG, "===========================V=metaData=V==========================="); 42 | try (BufferedReader metaDataReader = new BufferedReader(new InputStreamReader(new FileInputStream(IOUtils.Files.getMetaDataFile(context))))) { 43 | String metaDataLine; 44 | // loop through the metaData.csv lines 45 | while ((metaDataLine = metaDataReader.readLine()) != null) { 46 | Log.d(TAG, metaDataLine); 47 | } 48 | } catch (IOException e) { 49 | Log.e(TAG, "Exception in showMetadata(): " + e.getMessage()); 50 | Log.e(TAG, Arrays.toString(e.getStackTrace())); 51 | e.printStackTrace(); 52 | } 53 | Log.d(TAG, "===========================Λ=metaData=Λ==========================="); 54 | } 55 | 56 | public static void showStatistics(Context context) { 57 | SharedPreferences profilePrefs = context.getApplicationContext() 58 | .getSharedPreferences("Profile", Context.MODE_PRIVATE); 59 | Log.d(TAG, "===========================V=Statistics=V==========================="); 60 | Log.d(TAG, "numberOfRides: " + profilePrefs.getInt("NumberOfRides", -1)); 61 | Log.d(TAG, "Distance: " + profilePrefs.getLong("Distance", -1) + "m"); 62 | Log.d(TAG, "Co2: " + profilePrefs.getLong("Co2", -1) + "g"); 63 | Log.d(TAG, "Duration: " + profilePrefs.getLong("Duration", -1) + "ms"); 64 | Log.d(TAG, "WaitedTime: " + profilePrefs.getLong("WaitedTime", -1) + "s"); 65 | Log.d(TAG, "NumberOfIncidents: " + profilePrefs.getInt("NumberOfIncidents", -1)); 66 | Log.d(TAG, "NumberOfScary: " + profilePrefs.getInt("NumberOfScary", -1)); 67 | String[] buckets = new String[24]; 68 | for (int i = 0; i < buckets.length; i++) { 69 | buckets[i] = i + ": " + profilePrefs.getFloat(String.valueOf(i), -1.0f); 70 | } 71 | Log.d(TAG, "timeBuckets: " + Arrays.toString(buckets)); 72 | Log.d(TAG, "===========================Λ=Statistics=Λ==========================="); 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /app/src/main/java/de/tuberlin/mcc/simra/app/util/LoggingExceptionActivity.java: -------------------------------------------------------------------------------- 1 | package de.tuberlin.mcc.simra.app.util; 2 | 3 | import android.app.AlarmManager; 4 | import android.app.PendingIntent; 5 | import android.content.Context; 6 | import android.content.Intent; 7 | import android.content.SharedPreferences; 8 | import android.os.Build; 9 | import android.util.Log; 10 | 11 | import androidx.appcompat.app.AppCompatActivity; 12 | 13 | import java.io.File; 14 | import java.util.Date; 15 | 16 | import de.tuberlin.mcc.simra.app.BuildConfig; 17 | import de.tuberlin.mcc.simra.app.activities.StartActivity; 18 | 19 | import static de.tuberlin.mcc.simra.app.util.Utils.overwriteFile; 20 | 21 | public class LoggingExceptionActivity extends AppCompatActivity implements Thread.UncaughtExceptionHandler { 22 | 23 | private final static String TAG = LoggingExceptionActivity.class.getSimpleName() + "_LOG"; 24 | private final Context context; 25 | 26 | 27 | public LoggingExceptionActivity(Context context) { 28 | this.attachBaseContext(context); 29 | this.context = context; 30 | // we should store the current exception handler -- to invoke it for all not handled exceptions ... 31 | Thread.UncaughtExceptionHandler rootHandler = Thread.getDefaultUncaughtExceptionHandler(); 32 | // we replace the exception handler now with us -- we will properly dispatch the exceptions ... 33 | Thread.setDefaultUncaughtExceptionHandler(this); 34 | } 35 | 36 | @Override 37 | public void uncaughtException(final Thread thread, final Throwable ex) { 38 | try { 39 | Log.d(TAG, "called for " + ex.getClass()); 40 | // assume we would write each error in one file ... 41 | 42 | // log this exception ... 43 | 44 | StringBuilder stackTrace = new StringBuilder(); 45 | for (int i = 0; i < ex.getStackTrace().length; i++) { 46 | stackTrace.append(ex.getStackTrace()[i]).append("\n"); 47 | } 48 | String causeTrace = ""; 49 | if (ex.getCause() != null) { 50 | for (int i = 0; i < ex.getCause().getStackTrace().length; i++) { 51 | stackTrace.append(ex.getCause().getStackTrace()[i]).append("\n"); 52 | } 53 | } 54 | String fileInfoLine = BuildConfig.VERSION_CODE + "#1" + System.lineSeparator(); 55 | 56 | String errorReport = 57 | "System Timestamp: " + System.currentTimeMillis() + "\n" + 58 | "Build.VERSION.RELEASE: " + Build.VERSION.RELEASE + "\n" + 59 | "Build.DEVICE: " + Build.DEVICE + "\n" + 60 | "Build.MODEL: " + Build.MODEL + "\n" + 61 | "Build.PRODUCT: " + Build.PRODUCT + "\n" + 62 | "App Version: " + BuildConfig.VERSION_CODE + "\n" + 63 | "Exception in: " + context.getClass().getName() 64 | + " " + ex.getClass().getName() + "\n" + 65 | ex.getMessage() + "\n" + 66 | "stackTrace: " + stackTrace + "\n" + 67 | "causeTrace: " + causeTrace + "\n"; 68 | 69 | overwriteFile((fileInfoLine + errorReport), new File(IOUtils.Directories.getBaseFolderPath(this) + "CRASH_REPORT" + new Date().toString() + ".txt")); 70 | 71 | SharedPreferences sharedPrefs = getApplicationContext() 72 | .getSharedPreferences("simraPrefs", Context.MODE_PRIVATE); 73 | 74 | SharedPreferences.Editor editor = sharedPrefs.edit(); 75 | 76 | editor.putBoolean("NEW-UNSENT-ERROR", true); 77 | editor.commit(); 78 | 79 | // Toast.makeText(this, R.string.crash_error,Toast.LENGTH_LONG).show(); 80 | 81 | System.exit(0); 82 | // restartApp(); 83 | 84 | } catch (Exception e) { 85 | Log.e(TAG, "Exception Logger failed!", e); 86 | } 87 | 88 | } 89 | 90 | private void restartApp() { 91 | Intent intent = new Intent(getApplicationContext(), StartActivity.class); 92 | int mPendingIntentId = 1337; 93 | PendingIntent mPendingIntent = PendingIntent.getActivity(getApplicationContext(), mPendingIntentId, intent, PendingIntent.FLAG_IMMUTABLE); 94 | AlarmManager mgr = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); 95 | mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent); 96 | System.exit(0); 97 | } 98 | } -------------------------------------------------------------------------------- /app/src/main/java/de/tuberlin/mcc/simra/app/util/SimRAuthenticator.java: -------------------------------------------------------------------------------- 1 | package de.tuberlin.mcc.simra.app.util; 2 | 3 | import android.content.Context; 4 | 5 | import java.io.BufferedInputStream; 6 | import java.io.ByteArrayOutputStream; 7 | import java.io.IOException; 8 | import java.io.InputStream; 9 | import java.text.SimpleDateFormat; 10 | import java.util.Date; 11 | 12 | public class SimRAuthenticator { 13 | public static final SimpleDateFormat DATE_PATTERN_SHORT = new SimpleDateFormat("dd.MM.yyyy"); 14 | 15 | public static String getClientHash(Context context) { 16 | Date dateToday = new Date(); 17 | String hashSuffix = ""; 18 | try { 19 | InputStream hashInput = new BufferedInputStream(context.getResources().getAssets().open("hash-suffix.h")); 20 | ByteArrayOutputStream result = new ByteArrayOutputStream(); 21 | byte[] buffer = new byte[1024]; 22 | int length; 23 | while ((length = hashInput.read(buffer)) != -1) { 24 | result.write(buffer, 0, length); 25 | } 26 | // StandardCharsets.UTF_8.name() > JDK 7 27 | hashSuffix = result.toString("UTF-8"); 28 | } catch (IOException e) { 29 | e.printStackTrace(); 30 | } 31 | 32 | return Integer.toHexString((DATE_PATTERN_SHORT.format(dateToday) + hashSuffix).hashCode()); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/de/tuberlin/mcc/simra/app/util/UnitHelper.java: -------------------------------------------------------------------------------- 1 | package de.tuberlin.mcc.simra.app.util; 2 | 3 | import android.content.Context; 4 | 5 | import java.util.Collections; 6 | import java.util.Map; 7 | import java.util.concurrent.ConcurrentHashMap; 8 | 9 | import de.tuberlin.mcc.simra.app.R; 10 | 11 | public class UnitHelper { 12 | public static String getShortTranslationForUnit(DISTANCE unit, Context context) { 13 | switch (unit) { 14 | case IMPERIAL: 15 | return context.getString(R.string.feet_short); 16 | default: 17 | return context.getString(R.string.meter_short); 18 | } 19 | } 20 | 21 | public static long convertMeterToFeet(int meter) { 22 | return Math.round(meter * 3.28); 23 | } 24 | 25 | public static long convertFeetToMeter(int feet) { 26 | return Math.round(feet / 3.28); 27 | } 28 | 29 | public enum DISTANCE { 30 | /** 31 | * Metric System using meter and cm 32 | */ 33 | METRIC("m"), 34 | /** 35 | * Imperial System using miles and inches 36 | */ 37 | IMPERIAL("ft"); 38 | 39 | private static final Map ENUM_MAP; 40 | 41 | static { 42 | // Build an immutable map of String name to enum pairs. (for faster access) 43 | Map map = new ConcurrentHashMap<>(); 44 | for (DISTANCE instance : DISTANCE.values()) { 45 | map.put(instance.getName(), instance); 46 | } 47 | ENUM_MAP = Collections.unmodifiableMap(map); 48 | } 49 | 50 | private String name; 51 | 52 | DISTANCE(String unit_name) { 53 | name = unit_name; 54 | } 55 | 56 | 57 | public static DISTANCE parseFromString(String name) { 58 | return ENUM_MAP.get(name); 59 | } 60 | 61 | public String getName() { 62 | return this.name; 63 | } 64 | } 65 | 66 | } 67 | -------------------------------------------------------------------------------- /app/src/main/java/de/tuberlin/mcc/simra/app/util/UpdateHelper.java: -------------------------------------------------------------------------------- 1 | package de.tuberlin.mcc.simra.app.util; 2 | import android.content.Context; 3 | import de.tuberlin.mcc.simra.app.BuildConfig; 4 | import de.tuberlin.mcc.simra.app.update.VersionUpdater; 5 | 6 | public class UpdateHelper { 7 | 8 | /** 9 | * Migrate Shared Prefs Data from previous Versions to the current 10 | * 11 | * @param context 12 | */ 13 | public static void migrate(Context context) { 14 | int lastAppVersion = SharedPref.lookUpIntSharedPrefs("App-Version", -1, "simraPrefs", context); 15 | VersionUpdater.updateToV27(context, lastAppVersion); 16 | VersionUpdater.updateToV30(context, lastAppVersion); 17 | VersionUpdater.updateToV31(context, lastAppVersion); 18 | VersionUpdater.updateToV32(context, lastAppVersion); 19 | VersionUpdater.updateToV39(context, lastAppVersion); 20 | VersionUpdater.updateToV50(context, lastAppVersion); 21 | VersionUpdater.updateToV52(context, lastAppVersion); 22 | VersionUpdater.updateToV58(context, lastAppVersion); 23 | SharedPref.writeIntToSharedPrefs("App-Version", BuildConfig.VERSION_CODE, "simraPrefs", context); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/de/tuberlin/mcc/simra/app/util/ble/BleExtensions.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Punch Through Design LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package de.tuberlin.mcc.simra.app.util.ble 18 | 19 | import android.bluetooth.BluetoothGatt 20 | import android.bluetooth.BluetoothGattCharacteristic 21 | import android.bluetooth.BluetoothGattDescriptor 22 | import android.util.Log 23 | import de.tuberlin.mcc.simra.app.util.ConnectionManager.CCCD_UUID 24 | import java.util.Locale 25 | import java.util.UUID 26 | 27 | /** UUID of the Client Characteristic Configuration Descriptor (0x2902). */ 28 | private const val TAG = "BleExtensions_LOG" 29 | 30 | // BluetoothGatt 31 | 32 | fun BluetoothGatt.findCharacteristic(uuid: UUID): BluetoothGattCharacteristic? { 33 | services?.forEach { service -> 34 | service.characteristics?.firstOrNull { characteristic -> 35 | characteristic.uuid == uuid 36 | }?.let { matchingCharacteristic -> 37 | return matchingCharacteristic 38 | } 39 | } 40 | return null 41 | } 42 | 43 | fun BluetoothGatt.findDescriptor(uuid: UUID): BluetoothGattDescriptor? { 44 | services?.forEach { service -> 45 | service.characteristics.forEach { characteristic -> 46 | characteristic.descriptors?.firstOrNull { descriptor -> 47 | descriptor.uuid == uuid 48 | }?.let { matchingDescriptor -> 49 | return matchingDescriptor 50 | } 51 | } 52 | } 53 | return null 54 | } 55 | 56 | // BluetoothGattCharacteristic 57 | 58 | fun BluetoothGattCharacteristic.isReadable(): Boolean = 59 | containsProperty(BluetoothGattCharacteristic.PROPERTY_READ) 60 | 61 | fun BluetoothGattCharacteristic.isWritable(): Boolean = 62 | containsProperty(BluetoothGattCharacteristic.PROPERTY_WRITE) 63 | 64 | fun BluetoothGattCharacteristic.isWritableWithoutResponse(): Boolean = 65 | containsProperty(BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE) 66 | 67 | fun BluetoothGattCharacteristic.isNotifiable(): Boolean = 68 | containsProperty(BluetoothGattCharacteristic.PROPERTY_NOTIFY) 69 | 70 | fun BluetoothGattCharacteristic.containsProperty(property: Int): Boolean = 71 | properties and property != 0 72 | 73 | // BluetoothGattDescriptor 74 | 75 | fun BluetoothGattDescriptor.isReadable(): Boolean = 76 | containsPermission(BluetoothGattDescriptor.PERMISSION_READ) 77 | 78 | fun BluetoothGattDescriptor.isWritable(): Boolean = 79 | containsPermission(BluetoothGattDescriptor.PERMISSION_WRITE) 80 | 81 | fun BluetoothGattDescriptor.containsPermission(permission: Int): Boolean = 82 | permissions and permission != 0 83 | 84 | /** 85 | * Convenience extension function that returns true if this [BluetoothGattDescriptor] 86 | * is a Client Characteristic Configuration Descriptor. 87 | */ 88 | fun BluetoothGattDescriptor.isCccd() = 89 | uuid.toString().uppercase(Locale.ROOT) == CCCD_UUID.toString() .uppercase(Locale.ROOT) -------------------------------------------------------------------------------- /app/src/main/java/de/tuberlin/mcc/simra/app/util/ble/ConnectionEventListener.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Punch Through Design LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package de.tuberlin.mcc.simra.app.util.ble 17 | 18 | import android.bluetooth.BluetoothDevice 19 | import android.bluetooth.BluetoothGatt 20 | import android.bluetooth.BluetoothGattCharacteristic 21 | import android.bluetooth.BluetoothGattDescriptor 22 | import de.tuberlin.mcc.simra.app.util.ConnectionManager 23 | 24 | /** A listener containing callback methods to be registered with [ConnectionManager].*/ 25 | open class ConnectionEventListener { 26 | open var onConnectionSetupComplete: ((BluetoothGatt) -> Unit)? = null 27 | open var onScanStart:((Boolean) -> Unit)? = null 28 | open var onScanStop:((Boolean) -> Unit)? = null 29 | open var onDisconnect: ((BluetoothDevice) -> Unit)? = null 30 | open var onDescriptorRead: ((BluetoothDevice, BluetoothGattDescriptor) -> Unit)? = null 31 | open var onDescriptorWrite: ((BluetoothDevice, BluetoothGattDescriptor) -> Unit)? = null 32 | open var onCharacteristicChanged: ((BluetoothDevice, BluetoothGattCharacteristic) -> Unit)? = null 33 | open var onCharacteristicRead: ((BluetoothDevice, BluetoothGattCharacteristic) -> Unit)? = null 34 | open var onNotificationsEnabled: ((BluetoothDevice, BluetoothGattCharacteristic) -> Unit)? = null 35 | open var onNotificationsDisabled: ((BluetoothDevice, BluetoothGattCharacteristic) -> Unit)? = null 36 | open var onDeviceFound:((BluetoothDevice) -> Unit)? = null 37 | open var onSensorDistanceNotification:((ConnectionManager.Measurement) -> Unit)? = null 38 | open var onClosePassNotification:((ConnectionManager.Measurement) -> Unit)? = null 39 | open var onTimeRead:((Int) -> Unit)? = null 40 | open var onConnectionFailed: ((BluetoothDevice) -> Unit)? = null 41 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/dashboard_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-hdpi/dashboard_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/edit_event_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-hdpi/edit_event_blue.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/edit_event_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-hdpi/edit_event_green.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/edited_event_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-hdpi/edited_event_blue.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/edited_event_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-hdpi/edited_event_green.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/globe_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-hdpi/globe_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_route.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-hdpi/ic_route.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/racingflagblack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-hdpi/racingflagblack.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/racingflagwhite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-hdpi/racingflagwhite.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/startblack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-hdpi/startblack.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/startwhite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-hdpi/startwhite.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/twitter_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-hdpi/twitter_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/dashboard_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-mdpi/dashboard_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/edit_event_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-mdpi/edit_event_blue.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/edit_event_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-mdpi/edit_event_green.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/edited_event_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-mdpi/edited_event_blue.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/edited_event_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-mdpi/edited_event_green.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/globe_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-mdpi/globe_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_route.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-mdpi/ic_route.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/racingflagblack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-mdpi/racingflagblack.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/racingflagwhite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-mdpi/racingflagwhite.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/startblack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-mdpi/startblack.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/startwhite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-mdpi/startwhite.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/twitter_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-mdpi/twitter_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/person.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-v24/person.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/dashboard_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xhdpi/dashboard_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/edit_event_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xhdpi/edit_event_blue.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/edit_event_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xhdpi/edit_event_green.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/edited_event_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xhdpi/edited_event_blue.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/edited_event_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xhdpi/edited_event_green.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/globe_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xhdpi/globe_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_route.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xhdpi/ic_route.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/racingflagblack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xhdpi/racingflagblack.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/racingflagwhite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xhdpi/racingflagwhite.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/startblack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xhdpi/startblack.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/startwhite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xhdpi/startwhite.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/twitter_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xhdpi/twitter_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/dashboard_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xxhdpi/dashboard_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/edit_event_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xxhdpi/edit_event_blue.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/edit_event_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xxhdpi/edit_event_green.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/edited_event_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xxhdpi/edited_event_blue.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/edited_event_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xxhdpi/edited_event_green.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/globe_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xxhdpi/globe_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_route.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xxhdpi/ic_route.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/racingflagblack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xxhdpi/racingflagblack.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/racingflagwhite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xxhdpi/racingflagwhite.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/startblack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xxhdpi/startblack.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/startwhite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xxhdpi/startwhite.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/twitter_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xxhdpi/twitter_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/dashboard_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xxxhdpi/dashboard_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/edit_event_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xxxhdpi/edit_event_blue.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/edit_event_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xxxhdpi/edit_event_green.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/edited_event_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xxxhdpi/edited_event_blue.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/edited_event_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xxxhdpi/edited_event_green.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/globe_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xxxhdpi/globe_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_route.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xxxhdpi/ic_route.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/racingflagblack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xxxhdpi/racingflagblack.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/racingflagwhite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xxxhdpi/racingflagwhite.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/startblack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xxxhdpi/startblack.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/startwhite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xxxhdpi/startwhite.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/twitter_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable-xxxhdpi/twitter_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/border.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/button_pressed.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 12 | 13 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/button_unpressed.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/cancel_icon_640.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable/cancel_icon_640.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/co2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable/co2.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_access_time_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_alt_route_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_back_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_back_blue_24dp.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_connect_without_contact_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_email_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_feedback_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_touch_app_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_web_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_bluetooth.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_bluetooth_connected.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_bluetooth_disabled.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_bluetooth_searching.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_cancel.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_cloud_done_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_co2.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_content_paste_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_copyright_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_directions_car_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_face_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_file_upload_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_help_outline_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_help_outline_blue_24dp.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_help_outline_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_info_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_instagram_logo.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_list_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_nav_mcc.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_phone_android_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_save.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_save_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_security_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settings_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_tachometer.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_timer_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_today_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_traffic_light_red.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_twitter_logo_blue.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_undo.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/mcc_ecdf.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable/mcc_ecdf.PNG -------------------------------------------------------------------------------- /app/src/main/res/drawable/my_center.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable/my_center.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ok_icon_640.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable/ok_icon_640.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/profile_region_border.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/racingflag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable/racingflag.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/racingflagwhite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable/racingflagwhite.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ripple_effect.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_white.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 14 | 15 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/route.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable/route.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/shadow_gradient.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/simra_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable/simra_logo.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/start.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable/start.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/startwhite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable/startwhite.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/stop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable/stop.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/tap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable/tap.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/tap_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable/tap_64.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/tap_blck.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable/tap_blck.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/tap_blck_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable/tap_blck_64.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/traffic_light_in_red_signal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable/traffic_light_in_red_signal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/tu_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable/tu_logo.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/tutorial.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/drawable/tutorial.gif -------------------------------------------------------------------------------- /app/src/main/res/font/assistant_extralight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simra-project/simra-android/911097f28f10687c081dcbf0f593fa93ef28f191/app/src/main/res/font/assistant_extralight.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/bungee_shade.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_about.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 12 | 13 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_contact.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | 12 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_credits.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | 12 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_feedback.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 12 | 13 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_help.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_history.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 13 | 14 | 22 | 23 | 32 | 33 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 17 | 18 | 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_openbikesensor.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 13 | 14 | 20 | 21 | 28 | 29 |