├── app ├── .gitignore ├── release │ ├── app-release.apk │ └── output.json ├── src │ ├── main │ │ ├── res │ │ │ ├── mipmap-hdpi │ │ │ │ ├── logo.png │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── values │ │ │ │ ├── dimens.xml │ │ │ │ ├── styles.xml │ │ │ │ ├── colors.xml │ │ │ │ └── strings.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ ├── drawable │ │ │ │ ├── ic_home_black_24dp.xml │ │ │ │ ├── ic_fast_forward_black_24dp.xml │ │ │ │ ├── ic_dashboard_black_24dp.xml │ │ │ │ ├── ic_info_outline_black_24dp.xml │ │ │ │ ├── ic_notifications_black_24dp.xml │ │ │ │ ├── ic_date_range_black_24dp.xml │ │ │ │ └── ic_launcher_background.xml │ │ │ ├── xml │ │ │ │ └── device_admin_receiver.xml │ │ │ ├── layout │ │ │ │ ├── password_alert.xml │ │ │ │ ├── participant_name.xml │ │ │ │ ├── fragment_schedule.xml │ │ │ │ ├── activity_main.xml │ │ │ │ ├── fragment_quick_mode.xml │ │ │ │ ├── fragment_status.xml │ │ │ │ └── fragment_settings.xml │ │ │ ├── menu │ │ │ │ └── navigation.xml │ │ │ └── drawable-v24 │ │ │ │ └── ic_launcher_foreground.xml │ │ ├── images │ │ │ ├── bettervent logo.xcf │ │ │ └── bettervent logo small.xcf │ │ ├── java │ │ │ └── edu │ │ │ │ └── rit │ │ │ │ └── csh │ │ │ │ └── bettervent │ │ │ │ ├── AdminReceiver.kt │ │ │ │ ├── ApiAsyncTask.kt │ │ │ │ ├── ParticipantListAdapter.kt │ │ │ │ ├── QuickModeFragment.kt │ │ │ │ ├── SettingsFragment.kt │ │ │ │ ├── ScheduleFragment.kt │ │ │ │ ├── StatusFragment.kt │ │ │ │ └── MainActivity.kt │ │ └── AndroidManifest.xml │ ├── test │ │ └── java │ │ │ └── edu │ │ │ └── rit │ │ │ └── csh │ │ │ └── bettervent │ │ │ └── ExampleUnitTest.java │ └── androidTest │ │ └── java │ │ └── edu │ │ └── rit │ │ └── csh │ │ └── bettervent │ │ └── ExampleInstrumentedTest.java ├── proguard-rules.pro └── build.gradle ├── settings.gradle ├── 3d_files ├── STLs │ ├── BACK_1.stl │ ├── BACK_2.stl │ ├── FRONT_1.stl │ ├── FRONT_2.stl │ ├── FOFF_BACK.stl │ ├── FOFF_FRONT.stl │ ├── FOFF_V2.2_BACK.stl │ └── FOFF_V2.2_FRONT.stl └── foff_tablet_case_holder_V2.2.FCStd ├── .idea ├── caches │ └── gradle_models.ser ├── encodings.xml ├── vcs.xml ├── gradle.xml ├── codeStyles │ └── Project.xml └── misc.xml ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── BetterVent_Screenshots ├── newthing.png ├── free_upcoming.png ├── dark_calendar_view.png ├── free_not_upcoming.png ├── reserved_upcoming.png ├── reserved_not_upcoming.png ├── Screenshot_20190121_042156.png ├── Screenshot_20190121_042312.png ├── Screenshot_20190121_042504.png ├── Screenshot_20190121_042635.png ├── Screenshot_20190302-044311_BetterVent.jpg ├── Screenshot_20190302-044442_BetterVent.jpg ├── Screenshot_20190302-044505_BetterVent.jpg ├── Screenshot_20190302-045308_BetterVent.jpg └── Screenshot_20190302-045456_BetterVent.jpg ├── .gitignore ├── gradle.properties ├── gradlew.bat ├── README.md ├── gradlew └── LICENSE /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | -------------------------------------------------------------------------------- /3d_files/STLs/BACK_1.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/3d_files/STLs/BACK_1.stl -------------------------------------------------------------------------------- /3d_files/STLs/BACK_2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/3d_files/STLs/BACK_2.stl -------------------------------------------------------------------------------- /3d_files/STLs/FRONT_1.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/3d_files/STLs/FRONT_1.stl -------------------------------------------------------------------------------- /3d_files/STLs/FRONT_2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/3d_files/STLs/FRONT_2.stl -------------------------------------------------------------------------------- /3d_files/STLs/FOFF_BACK.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/3d_files/STLs/FOFF_BACK.stl -------------------------------------------------------------------------------- /3d_files/STLs/FOFF_FRONT.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/3d_files/STLs/FOFF_FRONT.stl -------------------------------------------------------------------------------- /app/release/app-release.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/app/release/app-release.apk -------------------------------------------------------------------------------- /.idea/caches/gradle_models.ser: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/.idea/caches/gradle_models.ser -------------------------------------------------------------------------------- /3d_files/STLs/FOFF_V2.2_BACK.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/3d_files/STLs/FOFF_V2.2_BACK.stl -------------------------------------------------------------------------------- /3d_files/STLs/FOFF_V2.2_FRONT.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/3d_files/STLs/FOFF_V2.2_FRONT.stl -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /BetterVent_Screenshots/newthing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/BetterVent_Screenshots/newthing.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/app/src/main/res/mipmap-hdpi/logo.png -------------------------------------------------------------------------------- /BetterVent_Screenshots/free_upcoming.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/BetterVent_Screenshots/free_upcoming.png -------------------------------------------------------------------------------- /app/src/main/images/bettervent logo.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/app/src/main/images/bettervent logo.xcf -------------------------------------------------------------------------------- /3d_files/foff_tablet_case_holder_V2.2.FCStd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/3d_files/foff_tablet_case_holder_V2.2.FCStd -------------------------------------------------------------------------------- /BetterVent_Screenshots/dark_calendar_view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/BetterVent_Screenshots/dark_calendar_view.png -------------------------------------------------------------------------------- /BetterVent_Screenshots/free_not_upcoming.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/BetterVent_Screenshots/free_not_upcoming.png -------------------------------------------------------------------------------- /BetterVent_Screenshots/reserved_upcoming.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/BetterVent_Screenshots/reserved_upcoming.png -------------------------------------------------------------------------------- /app/src/main/images/bettervent logo small.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/app/src/main/images/bettervent logo small.xcf -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /BetterVent_Screenshots/reserved_not_upcoming.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/BetterVent_Screenshots/reserved_not_upcoming.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /BetterVent_Screenshots/Screenshot_20190121_042156.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/BetterVent_Screenshots/Screenshot_20190121_042156.png -------------------------------------------------------------------------------- /BetterVent_Screenshots/Screenshot_20190121_042312.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/BetterVent_Screenshots/Screenshot_20190121_042312.png -------------------------------------------------------------------------------- /BetterVent_Screenshots/Screenshot_20190121_042504.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/BetterVent_Screenshots/Screenshot_20190121_042504.png -------------------------------------------------------------------------------- /BetterVent_Screenshots/Screenshot_20190121_042635.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/BetterVent_Screenshots/Screenshot_20190121_042635.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /BetterVent_Screenshots/Screenshot_20190302-044311_BetterVent.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/BetterVent_Screenshots/Screenshot_20190302-044311_BetterVent.jpg -------------------------------------------------------------------------------- /BetterVent_Screenshots/Screenshot_20190302-044442_BetterVent.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/BetterVent_Screenshots/Screenshot_20190302-044442_BetterVent.jpg -------------------------------------------------------------------------------- /BetterVent_Screenshots/Screenshot_20190302-044505_BetterVent.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/BetterVent_Screenshots/Screenshot_20190302-044505_BetterVent.jpg -------------------------------------------------------------------------------- /BetterVent_Screenshots/Screenshot_20190302-045308_BetterVent.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/BetterVent_Screenshots/Screenshot_20190302-045308_BetterVent.jpg -------------------------------------------------------------------------------- /BetterVent_Screenshots/Screenshot_20190302-045456_BetterVent.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ComputerScienceHouse/BetterVent/HEAD/BetterVent_Screenshots/Screenshot_20190302-045456_BetterVent.jpg -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches/build_file_checksums.ser 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | .DS_Store 9 | /build 10 | /captures 11 | .externalNativeBuild 12 | -------------------------------------------------------------------------------- /app/release/output.json: -------------------------------------------------------------------------------- 1 | [{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}] -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 6 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue Aug 27 01:40:07 EDT 2019 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_home_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_fast_forward_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dashboard_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/xml/device_admin_receiver.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/layout/password_alert.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/test/java/edu/rit/csh/bettervent/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package edu.rit.csh.bettervent; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_info_outline_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_notifications_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_date_range_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/layout/participant_name.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/menu/navigation.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 13 | 14 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx1536m 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | 15 | 16 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 19 | 20 | -------------------------------------------------------------------------------- /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/androidTest/java/edu/rit/csh/bettervent/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package edu.rit.csh.bettervent; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumented test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("edu.rit.csh.bettervent", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #008577 4 | #00574B 5 | #D81B60 6 | #5BA215 7 | #E11C52 8 | #000000 9 | #FFFFFF 10 | 11 | 12 | #296ba0 13 | #f57f68 14 | #87d288 15 | #f8b552 16 | #efefef 17 | #EEEEEE 18 | #CCCCCC 19 | #8f000000 20 | #2789e4 21 | #757575 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/java/edu/rit/csh/bettervent/AdminReceiver.kt: -------------------------------------------------------------------------------- 1 | package edu.rit.csh.bettervent 2 | 3 | import android.app.admin.DeviceAdminReceiver 4 | import android.content.Context 5 | import android.content.Intent 6 | import android.widget.Toast 7 | 8 | class AdminReceiver : DeviceAdminReceiver()// void showToast(Context context, String msg) { 9 | // String status = context.getString(R.string.admin_receiver_status, msg); 10 | // Toast.makeText(context, status, Toast.LENGTH_SHORT).show(); 11 | // } 12 | // 13 | // @Override 14 | // public void onEnabled(Context context, Intent intent) { 15 | // showToast(context, context.getString(R.string.admin_receiver_status_enabled)); 16 | // } 17 | // 18 | // @Override 19 | // public CharSequence onDisableRequested(Context context, Intent intent) { 20 | // return context.getString(R.string.admin_receiver_status_disable_warning); 21 | // } 22 | // 23 | // @Override 24 | // public void onDisabled(Context context, Intent intent) { 25 | // showToast(context, context.getString(R.string.admin_receiver_status_disabled)); 26 | // } -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_schedule.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 43 | 44 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android-extensions' 3 | apply plugin: 'kotlin-android' 4 | 5 | android { 6 | compileSdkVersion 28 7 | defaultConfig { 8 | applicationId "edu.rit.csh.bettervent" 9 | minSdkVersion 23 10 | targetSdkVersion 28 11 | versionCode 1 12 | versionName "1.0" 13 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 14 | vectorDrawables.useSupportLibrary = true 15 | multiDexEnabled true 16 | } 17 | buildTypes { 18 | release { 19 | minifyEnabled false 20 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 21 | } 22 | } 23 | } 24 | 25 | dependencies { 26 | implementation fileTree(dir: 'libs', include: ['*.jar']) 27 | implementation 'com.android.support:appcompat-v7:28.0.0' 28 | implementation 'com.android.support:design:28.0.0' 29 | implementation 'com.android.support:support-vector-drawable:28.0.0' 30 | implementation 'org.jetbrains.anko:anko-commons:0.10.8' 31 | implementation 'org.jetbrains.anko:anko-design:0.10.8' 32 | testImplementation 'junit:junit:4.12' 33 | androidTestImplementation 'com.android.support.test:runner:1.0.2' 34 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' 35 | implementation 'com.android.support.constraint:constraint-layout:1.1.3' 36 | 37 | // Google Calendar API dependencies 38 | implementation 'com.google.android.gms:play-services:12.0.1' 39 | api 'com.google.apis:google-api-services-calendar:v3-rev119-1.19.1' 40 | api 'com.google.api-client:google-api-client:1.23.0' 41 | api 'com.google.api-client:google-api-client-android:1.23.0' 42 | api 'com.google.api-client:google-api-client-gson:1.19.1' 43 | 44 | implementation 'com.github.thellmund:Android-Week-View:3.1.3' 45 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 46 | } 47 | 48 | configurations { 49 | all { 50 | exclude module: 'httpclient' 51 | } 52 | } 53 | repositories { 54 | mavenCentral() 55 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 10 | 11 | 12 | 15 | 16 | 23 | 27 | 29 | 30 | 31 | 32 | 33 | 37 | 38 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | BetterVent 3 | HomeActivity 4 | Home 5 | Dashboard 6 | Notifications 7 | Event Time 8 | Next Event Title 9 | Event Title 10 | Next Event 11 | Next Event Time 12 | Reserved 13 | Free 14 | BetterVent 15 | Allows kiosk mode to be enabled so that the app cannot be quit by a non-administrator 16 | Settings 17 | Event Filtering Keywords 18 | Colors 19 | Separate keywords with commas 20 | Enter keywords to only display events that contain those words 21 | Status Page Colors 22 | Enter a hex number 23 | This room is currently reserved for: 24 | Enter event title... 25 | Add 26 | Participants: 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 19 | 20 | 32 | 33 | 46 | 47 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /app/src/main/java/edu/rit/csh/bettervent/ApiAsyncTask.kt: -------------------------------------------------------------------------------- 1 | package edu.rit.csh.bettervent 2 | 3 | import android.content.Context 4 | import android.content.SharedPreferences 5 | import android.os.AsyncTask 6 | import com.google.api.client.googleapis.extensions.android.gms.auth.GooglePlayServicesAvailabilityIOException 7 | import com.google.api.client.googleapis.extensions.android.gms.auth.UserRecoverableAuthIOException 8 | import com.google.api.client.util.DateTime 9 | 10 | import com.google.api.services.calendar.model.* 11 | 12 | import java.io.IOException 13 | 14 | /** 15 | * An asynchronous task that handles the Google Calendar API call. 16 | * Placing the API calls in their own task ensures the UI stays responsive. 17 | */ 18 | 19 | /** 20 | * Created by miguel on 5/29/15. 21 | */ 22 | 23 | class ApiAsyncTask 24 | /** 25 | * Constructor. 26 | * @param activity MainActivity that spawned this task. 27 | */ 28 | internal constructor(private val mainActivity: MainActivity) : AsyncTask() { 29 | 30 | private val appSettings: SharedPreferences? = null 31 | 32 | /** 33 | * Background task to call Google Calendar API. 34 | * @param params no parameters needed for this task. 35 | */ 36 | override fun doInBackground(vararg params: Void): Void? { 37 | try { 38 | mainActivity.clearResultsText() 39 | mainActivity.updateResultsText(getDataFromApi(mainActivity.calendarID!!, mainActivity.maxResults)) 40 | 41 | } catch (availabilityException: GooglePlayServicesAvailabilityIOException) { 42 | // mainActivity.showGooglePlayServicesAvailabilityErrorDialog( 43 | // availabilityException.getConnectionStatusCode()); //TODO: Display error when unable to fetch events. 44 | System.err.println("Error connecting to Google Play Services. Error code: " + availabilityException.connectionStatusCode) 45 | 46 | 47 | } catch (userRecoverableException: UserRecoverableAuthIOException) { 48 | mainActivity.startActivityForResult( 49 | userRecoverableException.intent, 50 | MainActivity.REQUEST_AUTHORIZATION) 51 | 52 | } catch (e: IOException) { 53 | mainActivity.updateStatus("The following error occurred: " + e.message) 54 | } 55 | 56 | return null 57 | } 58 | 59 | /** 60 | * Fetch a list of the next 10 events from the primary calendar. 61 | * @return List of Strings describing returned events. 62 | * @throws IOException 63 | */ 64 | @Throws(IOException::class) 65 | private fun getDataFromApi(calendarID: String, maxResults: Int): List { 66 | // Load up app settings to fetch passwords and background colors. 67 | // System.out.println("*** Attempting to get data from API. ***"); 68 | // List the next 10 events from the primary calendar. 69 | val now = DateTime(System.currentTimeMillis()) 70 | val events = mainActivity.mService.events().list(calendarID) 71 | .setMaxResults(maxResults) 72 | .setTimeMin(now) 73 | .setOrderBy("startTime") 74 | .setSingleEvents(true) 75 | .execute() 76 | // println("*** items: " + events) 77 | return events.items 78 | } 79 | 80 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BetterVent 2 | A tablet-based reservation app written for Computer Science House. 3 |
4 | 5 | 6 | # What is it? 7 | BetterVent is a lightweight, open source, customizable android app that shows the status of conference rooms. 8 | It has three main functions: 9 | - Display the current event happening in a room as well as when the next event is 10 | 11 | View when the room is free: 12 | 13 | 14 | 15 | 16 | 17 | View when the room is reserved: 18 | 19 | 20 | 21 | - Show a week-view interface of events for the next seven days 22 | 23 | 24 | 25 | - A quick-mode function for ad-hoc events. Has an editable title field, as well as a name-list for queuing or attendance purposes 26 | 27 | 28 | 29 | 30 | 31 | # How do I get it? 32 | Currently, BetterVent is not on the Play Store, but you can download the .apk file in the releases tab. 33 | (I'll try to keep it up to date) 34 | 35 | # Future Features 36 | - Quality of life changes for Quick Mode 37 | - Add confirmation when leaving the fragment 38 | - Add button to clear Quick Mode without leaving the fragment 39 | - Anti tampering 40 | - Require a pattern of clicks on the escape squares to activate 41 | - Settings panel 42 | - Ability to filter events by keyword 43 | - Better parsing of event keywords 44 | - Set keywords that usually pertain to a location 45 | - Colors 46 | 47 | ## Device Admin 48 | To set the app as device admin (You need to do this before kiosk features work (Thanks, Google)) Connect to a computer and in the terminal (after installing adb) do this *BEFORE SETTING UP A GOOGLE ACCOUNT*: 49 | 50 | ``` 51 | adb shell 52 | dpm set-device-owner --user current edu.rit.csh.bettervent/.AdminReceiver 53 | ``` 54 | 55 | To remove device admins: 56 | 57 | ``` 58 | adb shell 59 | dpm remove-active-admin edu.rit.csh.bettervent/.AdminReceiver 60 | ``` 61 | 62 | ## Setting up the API for development 63 | If you want to develop for this app, you're going to have to set up your own dev environment. That involves getting the API set up properly. If you want to know how to do that, you can find instructions on it in here: https://github.com/WillNilges/CalendarQuickStart 64 | 65 | Here's the Google Developer's Console: https://console.developers.google.com/start/api?id=calendar 66 | 67 | Also, this command will be useful: `keytool -alias androiddebugkey -keystore ~/.android/debug.keystore -list -v` 68 | 69 | I will update this page with more detailed instructions before I die (probably). 70 | -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | xmlns:android 14 | 15 | ^$ 16 | 17 | 18 | 19 |
20 |
21 | 22 | 23 | 24 | xmlns:.* 25 | 26 | ^$ 27 | 28 | 29 | BY_NAME 30 | 31 |
32 |
33 | 34 | 35 | 36 | .*:id 37 | 38 | http://schemas.android.com/apk/res/android 39 | 40 | 41 | 42 |
43 |
44 | 45 | 46 | 47 | .*:name 48 | 49 | http://schemas.android.com/apk/res/android 50 | 51 | 52 | 53 |
54 |
55 | 56 | 57 | 58 | name 59 | 60 | ^$ 61 | 62 | 63 | 64 |
65 |
66 | 67 | 68 | 69 | style 70 | 71 | ^$ 72 | 73 | 74 | 75 |
76 |
77 | 78 | 79 | 80 | .* 81 | 82 | ^$ 83 | 84 | 85 | BY_NAME 86 | 87 |
88 |
89 | 90 | 91 | 92 | .* 93 | 94 | http://schemas.android.com/apk/res/android 95 | 96 | 97 | ANDROID_ATTRIBUTE_ORDER 98 | 99 |
100 |
101 | 102 | 103 | 104 | .* 105 | 106 | .* 107 | 108 | 109 | BY_NAME 110 | 111 |
112 |
113 |
114 |
115 |
116 |
-------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 33 | 53 | 54 | 55 | 56 | 57 | 58 | 60 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_quick_mode.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | 30 | 31 | 46 | 47 | 60 | 61 | 73 | 74 |