[Android] Setting a quick instrumentation test environment with Espresso + JUnit + Mockito

1.- Gradle dependencies – global build.gradle

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.0'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
        maven { url "https://jitpack.io" }
    }
} 

2.- Gradle dependencies – app/build.gradle

defaultConfig {
    applicationId "..."
    minSdkVersion 15
    testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
}

dependencies { 
    // ... testCompile 'junit:junit:4.12' 
    androidTestCompile 'com.google.dexmaker:dexmaker:1.2' 
    androidTestCompile('com.google.dexmaker:dexmaker-mockito:1.2') { 
        exclude group: 'org.hamcrest', module: 'hamcrest-core' 
    }
    androidTestCompile 'com.android.support.test:runner:0.4.1' 
    androidTestCompile 'com.android.support.test:rules:0.4.1'
    androidTestCompile 'org.mockito:mockito-core:1.10.19' 
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.1') 
    { 
        exclude group: 'javax.inject', module: 'javax.inject'
        exclude group: 'com.squareup', module: 'javawriter' 
    }
    androidTestCompile('com.android.support.test.espresso:espresso-contrib:2.2.1') 
    { 
        exclude module: 'support-annotations' 
        exclude module: 'recyclerview-v7' exclude module: 'support-v4' 
    }
    androidTestCompile('com.android.support.test.espresso:espresso-intents:2.2.1') 
    testCompile "org.mockito:mockito-core:1.9.5" 
    testCompile 'org.mockito:mockito-all:1.9.5' 
}

configurations.all { 
    resolutionStrategy.force 'com.android.support:support-annotations:23.0.1' 
}

3.- Sample test (androidTest/com/package/name folder)

@RunWith(AndroidJUnit4.class) @LargeTest
public class IssuesActivityTest {
    @Rule
    public IntentsTestRule<IssuesActivity> activityRule =
            new IntentsTestRule<>(IssuesActivity.class, true, false);

    @Test
    public void shouldDisplayToolbarOnStart() {
        startActivity();

        onView(withId(R.id.toolbar)).check(matches(isDisplayed()));
    }

    private IssuesActivity startActivity() {
        return activityRule.launchActivity(null);
    }
}

And that’s all folks

[Android] Configuring checkstyle for your Android project

1.- app/build.gradle

apply plugin: 'com.android.application'
apply plugin: 'checkstyle' // <-- add this line

android {
    // ...
}
task checkstyle(type: Checkstyle) {
    configFile = rootProject.file('config/checkstyle.xml')

    source 'src'
    include '**/*.java'
    exclude '**/gen/**'

    classpath = files()
}

dependencies {
    //  ...
}

2.- Create a file and name it checkstyle.xml inside project_root/config


<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
 "-//Puppy Crawl//DTD Check Configuration 1.2//EN"
 "http://www.puppycrawl.com/dtds/configuration_1_2.dtd">


<!-- THIS CHECKSYTLE CONFIGURATION IS SIMILAR TO THE ONE USED BY SQUARE INC. IF YOU WANT TO
 CONFIGURE YOUR IDE TO USE THIS CHECKSTYLE TAKE A LOOK AT https://github.com/square/java-code-styles-->


<module name="Checker">
 <!--module name="NewlineAtEndOfFile"/-->
 <module name="FileLength"/>
 <module name="FileTabCharacter"/>

 <!-- Trailing spaces -->
 <module name="RegexpSingleline">
 <property name="format" value="\s+$"/>
 <property name="message" value="Line has trailing spaces."/>
 </module>

 <!-- For each spacing -->
 <module name="RegexpSingleline">
 <property name="format" value="^\s*for \(.*?([^ ]:|:[^ ])"/>
 <property name="message" value="Space needed around ':' character."/>
 </module>

 <module name="TreeWalker">

 <!-- Checks for Naming Conventions. -->
 <!-- See http://checkstyle.sf.net/config_naming.html -->
 <module name="MethodName"/>
 <module name="PackageName"/>
 <module name="ParameterName"/>
 <module name="TypeName"/>
 <module name="ConstantName"/>

 <!-- Checks for imports -->
 <!-- See http://checkstyle.sf.net/config_import.html -->
 <module name="AvoidStarImport"/>
 <module name="IllegalImport"/>
 <!-- defaults to sun.* packages -->
 <module name="RedundantImport"/>
 <module name="UnusedImports">
 <property name="processJavadoc" value="true"/>
 </module>

 <!-- Checks for Size Violations. -->
 <!-- See http://checkstyle.sf.net/config_sizes.html -->
 <module name="LineLength">
 <property name="max" value="120"/>
 </module>

 <!-- Checks for whitespace -->
 <!-- See http://checkstyle.sf.net/config_whitespace.html -->
 <module name="GenericWhitespace"/>
 <module name="EmptyForIteratorPad"/>
 <module name="MethodParamPad"/>
 <module name="NoWhitespaceAfter"/>
 <module name="NoWhitespaceBefore"/>
 <module name="OperatorWrap"/>
 <module name="ParenPad"/>
 <module name="TypecastParenPad"/>
 <module name="WhitespaceAfter"/>
 <module name="WhitespaceAround"/>

 <!-- Modifier Checks -->
 <!-- See http://checkstyle.sf.net/config_modifiers.html -->
 <module name="RedundantModifier"/>

 <!-- Checks for blocks. You know, those {}'s -->
 <!-- See http://checkstyle.sf.net/config_blocks.html -->
 <module name="LeftCurly"/>
 <module name="NeedBraces"/>
 <module name="RightCurly"/>

 <!-- Checks for common coding problems -->
 <!-- See http://checkstyle.sf.net/config_coding.html -->
 <module name="CovariantEquals"/>
 <module name="EmptyStatement"/>
 <module name="EqualsHashCode"/>
 <module name="IllegalInstantiation"/>
 <module name="MissingSwitchDefault"/>
 <module name="SimplifyBooleanExpression"/>
 <module name="SimplifyBooleanReturn"/>

 <!-- Miscellaneous other checks. -->
 <!-- See http://checkstyle.sf.net/config_misc.html -->
 <module name="UpperEll"/>
 </module>
</module>

3.- You can now execute the checkstyle from your terminal

./gradlew checkstyle

[Android] Adding Dagger2 to your project in 4 quick steps

1.- Gradle dependencies

[global build.gradle]

classpath ‘com.android.tools.build:gradle:2.1.0’
classpath ‘com.neenbedankt.gradle.plugins:android-apt:1.4’

repositories {
jcenter()
maven { url “https://jitpack.io&#8221; }
}

[app/build.gradle]

apply plugin: ‘com.android.application’
apply plugin: ‘com.neenbedankt.android-apt’

compile ‘com.google.dagger:dagger:2.0.2’
apt ‘com.google.dagger:dagger-compiler:2.0.2’
provided ‘javax.annotation:jsr250-api:1.0’

2.- Root Component

@Component(modules = MainModule.class)
public interface RootComponent {

void inject(BaseActivity activity);
void inject(App application);

// …. more injections here
}

3.- Main Module

@Module
public class MainModule {
App application;
LoggedUserFacade facade;

public MainModule(App application) {
this.application = application;
facade = new LoggedUserFacade(application);
// … More dependencies here
}

@Provides
@Named(“applicationContext”)
Context provideApplicationContext() {
return application.getApplicationContext();
}

// … rest of the @Provides-annotated methods
}

4.- Application class

public class App extends Application {
MainModule mainModule;
RootComponent component;

@Override
public void onCreate() {
super.onCreate();

initializeDependencyInjection();
}

private void initializeDependencyInjection() {
mainModule = new MainModule(this);
component = DaggerRootComponent.builder()
.mainModule(mainModule)
.build();
component.inject(this);
}

public RootComponent getComponent() {
return component;
}

@VisibleForTesting public void setComponent(RootComponent component) {
this.component = component;
}
}

[Android] Uploading a new version of a Library (e.g. PdfViewPager)

Just a quick reminder of how to deploy a new version of the lib.

First, update all the version numbers in module library/build.gradle:

ext {
    bintrayRepo = 'maven'
    bintrayName = 'pdfviewpager'

    publishedGroupId = 'es.voghdev.pdfviewpager'
    libraryName = 'PdfViewPager'
    artifact = 'library'

    libraryDescription = 'Android widget to display PDF documents in your Views, Activities or Fragments.'

    siteUrl = 'https://github.com/voghDev/PdfViewPager'
    gitUrl = 'https://github.com/voghDev/PdfViewPager.git'

    libraryVersion = '0.3.0'

    developerId = 'voghDev'

    licenseName = 'The Apache Software License, Version 2.0'
    licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
    allLicenses = ["Apache-2.0"]
}

After changing version numbers and commiting all the changes, execute:

./gradlew bintrayUpload

Then you can go to bintray website (I suggest you to log in using Github, that’s what I do), and see your recently uploaded package inside the list.

pdfvp-3.0.png

Important note: It will take around one week to have your version available via gradle dependency. One of my uploads took 13 days, so don’t desperate.

On the top-right corner you will find an useful link for the uploaded folder in maven central repositories. Mine is:

https://dl.bintray.com/voghdev/maven/es/voghdev/pdfviewpager/library/

There you can see if the library is available yet, or not.

Hope it helps somebody on his/her deploys🙂