From 303f0dfe9c7c50b619ba14bbdce90b6feb5ad3b5 Mon Sep 17 00:00:00 2001 From: Chirag Jain Date: Mon, 13 Jul 2020 16:45:27 +0530 Subject: [PATCH 01/16] Fix App Not Loading (#561) --- .../anywhere/activity/ServerAppActivity.java | 51 +++++++++++++++---- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/amahi/anywhere/activity/ServerAppActivity.java b/src/main/java/org/amahi/anywhere/activity/ServerAppActivity.java index 386a4731b..7f7fc1712 100644 --- a/src/main/java/org/amahi/anywhere/activity/ServerAppActivity.java +++ b/src/main/java/org/amahi/anywhere/activity/ServerAppActivity.java @@ -22,7 +22,6 @@ import android.content.Context; import android.graphics.Bitmap; import android.os.Bundle; -import androidx.appcompat.app.AppCompatActivity; import android.text.TextUtils; import android.view.Menu; import android.view.MenuItem; @@ -31,6 +30,13 @@ import android.webkit.WebView; import android.webkit.WebViewClient; +import androidx.appcompat.app.AppCompatActivity; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.resource.drawable.GlideDrawable; +import com.bumptech.glide.request.animation.GlideAnimation; +import com.bumptech.glide.request.target.SimpleTarget; + import org.amahi.anywhere.AmahiApplication; import org.amahi.anywhere.R; import org.amahi.anywhere.server.client.ServerClient; @@ -54,6 +60,8 @@ public class ServerAppActivity extends AppCompatActivity { @Inject ServerClient serverClient; + Context ctx; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -67,6 +75,7 @@ protected void onCreate(Bundle savedInstanceState) { private void setUpInjections() { AmahiApplication.from(this).inject(this); + ctx = this; } private void setUpApp(Bundle state) { @@ -83,7 +92,7 @@ private void setUpAppWebCookie() { String appCookies = Preferences.ofCookie(this).getAppCookies(appHost); for (String appCookie : TextUtils.split(appCookies, ";")) { - CookieManager.getInstance().setCookie(getAppUrl(), appCookie); + CookieManager.getInstance().setCookie(getServerUrl(), appCookie); } } @@ -91,10 +100,19 @@ private ServerApp getApp() { return getIntent().getParcelableExtra(Intents.Extras.SERVER_APP); } - private String getAppUrl() { + private String getServerUrl() { return serverClient.getServerAddress(); } + private String getAppUrl() { + String host = getApp().getHost(); + if (host.matches("^(http|https)://")) { + return host; + } else { + return "http://" + host; + } + } + private void setUpAppWebAgent() { getWebView().getSettings().setUserAgentString(getAppWebAgent()); } @@ -130,6 +148,18 @@ private void setUpAppWebTitle() { getSupportActionBar().setTitle(getApp().getName()); } + private void setUpAppWebIcon() { + getSupportActionBar().setIcon(R.drawable.ic_launcher); + if (!TextUtils.isEmpty(getApp().getLogoUrl())) { + Glide.with(ctx).load(getApp().getLogoUrl()).into(new SimpleTarget() { + @Override + public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) { + getSupportActionBar().setIcon(resource); + } + }); + } + } + private void setUpAppWebContent(Bundle state) { if (state == null) { getWebView().loadUrl(getAppUrl()); @@ -192,9 +222,8 @@ protected void onPause() { @Override protected void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - getWebView().saveState(outState); + super.onSaveInstanceState(outState); } @Override @@ -210,7 +239,7 @@ protected void onDestroy() { private void tearDownAppWebCookie() { String appHost = getApp().getHost(); - String appCookies = CookieManager.getInstance().getCookie(getAppUrl()); + String appCookies = CookieManager.getInstance().getCookie(getServerUrl()); Preferences.ofCookie(this).setAppCookies(appHost, appCookies); @@ -227,6 +256,11 @@ private void showApp() { ViewDirector.of(this, R.id.animator).show(R.id.web_content); } + @Override + protected void attachBaseContext(Context newBase) { + super.attachBaseContext(LocaleHelper.onAttach(newBase)); + } + private static final class AppWebAgentField { public static final String HOST = "Vhost"; @@ -255,9 +289,4 @@ public void onPageFinished(WebView appWebView, String appUrl) { activity.showApp(); } } - - @Override - protected void attachBaseContext(Context newBase) { - super.attachBaseContext(LocaleHelper.onAttach(newBase)); - } } From e7888e9a04130989891f8ee3d9ef601d3d65bdfc Mon Sep 17 00:00:00 2001 From: Chirag Jain Date: Sat, 18 Jul 2020 01:27:41 +0530 Subject: [PATCH 02/16] Add release to gitignore (#562) --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 5ecda83bd..78acf215a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # Gradle .gradle/ build/ +release/ # Android Studio .idea/ From f0bf41f4b1f95f11c5f86b9d27a3886edee7a4a5 Mon Sep 17 00:00:00 2001 From: Chirag Jain Date: Mon, 20 Jul 2020 16:47:34 +0530 Subject: [PATCH 03/16] Update README with better badges (#568) * Update README with badges --- README.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9a9e7001b..f77b1e253 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,17 @@ -# Amahi Android App [![Build Status](https://travis-ci.org/amahi/android.svg?branch=master)](https://travis-ci.org/amahi/android) +

Amahi Amahi Android App

+

+ + Get it on Google Play + +

+ +[![Build Status](https://travis-ci.org/amahi/android.svg?branch=master)](https://travis-ci.org/amahi/android) +[![Twitter](https://img.shields.io/twitter/follow/amahi.svg?style=social&label=@amahi)](https://twitter.com/amahi) +[![#amahi on Freenode](https://img.shields.io/badge/chat-on%20freenode-brightgreen)](https://webchat.freenode.net/?channels=amahi) This repository contains the source code for the Amahi Android app. -You will need JDK 1.7+ installed to work with it. Gradle, Android SDK, and project dependencies will be downloaded automatically. +You will need JDK 1.8+ installed to work with it. Gradle, Android SDK, and project dependencies will be downloaded automatically. ## Building the app @@ -20,7 +29,7 @@ You will need JDK 1.7+ installed to work with it. Gradle, Android SDK, and proje chromecast.app.id = APP_ID ``` -This is something to keep **private** and you obtain it by sending a message to `support at Amahi dot org`. +This is something to keep **private** and you obtain it by sending a message to . 2. Build the application using a command line or using GUI. From 761a34e8a5d9ddb1bb35f295b711334a615358d6 Mon Sep 17 00:00:00 2001 From: Chirag Jain Date: Mon, 20 Jul 2020 16:48:31 +0530 Subject: [PATCH 04/16] Application Crash Reports (#565) * Add ACRA for Crash Reporting during development --- .gitignore | 3 ++ .travis.yml | 4 +- README.md | 16 ++++++-- acra.properties.sample | 4 ++ build.gradle | 26 ++++++++++--- fakeAcra.properties | 5 +++ fakeApi.properties | 2 + fakeSigning.properties | 2 + gradle/wrapper/gradle-wrapper.properties | 4 +- src/main/AndroidManifest.xml | 1 + .../org/amahi/anywhere/AmahiApplication.java | 38 ++++++++++++++++++- .../java/org/amahi/anywhere/server/Api.java | 4 ++ src/main/res/values/strings.xml | 2 + 13 files changed, 97 insertions(+), 14 deletions(-) create mode 100644 acra.properties.sample create mode 100644 fakeAcra.properties diff --git a/.gitignore b/.gitignore index 78acf215a..e8751f9f1 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,6 @@ signing.properties amahi-release-key.keystore .DS* + +# Acra +acra.properties diff --git a/.travis.yml b/.travis.yml index bb4eb1c6d..a2d460a82 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,12 +1,13 @@ language: android before_install: + - yes | sdkmanager "platforms;android-29" - yes | sdkmanager "platforms;android-28" + - yes | sdkmanager "platforms;android-19" jdk: - oraclejdk8 -sudo: required android: components: - tools @@ -14,7 +15,6 @@ android: - platform-tools - build-tools-28.0.3 - android-28 - - android-26 - android-19 - extra-android-support - extra-android-m2repository diff --git a/README.md b/README.md index f77b1e253..c5a85eaa5 100644 --- a/README.md +++ b/README.md @@ -31,16 +31,24 @@ You will need JDK 1.8+ installed to work with it. Gradle, Android SDK, and proje This is something to keep **private** and you obtain it by sending a message to . +2. Set ACRA information -2. Build the application using a command line or using GUI. + ``` + $ vim acra.properties + ``` + ``` + mailto.email = myemail@mydomain.com + ``` + +Enter your personal email in place of `myemail@mydomain.com` + +3. Build the application using a command line or using GUI. ``` $ ./gradlew clean assembleDebug - ``` - -3. Once you have built the application, you will be needing credentials to use the application. Go to Amahi website and create your account, once the account is activated, you will see the description on how to set up the Amahi server. However, this is not strictly needed, as we have a set up of a demo server called "Welcome to Amahi" which you should see even without your own server installed. +4. Once you have built the application, you will be needing credentials to use the application. Go to Amahi website and create your account, once the account is activated, you will see the description on how to set up the Amahi server. However, this is not strictly needed, as we have a set up of a demo server called "Welcome to Amahi" which you should see even without your own server installed. ## Code Style Convention diff --git a/acra.properties.sample b/acra.properties.sample new file mode 100644 index 000000000..1cbfc975a --- /dev/null +++ b/acra.properties.sample @@ -0,0 +1,4 @@ +# Set ACRA mailing information in acra.properties. +# This is something to keep private and can be created by following steps in README.md + +mailto.email = myemail@mydomain.com diff --git a/build.gradle b/build.gradle index b7c5f9285..d6f726fd8 100644 --- a/build.gradle +++ b/build.gradle @@ -6,8 +6,8 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.4.1' - classpath 'io.fabric.tools:gradle:1.26.1' + classpath 'com.android.tools.build:gradle:4.0.1' + classpath 'io.fabric.tools:gradle:1.28.1' } } @@ -52,10 +52,13 @@ android { targetSdkVersion 28 def apiFile = file("api.properties") + def acraFile = file("acra.properties") def apiProperties = new Properties() + def acraProperties = new Properties() - // NOTE-cpg: this fake api is here for the tests to pass + // NOTE-cpg: this fakeApi and fakeAcra is here for the tests to pass def fakeApiFile = file("fakeApi.properties") + def fakeAcraFile = file("fakeAcra.properties") if (apiFile.exists()) { apiProperties.load(apiFile.newInputStream()) @@ -63,11 +66,18 @@ android { apiProperties.load(fakeApiFile.newInputStream()) } + if (acraFile.exists()) { + acraProperties.load(acraFile.newInputStream()) + } else { + acraProperties.load(fakeAcraFile.newInputStream()) + } + buildConfigField "String", "API_URL_AMAHI", formatStringField(apiProperties["url.amahi"]) buildConfigField "String", "API_URL_PROXY", formatStringField(apiProperties["url.proxy"]) buildConfigField "String", "API_CLIENT_ID", formatStringField(apiProperties["client.id"]) buildConfigField "String", "API_CLIENT_SECRET", formatStringField(apiProperties["client.secret"]) buildConfigField "String", "CHROMECAST_APP_ID", formatStringField(apiProperties["chromecast.app.id"]) + buildConfigField "String", "ACRA_EMAIL", formatStringField(acraProperties["mailto.email"]) testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -88,8 +98,8 @@ android { } } compileOptions { - targetCompatibility 1.8 - sourceCompatibility 1.8 + targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_1_8 } } @@ -171,6 +181,12 @@ dependencies { implementation 'android.arch.persistence.room:runtime:' + rootProject.archRoomVersion annotationProcessor 'android.arch.persistence.room:compiler:' + rootProject.archRoomVersion + def acraVersion = '5.6.1' + implementation "ch.acra:acra-mail:$acraVersion" + implementation "ch.acra:acra-dialog:$acraVersion" + implementation "ch.acra:acra-notification:$acraVersion" + implementation "ch.acra:acra-toast:$acraVersion" + // Uncomment the dependencies below to enable Chuck Interceptor for logging /* debugImplementation 'com.readystatesoftware.chuck:library:1.1.0' diff --git a/fakeAcra.properties b/fakeAcra.properties new file mode 100644 index 000000000..eaeda3d7c --- /dev/null +++ b/fakeAcra.properties @@ -0,0 +1,5 @@ +# Set ACRA mailing information in acra.properties. +# This is something to keep private and can be created by following steps in README.md +# Purpose: This file is required for Tests and Travis checks to pass + +mailto.email = myemail@mydomain.com diff --git a/fakeApi.properties b/fakeApi.properties index 5d0473ebe..b0f2d2482 100644 --- a/fakeApi.properties +++ b/fakeApi.properties @@ -1,6 +1,8 @@ # Set API information in api.properties. # This is something to keep private and you obtain it by asking in the Amahi IRC channel or # send a message to support at Amahi dot org +# Purpose: This file is required for Tests and Travis checks to pass + url.amahi=https://amahi.org url.proxy=https://amahi.org client.id=1234567890 diff --git a/fakeSigning.properties b/fakeSigning.properties index 86d6879d8..5bb671b88 100644 --- a/fakeSigning.properties +++ b/fakeSigning.properties @@ -1,6 +1,8 @@ # Set API information in api.properties. # This is something to keep private and you obtain it by asking in the Amahi IRC channel or # send a message to support at Amahi dot org +# Purpose: This file is required for Tests and Travis checks to pass + keystore.file=debug.keystore keystore.password=android key.alias=androiddebugkey diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index fe7c2b518..ea4655882 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sun Jun 09 01:34:57 IST 2019 +#Sat Jul 18 05:49:07 IST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index fd718f4bf..d6626655c 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -33,6 +33,7 @@ + diff --git a/src/main/java/org/amahi/anywhere/AmahiApplication.java b/src/main/java/org/amahi/anywhere/AmahiApplication.java index f3446dd94..41e4b3845 100644 --- a/src/main/java/org/amahi/anywhere/AmahiApplication.java +++ b/src/main/java/org/amahi/anywhere/AmahiApplication.java @@ -27,13 +27,21 @@ import android.os.Build; import android.os.StrictMode; import android.preference.PreferenceManager; + import androidx.annotation.RequiresApi; import androidx.appcompat.app.AppCompatDelegate; import com.crashlytics.android.Crashlytics; +import org.acra.ACRA; +import org.acra.ReportField; +import org.acra.config.CoreConfigurationBuilder; +import org.acra.config.MailSenderConfigurationBuilder; +import org.acra.config.ToastConfigurationBuilder; +import org.acra.data.StringFormat; import org.amahi.anywhere.job.NetConnectivityJob; import org.amahi.anywhere.job.PhotosContentJob; +import org.amahi.anywhere.server.Api; import dagger.ObjectGraph; import io.fabric.sdk.android.Fabric; @@ -43,6 +51,7 @@ * Application declaration. Basically sets things up at the startup time, * such as dependency injection, logging, crash reporting and possible ANR detecting. */ + public class AmahiApplication extends Application { private ObjectGraph injector; @@ -162,7 +171,34 @@ private void createNotificationChannel() { NotificationManager notificationManager = getSystemService(NotificationManager.class); notificationManager.createNotificationChannel(uploadChannel); notificationManager.createNotificationChannel(downloadChannel); - } + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(base); + if (isDebugging()) { + + CoreConfigurationBuilder builder = new CoreConfigurationBuilder(this) + .setBuildConfigClass(BuildConfig.class) + .setReportFormat(StringFormat.JSON) + .setAlsoReportToAndroidFramework(true) + .setReportContent(ReportField.APP_VERSION_CODE) + .setReportContent(ReportField.APP_VERSION_NAME) + .setReportContent(ReportField.ANDROID_VERSION) + .setReportContent(ReportField.PHONE_MODEL) + .setReportContent(ReportField.CUSTOM_DATA) + .setReportContent(ReportField.STACK_TRACE) + .setReportContent(ReportField.LOGCAT); + + builder.getPluginConfigurationBuilder(MailSenderConfigurationBuilder.class) + .setMailTo(Api.getAcraEmail()) + .setEnabled(true); + + builder.getPluginConfigurationBuilder(ToastConfigurationBuilder.class) + .setResText(R.string.acra_report_toast) + .setEnabled(true); + + ACRA.init(this, builder); + } + } } diff --git a/src/main/java/org/amahi/anywhere/server/Api.java b/src/main/java/org/amahi/anywhere/server/Api.java index 2ef21718d..e25b87b5f 100644 --- a/src/main/java/org/amahi/anywhere/server/Api.java +++ b/src/main/java/org/amahi/anywhere/server/Api.java @@ -43,4 +43,8 @@ public static String getClientId() { public static String getClientSecret() { return BuildConfig.API_CLIENT_SECRET; } + + public static String getAcraEmail() { + return BuildConfig.ACRA_EMAIL; + } } diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 4137e2cad..769b6ac8b 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -320,4 +320,6 @@ Go back Select the type of connection you want. You can set it as Auto detect, remote or local area network. + ACRA Log Report Sent! + From daa81ec20c3db809a1315e1fd84d38c94d9d2b5d Mon Sep 17 00:00:00 2001 From: Chirag Jain Date: Sun, 26 Jul 2020 07:40:55 +0530 Subject: [PATCH 05/16] remove captures --- .../org.amahi.anywhere_2020.07.11_05.41.li | Bin 237003 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 captures/org.amahi.anywhere_2020.07.11_05.41.li diff --git a/captures/org.amahi.anywhere_2020.07.11_05.41.li b/captures/org.amahi.anywhere_2020.07.11_05.41.li deleted file mode 100644 index fd246df5c67b5af7875ebadd344fca2f31adfbaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237003 zcmeEP2Y3@#wkG|h082<9p*my($s&xJE!kj zr5Y~{s8Qp^8Z|y1*esoJxvfq|v+!o3W`brOtH(ybe>+{t!6v&Y#TsmKWM!lfE+W`u z_E^)co~&TC!{c&V(%^qO9SZ7?%?8(a{+CzHPCLxExSUo?u+`xqTn>{hIMr#hnzMqH zgxTpzuo4;VO;Wiy#B2^qHCZfHM{>BmqtitsyPRnbOK0*=9h@GI(;gub2p=&imPqmx zGeu`jPAP7V!I_G$Vkb=QG#6nf9G-A{9Qi*KHd|DR)n;)Kj))LJlF8;Kf^4QNXBtew z15t3(o~~9;ios=axUKM6y~pGs$O}fpPfG1*GbOu?QL*aI#;6!|tWu}aL`Vd}Oi_^C zf83xoc2+2rYE3krA!g2qki%!hQmHUR5=5lK_qfCDu_m|2;7l{8D4iJ&wZlSW;_u}g zHdyUMM3^8%CKbv;WTGN2(hYv4Od<;wa(_qnh){tjR49gVi_4UOo?SBGiLzN!=~eph zqX?5a+=fJ=mJW@Z6+KRlf%;y{mGPQwZS%niDHSMqc$pDZ&Y+N zsB}i9N*|@tC>0umo_YDsXal=FuqI0KrlL&d6aqdTCeTOew6U?Uph4a*!wcp%y9mP3 z!R9pgbK~!X+4S?Jf0@-y|0wFRT9<`zsT`(68)0G0PfRwt(K9#NwtE?8y3!yX0ru(QeY2;2flydZcmntXl+2l!HU$> zD5pKufy6qqEDJ4ts!n z*_Ap)R}I`Xys&U<%puqr@aD^fa=AqAT_y7J)Q^On>9pCfRn+7E?1tazfIoL9O^iMZ zHoiUHnqYNX$=3#(4x#tr^c{MC6Kql!b@yCWmNBeySRzCsK`XIHDwE13p;Ece7&E2? zE*oQzW9b;9U@Ki9sp!3dsnm<-H4)^yK^mhN*rPVIPkk?b zpn+4_2zdJB#lW`1Ey2BXwA$bR#O8)@cTFK2+C;Y*4j88Gz|%Z#@+o$;IxNl%H{1|y zioAD(Z4@#*Fes9eMp4lrR%KMg8?=nyPrefPCt))a@cY&FRHw^>Ev-vIEer z8};4w234G~gF*-Y7u6|Rr;XPr_2lLyzr*ias3DPDBxL-Y6sOBN0Jf*e)|E7jq+OG4t0kKaLJ@iAX4;&nBY>nQl?2po2mWKfE(6 zQPR1A1H-~k!vJxfi>z;?cf zIj|XHoo4)gX&qn`;p8@E!Zt$Yo%$}WDae8FKO10P9O>Cnr;oy6!44bDs%_z!#oEGPgI^(iJe<6wwB z;;8okhR79#-A%uc^c1TbgG_L*m`5kL=Kw4FQHLTumtKCWTgkuzzO$R2XLbAjMxE#6 z@3fLX)9LJ*yEfQ^z7-YvZk@_)^DUk7Ug3wKJ2@7I7Y!iN8Y&2=FGs?q3+S@ zjxmAPV(v%~mPC`eU%-#>T_ncjvSgTC1Ultygo|1|-*ueu$XK^%b*o7u!2D%?YtxCy zN_4`7HKufHGTzxywlwfS(Xmf20`)|#ZqlmhJjiXJ2YvUaO*QpTBVQc6Nv!V9F7Va- zZb=XKZuWohdW4r$Nl7pg_!#ML$N+yuB>qi z!6w425WTy6G!ojAw6UvT8mZzLB(xYTOA<%9`PdhNMXbyWl2{NH%I1kMwtEzX1dNEh zgYOI~a|#I?0d%_1`;I=1syvS*_P#W5va{WK>bJt*>4O-2f~w3TvAj3N+-vHPQ2Yv;#G0Cr3!~7kO63IE5}6cq`z6R2|hCpt<4{`cBy4kA`R!YIGXyAX9*0!}VEH}aG zE)SB2Ubjlc@_1>Ubci?xqp+jila|=%K)5CL5*^rAQ|O*y?~iT z07D!tM*&BXP~ih^z6g9k4gsH9fL2Q$=HpSo6|ClvkT%5RF;yx|h>ZZk6L8w0H?ZoW z!eo*~2kXvESE67}Mqu=vMnEhyiI#x;2tCYWNg5vpV#(6N$gVmCBuqk}pmHV)_@6+J zz>sJv?JU4FZ<+uZ&-EYi1!Jkb1s~CIWe8LdcEm;i=Oj>R1e_sdK1+a1a;Pj>0#ZRV zBQF!S6rCdAw>dcp2${c>izHCWJ23){U-qC0Oz%vezSNX^@3kFmZngJUDvf81X${5hA z#WM{&)8HcziiukLCRW;jHJR|kI4>CV0a?Psib0G0j~B*t4CGj|{d2y(ghMfP3BnNM z_&g5lfQ>-$iT6Nb_~+jHNDSJ4Ky(LZfdU`4epbWQQb>b1VIzPF^~<+J!Ji~TG**@8hkjym1FVqh%i;F|oX(_1AzhZuE+=@(B?kcY z_>u!hGUyhSSk3TRD>=YM0IBCbM%@8lazMc-Ty;S)y5zr%e91wTE;%SwA^^_Q;!Yay z&jLVG8UD5x7glV|0X6~*9Z){{&sK2s&yJ|t%7lE)0R{5t7m?Q_M4E)y2$WWskVk~Y zA;Kt9*qT{~ASI+pLV1!eD8knv@O22BZ5Ez-9fB7Q_-rH2F>w(NC0R9AbhCx(5r9T@ z2vD#OItpg;&Gq_gPu@=9nTj^^fo5+%htd!bEPPNgfo5z3s00%#7EGH1h^9ia|Xi}(ICJynYqGO=f#4aU#hHP~8)y z&_YQZ;uTA_`(*Et3r_nBRV>TA>>DROV@Mx2PW0BO+RI$^z8a>K3#(S+L~I1egz<{) zo>;Y!el<=kuWUKx6(Cets;mKy>LXy+So$;-EFTa6*0B*NCko19S%`mw+DCHR5~*pxQ8A}+T$GUhLqqz0flq0J2gmSVmREZk76M<0!b!BW75A5 z=*$$W&GPJI3iy|*034FnrzsM^l9&S|wD7iXnQxz4aR)$l;=DI4Ewb zs9}}E65-dIjO!|~(4h<`h;t2c6p%1(pyYW26~ZQ9BY-;B#Xuzhv_Mbs6zLZ5c>}Sg zM8XD%eh^K;#|>3301E>m7NAbd?0ha33v?>IHZ}no)G5_ERg^)k)fiFZd3KS33H6=t zYW1XahJMlxkAKHosuaPlOS2JfBkGi=O+q^s+wImGtx>J?yC5~yg`Q;z=b93sQm{l< zh2QVYDA7#(yXaPrCI1BZrj_9L;p^iHt&&cr-qVs!r!7ZG=abK`boWnwrc}Rz{75N( z3;CfUe-UW}eCZU_7Ba(rBwQtWcI4C;r^`A3GVV;aQhX?Za6!}c5`F~BQBO4OpnmH;3Y1gp=gxJ zoI?0Kb6>WK?{6%{C##z&_(V@9>w_6%0b-`u2w+NpHJ7mP2}D&jfhY(xOoNjFV5B7m zr<$BLr_1Sq|Buv7tqzaN8LUW6Ripnvx)+^I$%L!DNhV4Znnd(rYOjc_B9K&lrrMQA z1h`|oQPI($(ixR1eZ?geVI$y3_Nx-2>`T#&Td80u%_UZ`{2>vh{!p`8V=8(Hco_Mi|M3g>fKm*n8m~gY}v)mrS9&h#K8&j=YDNo-{-y|0`MuB zi%_xb!Gx)m)& zk6{{!Bx$N7>j#9j-!BRv{IC%ynq%f!zoOW8#@^srKb<-{#$b$7=%UpcW4uPG>ZsO0 zR3uKJ?}X3tN?tbjtS2F2BjDl720wz$DuPTA@F4VNm(ynJU~=g_SvHjLC6Wr%8ogSn zGHMf4x>!YbrZ1;=+N_o+guKyA@I~PYyt*x{1<(57%|p|3G;%H@EhCnD{V39}Bzzw> z0^!tE2up`7C6Q!Gvw7et2HrmS)n-Cza`jW#AY6>eL+WPu4n}&ESENcxBFr9l0C`LA zfDAw+8m9-dzDiQFg=3+qS!e=d6sy|?77nsH7KJ2+NkbAD6<{VeVY5021xiLBEC7Z0 zjzuPSnhTV59iDJ|w9Axk^<)`=l0)QNjP@DrSVS6ur%VS!yj7`GYod)Bt-+{?kBx=h zDa;fLgW$2yS)>ti^d~4pl}Wf0In@pekx3@)a3*^4IikS75rm_I&1vpO#*P>!g*Hp2 zNDqa`yN58^ArTHcJ`rJpRw9W|ES3v>#mW>rSG9R#8IqZ@o2(A6$5%|QDEhgfuzML| zqu!21B)>(oTbxs{8Y%2|QK(EN7l(!VUC8R7u7Uha_64kvW@hoEu=5z%X_DaJhKYT7 zl++-}ZqOVmHUd!bW2Z(r(jTc2nwe$mXBS5w%f)gz2YoDow>v0+B<_ZPO~9YakUREU z5=LfcC1H;xav}UvR3$1(ZKs%WKpk{G9=zK)fiZwTrIZep1T3jF)nj!!U@Fy=jEo4w zRVddF)3tosXvGl7DFn*zjDW00qb?EUKVa)pQBWwg<5Bb?2 z*c^26BWZ?M)sF$4+8EPWBFn}&l|mn{1CB^Ob$1aUU53el|hD;v1SI} zxUU2f_L(ni3F}#Uz9SSn3+%7r{C?k;l4d%^RHPRNL)vu0Wy1*|$vOgDV;B5NZ0IrU zqkk4m)Tfv%PA0mf%mNGXdZ-`?v4oZ&51JNEwPRv^^htUe;hwV| ztHKcfiojx`4s-Bj9e5prXoR{g#=a-fm~j;c#KuH#zbS-^GYS#6!{@B&Y{PH zVnQw`CJ}_mB^80hSc~zPIE=kGjEj&cw#Z>`5Vw_BB$Y|!l2EBU$d2p?u3|=N)51&< zMq(nCUr>TP9*IC4CJIbDsY*}`8-XY3KSaJ;0dSO+sbe<7abr!i+JK4$15#W%4>=xi z$@0kNp|yWQ1tddEBW}`JGG>riO(KwhO{N?uYKSl1c}m4Qz+SOeK7-`K!~(AHKAg1y zs5cY#9AIOSOh#XcYZls>*orXE37A+UEDk(X7_(WZ81H#>!qEOXOk}`VsT6H5|1ks> zLImPaQLvYHg^%e>8LJkW+!9LMRdf*OC=otAmYz3%ox#826z{*fb@EvZNox*oo*i zq~Kn$_b2C<`@ZoBa4Zer=vycb$nqE#u^b5KK5^V08vzvMcUky8L@9*wF@yIslBGq2 zSkZfV7-11x!suhjPP6)zDtb@F${`!dppH_IL0fQ*na5&z#nr*qfHN*)f0x#UXexa8 zK+MQ*&;ZAhEtYU3LwF3V7etXMX8{E;V@FakL2 zSx*-0X3+^uZiQ>0tb^P_pqnkaiGw zyf9|7_?60%br2$uNareLhe+WGX)NXa<)g{jonuagcJ)PJnThV z6u6{A%p5~y7@jXj5Xl0@4DeQl5R$!cjPKxDJjQS-@MEdt^E`f(1ZF3&kfC2>zG(c2 zjQ}OLAr?5ElGp|fA&U#oGjip55SivNx=@Nat)3YWKzDmgF7K#Fz)Xyx035Z59%pKi z7xAUBbA{ol3uHWIsJ?8mnQ{q61J?5&+l;Sj`;?!h+gu6j=$+Rv)hxY95M~UKq`SgKdTsLROXomAz~@p zgwSClk|v_O4VICK59?bxFkJa?@MEM)NJ9gGVCmEhuo0-bO^L}j zt5jgP3aS|hgS{n)RG^;Ex%VbS1R&L?o-X0L131o$!oea?9-<&U*DRE74;E5ZwAvmA z4)#A);KFfCog4-ZCQle{7%as`K#p{b{3jqREER-Ec__?xBJeQe3OLgM7~?)v3VX5? zat6o^V(dXu&H!&e#$PFdMkr@*Sl@T@f(D?LR@y8CYy_O(3a}*QSXbe@5mZ8DKL0EP zO5cq$2_Z4jk|YdEqz|I1nS>Cl>SzE+CCrqt5fh!H07|wx0}h^Jm9QdaRiJ8uQKyPk z7}NJ(kJ1+725$wDNzoZCe-UFrhPA4!xnDEgW3)l!$4xt6U8v%p`X$dwl z6&W;kP<7PmR2AE`HlSfGZGxbn2Aprc8v$p14aM`bNgj5I4fVEiP9ce+a#Cmj7|rNL zfQ8-1YHW(=Mu1y51hgF}1EB`iod@Pmu$Kg-jJc?vS4om5 zP&Wdp5cDh=o^c5@FrV!j8|n=!6=76#kxd1(vrQ?tZUpFkU=S1(90=$~P&&;;4vSV4 zN%2HgAO2x~hMi=*9wiF>Ly%P%g18XhV(_tlzV#x`yz)yId1AtYJNA!upxp1PI0=_B zVLYfRYx*@|DL7&yARtp^sn-GbBY1+?zu(tY#tw{SRe4cuiY};UW_4HXJ_KTs&|;Rz zA2aSR3K1x9`7Ig1k5MX0AHA=VO$e|Nu-T~g0ZvzPaOG3VD}56J@b8hZJXcKK8?{HR z88~OqQG1!(Kk#2pQG2#rJ_~_y4m}; z@>Dsfl3fU}5pY0uJgy_`odn z-5HM~Z9pCp)Q^CD9uVBmg14bOn-HJ_hW5!vx?ZK1>*=485O<7PX_#BgV`}w$pn8`0D>vWrSbp%aV&gHNry& zYK2M%Z~|D86JWJ3fmbl_6s<(sJQzp4unC97 z3Hm5YAEPjaLIRpNb9ogR-9HLT#f5D*qGt%ACKJc3qX#BSKL%86TH@eC|#g=^$7 znU(6;g#a4?)*1y6EJcl$f?wg~0ZPfNpx3MF2DoVnNw!2S4dUtkj(isa>WHBhrp)94 zO05iljey7KrB_NL4}h!#^*iAB=OkD776g7R9_i{#ih?O&$4FjifEOCzPBsW=4oXsp zrE5WejR0Fwt7x{yF9QH3@?;GzyXcUmgy!*SHq`xP=BSC>v<%g02JMb*@Ux={tBM;8U` zN*A1GHfRXIjzxATCe!5N3SG2XV~p1*RUOqDl@k7-?}V${yyfB)#AAI{r;d(!)Q9EtnZxm6 zOqUCz{AN5w1SuAjbqj*B1(Hvci5^g<{|xpYz(xScE%E3SI$#S?o~Xf;j3XX6JV0ak z;+F``U}jl}#Db1$o!(&78+2MtbU+?})nj!!*i}I2%UvkqjfONPJ5s8ryfhkI&{J%< z+M{B!2uguY10XA(L{JI)4`3re1R>0s>fy{JAUi40n~(>mr3I%nN8m-Lk1G8S6$+CQ zWitBIubfE)eE$LP62t9Xy%qS7fat44tAhOpNF#s`LC!P;zW;zJgOm}aGbfZT{1>gu zLb!arTIg53=$4gme)9bXd^raG6472sMzVB+@;3PV0<`(;db7)EvvtR>X*u*Cz(ydv z5|+^O{RbYibc63d;EP;S3=1T#(Y+TR)uPcxBo(b($f9_v89juJfC;l;o)WaF3|Qat zN-%(vfNwq^P-|jTI<RKEE@n%gHdz=-&>Nr@m_wpg75*AjY!8~Dz9G( zf9z@BXuh`XEmRbf#hrLu8_f=5KfbT&-0{w6b z?^m*X2_IgDeIAfWp9wFE7-anE=nvPNESLju;AwUsz(ye5i95}Q2&8-m0wy-ZNSQ=^ zCwf}Sg8CK|t@o+$!3WD%q0gbJnT5bNAh4Hp z0|IOWC_m9wl)RLo@*2Cz>hK;9#k8qJnW*f9hthT*D2J>Grp!Lc34~Xc&I3q7(vdvUk9fv<<*Uz=cm(SU59bp*j#y^isGRvEZ!@2%-fm ziFB)(pn{3Pu_%ZbtTeg$Da@$q4JdQwWs;JOG{E!f6nLy28&OtBN+Kwxb3i!&DV9f1 zDGlJ>ZEOjAmcAY55HC;QNak2L1`H!16npU)!zIE{j~Q-<-T{vnZwK$BN`~5faDXhV zhWD6!yQ+J(RjGB3ET^?KOVBk`?2sW#5K#Q zeZXUP4!}mh4@=Qm=A3!c^dKh+<5SSRehwS6axNtUvvRH`W88-@;kxCKf?htDmJVOi z#7}vFS{~1OCBNyVE=|opHUd;HLaUqI7lA^YbgDonA}i5pa#=K{bZatB7L2l`K@K!R z0rbF9b!8SK;mf z$RVc}4^Tj?$(2mFJ$Om{H(OQY6h$ycjXyoyv{0*yz+WvlI}PM0S@_mP?qaM4&( zB4O+3L=G9Q1fvd6xDe^JFg4G_Vu4Pj*TyD*I-*joQ$-onT8%N*premn^20{HbAT|j zQtLkYY80p^_E}KDnmj=`j9IX^%By<-c0V4IU6D#cgF_fM z4nqEcd*0Vgk*<;C_5P!rHf%7^;Q8_393>D#nJwJRs)|6r2oGx=_g@gmKnz>(&cKi#*cWFy z!LE{g#+emr!_t)uK{T_H84QvY5X?_Cd1#VFk(wHX|KQX650Ql?nL?O7ZD@uB79IOJ zMeDZ#wI34ZLrGOD7rFFO|B&P=5j`>;nGAKZ_$F4Q0}gk&NCua{M!@8Ta$h?%c?q}2 zl~bQMwjRA-Af2gX|73WNOXnZT(%=iqL*`#1kN`KBYO+|c5*!0p|V1dzHIU7wvn zw~9k?LlSS$Ly5TjgH~$`Kqb7A8@)7-60$3ah+EkU{X;=mm^6%jo<+mHFo~FTxWG*M z@CXp-4?JiXv;BkWl6uULw7QP6W09M5z`OYr3m?jAeV~`^2ogj9sv8#zCb=-$L=QBwdqCHv9qV~ zCF~UyQO8CgJi}_Um8+h<#cUBveMgah+?)s|M~G(qQ11GlwF=kQkouDM#I5{Ul+b<;}ye z)`!8flq~FC0v4unMclCwaHaXmdH@4dM)^S0t0Evm{zOzvQxf0D2}eQv<3#2Il1Lsq%u^sy1ZYHgun9}~zkFuaDK(}C!ZfSQ7* zS}= zNS`d~k3l8=dcp;n6v3sh>VHBleO^YNR0i-X>F1Qu$3_5m+baeQW2Iy^lw~WWLGl79 zesj(s;V>y9%brk`(J)s|0)qU!mi{Bs&mSWt;n}L~$3@YMvVQbZl?n$xhKxSx2_W=R zjv45o0FRb2V)-A&LzC!p$Un;f4xma<+uuQJFlgg& zunltKS)hn6|9=J*^`Z2hwG<^*)F^uaA~nlc_hfq|>Rx z>=A2Caso!`+29)@A7bf#1o@d#{S@*erTjtUhrDMr)6HjZ9W(4h!d0SYMox`!x~v17 z4v)!JiVr0aE|1k*!jE7=uY|i9im^&K6F)LNN}MUtedFm=5hE6vf7JWO*bb%q2J$%- z`#q$KQe-|5Uy?>I%@Za=p;|AmD?_~~jC3e$1PoCz(E3ZK(imu8n2X;&gIv_ElC=$MaFGeeeVl=)E z4F^CFN?`0zlA!m~@6bDA%L-86U*a*0-aBhOF$4bgR!WQ)tKw0ES zMZ@=3APRU562wR|#6{@!E{()1ukM=RqnT(85{mzQlmZD#V@j|R8SP~uVWEjKGgl%M zxW27KVp)hVR4(=AKhY^sGJ#womxqD?2_r8`D0qx?CUI~m`iDxeg0n>rx-+;52lznn z<5&qx-ZAV{`H!MsrMC_srOYL$)iS<0xF)J&NivxUI)^nBN?LSrir65KS8@AOT0+Q3 z7KaK$C6Z9@$#19e0B}9@MrF5u#74l8_9XpFSUpF`PLkBKEVI@nA_l)@bQ7s2Q22o! zGv1#R`$SbgMKWO|&lNaaiBp_9YIRX6W2~aPHr@bd4KDHVtNbydq9C;<+8CvXicuNW zngm6xT8YTxOs<(lln;r7FkcP@M35lh+iyNXsXRnn(32=<374Y2!uP|tZomtcN+94O z_ikHw!xgsF6cZQ(2zIcN_Gu1+wiN+XQ4}CoIJpru@3N+%=07l1D!^|tgSbyJrP(|< zkQxJp7{J=3cmiUv78f=GID(5>7gWB|A@ooJR^U;ELywU#g*!2pW3Cjt9Fc}(ym$+a zmkOh32udxC>nWBEdHW^P55;Qnq(q3sf;dG*LS+AA2i{B?PWuC7G?hLJVVV~m2h@Cc zn|YEWN{^XGfRG4w*1W0j@nPeWFA!;^xm61|)hHXin9_(`dxoP)7_`DlC@MdN`>=&DnIV~9}ofnpPu9dY`j3MJKXB7?k!g-zKjma(|tj>=m)|SW|oGSc>2MQ zo~V}e12zJvcLvx5YL76&jBZG&wcw_BpgUypwo(vF1s%0f@p@wi6~v`gMx{y*f&of} z#-L|f+RlW_ZH2bQ5Y8ld0$fK5UsTcbgIEwI^WJC`V;`WKAe01I9TrGehFl4w8KpWy zJLD2)O-KY%v0v>T9e<+KQb9kah}Je_;shjlO8gm%N}M|JSX!yjc`rm(E*)zCkX1IJ zRBQw&)}tagiD!e3z^_%+Wg}Ru0t)`|q=L6u4glY&7+_$M=vrv?LvdD9snp z0@O~IPOk*s0p(sQP%&GP%~YsK+$j-^yVN-$A(KqQ3IMY77-#I89^_Oe!ICcI$BGks z;dNe~hRzG}Xc$i&J(>{YD6zLCdX~T_gtGryjTi-N1bD3%zSStggZ^<}swWKsbND^L zMVnqm!Jkry1yEvg#gZuvNr}+tUYI*$@jBvq6h;Y&UEQV*BO;kIES%g0s#S;s2%kO>mhdUc0bZ*x7E z04@zS0-h9rd;t_5C-KEec=^7S3@?I=0WM$UfSE9)g=Q2s=wtzLNgYHW2^T9sNxPxN zOCdblMIUsj24C+1IWAT=S*`CUeW6EH6{@5psPT6fS?%&T&3OG2E`t2|5w+cvOkmXm zvpmTR>|A z&0!$tzePFkg7d3=-}eMK&Oflo1G%c!*%KQ9=uA#-g6f|>Pw!Y?w7Y0HCz1$761i7> z2Hwlc2j?mQlH)*P>_!E}#o0J6P|cv6OkOS-$jF`Ls$`}@y+sWN)I(zeNJjX*h2yF4y&`(qiO?mj%uCWVALCQS`fYQ2V+)**Vv++RT#=if#hbVD3>#q z!$tstEcCMSfUc?mIv&e8trof(+83H5#7Sl|t5GtKpw(~afWf| zK~4xzK6R+r2%t0pUR4{Fg^_W=CkoDiwwj-e73bsRqjQ)IrK2@;bjo|UsvTJ5HqL3G zG_Xto@>i_{i9Dj?Ky)Nl;n5rvz!i~c2`dy5%A>iUN1{1w1R!}IIRk8ZwdnURKqBXv z&9~&^b9{WRlBZfin_k9I%8ll*5hy=lA^&8yYL;)wr&>bkTJ?(0aR^>jdpL)U0Iw{> zD+?8`EL0jeCk_#r2$7U=2Jvu?8_oe(sc<-ljerHo4RhrhQVOJjxr5XIM>7>_#M`5) zvkSL3C!0z=Lin|4OcxfyW4cFUIv&nNh$sPUKHajI?lWA$InoG}BKHO6?2Qq@tdf!Jf5Lf;ANvU$%3D)7kqtWF&r^QaGd3$r;sjCI>8 zRtbeGm6E#C$1I-jWh2tr;`{K&j#it8aN#@-!re86aA*_V<}?>8Zv#*Bxb<1keaPMwn&mh% z+>BHNGOYtma^k*5d&)b9` zw8$QfT%Wc&m>=}YgHQpsrx&inMgZxHi=p8OGo0sZL=Yf)DG^9SVjkylhV7(6sJEft z8}JaGV<5-ec3Wo*SuX@m7A84W(v$3USO%{W(XT0Rz6i9GmC1SQ4 z%K%t1H00ZR&=N6l`|$vaZyxXj%>(GZ0qp&W3KgM`;-gF2un{0j2dY|K8zufuzmZnA z5_;wV(TW?O`()Zpzq0OQ%(J=9lT1kn4}>gNetUwRpAvj0tz#dXX;==k2h41Y9co?4HB*Drn*x9sZgM6U zL65V*{sTM|gGQ$aymRz~11QE)|K_2XzGP60gabC{yZXev2Y5W@ZCcMvf+X`8i^O9* z6l1Y*JQNdpPgz)tr=u`}jetrQtKjiiN$^;h08V$Vc5Y9A$apa3OBdn67!6T75m|{& zlgpxk&gjWFU8nrO7&ZbZL|D}VUJ|+41n8t1AhHsJF$ZYydXI@>z?eiJg9dn<@hnO_ zGLR4rY`a}GBVMHpc0m^*q2!s4c3~qReI(A}LtYeT$cMa=0lY8+G$b!*d@8kNB&_nU zKJ$jTxbKV^;u47jt;8a!jN0uKr%C;UiV1d+rkc7F@cxTTC@kM-7d8SkjSIKIhrCQS zf)s!hu>*cse4BQd{W`lie&K!tE334ltC3v=w}50F|dA3mbucC5cjr zLs4Cp!yC2)LaYNM5GK1&pMsJ`u5gYWnZ<7>9G-A*RLU2(f@lqAWQ#1gLO??f*>|jK zRLw@#7){BGLR0V~%R`C-HlkR_-G!Q~Y7I8Eiz;dhXlTuSl|Vg8#x*!JDH)?s&EfJy z_>uTrsew?W<$IUlbbOXm14|^X2;pFOt%|JG!bSk(JzNU28ER#%iB^<7h|fAxn#YMq za8_9t{4L39LmA>y0iFs5lp7{)kfSc)<3 zE69TDmbkN7;Qr;j5A@}s_*7?aXy2ET(H!V9jRQR}oi6&JUkw=2rV}n3s1ZQfm5y*& z2p9YZw(l&JDZW#6HSbhS8UeCJW{GRTC`4Sjlr{n(n@KLS$YqIKkSz?#%0p!`nHaJ# zD8o-9H?bfr)Q4`OY}V8c2=KVU^>L)xY(btB!cK%cUCF^FyD7yQY;t5}q!2D5+>NpY zS{u-CuvgV1SmWfxTI5w|+r<2+l1R6j396G`a4f3%4py36C4+2YETsYXG|gQua1AdG z^YHfKIUcRqx?u+>0K|32f3}lqd+}D^aX=N8(ff~%&UwW}7)Ysnp&B*xhZ^Dp*Rt2qf292FxmVy{|Bk4}|H4L~y8p;(_WRZ^QSTc%a9Kb2Sv6AL zYzePajZZJW%KwXBg2&ti*a+}jh<}TCL-Op}QfvfDZbH9keChd5Pac?=*8TIzlSAbT z=gtjJzj!p`#lJm&BC~5k!kd?JSHw2iNL)CcwCJ04>!i8MG*dekv!JTxZZlj zwD7eWv$g8c_4dsDR@x)}^Nu+?7bM=^tq~E4*(2mXPC4~+^o-F*3c9~5IkPb0w=W8t zx@&#C`s~lo?eBYc|KDF4n;pJ7&ouYN8Y#7=hbL@$>CDaXiw0kwfBT$l*Z6a1>fg+} z`|IXuFQf!NU+cu%aPcjhUS0p%fE{0U>22=(u-0dDn$`F^Y;2>0VePK{XWz*-In(QY zH$0o6po9Gp_M(uMdc`T1T(C{*RNHZ@yUL`>-_It=pHo?i$-~ zVWT02<9YA}8uSGX)?UAMQF1TT{XvbN{x}Ff=lH{gi?7@nKfMV-MBlvm6E%;xd%bVN z{4Jh-`}^IyWvxH)wO&cD)p+Z(*LOAki}At5uV5Yi$nPw{r=VUC%0$M@Fhi znbPB-wN~A&w?=6PeKKfiuX*iGH)`*`*6_K^J=@G{HlO%=+=Y*iZ|I#B8#(loqqir2 zu*2|njnvuOCLiy1VWTr|VcP*WQtC#%oIaxNXBi{=!v}tRZ~C{Y(Z4JldPg-Z|D0-S zer;K6`|!TTZPQ+mH=2KR(c8)Tz@2HgNKcgKN7l47s_p}^@EKI2d}-FS#V^FbYR5kMnC=0>_m-b%}#!M z?PcW|&D%R%3-<1<*Z;5zZlyH!qIwy>?#Wtr>F<{n$T4&}T(Ry|&9gYBD&{Y>1C z@%!wB+qNn$A6ngdMxSM?yAa{x3p!N=9Q*A5T(OaI`p$oR3+*GIc zge{I^>7Tr=crSNl%kgzucs_2hHf#IwZc7IBTW{Vn_S_`TfXz$3ID!m7pPL1mclL^A zY8$@;FVe^+$9hE1OZZ`NMnU1BCCkO9BW@n;a_5+K&EeV$M;9FbF{toPQ;oWTaqqXP zb?279pSW|~>3hySi^XSZj2i#x3nSpuTj#V$(>A!by(R4njX4Kz>BOy`(UV$T$X<5q^1GrzDYN7kt{=ZLGiS_*Gb=BS99Uqi zyYbGxlfR~a*XQDmFTVILT*^@5MT zxpG&xw>Lhxb~0(Bso==k-s?_Z{YG@@V&R_Uo#y?S)A;D*_4a|pQCV`_{d1FuE4TGi z$4$-Et-Dn7yTrX#t2Rjn4|#IovFwI7+BF@pYumPhrG0md%Y4wrsos#j>$3f1&91dZ zFVz$@esFhLztsCb|8Q|1+)EvE;;E%a%m-iSmp}C3j~~MJntp%7qE(KKH?J&cojqNe zelzOA$@jCTci(*@di>cp^KS3`^ZUiOc66`%@apD!7aCt%ls)a8-r*tlzj|=@R+Eu= z8+ZS-Sig1D?GppHY~H`^!MF1#rGB5WYsH?$QL7v7c;kLy>rRQehacqsDLOV`OLp6t zJ;${D#@%-Ps&juou~-O?U@|;{?ZJ)ipM32fcQ3*l0_*p!e4sA-op#IqXfbl%uBMrX zS~Q%MohvE)!`|Y91NzCq(|c^5*ZSQz_syy~W@E=Iw+}Z!esi^!{B8RrUyec_<;)TDpZawzaMz?L<`EP%& zIlRM-bGtXR4PO6A=U!ra=eF{pgYR#x-Nf$dZ1{co+lgBq%$qpuvz^ob21~v^@#e69 zMQm=>vgJt8cY6~;mCE1M>xRG!bY(`rt(%DYwLTv3OV7#AJ;>eq>5xnLS4Y3RHQU*{ zUgZ7Fb-Q$5y>U-Yn}eQ|u1)H^l3*WnNz4v`MIedAi+ zn)7PK>-IM5GkDv-S6%LTZOZ)(VY|XUJvr-@SN?Kl+Tj+~qxZMUw!mSU=r}1ppsqXM zgVsZxV{WZ~@cr$(XLj|~W&Th1_NgEGpZXx`&Ise}L+@T0S$m9jiZq9~J|g%^{)Jgv4ot3T*M0gwU8^3-X+u8V zb$gF&=jeV58w`m(m@xZD^87Jic;Vbm8}LWmbF*SE*1cq0rFO)`#cj&F++)v)Rf}7s zk8QXiqE(-Pn_rE4P1a{_?<14??}-03|4iPDdf(MuIi*qU+~xLn2M<_2cIdsM-D?hS zSm*h1)7maib+^58{o1yCZR4pc&VT#f>YZVqw*5c(3At>5WwP9qnp^YsV0VsExydd` zP^HEFI`PoWOTXn$ND6=Xa%bcH+wWf4k~1b{Z=9$1T{!S^hFU+4ZTH=k#>Ypm-*7zQ z$d+3VFCG0d{0F1-$Ezzpf#20@$et6oSMHjAV0OXKU$#Y@ykPvYQHwV&A6oaX^O{Cio8USOVv4Q@Ac`mx9j zh5y>NC(_jBWAhsq^V%(ZI8=Y~=+e7QCS5o)6J71A+S&CY*3P=oS$)U(!sh(rhx<*~ zdh^1*h1>oZu+UvAsOj^yF` z{tNkLc$cO=SkwBzLi_gHN29gQ{dMOhE?P7&=irs)yQaVU>u~9=-zKb?CfblZ=nwO( z`q!tJqQW=Ve|T!l*+cJL8aY(oEA8Cw+gmfn#5FPgzC2{}F-dk@lQy%5e)dk=ucH(> z+GF`m>-2v(tlxzPcMngzyQxK_^gVb^-8myqD>Bgu#9s4*o zxU()EnS5Mk{bf~?xB(j*ooUp*&x?&xr?rvve?D^P&%+NbcIS;+yY9-PtC#FtRJ-BckJ{b%=GAE1s{<~;D~cY#u)Fo^oo&=_O@_Vq?#!Ns zt4q>)67zd+lw=Lkuk3X?^h}Mb@1OWI|IokA)EeO!IWgzn=?(X{orlf#LByPvEn8Yw zG%Qp+XtQbUqQ=JrIUgUG7d4Te~Hs?^K0;-KiVzoB#XMaOazO z*K_NLuKsi9OT7nf-8p!%ZS#t5t1O-7_gcUH>lXj1^Gbs=>(8_@H?U=Pg=g{E>e{np zryE8FKe(pTGVEI$wNo&%Ez+#Ny;#g(>@H3efz{?i~l=6kqRb^HICIce>vgH}J;w_qOE> zO1d)X_GagdA)9ZGLZ|%6Yp-l+xTr~!^#f;yXfEZ<>W!Sv`s083eZh*;srMpU=1;J` zFmcNa`L~^xIlIo-Kg~1fx$TFOcPtn<@V7R{GZVjCVTez-JbnS(D=g=p4fgG44=rxi zqu!zVNnp16U%Jq7OY0%mJU0zBb;IKiEIxO8e)uBWtIfKXh4iXUwvl z7wXjMx#IHJsgBY1xE@Cl2({MyDE3OHfCO$r-`||RcP(7 z=$(iqou)Uw*J5137lS5je_{Om@k0xb&YwMZz^U&}q6c|vX!kd7?dVfC@9x#Zq92Fm z?%Q&0=lPz=BRa#znY{Yi!L3u$+DzQAYt+@f@`Cvr`tMt?{e0t`IcC+>xswOSAGorz zO~1&9AChl{UYWA}_190&=&>rS&~;?V?IY7$Chj`^u+7!w;Owrlu<>`x895F@4SB^dHhB}+Y$2r zDQ~TKw`IQlp=aypn!oE}8yO#N_#<(V^D6kzN6%iL^=0kI74Iz^oOkKU+Q`;Jy05C! z|C3!en>zb6aNgP4=KOtIqq*OIuUdC{N!|1J2lQRKfBhHt@>@O>Ejn1^j~|fNob&LL zAy?11K{xy4=3YJBQyz5AZE|bGh<(~ihfjPtXX3pNUg`V#jH7Q|kX@X6qhHR3A(mzK zi5tY{GluqQRB-#m^edlDoxDMCbi{~58@>|{d9YP=WoPYU@yTE7rUF*WAKSI*>imJD zj~)N*!QxB+qY`KD-@jZQetGC8_O>_woY`$nVo%$lRrgXRNB=$ja&FH5zOMiIvXuV} z`gUihQ|L`4UV5d`tes&JyYoK4+Vku7^nsH^(0xS+c((tWxO>={eN6}a`k!y%nf1T> zQO&&0DkXT~TXQyCOBHlKp1So$>%x1(_AGL){eIT(z1J=qg|O3ixq9hX;`<#^-))^Vk5A3_WVJolE3b{YuT&UCJ;R@ ztgF**KiYdl%atG8c$kv2f_US6-ZuxE`~|Jvnj4qD=zrjcsEO@bd^D@?wDgbf-u(P4 zcfXC_SmV1iI1{HS$nT#wE#%7Bf?dwkUc{-w+j}=gz7w%_rMlLSGpFy1+;DGS{=mcc z;62RWvQaRy=j9$(mc0D$KkYdSe@QSev+8eOiqgO_=uAlcsej6!uOhE)*{om23l4QF z7<+lzrk$r7=T4U09r@dJun^fV?iv8AeE-n!?-$3z_Rijz+3e29-P_XUfBNCgyBJex zG;0sfpEL6I>G4hC`V8sSeRZVc_5r=x+$R0Q@#?yLjn=($o7sQqb@t?~1O4_*J(G5! z$GziM6BjNBizwVbv)cx7E9JS|)$zmT$+yh-az$ba9R2;b_gVVje%p9DwcTWooU zQzNHO?t5(RkDtE3GVGOq%UXhG<2m=QVH2`X@3MXJ`Y(2{5V8$P%Dp#sMy?%t|Bur@ zSe^IZ%&(jMV@KuhtA?g2a%Mc(y{6mp0R!JSo0A&(&*N#=Tfh(A*=C;6@Yflet{ke{ z@b%oef2q@d>-u>o2N%dcvL3#AyZ^EL89fT$NN;{zI9<5PteE%ihO0ZWt}J*sNMOA< zJZ^dG1+7o#PB}9Fm7L}awv3ejcxleUh|3c-7v7%U=7*Q+!UO1>>>NFOMW6Ni*DuZa zYtxK@yO;J$-!#~LaMQA-`~EQ+9MHFyrCscX9)8W6x8F0~yH&s5u1R0iyE#be{gI#N zwi*l;8}93d_H_N$5kFd_D)X*c+DnQbSGtBCjad3)jrW=*{;{`}IzK#P{)6EQ4qfQf z`yb$nn&M$8>p>U4< zLhRz4gGU{!-743_|K1(fu-%30%ko5ZUirt!HDj9W`QT3Yzpn4koP(ZA)^&!${U&8_=z$&v}H?*F2IXWbxd zzWeH)c`Xy{&i!Lg?0x%4;;HkOY8EcF-)lMfO1*)D>-=ZX-fe{sLi*nuvn68s5Qn)( z!N?8k`x%KPC+5U$D@gn0#JDT@55H{i@csrp@K3*tuhq&Rg1ery@KC*7f{$OH_j2uv zozMLC?cHC-PtFDRspYs~ZByFk-2_CKdvF^1vFoC<-lG55g@nQq7&WS$F=dH(&SmoC1S9hPC=yXr_1?6W@8S70Mx z@%;9EyDJZ}BWCo9dap$cI42QV7dt(;*j2lE*PHiZ8qGa)0bCz-yOW+Bcc+hS_pu-0*YZh;5q}+_*v4K4NLYg5yoJZLbZ&9=-J8>Lllu z?!PZ@TnosxkzIamSlDawvXnad7Pm%cKPcE9Id$0Gj1h_l`#LQD>~v(;Gc|Xd{m;31 zvU;uJ27cS~%!SFev63yaMl(O3v|@zl{k2=>zp{6TtV6Bbm7OAg_^=u971w8ezj{a5 zr}tll*J4udD3*VBIatN?TS?>YPg>|7UdcY~oy> zWKa|w`Bt?Fpq;t>#+$7}KkvEG)K$=H$p=k_-o3Lbe@6V`^uhbG+tqj5cU+pZHepN8 zMen}dYI}piHjN_}-fQ{%ICqO%amSsJ=7eKCR}8oj6FF+hoT1}hX|Q4D1INWfSF2AN(+5&4m1EFZ?(A(-+3QKRLGHTMK&5dT=NboEF8_ zc{{#Z8EjqB|Lbvo-!^e`&;Nffe@GdJY)$ z*JXXtdm)N|9>I=xRuINz-+J1&esj{jIkIC894e&yafY1B$b ze7!R>4&2)OFb@c}y*DR~7_qwcqVaR*uDNw}R^d1}s13-lR3_n>9<^HRFBv-c6m}9yoZjd``=G$rpb8?ZA=z2idD+?e6W_H(_$< ztiEu>_8Rc>*I$OOHr~Ipf&j}fM4bNDCeQV}2=~45*z#t_(=MI;e%G!|SJt0A-KN&G zPh6L~51!cdxnqZavc7s_u%_1XwIly9z4u&n*6QS_Mm>kW@$rSP>eg8-y7J-aUI4}l z5g1!_@fSrG-GmjQ4M4;#e7N`XUwiBVqGm$#hI6zj&0fPs;KIe@y$_-eVz<~vc`e&Lbk^RqZ**wWy30dmA%pb(>!F)~ zEpE`LjU#qt{fD9m*@ze8YVPCi)uQ?}l-kVd2 zGvVL`oe{m*sKw0Ki|%EeGQR>J=7Z^%yX3ujGpg~}AM!W%F~0X)?BYB5J38gpEZ7h- zcu#evg7D_^(E1x{iU!#V9aX`u;bL6xPdraQ^6*qJC*h z9mme@ofALkd{o_Wt8=IPx*%ggOyLmtO^tzLoiu3fZu_gVK6q=1{d@a`nK!0b^McoJ zJGtjj-g&z^^{TGPUHh1bpj%Qtn< zdPnc^_s_k&xli7TOXqgf?>Zk`+20r5JGArklJvp(nsvzj^xqmW?^_7T?36E0o)*4h z;4}bI(}c6lu33e-V<7ynaGfRQ{x`2~pFDc?iY>WIGlsSW(>yt(&Vub9wMZL(e$z|! zTXuDh|E%ee-6vLc7_wr(t&byhD-Pz|iXHl3=B6eu{(G2vr|tHcdtWE#TpZD2#*hs^ z_eabWvb*o(z)Ll)f8T4NN?Y)-S3D!GNI=HZ6Dh|=lA4^&yPcI;jP7AUfaFq`~LHCF2yvcUq?OmA7=b_fF}w zIA>-0gPn)gED(pMr)0i5q@a)8eD>>ci!E8XO)extfT{7)rakH}HLmL41d!Ug!cnIF z$NwDCrN@*>&Bru27zR+N-_7p^!Lq(3Nm?)txM1u5-q|)`LOlpD{F+?=?0C=1eKQAs ztlU&r8`(4@#JZ#7XSL6L?%9$1IgrG=f3~jI+yw9bA1!1dch`U2&2zDHlY#-)&i;Aj zz=05TT)6jlIL>!JcV>6fn#er^{Mn^@_j?;|g15eTl6@d}rK4V66q4Egvy}KQJvtl5 zj2LliLt1RF0e^h`^419Om2Y26b1$9Sx>+JR69L-R+_2$$)#%Ivn}_A!#YUj%@2zKV zNW8Xb->$96*)tl}|GjtJ?84nvb@ZJ{lP7NhCUxSB&Q0bmKQI#@#p#_rn*up|NRZPL zaLd(g!hQ!YjX4u~dDM(!4g1{L5A=1%$gd)@-8jGhn`Xf?!h;-Zi0;$P2(q4A^&0@( zRVR)^Xs)s+{9X~u`f4(*{dr;k*b4R}{``d{R{~S2ad86ZdEp6d%?cV>^lp{U!gmb^% zH5fva_is6~t*J**WZ`P_6Q7z7Awb;cWh3mKo-1a`ZuE<}ck|RX?MJ(^_ijACZA;Yn zwv*oqQYxp(Ry!54DVL6XvGq{hea$TwX3Sfk*Ku)928wC5TGaI24?d_lv>pnIj9+)_ z^V|PDlhiyXbN1!lJ-2pk7xB@}t~r|`2VXt@a%9)(ZQ_*$GinyR&{VWce}DB)J>Vft zZq#hq+*7l6Coa4c^VNeBYr4UKzBfB+@Z5R*{-3?~fNHW^w}oRxML|VGq^T&V2#AQ( zfE7ea6r{ILk=|=4f#_#Jr9=TiYEYWgNDCzpR0O0Y^d68JAcPh|PjXk-XaE1bh8cFALGIz|poQLW0@Of)(BmSyZ*UITWl{xhN+ZS(m)^V}02N zO08ZeOe_-QlRkQ%tmV&Kc?;mUvUgl2oxnxyNX}3#N?VyI2LRG&$DL>@Gcqo$*%Rk& zidkDz3rA7#a?%c4TH6*YtE~gjvt5i6_@yk(#ZSaRqj_wi9HregS)YQ;YF9EW>9i&1 z8x1)h_j1u_PxPmZHEO-OI(-r**)P~+lrCQt{<@5jY_K>~8u7-}LO?YbYjDQ_F}iDP ztV$%|y*CxK0&C+O;%8lW-o7?2vDIh>!*d`yJA00wjZc_dJ;hTZBf% zGlil9YLaGF0uArz==Ar-NNSB1a_;R~r{@h^1kR0v)__^@>$Ry(UCoLS1PfPJ2MU&M z#oQd!Kqe<5A>lDb`V716Ox#*Ma%3?(l%pQGMTs6K-e+4C>gcCwX)NlVRlOc_A zvOLwRFiEU!5Ll~ATRqW=31W+wQFX!(?=F0Go{(_E18ftW?#3BjT|Y?=Ql;pDNnJWz zbkTo{eS{n|R949+w_02`RyS|70tN$yChn}&W{k1`Q`Xq%+mT;LIDH|F$8l)m)q}-! zn6@_8;}l>Tod9lO<;>`Jw)=n*aQi5X-kh4=6C!Zr$S|vKO!NDA!Bw!9Y=KmgDwQ0M zul8j(ks3SXk6bt|)pu0O$T|Ge^LAZv1#&ZfF_jhYnSfyt!#T%*?5=KNQWLf13KmI^ zD%_AwY+bAE4A|zvBH%YiJbtTtH~v(WVQf8QH8 zB?~+|P4U){H{IjMJ6#zc&uX^6u{_nikp1pCTLG)yVEouyFKL38Q@rXx%D#kOUVP&* zKilO&4kFg2!kojBlvnSt@YGZz)HRt$<|qa0n~&tf1+8qE^ckZq-0`;0zf-?ZJUb+t zB6W4&D6FuxKENptIvPBPALIds`1?Hq2UPn+YZF7d&%v$%Kt7xqLA4}n9)U>@36>5= z4b6T9%ST%|6UqL$EoeM)-?aTqqku=ichDp+RwKW#CNp{|p|98GV8?$>VSL_TUD{C# zIp?LrX_?D`1>8UIU}fRp$cNFf$Cq!f7jkm2i``hDn#ICfOdg1dupPbjLr5T$S5o62 zczjo6jOE7>>t;i`Yg467Y}ih!g1>jE0vYI{gfx7E93ie0-;D(Jhmgan+SmNH9qhVW zbxBa-XG~t;7&5r@GIN9~ey%!$t(U%%2&omw7d$Q}cO-D-;hh{qn{fOhZo~+7juC zt=lwdUg#89+_l3N&@<~9qmd5JXOf)RvS|Hu=8AUzSn!wbypt@-TsO|B&YGT>?0z3G z6#MCzH6knEit56gM>xLC$;9xeB#&WM=VZJ@NWIW%?%S7I*ve5SwT)UH84muc>hF~zSsWLt& zHjJUVzy*s7D2<%BD!17A>~&4i!{rokaz7&{rnM+U#0X-e!nwCt8NXhmky=sl)b^-O zF`^5*E!O>;mofXq~pW)i-vtZS%A9AIBVP|C6+GKI|d6nz0U$0To z$GbKaCD|8Ht5w>)zG{Sq2Cmji!g+lI?z!NX!#S*LGDtdj-P7Iq!zSeJ?24=Ps|Pfi zhUd(Wu(sAs_T+t4Fa*s~GMLz5(;Yc3VM0mFXqvkuFVx=kN1G>y&y4XA0Ng1Lw;>IZ#>ix#7-R88*7 zc4owb61>JFo>V=Z^3h2-@?^*PWw3(cClr3kQGDyjcqMtPtHdmA$T*>NHk@cFFMkbM zote_Z7?p>KU_1CD#>uF$ra6*<2ZNhjAIoHX|I-ql%jV#~Bt78;GBce0H{IuFw+DQ{ zHVu9a^;&^7`wG3AF&+!6lSZyKKT4Wa!`W&e)?{U^r{Dg7VSs>m=8S3}X>biRTHKq5 zI>3TkYmi234>d7pR%$|O4751v*Ts(}+_~YfAb;PbH8z)62iCy>%LY#(BPW5%AgkeJ z*tdR92-izfAc`QCtnBJ}h$>bKPVj$|Necqu21VUh;X@mrOTK;S7^*9y9fxblF(AG-4Lwz0WdCy z+&HhEx?vVAOpK&`4Cro0*kUY*@3c6@WKv2@KxIa3X|2|?Yw!)sCb*z5Owi`YpGFyJ z{Z+V&!Awf#Sn3|B8mX23h!>;wTr~F1|O{p6?xKE{D>NJ5x~h2#^6R@O!ZaiL}AKy&(TYcnB)$n~IAtihi zWTq}n?S3A#nLXCu{+)}RP?Fjh^_$LUF90+VT)b~nx zFrHiPG?rl&D>rbI1tz~cZi4V(F<%}P@%F_e0!|EA`P#jdGb|k@z$!eO|4~(e04;J0 zdHIr+Pq8BsGLC-aG<|!l^MHUX zIXB#DYjWDpw>$Y-f zt5znJJnZSWN+TOu-M-x;mG>AVAs+Ys)@@4-q_A}jPE{Y&XXx_$Q zB~vSH93IXMh_J2OE+=^1pPAQcb2+-N1@`WQ)b9eH{CPJ!pD!%TT8k(+6oI4Xe^`8p zQF8||SBS#(s0WZ!eVq*snOuYZ!|$PQPe87J+W|StPPc`f9CEK|W{-b!xfAO89SDS_ z!G6r2=G1X=wI!*Pxxlvz;=T{OL2F8nrN>Q>L4mdR0?l2exeEfRjI@5dObPq2kak1w@VfUlET5xH6zjoA-@mruGs#U3< z)6Smm^ZV`sH>=tK5d_nN{ap6_juKmTT&Bpo4DnR6D3P|g`yi*1gaskji^>*>T8{y9 z*1&;-E1dfcfyB@D$tjN_gR2+pW5Ge{cY~)z%?=m|4R5ujf~XS9K6WQ$8wCFLSgHZQ z3GUz(zvh5HsBKbvAPNMBD+eG~8-e+`SOq|Nc&K=d{TdMYg&f!>D!_OP2TGEAvDOaA zYxZC){J94Z+&K$V4OTD}WCE9Mta7s6^j7-7*e1asl-5_a9>J@Tbr15izvSapMyZ?z zZXYDY4}_5G0N(~qK=%Vn%cJZCz`mOshj0;h(!8esPU#7k0YaSkMgRdjSGz zNc_AL1iqgDUGJ}d{u+Y+t7gF#(swSizVJo<*uwl^_FQtZaKTAv|o@cjj)E~UZ*#ha%C+QokmbHe*&D<^3 zN!pCtRB5_L%68M8Nv@!0dBKvmhh%)eAXpyP|ASw)LEu06+`pdoAC2T+qx0A3{KsqU zzwHd!27&(&CjQ%=`d??w2Kb@r?p?o6R9!|*rqi7%{O7or&? z_#(U~M7F70;`f^1q|Y~SdJx$4-|T;uc5{KhPr?2nzZ|u(p92Tm-e=$+d*pxE(dNA= zJHCyqhfI*k-#xu3{3_P+wrV04NCoLUZftUUQLY!#m1qPP84B1Bk@d0*3REp()_2Q3 z-6iS{nO~TQf)OcAq&&NYFp|k|@-T^&_igc5x5?yi%xX)lZmTLvT)W{*2`MTHqM4}!KmV+4fvm8YY+so;Cjv-asl2`wBAJ@@UkYkK_~7F z4_2uRn_8};e*sc$&i8EBUH|#S7Cz}}MIv#%TVHsrgGLmWCf0V#LLk3?m2qtEG9m5` z#uVbe^RHk26~+KwL5DmQUtCFSrr>b2!GHpKv;@Pi9J=Xa8gTZVx}24gp25A5o|qV?&b=8ZZ}(3h(^uLyFqtB zAi-h)yM$D$kuH?|TbFXdQz1{$LT(S(J?%fVUi|ky8XKqTryf@)lup+1s60-Jo8S)~ zV$naMSFDMSL>Q|CW}B4YrP!1UE1L)~Z*E8=&dE^n$4;oWtoj)WB(Km|n=;(79ervv zDg+|P$*%4tq#RlvNy3bHccXQqZi~spkjv=^0D&8gbJjFI9EvEK*(2_&id%168f4?y z>!kyN*A}`xy@uiwz^f{tvWKci_xIC7 zgQilG>HbdOO?<9w=83Cx*A^y-5UA{fLOAN6+k3^RJOe8S@{8xc=$F5>1OIi$|1UiC zf5Jm6lL8>$q7*DvX~`2*6WeM~ZjxGB{1wED2>-SmcXGU2YENu&vtp74O{Gi0M8r@n zldAiwl*nvOVlDw_Ot~y-(ra^`K=Zmqz!t?F*>w5^kB^qAax!T5cCW`53ZYHQ|PE zHDh*iXz9ld)~ryrPj`6{@+zkJd0wXbi@BC0|F1Z?rqjvBPbC=k{;rh$?$I$;>!av= zGt^USFQv_L#aQ<7ixiXS*RAf(+a{R-+9NobMM3CJK8|^=65N#QI`PVy!~N`TuBW0NPEfRT?r^ENzOEC77N;;|8YEJbEcj?fMZzb;B|3HcC|Ar~Z*2o~{sK4O_!p@)7tq;ks zt(tgQzRXg2ntIwDBKRi6O9_cbAn*Z8Guw~$4Q{t02O;@y*y9S;HFu0M?Rj|-yF2ll zG%o_I=3l8h0cGeLvH(tAe9#rbWDQ3J!S-pbK=v!|yW9IC;`8}@;}S=gbVjzC83v18 zaV)W?J6gCpISmYS_nW%8IAOZ_9Sx4%es|}1-)fNf?z{Wmy@S#=MX$)(*+yzd_Nk6+ zg8&_&;-{j}a7o-tm8OWMsiOCQCdUut3fO=C`p;j3@YhWEr(OmBrV0GD*8c*$zfk{Q zbro!bz+XWBPYv|{1bptnr=cC@Cq^HO$_44=TjMgY573vOf0iDH< z+Ue;(m9Ra|3i)H=Ik(C*p0e)acMLBE?P%?a>$l`EKjMDsyk4aB)zv_2!GUyf0{??Y zL+c+tom5Flu-;Td8>>G*Zn1YlU_oe@4`Pv&MfLf{yF)`+#e4XCda%c8Mh5lJ*;pGC>P z)LQ&TG5(s2hLL%@nQX@R%Yf3~qeE`yX<^Cx-=a|My$|>+sIPW>8afBL{?482y50R? zNQzSmczu3FE~=g=g-*uoK?@&X629d;j4f!3?1Vy9ZwHPd?}!Fu1(qt*uVlE`T)dEX zU_^Mwb-(FGGGw>#1jm%Ay|Pu=J_W>KK7p+L)`cp;s*|IZGs(i4g-h{=XL$$njJ>p@ z>bF6_PAhUoAikpW<9EfFGaK2?l!;WjWcdbmd^&IKNwdC#9-cesaQ0|oFD&M)#TA*@r=r?duU?%NVGZ%jkRXs35HiGj?*s>= zVy_s#%dKG7!dKkWBfUdkC(;b_C4HRvR&=^vKY~_5dAFaY5HG)jm$S5~ z?``p>9G~g&NlT$?3Ep&@pyEeGEZh~_W$pU`rN%-~!wH(6&Hlv)jV-!*PttViVTPMN z!S5`gqg_y_u8)t-MW~1F2LpO=AeGkMF&h2heM*NN#d~&5QSR#1bq4fLNl7`wxT>Sz zvlw4$&KZDD<{q48o)xeCVubRm{dxOKZlyXnWQaF%>)geQH~aYC+`Ic)Pcv(Nn7?Df zR{X*R8PgDy;ofoOzL-BcIW2A&T|k?F=jgoIZ{p9H_T|gI3G&$n+oI{an(2;?3@am! zCB)&WE8PY}A?7hx@@D>@8%2zrq-*;g20{~2az43=`xN>wrz;FBvKq4kTFm^eld}cb zCu_5E@7-A)!PxYVAMc`JPr!Qw%y5he4J2TbI*C^Or!*^Ue33dA2yH1$(lI`PX+Q1S zIMcj7_nY&CflLF+JxNS#{Lxf1Tkh8J#lD%O1n2!v8g;wun^rul7BLp4xW(Hz=E{q; z^CWklPh#OshBxMq)qfS#bSxY&@XWm@P#QBWGEZ%bp-xZ(T#Rb1ulP`#@nAEaOq=|u zY%h90mKHq}jKsjAf}k7U?0J`UeVkdN6NgR<+)9Z0kY;AP+Eey`zmah7;fuWWk5~Js z7oowr6nS*#!2EpIq>GIunl+{o`k_tsdqGk{lKna((Trodsb>}LENvcOjP&=?2;G$R z{-eURtm1x6h_{iiZKN~d%x5q})IOwXXpB%BI1ttQ`RuEl1ClvhN#}FAYgi?NndBj* zz^As_K2p_{fmSb*{XKL-QPQ(f*?mO^t~%a^P1u+oT>2j5r%Pxd=6ub2#SKsh zyJG9jg|>T8=2qi1bWimu9qwVP&N*@k_)MZ7R2lxK^=1)KYk5=6&EVm~7p}NZ>zk@6 zmv!3OT7(v7eY0{aP0?-&`SQ#XvjKS0Oy_3lPZ9df%T0IB4-XVC#l@V=L95C%6a+0S zm_Qe!3>pdAok^wKZ7*a@?rFN_r^3)#9Un?7$2x-1@`$_epv}4W5!7}b^75|^^!oDP za*mgBc+auxU=A2=gTRgXhxIar1L?a$i1ze~ zv5gLa0cD?}lp^x;?loLkIp<_~s^o}qa2i2mxUBbX)!NvFw{M;En_%d?E;w1rg%&g) zC#!9(ZhJQ}BF4~RPFA8HK>%AC6udfk7w*g=N(c;eT}xvgv|#vKo*&rDbj09jJq0W9 zfj;zRccgo^HSXxn2t#dQbY5ca+4_~Ya`oQ%6*nS_oekdLy?s8Ny&!qcu*i0~TWxrl z(m|=KyY0B})HQ-S6TkP+Opgvq<+3SbBO@S4*YsYlR8nHjG>_MEX(@c#2-$lc>?RzY z#W7!H+!y!865Uf}mY8wO&S|vwQWbMWm$C6dN0mCZtXaOXLK5xF30bviKjVCD;>o!S z;u4y%IxQW_B6A&J$+YJ0mY2Gw$4#-4u@`v97J$ql>R@-Z^Aba;4dU#U4=`ff=y z6dtsscWJ;39#H)*?CsmuAUIdgAtPSXi#A4@Z`w}E6o;rEq<#XEaCug`+dfD<;H=A# zWyX9E<*~*&=&vCiu!TnlHpvD3&`!IhNU-LE6RKpbcXRG!K6r`bjg*}6v=iadjh$7q|DA7yGrXm{0#;!3wa~nmzrl!E05J_>S(<|;4A{`M@6_}$m`p$N6_U3#+^o@ z&dOR+OSd_3r9rFBrekUO2d1aA95u8yhG>nv9$i4Y=`m-oRrW!oL9Mgb7 z2M-q?+9FxPCy3Tm4A$$^N{fX;cY(!zFZbfnMy)_IELmD#sJik(qV=B;OA>geem?mP3U@S z*>UN|gLm%SnR=BIj~>hUwJ#w#(D^gq538mo6@`6iCb9t(Jnq%z*2br$@tQGjGWAyF zHQ&KI8X8lRlnu)FKxwW)rpi@ad5Zx|ZDWT8sD;T$#Am=O`bJg<%QJtpUoPrnPsh^r zN-(dqc3}$I^8Gov15~6y@gWkDQq1hQ?HAL=^1%&APE!6}ush|=l2;^s(3+?6+8=|p zwdynZ7_P1!SK;w(5GY+;wW|UJr~PDO<~)0T1Gc1clB`D~O|LlG+qc{0B=N~zGo!uC zlzv<-r`JFPk3o9sDQOyi|z&Tm;Dv1eOd zo?kENsaZF+`r_kkbdx*ccv{9!``IrC>sJcK$i+`;AJng4lQN5)++L>s5LQjYfs6B5 z_|@lIZRG0f)!*Csq-Uc=yaeI%CL;P_78d)UyifC@a8#DZ9sUScRHS!(EJuT_ldk7E z2TFveq-pT&O|HZTx2&T)uS8u1OPgIlr_S3&_-yLzqGS9wy|L|^Wd#MPSG-vy(Mwik zq)lB4iF?&yqF)aXi*!IDTd3t+f4-rtKkmTe<;}?5i4G`So)Vt_vfL!$xV)Gd zQsUqgM@Y=m4=7at*pa1`Ic{<>1}s(jq;lX7-$N7tRlP^O`=~8d!K$X-_m$yB=arOh zGC13>THi~q<5g_x2H@aG!+L^x|822oxU$0J&3*z-L*7#V3v&;l?mNY8zLWW!P>5aq z=73_9Gcuk5`dMG7re!GD_2XPf38-x+PtJlB*Pgc67q1AlDzJ)9Py1;PT}o=JU?hn6 z_#NDc`7WuZ2?bt! zXkvmHoV^_`l9UDJ;|0YFb&GH)lTomN3gP2$UQ<6sCwN)DrVi?Vy3>T3Y8@$3GU`Z4 zY(5KssdcR_E@JQN7BQ0l=3$rKfWi*1-FrS;?t8-Tz&X(&pZ_R^G&DG|@x;I6qyY8p z+nHX*doahRW|}q?u=S`$=OVjDo_b+YCkIId79JIbG(Hi>3I4p$(C|)c?g#@@$J{YH zUtFrX21;&XzHsBzX9 z4$&n;LL?PYwiZ5-y5gs!RBFOx`0S>TEVsZ=B0sr3<3s1%qbBkLNyn21)b&$(L27Gan)HFZVZ!{qu!%@(U(D|}@el~;?7T3z|#r=5`; zoYwnbG3{)q~$FqoAej?X_D|1sAKloY6z9wWk1h{(P&U zJRfF`On2K+?@zgw)H-Nqm|gip3GYAjV^@6j)Vt)kZ4fZaT`QX$WA_abQVl&KHSQ)u z4P!-efrg)~arjS~(oEOq^&cyf0xvEPZ80kB2$!|~3 zmlB(M3KaQG< z+2l@YYyWUAfI@->%)DQmNf<`hiJn%y2Z&gjvWT($_-^c>LplKyn1M=P=^z@36fbiQ zrnaX0eoUE%m-kcP+=&dgVB~|$A^F4fn<)o$>KcF0=4StyGpT388WS329tPu8j9f|>0BRTDM`=}vCW zJuN--o>IJOGx=%FFnO2J_w#?BWUx~a^VvS>7nKdH`GY&+KOd=53BKlizXJ4Erip9r zy{GK#AD3!{#)>%5p{6$(eX7h{HM65(*k@`3lxIraOwi#?0a*Ng_`~tCj4|Ip+PhJ;`!jmT3ZqlS*HXd1wzNsEZcxmW&63=wN-?h3G#nsV70!V%(2P2x7>}x zNve5O4|E8F2HZrPwK05H}HE4_jYb&au~Hqi0I|){jVmC?@_&`=Rn6xbI|tEaYH*3KA~(w# z$F-A7nmvmm2{=O4h-=#wr*p&aIo||`;M&WH5kZBy{h8;QBhV^#eZJ7PGIpaX?7tyf zuV!^oJIh~F)`(=T`&m+zteppgb4LgkFQ5`uTIbVkPg>GjZ2T*<_lVY^@_S;B(mBPsSm!NZC3lNI&P6#-wDi;gYq6 zjdAy@mCWp!fF|FG@{Qxd4imwpC9+NW>!0&XVg^zx`ukJDxEAp6pVv!yUSJM|R8*)7 zDb6H5%>wLch)!LtjuXsKxhwl_QetnYr?7o#`>kco{9pAA8twblv_Ht2X!iFZYxS)9_2z4z_qz9d z%|WqnFU$M=)b>EjSD{#q8+f0RLW88rRxiF^v>TTjjTI7=5l6C@cz%tUSw2WjlF}OD zI7pSsPS?Zc9gUWma?cr0PS%u0RX1Qs@`8mSexL&oETF zyJ~l5frZ8ziHo~HLTcK@q}`z=CMu7x69KwiiJlmx3IVa78qN165kFFw%P;U5!*-oDtjCe(0c{lQuZJ&@|v-* zED)5oL7?3R!N`cR6xZ}(BvL2|#lHHRwoiwPSj7{&BL()t{dU^SKa*8510k$FTwp+A zV`CKx?IMlr=44(HrQTUTn6x@M-y`oTFgx`?0e@bO;xGuL$;BG`6|4Jr@nu_b;yplQMWtDt%Q9dyNWhe^Fo(gPQ~TsiGJnU%`U1 zFJMJPB^7VA{5bCNH7yYwDNDq7>fjx$v-E0HK`Qeq3_ve_-`}TYnTM4=DQMqYc^aQk zaad;M6FpZy4nfrua+R5rgICIG=OXNn^YT72iM$u-T7k6+v67Zcr;b4J0b^FU=)_}r zm>~amsW+Y!$-&7~qj%W}7z)O#>rj8eX0&1cg|5n%97=MT&*XtJoeR`wp{8^?L5tl< z$3zd%xe~^MY*&E}ckZXM8d=tk(r>XCi!Mz5*0Hr_5|Y|sml%FR^B#pkIv-NoAFR+$p63~zNMO9rMN2F^!ajLl!#7n+%y9keOz%)g$MZ)GQ z$GO;z*5|F=V+hu?orce5_%5LVpb?wwc%yv7J$+%`rEyl$NcK&*auw&7DE<3vw+a zE1_&Ybn@pm(Ln#I*ADjfh1$LyoljPmF7mzVj6TtXkWAvGj9qzw->9*|&J2YdrxX#Z zq(fs5i=>B2&twHo9_$#l#NR}zDRj?U8yS`9L{L=6s+_E6oo$kO&Q(^xLyHiE5}~^# zIRujs$J&q)gcNgJwZOzv&zlpqtaFO82O0f7;xpnEp&qRyJqYv~l)%9#3#o`1N&=gd zCI!QKl(3@pS#r-*M0VrCUe*Bd>bsQMcZFfMAw%2gE)TqXNat1@EU>jtVQD#w&-EZu&T5 zC*Rz&h}|Pw3lvBvLf&&pwSn@?o9spli1PiQL%05sgjR$0S?|o@d`Z!s)1$p82wW|N zb_8n?5~+yNKzKswhv`6+qygyd*~Y?`5oj02ExSJH3sBiwD$iQ+)Y;BtR$I=OhW-L7 z(;sm<{dBI*h0`R-D2X6Ev#f`|o+Q2_EX)}xAuCoF@W4`kVB_AYj8I?B(}=iJ1?QgS z^KCs)S9-g|uf%3ctTNh}^h`N!0e&^5jw^4dUycw$Q^U<*8#Zf}*49y?DWS__hzBhg zp)%Ty^NrgeVEly$ii7X^{_geQv6w3s*Ye795J2xu&#cX={H)#~KA|M$nw#(Xb$Pb8 zGEbY`V9DdwciIC2nn&s#tO^D^_I%;|H-6N9it_V~4i%=eK(Ud6h|^4O{>!H|wZ;1t zUDSSQMAg|$zZ_OCcJdv&-_&rg-N?<;H{7{!fIeU(Paz`Z1Iu(y86@T#1l@`nd(n1( zI1Mvged=f61nGN?9ev5ECA=D_=j?v^^GMaz$B_4Odh_s@i#am}W<677V-rdec#Iw?rYk#l*(K6a z|D2d{&g#;EVcVT>zOaDrA~t8E=XKU+KfZb;mS?U%V;tlRxakIHR#=~8<5g76NH|4u zlRfc?TV7VagS$5|B0TirO~k{5CgIJC@5s;Z#}wR8Qtm%GyTp@AV}K4IV(9#X2S?(s zs%p(Q4`lAQPUJc6+HW}dz*Wr(Ie5f9On79rL?)$G(c`gQY>1BrdtR0tQabaudHLh; z2kB$sQxjiO7@ss&*N)poa~T<#N4lBZ^j$0zeIcOw#na@DxT@;C_40<(g95{eZYP)< zsDx$uCf^hXOtR-fY?QgT_X{=*elW5}r%U98H_?W}WkeIzTq4-#egTEOCYj&zIje z`+DxDh9a|ET9(|Bi5BXT4t7go45AOQRwqTidd~~VU%a)h*l=-*qQakRuHWy7%Crc~ zqkP4|EW2aAyV6E;X_3J=xOmvib-r5n%l-)L8S}kS!cti??rw$u^N8e{8f8D%Nc5Rn zYiogLSr}!ku^GPSY*GO$#pmv`>exxnzj3iaHWv$6-~VGBUzlw<09Oi8;O39c2aI0m zmIv_Z*nPGz(X0g9DRZ#iHcBcf(r#VwBB9fF-s zVysg4Y=eNC1!fQUK{11qY+U1F5M>J~HU}RA55d}ZnV9y1_?_(3P#W8u_mfm3fb~I0~H%?8P=evCxh>T4dsrd2ytj>v~t{oFa07 zUV6lLZsE@5CfHZPYQ99$xa~Q`S0i`ZBP=paD=BlP>UCkWHgRd*9fmBaHwfXs&loT^ z?nClC6l0zv?sqF@3RUlU@XMEY!CqqLU0J(7Y23S5(l)XCsF2VnC#m@{l*PdVtKNYN zPnVAiPkYlRg03R&qOOVbe5j(0sA|F6nR^`Ab{aZ4A^Jp~U9j=sZybXLw#LQ>EF*zZti>*e}4jvah`He`CkDlY4 zX3snMZ;7gK
Q3Ty9f9PRa*=O;>z=weVJVtuVagbE==q)Y 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 Date: Sun, 26 Jul 2020 07:41:58 +0530 Subject: [PATCH 06/16] reformat tests --- .../ExpandedControlsActivityTest.java | 11 ++------ .../activity/IntroductionActivityTest.java | 18 +++++-------- .../activity/NativeVideoActivityTest.java | 19 +++++-------- .../activity/NavigationActivityTest.java | 27 +++++++------------ .../activity/OfflineFilesActivityTest.java | 21 ++++++--------- .../activity/RecentFilesActivityTest.java | 20 +++++--------- .../activity/ServerAppActivityTest.java | 12 +++------ .../activity/ServerFileAudioActivityTest.java | 25 +++++++---------- .../activity/ServerFileImageActivityTest.java | 10 ++----- .../activity/ServerFileVideoActivityTest.java | 21 ++++++--------- .../activity/ServerFilesActivityTest.java | 17 +++++------- .../activity/SettingsActivityTest.java | 11 ++------ 12 files changed, 70 insertions(+), 142 deletions(-) diff --git a/src/androidTest/java/org/amahi/anywhere/activity/ExpandedControlsActivityTest.java b/src/androidTest/java/org/amahi/anywhere/activity/ExpandedControlsActivityTest.java index 7b55e8e16..2c437af54 100644 --- a/src/androidTest/java/org/amahi/anywhere/activity/ExpandedControlsActivityTest.java +++ b/src/androidTest/java/org/amahi/anywhere/activity/ExpandedControlsActivityTest.java @@ -14,14 +14,7 @@ import org.junit.runners.MethodSorters; import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.action.ViewActions.click; -import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist; -import static androidx.test.espresso.assertion.ViewAssertions.matches; -import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; import static androidx.test.espresso.matcher.ViewMatchers.withId; -import static androidx.test.espresso.matcher.ViewMatchers.withText; -import static org.hamcrest.Matchers.not; -import static org.junit.Assert.*; @RunWith(AndroidJUnit4.class) @LargeTest @@ -39,12 +32,12 @@ public void setUp() throws Exception { } @Test - public void test1(){ + public void test1() { onView(withId(R.menu.action_bar_expanded_controller)); } @Test - public void test2(){ + public void test2() { onView(withId(R.id.media_route_menu_item)); } diff --git a/src/androidTest/java/org/amahi/anywhere/activity/IntroductionActivityTest.java b/src/androidTest/java/org/amahi/anywhere/activity/IntroductionActivityTest.java index 7cea32e74..719dbd08e 100644 --- a/src/androidTest/java/org/amahi/anywhere/activity/IntroductionActivityTest.java +++ b/src/androidTest/java/org/amahi/anywhere/activity/IntroductionActivityTest.java @@ -1,12 +1,10 @@ package org.amahi.anywhere.activity; import androidx.test.filters.LargeTest; -import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner; import androidx.test.rule.ActivityTestRule; import androidx.test.runner.AndroidJUnit4; import org.amahi.anywhere.R; -import org.amahi.anywhere.util.Android; import org.junit.After; import org.junit.Before; import org.junit.FixMethodOrder; @@ -16,13 +14,9 @@ import org.junit.runners.MethodSorters; import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.action.ViewActions.click; import static androidx.test.espresso.assertion.ViewAssertions.matches; import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; -import static androidx.test.espresso.matcher.ViewMatchers.withId; - import static androidx.test.espresso.matcher.ViewMatchers.withText; -import static org.junit.Assert.*; @RunWith(AndroidJUnit4.class) @LargeTest @@ -40,37 +34,37 @@ public void setUp() throws Exception { } @Test - public void test1(){ + public void test1() { onView(withText(R.string.intro_phone_1)).check(matches(isDisplayed())); onView(withText(R.string.intro_desc_phone_1)).check(matches(isDisplayed())); } @Test - public void test2(){ + public void test2() { onView(withText(R.string.intro_title_2)); onView(withText(R.string.intro_desc_2)); } @Test - public void test3(){ + public void test3() { onView(withText(R.string.intro_title_3)); onView(withText(R.string.intro_desc_phone_3)); } @Test - public void test4(){ + public void test4() { onView(withText(R.string.intro_title_4)); onView(withText(R.string.intro_desc_phone_4)); } @Test - public void test5(){ + public void test5() { onView(withText(R.string.intro_title_5)); onView(withText(R.string.intro_desc_phone_5)); } @Test - public void test6(){ + public void test6() { onView(withText(R.string.intro_title_6)); onView(withText(R.string.intro_desc_6)); } diff --git a/src/androidTest/java/org/amahi/anywhere/activity/NativeVideoActivityTest.java b/src/androidTest/java/org/amahi/anywhere/activity/NativeVideoActivityTest.java index 58bafb1d3..221f30778 100644 --- a/src/androidTest/java/org/amahi/anywhere/activity/NativeVideoActivityTest.java +++ b/src/androidTest/java/org/amahi/anywhere/activity/NativeVideoActivityTest.java @@ -1,12 +1,10 @@ package org.amahi.anywhere.activity; import androidx.test.filters.LargeTest; -import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner; import androidx.test.rule.ActivityTestRule; import androidx.test.runner.AndroidJUnit4; import org.amahi.anywhere.R; -import org.amahi.anywhere.util.Android; import org.junit.After; import org.junit.Before; import org.junit.FixMethodOrder; @@ -16,14 +14,9 @@ import org.junit.runners.MethodSorters; import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.action.ViewActions.click; -import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist; import static androidx.test.espresso.assertion.ViewAssertions.matches; import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; -import static androidx.test.espresso.matcher.ViewMatchers.withId; - import static androidx.test.espresso.matcher.ViewMatchers.withText; -import static org.junit.Assert.*; @RunWith(AndroidJUnit4.class) @LargeTest @@ -41,37 +34,37 @@ public void setUp() throws Exception { } @Test - public void test1(){ + public void test1() { onView(withText(R.string.intro_phone_1)).check(matches(isDisplayed())); onView(withText(R.string.intro_desc_phone_1)).check(matches(isDisplayed())); } @Test - public void test2(){ + public void test2() { onView(withText(R.string.intro_title_2)); onView(withText(R.string.intro_desc_2)); } @Test - public void test3(){ + public void test3() { onView(withText(R.string.intro_title_3)); onView(withText(R.string.intro_desc_phone_3)); } @Test - public void test4(){ + public void test4() { onView(withText(R.string.intro_title_4)); onView(withText(R.string.intro_desc_phone_4)); } @Test - public void test5(){ + public void test5() { onView(withText(R.string.intro_title_5)); onView(withText(R.string.intro_desc_phone_5)); } @Test - public void test6(){ + public void test6() { onView(withText(R.string.intro_title_6)); onView(withText(R.string.intro_desc_6)); } diff --git a/src/androidTest/java/org/amahi/anywhere/activity/NavigationActivityTest.java b/src/androidTest/java/org/amahi/anywhere/activity/NavigationActivityTest.java index cd58c0fe9..5c3914a8b 100644 --- a/src/androidTest/java/org/amahi/anywhere/activity/NavigationActivityTest.java +++ b/src/androidTest/java/org/amahi/anywhere/activity/NavigationActivityTest.java @@ -1,12 +1,10 @@ package org.amahi.anywhere.activity; import androidx.test.filters.LargeTest; -import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner; import androidx.test.rule.ActivityTestRule; import androidx.test.runner.AndroidJUnit4; import org.amahi.anywhere.R; -import org.amahi.anywhere.util.Android; import org.junit.After; import org.junit.Before; import org.junit.FixMethodOrder; @@ -16,13 +14,8 @@ import org.junit.runners.MethodSorters; import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.action.ViewActions.click; -import static androidx.test.espresso.assertion.ViewAssertions.matches; -import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; import static androidx.test.espresso.matcher.ViewMatchers.withId; - import static androidx.test.espresso.matcher.ViewMatchers.withText; -import static org.junit.Assert.*; @RunWith(AndroidJUnit4.class) @LargeTest @@ -40,52 +33,52 @@ public void setUp() throws Exception { } @Test - public void test1(){ + public void test1() { onView(withId(R.id.view_stub_tv_loading)); } @Test - public void test2(){ + public void test2() { onView(withId(R.id.tv_loading)); } @Test - public void test3(){ + public void test3() { onView(withId(R.id.container_content)); } @Test - public void test4(){ + public void test4() { onView(withId(R.id.container_navigation)); } @Test - public void test5(){ + public void test5() { onView(withId(R.id.toolbar)); } @Test - public void test6(){ + public void test6() { onView(withText(R.string.title_shares)); } @Test - public void test7(){ + public void test7() { onView(withText(R.string.menu_navigation_open)); } @Test - public void test8(){ + public void test8() { onView(withId(R.id.drawer_content)); } @Test - public void test9(){ + public void test9() { onView(withText(R.string.application_name)); } @Test - public void test10(){ + public void test10() { onView(withText(R.string.title_apps)); } diff --git a/src/androidTest/java/org/amahi/anywhere/activity/OfflineFilesActivityTest.java b/src/androidTest/java/org/amahi/anywhere/activity/OfflineFilesActivityTest.java index 59d8c2897..866cc3cb8 100644 --- a/src/androidTest/java/org/amahi/anywhere/activity/OfflineFilesActivityTest.java +++ b/src/androidTest/java/org/amahi/anywhere/activity/OfflineFilesActivityTest.java @@ -1,12 +1,10 @@ package org.amahi.anywhere.activity; import androidx.test.filters.LargeTest; -import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner; import androidx.test.rule.ActivityTestRule; import androidx.test.runner.AndroidJUnit4; import org.amahi.anywhere.R; -import org.amahi.anywhere.util.Android; import org.junit.After; import org.junit.Before; import org.junit.FixMethodOrder; @@ -16,13 +14,10 @@ import org.junit.runners.MethodSorters; import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.action.ViewActions.click; import static androidx.test.espresso.assertion.ViewAssertions.matches; import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; import static androidx.test.espresso.matcher.ViewMatchers.withId; - import static androidx.test.espresso.matcher.ViewMatchers.withText; -import static org.junit.Assert.*; @RunWith(AndroidJUnit4.class) @LargeTest @@ -40,42 +35,42 @@ public void setUp() throws Exception { } @Test - public void test1(){ + public void test1() { onView(withText(R.string.title_offline_files)).check(matches(isDisplayed())); } @Test - public void test2(){ + public void test2() { onView(withId(R.id.container_files)).check(matches(isDisplayed())); } @Test - public void test3(){ + public void test3() { onView(withText(R.string.message_progress_file_downloading)); } @Test - public void test4(){ + public void test4() { onView(withText(R.string.message_file_download_complete)); } @Test - public void test5(){ + public void test5() { onView(withId(R.id.parent_view)); } @Test - public void test6(){ + public void test6() { onView(withText(R.string.alert_delete_dialog)); } @Test - public void test7(){ + public void test7() { onView(withText(R.string.alert_delete_confirm)); } @Test - public void test8(){ + public void test8() { onView(withText(R.string.message_offline_file_deleted)); } diff --git a/src/androidTest/java/org/amahi/anywhere/activity/RecentFilesActivityTest.java b/src/androidTest/java/org/amahi/anywhere/activity/RecentFilesActivityTest.java index 5ae11bcf1..ea3099b7c 100644 --- a/src/androidTest/java/org/amahi/anywhere/activity/RecentFilesActivityTest.java +++ b/src/androidTest/java/org/amahi/anywhere/activity/RecentFilesActivityTest.java @@ -1,12 +1,10 @@ package org.amahi.anywhere.activity; import androidx.test.filters.LargeTest; -import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner; import androidx.test.rule.ActivityTestRule; import androidx.test.runner.AndroidJUnit4; import org.amahi.anywhere.R; -import org.amahi.anywhere.util.Android; import org.junit.After; import org.junit.Before; import org.junit.FixMethodOrder; @@ -16,16 +14,12 @@ import org.junit.runners.MethodSorters; import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.action.ViewActions.click; import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist; import static androidx.test.espresso.assertion.ViewAssertions.matches; import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; -import static androidx.test.espresso.matcher.ViewMatchers.isNotChecked; import static androidx.test.espresso.matcher.ViewMatchers.withId; - import static androidx.test.espresso.matcher.ViewMatchers.withText; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.*; @RunWith(AndroidJUnit4.class) @LargeTest @@ -43,37 +37,37 @@ public void setUp() throws Exception { } @Test - public void test1(){ + public void test1() { onView(withText(R.string.title_recent_files)).check(matches(isDisplayed())); } @Test - public void test2(){ + public void test2() { onView(withId(R.id.recent_list)).check(matches(not(isDisplayed()))); } @Test - public void test3(){ + public void test3() { onView(withId(android.R.id.empty)).check(matches(isDisplayed())); } @Test - public void test4(){ + public void test4() { onView(withId(R.id.layout_refresh)).check(matches(isDisplayed())); } @Test - public void test5(){ + public void test5() { onView(withText(R.string.message_delete_file_error)).check(doesNotExist()); } @Test - public void test6(){ + public void test6() { onView(withText(R.string.message_offline_file_deleted)).check(doesNotExist()); } @Test - public void test7(){ + public void test7() { onView(withId(R.id.media_route_menu_item)).check(doesNotExist()); } diff --git a/src/androidTest/java/org/amahi/anywhere/activity/ServerAppActivityTest.java b/src/androidTest/java/org/amahi/anywhere/activity/ServerAppActivityTest.java index 42bb0413c..81ca804b9 100644 --- a/src/androidTest/java/org/amahi/anywhere/activity/ServerAppActivityTest.java +++ b/src/androidTest/java/org/amahi/anywhere/activity/ServerAppActivityTest.java @@ -1,12 +1,10 @@ package org.amahi.anywhere.activity; import androidx.test.filters.LargeTest; -import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner; import androidx.test.rule.ActivityTestRule; import androidx.test.runner.AndroidJUnit4; import org.amahi.anywhere.R; -import org.amahi.anywhere.util.Android; import org.junit.After; import org.junit.Before; import org.junit.FixMethodOrder; @@ -16,14 +14,10 @@ import org.junit.runners.MethodSorters; import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.action.ViewActions.click; -import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist; import static androidx.test.espresso.assertion.ViewAssertions.matches; import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; import static androidx.test.espresso.matcher.ViewMatchers.withId; - import static androidx.test.espresso.matcher.ViewMatchers.withText; -import static org.junit.Assert.*; @RunWith(AndroidJUnit4.class) @LargeTest @@ -41,17 +35,17 @@ public void setUp() throws Exception { } @Test - public void test1(){ + public void test1() { onView(withText(R.string.title_offline_files)).check(matches(isDisplayed())); } @Test - public void test2(){ + public void test2() { onView(withId(R.id.container_files)).check(matches(isDisplayed())); } @Test - public void test3(){ + public void test3() { onView(withText(R.string.message_progress_file_downloading)); } diff --git a/src/androidTest/java/org/amahi/anywhere/activity/ServerFileAudioActivityTest.java b/src/androidTest/java/org/amahi/anywhere/activity/ServerFileAudioActivityTest.java index a41fc7108..4fba60217 100644 --- a/src/androidTest/java/org/amahi/anywhere/activity/ServerFileAudioActivityTest.java +++ b/src/androidTest/java/org/amahi/anywhere/activity/ServerFileAudioActivityTest.java @@ -1,12 +1,10 @@ package org.amahi.anywhere.activity; import androidx.test.filters.LargeTest; -import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner; import androidx.test.rule.ActivityTestRule; import androidx.test.runner.AndroidJUnit4; import org.amahi.anywhere.R; -import org.amahi.anywhere.util.Android; import org.junit.After; import org.junit.Before; import org.junit.FixMethodOrder; @@ -16,15 +14,12 @@ import org.junit.runners.MethodSorters; import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.action.ViewActions.click; import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist; import static androidx.test.espresso.assertion.ViewAssertions.matches; import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; import static androidx.test.espresso.matcher.ViewMatchers.withId; - import static androidx.test.espresso.matcher.ViewMatchers.withText; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.*; @RunWith(AndroidJUnit4.class) @LargeTest @@ -42,52 +37,52 @@ public void setUp() throws Exception { } @Test - public void test1(){ + public void test1() { onView(withText(R.string.title_recent_files)).check(matches(isDisplayed())); } @Test - public void test2(){ + public void test2() { onView(withId(R.id.recent_list)).check(matches(not(isDisplayed()))); } @Test - public void test3(){ + public void test3() { onView(withId(android.R.id.empty)).check(matches(isDisplayed())); } @Test - public void test4(){ + public void test4() { onView(withId(R.id.layout_refresh)).check(matches(isDisplayed())); } @Test - public void test5(){ + public void test5() { onView(withText(R.string.message_delete_file_error)).check(doesNotExist()); } @Test - public void test6(){ + public void test6() { onView(withText(R.string.message_offline_file_deleted)).check(doesNotExist()); } @Test - public void test7(){ + public void test7() { onView(withId(R.id.media_route_menu_item)).check(doesNotExist()); } @Test - public void test8(){ + public void test8() { onView(withId(R.id.media_route_menu_item)); } @Test - public void test9(){ + public void test9() { onView(withId(R.id.menu_audio_list)); } @Test - public void test10(){ + public void test10() { onView(withId(R.id.audio_list_container)); } diff --git a/src/androidTest/java/org/amahi/anywhere/activity/ServerFileImageActivityTest.java b/src/androidTest/java/org/amahi/anywhere/activity/ServerFileImageActivityTest.java index 0c44f6264..2f0b5b75c 100644 --- a/src/androidTest/java/org/amahi/anywhere/activity/ServerFileImageActivityTest.java +++ b/src/androidTest/java/org/amahi/anywhere/activity/ServerFileImageActivityTest.java @@ -1,12 +1,10 @@ package org.amahi.anywhere.activity; import androidx.test.filters.LargeTest; -import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner; import androidx.test.rule.ActivityTestRule; import androidx.test.runner.AndroidJUnit4; import org.amahi.anywhere.R; -import org.amahi.anywhere.util.Android; import org.junit.After; import org.junit.Before; import org.junit.FixMethodOrder; @@ -16,15 +14,11 @@ import org.junit.runners.MethodSorters; import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.action.ViewActions.click; -import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist; import static androidx.test.espresso.assertion.ViewAssertions.matches; import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; import static androidx.test.espresso.matcher.ViewMatchers.withId; - import static androidx.test.espresso.matcher.ViewMatchers.withText; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.*; @RunWith(AndroidJUnit4.class) @LargeTest @@ -42,12 +36,12 @@ public void setUp() throws Exception { } @Test - public void test1(){ + public void test1() { onView(withText(R.string.title_recent_files)).check(matches(isDisplayed())); } @Test - public void test2(){ + public void test2() { onView(withId(R.id.recent_list)).check(matches(not(isDisplayed()))); } diff --git a/src/androidTest/java/org/amahi/anywhere/activity/ServerFileVideoActivityTest.java b/src/androidTest/java/org/amahi/anywhere/activity/ServerFileVideoActivityTest.java index e9fea6f35..e9ba2d1d8 100644 --- a/src/androidTest/java/org/amahi/anywhere/activity/ServerFileVideoActivityTest.java +++ b/src/androidTest/java/org/amahi/anywhere/activity/ServerFileVideoActivityTest.java @@ -1,12 +1,10 @@ package org.amahi.anywhere.activity; import androidx.test.filters.LargeTest; -import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner; import androidx.test.rule.ActivityTestRule; import androidx.test.runner.AndroidJUnit4; import org.amahi.anywhere.R; -import org.amahi.anywhere.util.Android; import org.junit.After; import org.junit.Before; import org.junit.FixMethodOrder; @@ -16,15 +14,12 @@ import org.junit.runners.MethodSorters; import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.action.ViewActions.click; import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist; import static androidx.test.espresso.assertion.ViewAssertions.matches; import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; import static androidx.test.espresso.matcher.ViewMatchers.withId; - import static androidx.test.espresso.matcher.ViewMatchers.withText; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.*; @RunWith(AndroidJUnit4.class) @LargeTest @@ -42,42 +37,42 @@ public void setUp() throws Exception { } @Test - public void test1(){ + public void test1() { onView(withText(R.string.title_recent_files)).check(matches(isDisplayed())); } @Test - public void test2(){ + public void test2() { onView(withId(R.id.recent_list)).check(matches(not(isDisplayed()))); } @Test - public void test3(){ + public void test3() { onView(withId(android.R.id.empty)).check(matches(isDisplayed())); } @Test - public void test4(){ + public void test4() { onView(withId(R.id.layout_refresh)).check(matches(isDisplayed())); } @Test - public void test5(){ + public void test5() { onView(withText(R.string.message_delete_file_error)).check(doesNotExist()); } @Test - public void test6(){ + public void test6() { onView(withText(R.string.message_offline_file_deleted)).check(doesNotExist()); } @Test - public void test7(){ + public void test7() { onView(withId(R.id.media_route_menu_item)).check(doesNotExist()); } @Test - public void test8(){ + public void test8() { onView(withText(R.string.title_recent_files)).check(matches(isDisplayed())); } diff --git a/src/androidTest/java/org/amahi/anywhere/activity/ServerFilesActivityTest.java b/src/androidTest/java/org/amahi/anywhere/activity/ServerFilesActivityTest.java index 0820fe031..c7c225c7e 100644 --- a/src/androidTest/java/org/amahi/anywhere/activity/ServerFilesActivityTest.java +++ b/src/androidTest/java/org/amahi/anywhere/activity/ServerFilesActivityTest.java @@ -1,12 +1,10 @@ package org.amahi.anywhere.activity; import androidx.test.filters.LargeTest; -import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner; import androidx.test.rule.ActivityTestRule; import androidx.test.runner.AndroidJUnit4; import org.amahi.anywhere.R; -import org.amahi.anywhere.util.Android; import org.junit.After; import org.junit.Before; import org.junit.FixMethodOrder; @@ -16,13 +14,10 @@ import org.junit.runners.MethodSorters; import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.action.ViewActions.click; import static androidx.test.espresso.assertion.ViewAssertions.matches; import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; import static androidx.test.espresso.matcher.ViewMatchers.withId; - import static androidx.test.espresso.matcher.ViewMatchers.withText; -import static org.junit.Assert.*; @RunWith(AndroidJUnit4.class) @LargeTest @@ -40,32 +35,32 @@ public void setUp() throws Exception { } @Test - public void test1(){ + public void test1() { onView(withText(R.string.title_offline_files)).check(matches(isDisplayed())); } @Test - public void test2(){ + public void test2() { onView(withId(R.id.container_files)).check(matches(isDisplayed())); } @Test - public void test3(){ + public void test3() { onView(withText(R.string.message_progress_file_downloading)); } @Test - public void test4(){ + public void test4() { onView(withText(R.string.title_offline_files)).check(matches(isDisplayed())); } @Test - public void test5(){ + public void test5() { onView(withId(R.id.container_files)).check(matches(isDisplayed())); } @Test - public void test6(){ + public void test6() { onView(withText(R.string.message_progress_file_downloading)); } diff --git a/src/androidTest/java/org/amahi/anywhere/activity/SettingsActivityTest.java b/src/androidTest/java/org/amahi/anywhere/activity/SettingsActivityTest.java index 6b77d5069..fecbbbcdc 100644 --- a/src/androidTest/java/org/amahi/anywhere/activity/SettingsActivityTest.java +++ b/src/androidTest/java/org/amahi/anywhere/activity/SettingsActivityTest.java @@ -1,12 +1,10 @@ package org.amahi.anywhere.activity; import androidx.test.filters.LargeTest; -import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner; import androidx.test.rule.ActivityTestRule; import androidx.test.runner.AndroidJUnit4; import org.amahi.anywhere.R; -import org.amahi.anywhere.util.Android; import org.junit.After; import org.junit.Before; import org.junit.FixMethodOrder; @@ -16,15 +14,10 @@ import org.junit.runners.MethodSorters; import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.action.ViewActions.click; import static androidx.test.espresso.assertion.ViewAssertions.matches; import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; import static androidx.test.espresso.matcher.ViewMatchers.withId; -import static androidx.test.espresso.matcher.ViewMatchers.withText; -import static org.hamcrest.Matchers.not; -import static org.junit.Assert.*; - @RunWith(AndroidJUnit4.class) @LargeTest @FixMethodOrder(MethodSorters.DEFAULT) @@ -41,12 +34,12 @@ public void setUp() throws Exception { } @Test - public void test1(){ + public void test1() { onView(withId(R.id.settings_container)).check(matches(isDisplayed())); } @Test - public void test2(){ + public void test2() { onView(withId(android.R.id.home)); } From 5c2deb93073dc31bca1df0e28238775c3cf27073 Mon Sep 17 00:00:00 2001 From: Chirag Jain Date: Sun, 26 Jul 2020 07:59:23 +0530 Subject: [PATCH 07/16] reformat tests --- .../anywhere/activity/ExpandedControlsActivityTest.java | 5 ++--- .../amahi/anywhere/activity/IntroductionActivityTest.java | 5 ++--- .../org/amahi/anywhere/activity/NativeVideoActivityTest.java | 5 ++--- .../org/amahi/anywhere/activity/NavigationActivityTest.java | 5 ++--- .../amahi/anywhere/activity/OfflineFilesActivityTest.java | 5 ++--- .../org/amahi/anywhere/activity/RecentFilesActivityTest.java | 5 ++--- .../org/amahi/anywhere/activity/ServerAppActivityTest.java | 5 ++--- .../amahi/anywhere/activity/ServerFileAudioActivityTest.java | 5 ++--- .../amahi/anywhere/activity/ServerFileImageActivityTest.java | 5 ++--- .../amahi/anywhere/activity/ServerFileVideoActivityTest.java | 5 ++--- .../org/amahi/anywhere/activity/ServerFilesActivityTest.java | 5 ++--- .../org/amahi/anywhere/activity/SettingsActivityTest.java | 5 ++--- 12 files changed, 24 insertions(+), 36 deletions(-) diff --git a/src/androidTest/java/org/amahi/anywhere/activity/ExpandedControlsActivityTest.java b/src/androidTest/java/org/amahi/anywhere/activity/ExpandedControlsActivityTest.java index 2c437af54..baa867195 100644 --- a/src/androidTest/java/org/amahi/anywhere/activity/ExpandedControlsActivityTest.java +++ b/src/androidTest/java/org/amahi/anywhere/activity/ExpandedControlsActivityTest.java @@ -23,9 +23,8 @@ public class ExpandedControlsActivityTest { @Rule - public ActivityTestRule mActivityRule = new ActivityTestRule<>( - ExpandedControlsActivity.class - ); + public ActivityTestRule mActivityRule + = new ActivityTestRule<>(ExpandedControlsActivity.class); @Before public void setUp() throws Exception { diff --git a/src/androidTest/java/org/amahi/anywhere/activity/IntroductionActivityTest.java b/src/androidTest/java/org/amahi/anywhere/activity/IntroductionActivityTest.java index 719dbd08e..bda7cbcf7 100644 --- a/src/androidTest/java/org/amahi/anywhere/activity/IntroductionActivityTest.java +++ b/src/androidTest/java/org/amahi/anywhere/activity/IntroductionActivityTest.java @@ -25,9 +25,8 @@ public class IntroductionActivityTest { @Rule - public ActivityTestRule mActivityRule = new ActivityTestRule<>( - IntroductionActivity.class - ); + public ActivityTestRule mActivityRule + = new ActivityTestRule<>(IntroductionActivity.class); @Before public void setUp() throws Exception { diff --git a/src/androidTest/java/org/amahi/anywhere/activity/NativeVideoActivityTest.java b/src/androidTest/java/org/amahi/anywhere/activity/NativeVideoActivityTest.java index 221f30778..a5acba208 100644 --- a/src/androidTest/java/org/amahi/anywhere/activity/NativeVideoActivityTest.java +++ b/src/androidTest/java/org/amahi/anywhere/activity/NativeVideoActivityTest.java @@ -25,9 +25,8 @@ public class NativeVideoActivityTest { @Rule - public ActivityTestRule mActivityRule = new ActivityTestRule<>( - IntroductionActivity.class - ); + public ActivityTestRule mActivityRule + = new ActivityTestRule<>(IntroductionActivity.class); @Before public void setUp() throws Exception { diff --git a/src/androidTest/java/org/amahi/anywhere/activity/NavigationActivityTest.java b/src/androidTest/java/org/amahi/anywhere/activity/NavigationActivityTest.java index 5c3914a8b..4e3565146 100644 --- a/src/androidTest/java/org/amahi/anywhere/activity/NavigationActivityTest.java +++ b/src/androidTest/java/org/amahi/anywhere/activity/NavigationActivityTest.java @@ -24,9 +24,8 @@ public class NavigationActivityTest { @Rule - public ActivityTestRule mActivityRule = new ActivityTestRule<>( - NavigationActivity.class - ); + public ActivityTestRule mActivityRule + = new ActivityTestRule<>(NavigationActivity.class); @Before public void setUp() throws Exception { diff --git a/src/androidTest/java/org/amahi/anywhere/activity/OfflineFilesActivityTest.java b/src/androidTest/java/org/amahi/anywhere/activity/OfflineFilesActivityTest.java index 866cc3cb8..ae8ee77e6 100644 --- a/src/androidTest/java/org/amahi/anywhere/activity/OfflineFilesActivityTest.java +++ b/src/androidTest/java/org/amahi/anywhere/activity/OfflineFilesActivityTest.java @@ -26,9 +26,8 @@ public class OfflineFilesActivityTest { @Rule - public ActivityTestRule mActivityRule = new ActivityTestRule<>( - OfflineFilesActivity.class - ); + public ActivityTestRule mActivityRule + = new ActivityTestRule<>(OfflineFilesActivity.class); @Before public void setUp() throws Exception { diff --git a/src/androidTest/java/org/amahi/anywhere/activity/RecentFilesActivityTest.java b/src/androidTest/java/org/amahi/anywhere/activity/RecentFilesActivityTest.java index ea3099b7c..0503a3ad5 100644 --- a/src/androidTest/java/org/amahi/anywhere/activity/RecentFilesActivityTest.java +++ b/src/androidTest/java/org/amahi/anywhere/activity/RecentFilesActivityTest.java @@ -28,9 +28,8 @@ public class RecentFilesActivityTest { @Rule - public ActivityTestRule mActivityRule = new ActivityTestRule<>( - RecentFilesActivity.class - ); + public ActivityTestRule mActivityRule + = new ActivityTestRule<>(RecentFilesActivity.class); @Before public void setUp() throws Exception { diff --git a/src/androidTest/java/org/amahi/anywhere/activity/ServerAppActivityTest.java b/src/androidTest/java/org/amahi/anywhere/activity/ServerAppActivityTest.java index 81ca804b9..1c5b46eca 100644 --- a/src/androidTest/java/org/amahi/anywhere/activity/ServerAppActivityTest.java +++ b/src/androidTest/java/org/amahi/anywhere/activity/ServerAppActivityTest.java @@ -26,9 +26,8 @@ public class ServerAppActivityTest { @Rule - public ActivityTestRule mActivityRule = new ActivityTestRule<>( - OfflineFilesActivity.class - ); + public ActivityTestRule mActivityRule + = new ActivityTestRule<>(OfflineFilesActivity.class); @Before public void setUp() throws Exception { diff --git a/src/androidTest/java/org/amahi/anywhere/activity/ServerFileAudioActivityTest.java b/src/androidTest/java/org/amahi/anywhere/activity/ServerFileAudioActivityTest.java index 4fba60217..1b14f02cc 100644 --- a/src/androidTest/java/org/amahi/anywhere/activity/ServerFileAudioActivityTest.java +++ b/src/androidTest/java/org/amahi/anywhere/activity/ServerFileAudioActivityTest.java @@ -28,9 +28,8 @@ public class ServerFileAudioActivityTest { @Rule - public ActivityTestRule mActivityRule = new ActivityTestRule<>( - RecentFilesActivity.class - ); + public ActivityTestRule mActivityRule + = new ActivityTestRule<>(RecentFilesActivity.class); @Before public void setUp() throws Exception { diff --git a/src/androidTest/java/org/amahi/anywhere/activity/ServerFileImageActivityTest.java b/src/androidTest/java/org/amahi/anywhere/activity/ServerFileImageActivityTest.java index 2f0b5b75c..8034bd826 100644 --- a/src/androidTest/java/org/amahi/anywhere/activity/ServerFileImageActivityTest.java +++ b/src/androidTest/java/org/amahi/anywhere/activity/ServerFileImageActivityTest.java @@ -27,9 +27,8 @@ public class ServerFileImageActivityTest { @Rule - public ActivityTestRule mActivityRule = new ActivityTestRule<>( - RecentFilesActivity.class - ); + public ActivityTestRule mActivityRule + = new ActivityTestRule<>(RecentFilesActivity.class); @Before public void setUp() throws Exception { diff --git a/src/androidTest/java/org/amahi/anywhere/activity/ServerFileVideoActivityTest.java b/src/androidTest/java/org/amahi/anywhere/activity/ServerFileVideoActivityTest.java index e9ba2d1d8..aa8825c48 100644 --- a/src/androidTest/java/org/amahi/anywhere/activity/ServerFileVideoActivityTest.java +++ b/src/androidTest/java/org/amahi/anywhere/activity/ServerFileVideoActivityTest.java @@ -28,9 +28,8 @@ public class ServerFileVideoActivityTest { @Rule - public ActivityTestRule mActivityRule = new ActivityTestRule<>( - RecentFilesActivity.class - ); + public ActivityTestRule mActivityRule + = new ActivityTestRule<>(RecentFilesActivity.class); @Before public void setUp() throws Exception { diff --git a/src/androidTest/java/org/amahi/anywhere/activity/ServerFilesActivityTest.java b/src/androidTest/java/org/amahi/anywhere/activity/ServerFilesActivityTest.java index c7c225c7e..3c1cad476 100644 --- a/src/androidTest/java/org/amahi/anywhere/activity/ServerFilesActivityTest.java +++ b/src/androidTest/java/org/amahi/anywhere/activity/ServerFilesActivityTest.java @@ -26,9 +26,8 @@ public class ServerFilesActivityTest { @Rule - public ActivityTestRule mActivityRule = new ActivityTestRule<>( - OfflineFilesActivity.class - ); + public ActivityTestRule mActivityRule + = new ActivityTestRule<>(OfflineFilesActivity.class); @Before public void setUp() throws Exception { diff --git a/src/androidTest/java/org/amahi/anywhere/activity/SettingsActivityTest.java b/src/androidTest/java/org/amahi/anywhere/activity/SettingsActivityTest.java index fecbbbcdc..e702e1748 100644 --- a/src/androidTest/java/org/amahi/anywhere/activity/SettingsActivityTest.java +++ b/src/androidTest/java/org/amahi/anywhere/activity/SettingsActivityTest.java @@ -25,9 +25,8 @@ public class SettingsActivityTest { @Rule - public ActivityTestRule mActivityRule = new ActivityTestRule<>( - SettingsActivity.class - ); + public ActivityTestRule mActivityRule + = new ActivityTestRule<>(SettingsActivity.class); @Before public void setUp() throws Exception { From ab3d87f519b02fe798df3eab14888e34cff77150 Mon Sep 17 00:00:00 2001 From: Chirag Jain Date: Sun, 26 Jul 2020 08:30:55 +0530 Subject: [PATCH 08/16] update espresso dependencies --- build.gradle | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 16055e473..0d317272e 100644 --- a/build.gradle +++ b/build.gradle @@ -150,9 +150,20 @@ dependencies { implementation 'com.jakewharton.timber:timber:4.5.1' // Espresso Testing Framework Implementations - androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0' - androidTestImplementation 'androidx.test.espresso:espresso-web:3.1.0' - androidTestImplementation 'androidx.test.espresso:espresso-intents:3.1.0' + def ESPRESSO_LIBRARY_VERSION = "3.2.0" +// androidTestImplementation "androidx.test.espresso:espresso-core:${ESPRESSO_LIBRARY_VERSION}" +// androidTestImplementation "androidx.test.espresso:espresso-web:${ESPRESSO_LIBRARY_VERSION}" +// androidTestImplementation "androidx.test.espresso:espresso-intents:${ESPRESSO_LIBRARY_VERSION}" + + androidTestImplementation ("androidx.test.espresso:espresso-core:${ESPRESSO_LIBRARY_VERSION}") { + exclude group: "javax.inject" + } + androidTestImplementation ("androidx.test.espresso:espresso-web:${ESPRESSO_LIBRARY_VERSION}") { + exclude group: "javax.inject" + } + androidTestImplementation ("androidx.test.espresso:espresso-intents:${ESPRESSO_LIBRARY_VERSION}") { + exclude group: "javax.inject" + } // Otto and Retrofit implementation 'com.squareup:otto:1.3.8' From cd75cc59f782e8c1386a663371db8bd031b39921 Mon Sep 17 00:00:00 2001 From: Chirag Jain Date: Sun, 26 Jul 2020 08:31:14 +0530 Subject: [PATCH 09/16] update espresso dependencies --- build.gradle | 4 ---- 1 file changed, 4 deletions(-) diff --git a/build.gradle b/build.gradle index 0d317272e..e29956410 100644 --- a/build.gradle +++ b/build.gradle @@ -151,10 +151,6 @@ dependencies { // Espresso Testing Framework Implementations def ESPRESSO_LIBRARY_VERSION = "3.2.0" -// androidTestImplementation "androidx.test.espresso:espresso-core:${ESPRESSO_LIBRARY_VERSION}" -// androidTestImplementation "androidx.test.espresso:espresso-web:${ESPRESSO_LIBRARY_VERSION}" -// androidTestImplementation "androidx.test.espresso:espresso-intents:${ESPRESSO_LIBRARY_VERSION}" - androidTestImplementation ("androidx.test.espresso:espresso-core:${ESPRESSO_LIBRARY_VERSION}") { exclude group: "javax.inject" } From 83e7f2b8d18c2c70ebf916ff93ad63c36d1d127d Mon Sep 17 00:00:00 2001 From: Chirag Jain Date: Sun, 26 Jul 2020 08:49:46 +0530 Subject: [PATCH 10/16] update travis --- .travis.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8c9a7fd7d..c12500114 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,6 +8,10 @@ before_install: jdk: - oraclejdk8 +env: + matrix: + - ANDROID_TARGET=android-19 ANDROID_ABI=armeabi-v7a + android: components: - tools @@ -31,7 +35,7 @@ before_script: - adb shell settings put global transition_animation_scale 0 & - adb shell settings put global animator_duration_scale 0 & - adb shell input keyevent 82 & - + script: - ./gradlew connectedDebugAndroidTest From 9db6ba35514de41b21b7806bd9fb55ef194f38c2 Mon Sep 17 00:00:00 2001 From: Chirag Jain Date: Sun, 26 Jul 2020 09:57:46 +0530 Subject: [PATCH 11/16] update travis --- .travis.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index c12500114..b0daa6d1c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,14 +3,14 @@ language: android before_install: - yes | sdkmanager "platforms;android-29" - yes | sdkmanager "platforms;android-28" - - yes | sdkmanager "platforms;android-19" +# - yes | sdkmanager "platforms;android-19" jdk: - oraclejdk8 env: matrix: - - ANDROID_TARGET=android-19 ANDROID_ABI=armeabi-v7a + - ANDROID_TARGET=android-28 ANDROID_ABI=armeabi-v7a android: components: @@ -19,16 +19,16 @@ android: - platform-tools - build-tools-28.0.3 - android-28 - - android-19 +# - android-19 - extra-android-support - extra-android-m2repository - extra-google-m2repository - - sys-img-armeabi-v7a-android-19 + - sys-img-armeabi-v7a-android-28 licenses: - .+ before_script: - - echo no | android create avd --force -n test -t android-19 --abi armeabi-v7a + - echo no | android create avd --force -n test -t android-28 --abi armeabi-v7a - emulator -avd test -no-audio -no-window & - android-wait-for-emulator - adb shell settings put global window_animation_scale 0 & From 0609e57f11cf6cf6c75a19cf78b8cbef9efcb522 Mon Sep 17 00:00:00 2001 From: Chirag Jain Date: Sun, 26 Jul 2020 10:06:21 +0530 Subject: [PATCH 12/16] update travis --- .travis.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index b0daa6d1c..7a55dbc3b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,14 +3,14 @@ language: android before_install: - yes | sdkmanager "platforms;android-29" - yes | sdkmanager "platforms;android-28" -# - yes | sdkmanager "platforms;android-19" + - yes | sdkmanager "platforms;android-22" jdk: - oraclejdk8 env: matrix: - - ANDROID_TARGET=android-28 ANDROID_ABI=armeabi-v7a + - ANDROID_TARGET=android-22 ANDROID_ABI=armeabi-v7a android: components: @@ -19,16 +19,16 @@ android: - platform-tools - build-tools-28.0.3 - android-28 -# - android-19 + - android-22 - extra-android-support - extra-android-m2repository - extra-google-m2repository - - sys-img-armeabi-v7a-android-28 + - sys-img-armeabi-v7a-android-22 licenses: - .+ before_script: - - echo no | android create avd --force -n test -t android-28 --abi armeabi-v7a + - echo no | android create avd --force -n test -t $ANDROID_TARGET --abi $ANDROID_ABI - emulator -avd test -no-audio -no-window & - android-wait-for-emulator - adb shell settings put global window_animation_scale 0 & From 22b3e00faa638a6a8f79e6471365e606356bf6ec Mon Sep 17 00:00:00 2001 From: Chirag Jain Date: Sun, 26 Jul 2020 10:25:59 +0530 Subject: [PATCH 13/16] update travis --- .travis.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7a55dbc3b..03e78f2e2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,21 +9,22 @@ jdk: - oraclejdk8 env: - matrix: - - ANDROID_TARGET=android-22 ANDROID_ABI=armeabi-v7a + global: + - ANDROID_TARGET=android-25 + - ANDROID_BUILD_TOOLS_VERSION=28.0.3 + - ANDROID_ABI=armeabi-v7a android: components: - tools - tools - platform-tools - - build-tools-28.0.3 - - android-28 - - android-22 + - build-tools-$ANDROID_BUILD_TOOLS_VERSION + - $ANDROID_TARGET - extra-android-support - extra-android-m2repository - extra-google-m2repository - - sys-img-armeabi-v7a-android-22 + - sys-img-armeabi-v7a-android-28 licenses: - .+ From 51754b94f494e68c8578babf9517915d11efc2f7 Mon Sep 17 00:00:00 2001 From: Chirag Jain Date: Sun, 26 Jul 2020 10:29:38 +0530 Subject: [PATCH 14/16] update travis --- .travis.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 03e78f2e2..b25dfcc53 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,22 +1,20 @@ language: android -before_install: - - yes | sdkmanager "platforms;android-29" - - yes | sdkmanager "platforms;android-28" - - yes | sdkmanager "platforms;android-22" - jdk: - oraclejdk8 env: global: - - ANDROID_TARGET=android-25 + - ANDROID_TARGET=android-24 - ANDROID_BUILD_TOOLS_VERSION=28.0.3 - ANDROID_ABI=armeabi-v7a +before_install: + - yes | sdkmanager "platforms;android-29" + - yes | sdkmanager "platforms;android-24" + android: components: - - tools - tools - platform-tools - build-tools-$ANDROID_BUILD_TOOLS_VERSION @@ -38,6 +36,7 @@ before_script: - adb shell input keyevent 82 & script: + - ./gradlew assembleDebug - ./gradlew connectedDebugAndroidTest notifications: From b41f5a921d72173315b0c3f19d7d065f3195c00d Mon Sep 17 00:00:00 2001 From: Chirag Jain Date: Sun, 26 Jul 2020 10:37:14 +0530 Subject: [PATCH 15/16] update travis --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index b25dfcc53..70d610a69 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ jdk: env: global: - - ANDROID_TARGET=android-24 + - ANDROID_TARGET=android-28 - ANDROID_BUILD_TOOLS_VERSION=28.0.3 - ANDROID_ABI=armeabi-v7a @@ -22,12 +22,12 @@ android: - extra-android-support - extra-android-m2repository - extra-google-m2repository - - sys-img-armeabi-v7a-android-28 + - sys-img-armeabi-v7a-android-22 licenses: - .+ before_script: - - echo no | android create avd --force -n test -t $ANDROID_TARGET --abi $ANDROID_ABI + - echo no | android create avd --force -n test -t android-22 --abi $ANDROID_ABI - emulator -avd test -no-audio -no-window & - android-wait-for-emulator - adb shell settings put global window_animation_scale 0 & From 158f07525d2eb885ee529506d0c4b5159b7807e9 Mon Sep 17 00:00:00 2001 From: Chirag Jain Date: Sun, 26 Jul 2020 10:42:23 +0530 Subject: [PATCH 16/16] update travis --- .travis.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 70d610a69..c115cdfa7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,13 +5,12 @@ jdk: env: global: - - ANDROID_TARGET=android-28 + - ANDROID_TARGET=android-22 - ANDROID_BUILD_TOOLS_VERSION=28.0.3 - ANDROID_ABI=armeabi-v7a before_install: - yes | sdkmanager "platforms;android-29" - - yes | sdkmanager "platforms;android-24" android: components: @@ -19,7 +18,6 @@ android: - platform-tools - build-tools-$ANDROID_BUILD_TOOLS_VERSION - $ANDROID_TARGET - - extra-android-support - extra-android-m2repository - extra-google-m2repository - sys-img-armeabi-v7a-android-22 @@ -27,7 +25,7 @@ android: - .+ before_script: - - echo no | android create avd --force -n test -t android-22 --abi $ANDROID_ABI + - echo no | android create avd --force -n test -t $ANDROID_TARGET --abi $ANDROID_ABI - emulator -avd test -no-audio -no-window & - android-wait-for-emulator - adb shell settings put global window_animation_scale 0 &