WIP: Updating build to be buildable in new Android Studio env

This commit is contained in:
2023-11-16 18:09:14 -06:00
parent 525040fb33
commit 8d0602e83a
36 changed files with 558 additions and 266 deletions

View File

@@ -1,43 +0,0 @@
apply plugin: 'com.android.application'
android.defaultConfig.vectorDrawables.useSupportLibrary = true
android {
compileSdkVersion 29
buildToolsVersion "29.0.3"
defaultConfig {
applicationId "org.timecrafters.TimeCraftersConfigurationTool"
minSdkVersion 16
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'net.sourceforge.streamsupport:streamsupport:1.7.4'
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'com.google.android.material:material:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.coordinatorlayout:coordinatorlayout:1.1.0'
implementation 'androidx.vectordrawable:vectordrawable:1.1.0'
implementation 'androidx.navigation:navigation-fragment:2.1.0'
implementation 'androidx.navigation:navigation-ui:2.1.0'
implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

73
app/build.gradle.kts Normal file
View File

@@ -0,0 +1,73 @@
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
}
android {
namespace = "org.timecrafters.TimeCraftersConfigurationTool"
compileSdk = 34
defaultConfig {
applicationId = "org.timecrafters.timecraftersconfigurationtool"
minSdk = 24
targetSdk = 34
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary = true
}
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
buildFeatures {
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.4.3"
}
packaging {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
}
}
}
dependencies {
implementation("com.google.code.gson:gson:2.10.1")
implementation("androidx.navigation:navigation-ui:2.7.5")
val appcompat_version = "1.6.1"
implementation("androidx.appcompat:appcompat:$appcompat_version")
// For loading and tinting drawables on older versions of the platform
implementation("androidx.appcompat:appcompat-resources:$appcompat_version")
implementation("androidx.core:core-ktx:1.12.0")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2")
implementation("androidx.activity:activity-compose:1.8.1")
implementation(platform("androidx.compose:compose-bom:2023.03.00"))
implementation("androidx.compose.ui:ui")
implementation("androidx.compose.ui:ui-graphics")
implementation("androidx.compose.ui:ui-tooling-preview")
implementation("androidx.compose.material3:material3")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
androidTestImplementation(platform("androidx.compose:compose-bom:2023.03.00"))
androidTestImplementation("androidx.compose.ui:ui-test-junit4")
debugImplementation("androidx.compose.ui:ui-tooling")
debugImplementation("androidx.compose.ui:ui-test-manifest")
}

View File

@@ -1,26 +0,0 @@
package org.timecrafters.TimeCraftersConfigurationTool;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("org.timecrafters.TimeCraftersConfigurationTool", appContext.getPackageName());
}
}

View File

@@ -0,0 +1,24 @@
package org.timecrafters.timecraftersconfigurationtool
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.Assert.*
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("org.timecrafters.timecraftersconfigurationtool", appContext.packageName)
}
}

View File

@@ -12,12 +12,15 @@
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:requestLegacyExternalStorage="true"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
android:theme="@style/AppTheme"
tools:targetApi="31">
<service
android:name=".tacnet.TACNETServerService"
android:enabled="true"
@@ -60,5 +63,4 @@
</intent-filter>
</receiver>
</application>
</manifest>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

View File

@@ -4,7 +4,6 @@ import android.Manifest;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

View File

@@ -19,6 +19,7 @@ import androidx.navigation.ui.NavigationUI;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.bottomnavigation.LabelVisibilityMode;
import com.google.android.material.navigation.NavigationBarView;
import org.timecrafters.TimeCraftersConfigurationTool.backend.Backend;
import org.timecrafters.TimeCraftersConfigurationTool.backend.TAC;
@@ -54,7 +55,7 @@ public class MainActivity extends AppCompatActivity {
Backend.instance().mainActivity = this;
if (Backend.instance().getSettings().mobileShowNavigationLabels) {
navView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
navView.setLabelVisibilityMode(NavigationBarView.LABEL_VISIBILITY_LABELED);
}
// Auto start TACNET server if allowed and device model contains AUTO_START_MODEL

View File

@@ -249,33 +249,29 @@ public class VariableDialog extends TimeCraftersDialog {
menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.boolean_type: {
setVariableType("boolean");
return true;
}
case R.id.double_type: {
setVariableType("double");
return true;
}
case R.id.float_type: {
setVariableType("float");
return true;
}
case R.id.integer_type: {
setVariableType("integer");
return true;
}
case R.id.long_type: {
setVariableType("long");
return true;
}
case R.id.string_type: {
setVariableType("string");
return true;
}
final int itemID = item.getItemId();
if (itemID == R.id.boolean_type) {
setVariableType("boolean");
return true;
} else if (itemID == R.id.double_type) {
setVariableType("double");
return true;
} else if (itemID == R.id.float_type) {
setVariableType("float");
return true;
} else if (itemID == R.id.integer_type) {
setVariableType("integer");
return true;
} else if (itemID == R.id.long_type) {
setVariableType("long");
return true;
} else if (itemID == R.id.string_type) {
setVariableType("string");
return true;
} else {
return false;
}
return false;
}
});

View File

@@ -209,28 +209,27 @@ public class ActionsFragment extends TimeCraftersFragment {
menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.clone: {
CloneDialog dialog = new CloneDialog();
Bundle bundle = new Bundle();
bundle.putInt("group_index", getArguments().getInt("group_index"));
bundle.putInt("action_index", action_index);
dialog.setArguments(bundle);
dialog.show(getFragmentManager(), "clone_dialog");
return true;
}
case R.id.save_as_preset: {
PresetDialog dialog = new PresetDialog();
Bundle bundle = new Bundle();
bundle.putInt("group_index", getArguments().getInt("group_index"));
bundle.putInt("action_index", action_index);
bundle.putBoolean("is_new_preset", true);
dialog.setArguments(bundle);
dialog.show(getFragmentManager(), "preset_dialog");
return true;
}
default:
return false;
final int itemID = item.getItemId();
if (itemID == R.id.clone) {
CloneDialog dialog = new CloneDialog();
Bundle bundle = new Bundle();
bundle.putInt("group_index", getArguments().getInt("group_index"));
bundle.putInt("action_index", action_index);
dialog.setArguments(bundle);
dialog.show(getFragmentManager(), "clone_dialog");
return true;
} else if (itemID == R.id.save_as_preset) {
PresetDialog dialog = new PresetDialog();
Bundle bundle = new Bundle();
bundle.putInt("group_index", getArguments().getInt("group_index"));
bundle.putInt("action_index", action_index);
bundle.putBoolean("is_new_preset", true);
dialog.setArguments(bundle);
dialog.show(getFragmentManager(), "preset_dialog");
return true;
} else {
return false;
}
}
});
@@ -246,21 +245,21 @@ public class ActionsFragment extends TimeCraftersFragment {
menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.add_from_preset: {
AddFromPresetDialog dialog = new AddFromPresetDialog();
Bundle bundle = new Bundle();
bundle.putBoolean("show_actions", true);
if (groupIsPreset) {
bundle.putBoolean("group_is_preset", true);
}
bundle.putInt("group_index", getArguments().getInt("group_index"));
dialog.setArguments(bundle);
dialog.show(getFragmentManager(), "add_from_preset_dialog");
return true;
final int itemID = item.getItemId();
if (itemID == R.id.add_from_preset) {
AddFromPresetDialog dialog = new AddFromPresetDialog();
Bundle bundle = new Bundle();
bundle.putBoolean("show_actions", true);
if (groupIsPreset) {
bundle.putBoolean("group_is_preset", true);
}
default:
return false;
bundle.putInt("group_index", getArguments().getInt("group_index"));
dialog.setArguments(bundle);
dialog.show(getFragmentManager(), "add_from_preset_dialog");
return true;
} else {
return false;
}
}
});

View File

@@ -187,26 +187,27 @@ public class GroupsFragment extends TimeCraftersFragment {
menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.clone: {
CloneDialog dialog = new CloneDialog();
Bundle bundle = new Bundle();
bundle.putInt("group_index", group_index);
dialog.setArguments(bundle);
dialog.show(getFragmentManager(), "clone_dialog");
return true;
}
case R.id.save_as_preset: {
PresetDialog dialog = new PresetDialog();
Bundle bundle = new Bundle();
bundle.putBoolean("is_new_preset", true);
bundle.putInt("group_index", group_index);
dialog.setArguments(bundle);
dialog.show(getFragmentManager(), "preset_dialog");
return true;
}
default:
return false;
final int itemID = item.getItemId();
if (itemID == R.id.clone) {
CloneDialog dialog = new CloneDialog();
Bundle bundle = new Bundle();
bundle.putInt("group_index", group_index);
dialog.setArguments(bundle);
dialog.show(getFragmentManager(), "clone_dialog");
return true;
} else if (itemID == R.id.save_as_preset) {
PresetDialog dialog = new PresetDialog();
Bundle bundle = new Bundle();
bundle.putBoolean("is_new_preset", true);
bundle.putInt("group_index", group_index);
dialog.setArguments(bundle);
dialog.show(getFragmentManager(), "preset_dialog");
return true;
} else {
return false;
}
}
});
@@ -222,17 +223,17 @@ public class GroupsFragment extends TimeCraftersFragment {
menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.add_from_preset: {
AddFromPresetDialog dialog = new AddFromPresetDialog();
Bundle bundle = new Bundle();
bundle.putBoolean("show_actions", false);
dialog.setArguments(bundle);
dialog.show(getFragmentManager(), "add_from_preset_dialog");
return true;
}
default:
return false;
final int itemID = item.getItemId();
if (itemID == R.id.add_from_preset) {
AddFromPresetDialog dialog = new AddFromPresetDialog();
Bundle bundle = new Bundle();
bundle.putBoolean("show_actions", false);
dialog.setArguments(bundle);
dialog.show(getFragmentManager(), "add_from_preset_dialog");
return true;
} else {
return false;
}
}
});

View File

@@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>

View File

@@ -0,0 +1,30 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="85.84757"
android:endY="92.4963"
android:startX="42.9492"
android:startY="49.59793"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:app="http://schemas.android.com/apk/res"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.TimeCraftersConfigurationTool" parent="android:Theme.Material.Light.NoActionBar" />
</resources>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?><!--
Sample backup rules file; uncomment and customize as necessary.
See https://developer.android.com/guide/topics/data/autobackup
for details.
Note: This file is ignored for devices older that API 31
See https://developer.android.com/about/versions/12/backup-restore
-->
<full-backup-content>
<!--
<include domain="sharedpref" path="."/>
<exclude domain="sharedpref" path="device.xml"/>
-->
</full-backup-content>

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?><!--
Sample data extraction rules file; uncomment and customize as necessary.
See https://developer.android.com/about/versions/12/backup-restore#xml-changes
for details.
-->
<data-extraction-rules>
<cloud-backup>
<!-- TODO: Use <include> and <exclude> to control what is backed up.
<include .../>
<exclude .../>
-->
</cloud-backup>
<!--
<device-transfer>
<include .../>
<exclude .../>
</device-transfer>
-->
</data-extraction-rules>

View File

@@ -1,17 +0,0 @@
package org.timecrafters.TimeCraftersConfigurationTool;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() {
assertEquals(4, 2 + 2);
}
}

View File

@@ -0,0 +1,17 @@
package org.timecrafters.timecraftersconfigurationtool
import org.junit.Test
import org.junit.Assert.*
/**
* Example local unit test, which will execute on the development machine (host).
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
class ExampleUnitTest {
@Test
fun addition_isCorrect() {
assertEquals(4, 2 + 2)
}
}