From 4cb379a4c16f4ebc3bd5885a4671ae2043597c67 Mon Sep 17 00:00:00 2001 From: Igor Ganapolsky Date: Fri, 28 Jul 2017 09:56:36 -0400 Subject: [PATCH] Update gradle versions. Update library versions. Fix gitignore file. Add Espresso test for RangingActivity. Lint and refactor RangingActivity. Format code. --- .gitignore | 19 --- app/build.gradle | 17 +-- .../beaconreference/RangingActivityTest.java | 111 ++++++++++++++++++ .../beaconreference/RangingActivity.java | 45 ++++--- app/src/main/res/layout/activity_ranging.xml | 17 ++- build.gradle | 6 +- gradle/wrapper/gradle-wrapper.properties | 4 +- 7 files changed, 158 insertions(+), 61 deletions(-) create mode 100644 app/src/androidTest/java/org/altbeacon/beaconreference/RangingActivityTest.java diff --git a/.gitignore b/.gitignore index a6c40ad..a56ccd2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,17 +1,3 @@ -# built application files -*.apk -*.ap_ - -# files for the dex VM -*.dex - -# Java class files -*.class -.gradle -local.properties -app/* -build/* - # generated files bin/ gen/ @@ -36,12 +22,7 @@ AndroidBeaconLibrary # Other gradle.properties .gradle -/local.properties -/.idea/workspace.xml .DS_Store .directory .env .ruby-gemset - -# Keep vendor libs out of repo -lib/ diff --git a/app/build.gradle b/app/build.gradle index 8c21203..c65dc80 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,13 +1,14 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 25 - buildToolsVersion "25.0.1" + compileSdkVersion 26 + buildToolsVersion "26.0.1" defaultConfig { applicationId "org.altbeacon.beaconreference" minSdkVersion 19 - targetSdkVersion 25 + targetSdkVersion 26 + testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner' } buildTypes { release { @@ -18,8 +19,10 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:support-v4:25.1.0' - //compile project(':android-beacon-library') - compile 'org.altbeacon:android-beacon-library:2+' + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'com.android.support:support-v4:26.0.0' + implementation 'org.altbeacon:android-beacon-library:2+' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.0', { + exclude group: 'com.android.support', module: 'support-annotations' + } } diff --git a/app/src/androidTest/java/org/altbeacon/beaconreference/RangingActivityTest.java b/app/src/androidTest/java/org/altbeacon/beaconreference/RangingActivityTest.java new file mode 100644 index 0000000..61f895a --- /dev/null +++ b/app/src/androidTest/java/org/altbeacon/beaconreference/RangingActivityTest.java @@ -0,0 +1,111 @@ +package org.altbeacon.beaconreference; + + +import android.Manifest; +import android.support.test.espresso.ViewInteraction; +import android.support.test.rule.ActivityTestRule; +import android.support.test.rule.GrantPermissionRule; +import android.support.test.runner.AndroidJUnit4; +import android.test.suitebuilder.annotation.LargeTest; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewParent; + +import org.hamcrest.Description; +import org.hamcrest.Matcher; +import org.hamcrest.TypeSafeMatcher; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.action.ViewActions.click; +import static android.support.test.espresso.action.ViewActions.closeSoftKeyboard; +import static android.support.test.espresso.action.ViewActions.replaceText; +import static android.support.test.espresso.assertion.ViewAssertions.matches; +import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; +import static android.support.test.espresso.matcher.ViewMatchers.withId; +import static android.support.test.espresso.matcher.ViewMatchers.withText; +import static org.hamcrest.Matchers.allOf; + +/** + * This test verifies that {@link RangingActivity} is opened with a {@link View} for displaying beacons. + */ +@LargeTest +@RunWith(AndroidJUnit4.class) +public class RangingActivityTest { + @Rule + public GrantPermissionRule mRuntimePermissionRule = GrantPermissionRule.grant(Manifest.permission.ACCESS_COARSE_LOCATION); + @Rule + public ActivityTestRule mActivityTestRule = new ActivityTestRule<>(MonitoringActivity.class); + + @Test + public void rangingActivityTest() { + ViewInteraction editText = onView( + allOf(withId(R.id.monitoringText), + childAtPosition( + childAtPosition( + withId(android.R.id.content), + 0), + 1), + isDisplayed())); + editText.perform(replaceText("Application just launched\nI have just switched from seeing/not seeing beacons: 0\n"), closeSoftKeyboard()); + + // Added a sleep statement to match the app's execution delay. + // The recommended way to handle such scenarios is to use Espresso idling resources: + // https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + ViewInteraction button2 = onView( + allOf(withId(R.id.Button01), withText("Start Ranging"), + childAtPosition( + childAtPosition( + withId(android.R.id.content), + 0), + 2), + isDisplayed())); + button2.perform(click()); + + // Added a sleep statement to match the app's execution delay. + // The recommended way to handle such scenarios is to use Espresso idling resources: + // https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html + try { + Thread.sleep(10000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + ViewInteraction textView_rangingText = onView( + allOf(withId(R.id.rangingText), + childAtPosition( + childAtPosition( + withId(android.R.id.content), + 0), + 0), + isDisplayed())); + textView_rangingText.check(matches(isDisplayed())); + } + + private static Matcher childAtPosition( + final Matcher parentMatcher, final int position) { + + return new TypeSafeMatcher() { + @Override + public void describeTo(Description description) { + description.appendText("Child at position " + position + " in parent "); + parentMatcher.describeTo(description); + } + + @Override + public boolean matchesSafely(View view) { + ViewParent parent = view.getParent(); + return parent instanceof ViewGroup && parentMatcher.matches(parent) + && view.equals(((ViewGroup) parent).getChildAt(position)); + } + }; + } +} diff --git a/app/src/main/java/org/altbeacon/beaconreference/RangingActivity.java b/app/src/main/java/org/altbeacon/beaconreference/RangingActivity.java index 8770daa..c439d70 100644 --- a/app/src/main/java/org/altbeacon/beaconreference/RangingActivity.java +++ b/app/src/main/java/org/altbeacon/beaconreference/RangingActivity.java @@ -1,25 +1,23 @@ package org.altbeacon.beaconreference; -import java.util.Collection; - import android.app.Activity; - import android.os.Bundle; import android.os.RemoteException; import android.util.Log; import android.widget.EditText; -import org.altbeacon.beacon.AltBeacon; import org.altbeacon.beacon.Beacon; import org.altbeacon.beacon.BeaconConsumer; import org.altbeacon.beacon.BeaconManager; -import org.altbeacon.beacon.BeaconParser; import org.altbeacon.beacon.RangeNotifier; import org.altbeacon.beacon.Region; +import java.util.Collection; + public class RangingActivity extends Activity implements BeaconConsumer { - protected static final String TAG = "RangingActivity"; - private BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this); + private static final String TAG = RangingActivity.class.getCanonicalName(); + + private final BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this); @Override protected void onCreate(Bundle savedInstanceState) { @@ -29,19 +27,19 @@ protected void onCreate(Bundle savedInstanceState) { beaconManager.bind(this); } - @Override + @Override protected void onDestroy() { super.onDestroy(); beaconManager.unbind(this); } - @Override + @Override protected void onPause() { super.onPause(); if (beaconManager.isBound(this)) beaconManager.setBackgroundMode(true); } - @Override + @Override protected void onResume() { super.onResume(); if (beaconManager.isBound(this)) beaconManager.setBackgroundMode(false); @@ -49,28 +47,29 @@ protected void onResume() { @Override public void onBeaconServiceConnect() { - beaconManager.setRangeNotifier(new RangeNotifier() { - @Override - public void didRangeBeaconsInRegion(Collection beacons, Region region) { - if (beacons.size() > 0) { - //EditText editText = (EditText)RangingActivity.this.findViewById(R.id.rangingText); - Beacon firstBeacon = beacons.iterator().next(); - logToDisplay("The first beacon " + firstBeacon.toString() + " is about " + firstBeacon.getDistance() + " meters away."); - } - } - + beaconManager.addRangeNotifier(new RangeNotifier() { + @Override + public void didRangeBeaconsInRegion(Collection beacons, Region region) { + if (beacons.size() > 0) { + //EditText editText = (EditText)RangingActivity.this.findViewById(R.id.rangingText); + Beacon firstBeacon = beacons.iterator().next(); + logToDisplay("The first beacon " + firstBeacon.toString() + " is about " + firstBeacon.getDistance() + " meters away."); + } + } }); try { beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null)); - } catch (RemoteException e) { } + } catch (RemoteException e) { + Log.e(TAG, e.getMessage()); + } } private void logToDisplay(final String line) { runOnUiThread(new Runnable() { public void run() { - EditText editText = (EditText)RangingActivity.this.findViewById(R.id.rangingText); - editText.append(line+"\n"); + EditText textView = RangingActivity.this.findViewById(R.id.rangingText); + textView.append(line + "\n\n"); } }); } diff --git a/app/src/main/res/layout/activity_ranging.xml b/app/src/main/res/layout/activity_ranging.xml index 86af58d..9a3f9a6 100644 --- a/app/src/main/res/layout/activity_ranging.xml +++ b/app/src/main/res/layout/activity_ranging.xml @@ -1,21 +1,20 @@ + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".RangingActivity"> + android:gravity="start|top"> - + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 74b2ab0..a01551b 100644 --- a/build.gradle +++ b/build.gradle @@ -2,10 +2,11 @@ buildscript { repositories { + google() jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.3' + classpath 'com.android.tools.build:gradle:3.0.0-alpha8' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -15,6 +16,9 @@ buildscript { allprojects { repositories { jcenter() + maven { + url "https://maven.google.com" + } } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 77c5ee5..f06a1ff 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sat Apr 16 13:42:44 GMT+05:30 2016 +#Fri Jul 28 09:35:49 EDT 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-milestone-1-all.zip