<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4122418037559796246</id><updated>2024-08-30T22:30:56.098-07:00</updated><category term="Android"/><category term="davistechyinfo"/><category term="Grails"/><category term="tech-talk"/><category term="conference"/><category term="unit testing"/><category term="Groovy"/><category term="Espresso"/><category term="JavaScript"/><category term="MySQL"/><category term="testing"/><category term="testing tricks"/><category term="Gradle"/><category term="Android Studio"/><category term="Git"/><category term="Hibernate cache"/><category term="Java"/><category term="Twitter"/><category term="clean code"/><category term="diagnose application performance"/><category term="jQuery"/><category term="mobile development"/><category term="plugin"/><category term="podcast"/><category term="public speaking"/><category term="video course"/><category term="Annotations"/><category term="BuildConfig.groovy"/><category term="Dagger"/><category term="DataSource.groovy"/><category term="Glassfish"/><category term="JSON"/><category term="Keynote"/><category term="MacBook"/><category term="Mockito"/><category term="Screen Robot"/><category term="Spring Security"/><category term="Unix"/><category term="XML"/><category term="cache statistics"/><category term="command line tool"/><category term="cyclomatic complexity"/><category term="improve performance"/><category term="mock hibernate criteria"/><category term="monitor cache"/><category term="vi commands"/><category term="1.3.5"/><category term="2015"/><category term="AWS Device Farm"/><category term="Android Job"/><category term="Android Summit"/><category term="Apache Shiro"/><category term="Builder Pattern"/><category term="Caching"/><category term="Camtasia"/><category term="Checkstyle"/><category term="Chrome"/><category term="CodeNewbie"/><category term="ConfigSlurper"/><category term="Cross Site Scripting"/><category term="EhCache Server"/><category term="ExclusionStrategy"/><category term="FindBugs"/><category term="Firebase"/><category term="FusedLocationApi"/><category term="GMock"/><category term="Geb"/><category term="Git commands"/><category term="Git log"/><category term="Git merge"/><category term="Google Docs"/><category term="Google I/O"/><category term="GoogleApiClient"/><category term="Gson"/><category term="HTML builder"/><category term="HTTP"/><category term="Hashmap"/><category term="Hibernate flush"/><category term="Instrumentation"/><category term="IntelliJ"/><category term="JSON builder"/><category term="JVisualVM"/><category term="Java 8"/><category term="Lint"/><category term="LocationServices"/><category term="MVC"/><category term="Mac"/><category term="MessageApi"/><category term="Migrations"/><category term="Objects"/><category term="OpenGL"/><category term="OpenGL ES"/><category term="PMD"/><category term="POST parameter"/><category term="Print Screen"/><category term="Processes"/><category term="Quartz Job"/><category term="Realm"/><category term="Robotium"/><category term="Runnable"/><category term="RxJava"/><category term="Selenium"/><category term="Spock"/><category term="Spring"/><category term="Storify"/><category term="StringWriter"/><category term="TED"/><category term="Tomcat"/><category term="Trello"/><category term="TweetDeck"/><category term="Twitter chat"/><category term="Word Crank"/><category term="XML builder"/><category term="XSS"/><category term="access logs"/><category term="allowedMethods"/><category term="android tv"/><category term="awk"/><category term="background work"/><category term="bean"/><category term="bitmap"/><category term="book review"/><category term="branch"/><category term="chat"/><category term="checkout"/><category term="commands"/><category term="compiler"/><category term="config"/><category term="connection pool"/><category term="contains"/><category term="cpu usage"/><category term="create index"/><category term="database"/><category term="deployment"/><category term="deserialization"/><category term="developer"/><category term="domain constraints"/><category term="domain.xml"/><category term="each function"/><category term="encoding"/><category term="environments"/><category term="error"/><category term="external"/><category term="file"/><category term="filters"/><category term="flair"/><category term="fragmented"/><category term="functional testing"/><category term="game development"/><category term="gsp"/><category term="high concurrency"/><category term="history"/><category term="inject"/><category term="interceptors"/><category term="jar file"/><category term="layout"/><category term="locale"/><category term="location"/><category term="maintainable"/><category term="memory leak"/><category term="memory usage"/><category term="merge"/><category term="mergetool"/><category term="messageSource"/><category term="messages.properties"/><category term="metaclass"/><category term="mock Params"/><category term="mock domain association"/><category term="mockParams"/><category term="mocking domain objects"/><category term="nested objects"/><category term="networking"/><category term="onclick event"/><category term="organization"/><category term="overdraw"/><category term="parse"/><category term="permissions"/><category term="production"/><category term="profiles"/><category term="property files"/><category term="readability"/><category term="recap"/><category term="reduce database connections"/><category term="refactoring"/><category term="remove"/><category term="request methods"/><category term="resource"/><category term="security"/><category term="selector"/><category term="self promotion"/><category term="show indices"/><category term="stackoverflow"/><category term="static code analysis"/><category term="strings.xml"/><category term="tech community"/><category term="testing in grails"/><category term="texture"/><category term="the blerg"/><category term="third party API. encapsulation"/><category term="top"/><category term="transactional"/><category term="travel"/><category term="tweets"/><category term="uiautomatorviewer"/><category term="upgrade"/><category term="version"/><category term="war"/><category term="wearable"/><category term="write/speak/code"/><category term="year end summary"/><title type='text'>@brwngrldev</title><subtitle type='html'>Helping you write beautiful code.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://davistechyinfo.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default'/><link rel='alternate' type='text/html' href='http://davistechyinfo.blogspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default?start-index=26&amp;max-results=25'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08779678670354545319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>88</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4122418037559796246.post-5003826500675195246</id><published>2017-03-07T16:11:00.000-08:00</published><updated>2017-03-07T16:11:08.235-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Dagger"/><category scheme="http://www.blogger.com/atom/ns#" term="Migrations"/><category scheme="http://www.blogger.com/atom/ns#" term="Mockito"/><category scheme="http://www.blogger.com/atom/ns#" term="Realm"/><category scheme="http://www.blogger.com/atom/ns#" term="unit testing"/><title type='text'>Realm Migrations Supercharged with Dagger</title><content type='html'>&lt;head&gt;
    &lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
    &lt;script src=&quot;//cdnjs.cloudflare.com/ajax/libs/gist-embed/2.4/gist-embed.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
  &lt;/head&gt;

&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4JdAI10yo9281yzo9GF2skRxqnyYrWXq44ubaSshfYFd61cVI7yBp4DQmt5wWwL1q5Ik7Qk5zo3KvhrloxRQb6kgnfdPWRDJRLeDIHkOm2dbcmkZVDyTM0Wnvfo32uTxgszsp8p9DspbP/s1600/realm_dagger_brwngrldev.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4JdAI10yo9281yzo9GF2skRxqnyYrWXq44ubaSshfYFd61cVI7yBp4DQmt5wWwL1q5Ik7Qk5zo3KvhrloxRQb6kgnfdPWRDJRLeDIHkOm2dbcmkZVDyTM0Wnvfo32uTxgszsp8p9DspbP/s640/realm_dagger_brwngrldev.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;My current tech obsessions are: &lt;b&gt;Realm&lt;/b&gt;, &lt;b&gt;Dagger&lt;/b&gt; and &lt;b&gt;Unit Testing&lt;/b&gt;. Therefore, I&#39;m always looking for opportunities to improve my code in some way that involves one or more of the above. That being said, I realized that the recommended way of &lt;a href=&quot;https://realm.io/docs/java/latest/#migrations&quot; target=&quot;_blank&quot;&gt;handling migrations in Realm&lt;/a&gt; could be improved significantly by means of &lt;a href=&quot;https://google.github.io/dagger/&quot; target=&quot;_blank&quot;&gt;Dagger 2&lt;/a&gt;.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: large;&quot;&gt;We&#39;re going to be refactoring the following &lt;i&gt;&lt;a href=&quot;https://gist.github.com/adavis/d3951ced45ef677ba9acbd87c042e7c4&quot; target=&quot;_blank&quot;&gt;Migration&lt;/a&gt;&lt;/i&gt; class:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1Ur0w5GGEs-mLP0ROXlNEeLJurlfXBHbPZSwkUF0xB4iPj6gIOBYMNCS6nbTkl6nNLnNv1GNL3wIdzkro5Rviknm2TiVxIXwfGK_hgKya7JO2fUQYeC5C_kPcAP-tesg0mbQWBUARPRBF/s1600/realm_migration_before.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;584&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1Ur0w5GGEs-mLP0ROXlNEeLJurlfXBHbPZSwkUF0xB4iPj6gIOBYMNCS6nbTkl6nNLnNv1GNL3wIdzkro5Rviknm2TiVxIXwfGK_hgKya7JO2fUQYeC5C_kPcAP-tesg0mbQWBUARPRBF/s640/realm_migration_before.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: large;&quot;&gt;With only two version updates, we already have a decent sized method to deal with. What&#39;s more if you didn&#39;t start out by creating tests for your migrations, once this method gets much longer you probably never will. But all is not lost, Dagger&#39;s&amp;nbsp;&lt;a href=&quot;http://google.github.io/dagger/multibindings.html&quot; target=&quot;_blank&quot;&gt;Multibinding&lt;/a&gt;&amp;nbsp;Support is coming to the rescue. Let&#39;s take a look!&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;h2&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Getting Setup&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;The first thing we&#39;re going to do is create a new Interface, &lt;i&gt;VersionMigration&lt;/i&gt;. This will have only the following:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;code data-gist-file=&quot;VersionMigration.java&quot; data-gist-id=&quot;ea13d2b264a1a59ec34ddf48d076d13c&quot;&gt;&lt;/code&gt;&lt;span style=&quot;font-size: large;&quot;&gt;The &lt;i&gt;&lt;b&gt;migrate&lt;/b&gt;&lt;/i&gt; method will take in a &lt;i&gt;DynamicRealm&lt;/i&gt;&amp;nbsp;instance and a &lt;i&gt;long&lt;/i&gt; which represents the previous version of the schema that you want to migrate from.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;With this available, we can now create two &lt;i&gt;VersionMigration&lt;/i&gt; classes that implement our new Interface. Here&#39;s the implementation for the &lt;i&gt;&lt;b&gt;Version1Migration&lt;/b&gt;&lt;/i&gt; class:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;code data-gist-file=&quot;Version1Migration.java&quot; data-gist-id=&quot;ea13d2b264a1a59ec34ddf48d076d13c&quot;&gt;&lt;/code&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: large;&quot;&gt;On &lt;i&gt;line 12&lt;/i&gt;, we implement the &lt;b&gt;&lt;i&gt;migrate&lt;/i&gt;&lt;/b&gt; method. Notice that we&#39;ve mostly just pasted in the same code that we had in our original &lt;i&gt;Migration&lt;/i&gt; class. The key difference is on &lt;i&gt;line 16&lt;/i&gt;, where we use the &lt;b&gt;&lt;i&gt;getObjectSchema&lt;/i&gt;&lt;/b&gt; method to retrieve the schema instead of grabbing it directly. I&#39;ll explain why we did it this way momentarily.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;
Next we are going to create a new Dagger module, named &lt;i&gt;MigrationsModule.&amp;nbsp;&lt;/i&gt;Then by means of the following annotations:&amp;nbsp;&lt;b&gt;@Provides&lt;/b&gt;, &lt;b&gt;@IntoMap&lt;/b&gt;, and &lt;b&gt;@IntKey &lt;/b&gt;I&#39;m defining how I want my VersionMigrations to be created and injected. The combination of these annotations allows all of the &lt;i&gt;VersionMigration&lt;/i&gt; Providers to be injected into a &lt;i&gt;Map&lt;/i&gt;. The key to the map will be an &lt;i&gt;Integer&lt;/i&gt; that corresponds to the previous schema version that the given &lt;i&gt;VersionMigration&lt;/i&gt; should be used for.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;code data-gist-file=&quot;MigrationsModule.java&quot; data-gist-id=&quot;ea13d2b264a1a59ec34ddf48d076d13c&quot;&gt;&lt;/code&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;For example, if my previous schema &lt;b&gt;version is 2&lt;/b&gt; and the current schema &lt;b&gt;version is 3&lt;/b&gt;, then I would use the &lt;i&gt;Version2Migration&lt;/i&gt; class. There would be no need for me to use any other &lt;i&gt;VersionMigration&lt;/i&gt;. However,&amp;nbsp;if my previous schema&amp;nbsp;&lt;b&gt;version is 1&lt;/b&gt;&amp;nbsp;and the current schema&amp;nbsp;&lt;b&gt;version is 3&lt;/b&gt;, then I would use both the&amp;nbsp;&lt;i&gt;Version1Migration&lt;/i&gt; and&amp;nbsp;&lt;i&gt;Version2Migration&lt;/i&gt;&amp;nbsp;classes. This will all come together once we take a look at our updated &lt;i&gt;Migration&lt;/i&gt; class.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;code data-gist-file=&quot;MigrationAfter.java&quot; data-gist-id=&quot;ea13d2b264a1a59ec34ddf48d076d13c&quot;&gt;&lt;/code&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;Our class has now been &quot;Daggerized&quot;! We start out by having a Map of &lt;i&gt;VersionMigration&lt;/i&gt;&amp;nbsp;Providers injected into our constructor on &lt;i&gt;line 7&lt;/i&gt;. &amp;nbsp;Recall that in our &lt;i&gt;MigrationsModule&lt;/i&gt; we used those three annotations:&amp;nbsp;&lt;b&gt;@Provides&lt;/b&gt;,&amp;nbsp;&lt;b&gt;@IntoMap&lt;/b&gt;, and&amp;nbsp;&lt;b&gt;@IntKey&lt;/b&gt;. Based on that, Dagger is clever enough to gather both of our Providers together and store them in a Map that uses the Integer constant we defined as the key.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Moving down to our &lt;b&gt;&lt;i&gt;migrate&lt;/i&gt;&lt;/b&gt; method. There on &lt;b&gt;line&lt;/b&gt;&amp;nbsp;&lt;b&gt;15&lt;/b&gt;&amp;nbsp;we have a simple for loop that starts with the &lt;i&gt;oldVersion&lt;/i&gt; and goes until we get to the &lt;i&gt;newVersion&lt;/i&gt;. Keep in mind, that the&amp;nbsp;&lt;i&gt;oldVersion&lt;/i&gt;&amp;nbsp;corresponds to the schema version that is active on the user&#39;s device. It&#39;s the version that we want to &lt;u&gt;migrate from&lt;/u&gt;, so that we can be on the &lt;i&gt;newVersion.&lt;/i&gt;&amp;nbsp;The main Dagger &lt;i&gt;awesomeness&lt;/i&gt; happens on &lt;b&gt;lines&amp;nbsp;&lt;/b&gt;&lt;b&gt;17 - 22.&lt;/b&gt;&amp;nbsp;We look in our &lt;i&gt;versionsMigrations&lt;/i&gt;&amp;nbsp;Map for the correct &lt;i&gt;Provider&lt;/i&gt;&amp;nbsp;using the loop variable value. Then we return an instance of the appropriate &lt;i&gt;VersionMigration&lt;/i&gt;&amp;nbsp;and execute it&#39;s migrate method. That&#39;s it. This means that no matter how many migrations we need in the future we don&#39;t have to bother this class anymore.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;What&#39;s more we also have our migration logic isolated into testable bits. Here&#39;s a look at some unit tests for the &lt;i&gt;Version1Migration&lt;/i&gt; class using JUnit and Mockito.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;code data-gist-file=&quot;Version1MigrationTest.java&quot; data-gist-id=&quot;ea13d2b264a1a59ec34ddf48d076d13c&quot;&gt;&lt;/code&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Remember I said, I would explain the use of the&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;i style=&quot;font-weight: bold;&quot;&gt;getObjectSchema &lt;/i&gt;method. Well, there on &lt;b&gt;line 17 &lt;/b&gt;when I create my migration object, I override the &lt;i&gt;getObjectSchema&lt;/i&gt;&amp;nbsp;method to return a mock of the &lt;i&gt;RealmObjectSchema&lt;/i&gt; class. I ran into several weird exceptions when I tried to mock the &lt;i&gt;RealmSchema&lt;/i&gt;&amp;nbsp;class directly, but this solution worked just fine.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;I hope you can use a similar approach to make your code more testable. All of the code snippets can be found in this &lt;a href=&quot;https://gist.github.com/adavis/ea13d2b264a1a59ec34ddf48d076d13c&quot; target=&quot;_blank&quot;&gt;gist&lt;/a&gt;. Thanks for reading!&lt;/span&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;If you would like to view additional Android content, I encourage you to check out my video tutorials available on&amp;nbsp;&lt;a href=&quot;https://caster.io/instructors/annyce-davis/&quot;&gt;Caster.io&lt;/a&gt;.&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://davistechyinfo.blogspot.com/feeds/5003826500675195246/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davistechyinfo.blogspot.com/2017/03/realm-migrations-supercharged-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/5003826500675195246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/5003826500675195246'/><link rel='alternate' type='text/html' href='http://davistechyinfo.blogspot.com/2017/03/realm-migrations-supercharged-with.html' title='Realm Migrations Supercharged with Dagger'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08779678670354545319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4JdAI10yo9281yzo9GF2skRxqnyYrWXq44ubaSshfYFd61cVI7yBp4DQmt5wWwL1q5Ik7Qk5zo3KvhrloxRQb6kgnfdPWRDJRLeDIHkOm2dbcmkZVDyTM0Wnvfo32uTxgszsp8p9DspbP/s72-c/realm_dagger_brwngrldev.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4122418037559796246.post-7984496432669174714</id><published>2016-12-20T11:49:00.000-08:00</published><updated>2016-12-20T11:49:35.004-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="conference"/><category scheme="http://www.blogger.com/atom/ns#" term="public speaking"/><category scheme="http://www.blogger.com/atom/ns#" term="tech-talk"/><category scheme="http://www.blogger.com/atom/ns#" term="travel"/><title type='text'>Conference Speaking One Year Later: Every Single Thing I&#39;ve Learned</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTpikKRwmt8fQaUKEFWZYC3aJgs332WaYmG8anYWIqJDXYizUe9uchBhgqs4IqJlEIn0c0C_VkNpbVg18fyK1Okc9p5GjjN3sB9XeiSPjECHPsQMbXJ24an5RKFG8NXsgPtKZwPwLFXUDk/s1600/andrdoid_to_conference_me.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTpikKRwmt8fQaUKEFWZYC3aJgs332WaYmG8anYWIqJDXYizUe9uchBhgqs4IqJlEIn0c0C_VkNpbVg18fyK1Okc9p5GjjN3sB9XeiSPjECHPsQMbXJ24an5RKFG8NXsgPtKZwPwLFXUDk/s320/andrdoid_to_conference_me.jpg&quot; width=&quot;320&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;I started speaking at Technical Conferences a year ago and I&amp;#39;ve learned &lt;b&gt;&lt;i&gt;so&lt;/i&gt;&lt;/b&gt; many things since then. Things about the process of putting on a conference, choosing speakers, writing talks, crafting slides, interacting with the audience, and more.&lt;/span&gt;&lt;br&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;I&amp;#39;ve never had a fear of public speaking per se; yet I just felt like I didn&amp;#39;t know &amp;quot;enough&amp;quot; to get up in front of dozens of people and share what &amp;quot;little&amp;quot; I did know. A few wonderful women in the Android Community helped me come to my senses and realize that I did have &amp;quot;something to say&amp;quot;. Not only that, what I wanted to share was valid, entertaining and useful. &lt;/span&gt;&lt;br&gt;
&lt;div&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;If you&amp;#39;re interested in becoming a Conference Speaker, I hope that you find at least one thing in this post that can help you on your journey.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;&lt;a href=&quot;http://davistechyinfo.blogspot.com/2016/12/conference-speaking-one-year-later.html#more&quot;&gt;Read more »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://davistechyinfo.blogspot.com/feeds/7984496432669174714/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davistechyinfo.blogspot.com/2016/12/conference-speaking-one-year-later.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/7984496432669174714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/7984496432669174714'/><link rel='alternate' type='text/html' href='http://davistechyinfo.blogspot.com/2016/12/conference-speaking-one-year-later.html' title='Conference Speaking One Year Later: Every Single Thing I&#39;ve Learned'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08779678670354545319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTpikKRwmt8fQaUKEFWZYC3aJgs332WaYmG8anYWIqJDXYizUe9uchBhgqs4IqJlEIn0c0C_VkNpbVg18fyK1Okc9p5GjjN3sB9XeiSPjECHPsQMbXJ24an5RKFG8NXsgPtKZwPwLFXUDk/s72-c/andrdoid_to_conference_me.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4122418037559796246.post-2600995147935104561</id><published>2016-11-17T13:28:00.000-08:00</published><updated>2016-11-17T13:28:09.395-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Android Job"/><category scheme="http://www.blogger.com/atom/ns#" term="background work"/><category scheme="http://www.blogger.com/atom/ns#" term="Dagger"/><title type='text'>Background Work with Android Job and Dagger</title><content type='html'>&lt;head&gt;
    &lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
    &lt;script src=&quot;//cdnjs.cloudflare.com/ajax/libs/gist-embed/2.4/gist-embed.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
  &lt;/head&gt;

&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSvT4_bdUL4PF0OThZKIkxsCWxyVMDVhWy6uBE7tcDDDlZj_xFk8S5OCmiLhiAE9pZGaasha9TVGTwoy3BAWHT4932pe6lor0y-brJtIeuEybGl-fG6qbHF3WnaziiOpyN_cBFC15tzUqv/s1600/background_work.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSvT4_bdUL4PF0OThZKIkxsCWxyVMDVhWy6uBE7tcDDDlZj_xFk8S5OCmiLhiAE9pZGaasha9TVGTwoy3BAWHT4932pe6lor0y-brJtIeuEybGl-fG6qbHF3WnaziiOpyN_cBFC15tzUqv/s640/background_work.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Background work on Android can be challenging when you have to support a wide range of API levels. Specifically you can use &lt;b&gt;Alarm Manager&lt;/b&gt;, &lt;b&gt;Job Scheduler&lt;/b&gt;&amp;nbsp;or &lt;b&gt;GCM Network Manager&lt;/b&gt;&amp;nbsp;depending on your minimum API level and if the device has &lt;i&gt;Play Services.&lt;/i&gt;&amp;nbsp;To help abstract away which implementation you&#39;re using to perform background work, the good folks at &lt;b&gt;Evernote&lt;/b&gt; have open-sourced, &lt;a href=&quot;http://evernote.github.io/android-job/&quot; target=&quot;_blank&quot;&gt;Android Job&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Android Job works by first allowing you to define how you want your jobs to be created, by means of the &lt;i&gt;Job Creator&lt;/i&gt; class. Then you can schedule requests using the &lt;i&gt;Job Manager&lt;/i&gt; and have the confidence that they will be run when the requirements are met. In the image below you can see a representation of the various components involved with using &lt;i&gt;Android Job&lt;/i&gt;&amp;nbsp;in your application. Each &lt;i&gt;Job&lt;/i&gt; is identified by a &lt;b&gt;tag&lt;/b&gt;; this is just a simple &lt;i&gt;String&lt;/i&gt; that is used to differentiate the various jobs in your application.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj95IL39UtcH5YHNyMG_nEa1TM235_ctpwxxUI0WsuoGKVUFRdM0oLiOiSiMkTmyXUJKPZgHtDFaQXwan_-IGbYqPYRWDURSKof5k2pd66THTedvNVzkRiQp4f6yH2AqX708EBeK_QrgNRh/s1600/Screen+Shot+2016-11-17+at+1.35.15+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;355&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj95IL39UtcH5YHNyMG_nEa1TM235_ctpwxxUI0WsuoGKVUFRdM0oLiOiSiMkTmyXUJKPZgHtDFaQXwan_-IGbYqPYRWDURSKof5k2pd66THTedvNVzkRiQp4f6yH2AqX708EBeK_QrgNRh/s640/Screen+Shot+2016-11-17+at+1.35.15+PM.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Let&#39;s take a look at each piece!&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;h2&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Getting Setup&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;In order to use Android Job you just need to add the dependency to your &lt;i&gt;build.gradle&lt;/i&gt; file. If you plan on taking advantage of &lt;a href=&quot;https://developers.google.com/cloud-messaging/network-manager&quot; target=&quot;_blank&quot;&gt;GCM Network Manager&lt;/a&gt; for older devices, you will need to include that dependency as well.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;code data-gist-file=&quot;build.gradle&quot; data-gist-id=&quot;6e54e3ce48b4090ecd5e352f3ef44b09&quot;&gt;&lt;/code&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Next, you would want to create your application&#39;s &lt;i&gt;Job Creator&lt;/i&gt;. This class is responsible for providing the correct &lt;b&gt;Job&lt;/b&gt; class that corresponds to the tag it receives in its &lt;i&gt;create()&lt;/i&gt; method. The &lt;i&gt;Job Creator&lt;/i&gt; is a Singleton that uses Dagger&#39;s &lt;a href=&quot;http://google.github.io/dagger/multibindings.html&quot; target=&quot;_blank&quot;&gt;Multibinding&lt;/a&gt;&amp;nbsp;Support to house a &lt;i&gt;Map&lt;/i&gt; that references Providers of Jobs. This allows you to add new Jobs to your application without having to modify the Creator class. Then on lines &lt;b&gt;15&lt;/b&gt; and &lt;b&gt;16&lt;/b&gt;, you look in the &lt;i&gt;Map&lt;/i&gt; for the correct &lt;i&gt;Provider&lt;/i&gt; and return an instance of the appropriate &lt;i&gt;Job&lt;/i&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;code data-gist-file=&quot;AppJobCreator.java&quot; data-gist-id=&quot;6e54e3ce48b4090ecd5e352f3ef44b09&quot;&gt;&lt;/code&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;
I like to keep the definition of my Jobs in a separate Dagger module, named &lt;i&gt;JobsModule.&lt;/i&gt;&amp;nbsp;This helps to isolate those dependencies. Notice that I&#39;m first defining my &lt;i&gt;Job Manager&lt;/i&gt;&amp;nbsp;which uses the &lt;i&gt;Job Creator&lt;/i&gt;&amp;nbsp;that we defined previously. Then by means of the following annotations:&amp;nbsp;&lt;b&gt;@Provides&lt;/b&gt;, &lt;b&gt;@IntoMap&lt;/b&gt;, and &lt;b&gt;@StringKey &lt;/b&gt;I&#39;m defining how I want my Job to be created and injected. The combination of these annotations allows all of the Job Providers to be injected into the Map, with their associated tags, for later use when a Job Request is received.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;code data-gist-file=&quot;JobsModule.java&quot; data-gist-id=&quot;6e54e3ce48b4090ecd5e352f3ef44b09&quot;&gt;&lt;/code&gt;
&lt;br /&gt;
&lt;h2&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Creating a Job&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: large;&quot;&gt;The heavy lifting is done by each Job class in its&amp;nbsp;&lt;i&gt;onRunJob()&lt;/i&gt;&amp;nbsp;method. A simple example is queuing a Job that adds a new record to an API endpoint. Let&#39;s assume you&#39;re using &lt;a href=&quot;https://square.github.io/retrofit/&quot; target=&quot;_blank&quot;&gt;Retrofit&lt;/a&gt; for your API needs. In the constructor of your Job you would annotate it with the &lt;b&gt;@Inject&lt;/b&gt; annotation to get the needed dependencies, namely your API resource. Then you would perform the network operation inside of the &lt;i&gt;onRunJob()&lt;/i&gt; method as usual. What&#39;s unique is that you should return a &lt;a href=&quot;https://github.com/evernote/android-job/blob/1dfcca57615f80bd816bae0b8e19df04889a0d56/library/src/main/java/com/evernote/android/job/Job.java#L55-L70&quot; target=&quot;_blank&quot;&gt;Result&lt;/a&gt;&amp;nbsp;from your method, so that the system knows whether to attempt to run your Job again at a later time.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;code data-gist-file=&quot;SendBookRequestJob.java&quot; data-gist-id=&quot;6e54e3ce48b4090ecd5e352f3ef44b09&quot; data-gist-line=&quot;1-54&quot;&gt;&lt;/code&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;h2&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Scheduling a Request&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: large;&quot;&gt;The final piece of the puzzle is building and then scheduling your requests. In order to send a request, you would simply use the &lt;i&gt;schedule()&lt;/i&gt;&amp;nbsp;method of the &lt;b&gt;Job Manager&lt;/b&gt; class. This method takes a &lt;i&gt;Job Request&lt;/i&gt; as its input.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;code data-gist-file=&quot;BookService.java&quot; data-gist-id=&quot;6e54e3ce48b4090ecd5e352f3ef44b09&quot; data-gist-line=&quot;12-15&quot;&gt;&lt;/code&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: large;&quot;&gt;The &lt;i&gt;Job Request&lt;/i&gt; is built inside the containing Job class. You can send information regarding the desired network connections, device state, as well as extra data to be used when the request is executed. The below is a typical request that I use when scheduling jobs in my application.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;code data-gist-file=&quot;SendBookRequestJob.java&quot; data-gist-id=&quot;6e54e3ce48b4090ecd5e352f3ef44b09&quot; data-gist-line=&quot;55-68&quot;&gt;&lt;/code&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: large;&quot;&gt;I&#39;ve really enjoyed working with this library and once all the pieces are set up it&#39;s been easy to use. All the code snippets can be found in this &lt;a href=&quot;https://gist.github.com/adavis/6e54e3ce48b4090ecd5e352f3ef44b09&quot; target=&quot;_blank&quot;&gt;gist&lt;/a&gt;. Thanks for reading!&lt;/span&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;If you would like to view some of my video content, I encourage you to check out my&amp;nbsp;&lt;a href=&quot;http://goo.gl/xuIOvv&quot; target=&quot;_blank&quot;&gt;video course&lt;/a&gt;&amp;nbsp;and bite-sized tutorials available on&amp;nbsp;&lt;a href=&quot;https://caster.io/instructors/annyce-davis/&quot;&gt;Caster.io&lt;/a&gt;.&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://davistechyinfo.blogspot.com/feeds/2600995147935104561/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davistechyinfo.blogspot.com/2016/11/background-work-with-android-job-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/2600995147935104561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/2600995147935104561'/><link rel='alternate' type='text/html' href='http://davistechyinfo.blogspot.com/2016/11/background-work-with-android-job-and.html' title='Background Work with Android Job and Dagger'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08779678670354545319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSvT4_bdUL4PF0OThZKIkxsCWxyVMDVhWy6uBE7tcDDDlZj_xFk8S5OCmiLhiAE9pZGaasha9TVGTwoy3BAWHT4932pe6lor0y-brJtIeuEybGl-fG6qbHF3WnaziiOpyN_cBFC15tzUqv/s72-c/background_work.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4122418037559796246.post-382178036657299312</id><published>2016-11-08T06:34:00.001-08:00</published><updated>2016-11-08T06:35:07.026-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="tech-talk"/><title type='text'>Talk: Developing Apps for Emerging Markets</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_qREkXtV0J9I21FpMhcbLVAqzxjn29LQntq6wAUbXR4JjSLiTF4BfwnGNPocm7UjZDigLO9ChTBzConFrmXTSHYGnMG0JmcPA7TNGlgGuD6i32i68ayaRo9nGs5a42BG5KWMZI9tK5Y0E/s1600/Screen+Shot+2016-10-30+at+8.28.49+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;358&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_qREkXtV0J9I21FpMhcbLVAqzxjn29LQntq6wAUbXR4JjSLiTF4BfwnGNPocm7UjZDigLO9ChTBzConFrmXTSHYGnMG0JmcPA7TNGlgGuD6i32i68ayaRo9nGs5a42BG5KWMZI9tK5Y0E/s640/Screen+Shot+2016-10-30+at+8.28.49+PM.png&quot; width=&quot;640&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;At Off Grid Electric our mission is to power homes across rural Africa with affordable, solar energy. In order to do that we need to provide our employees with tools that work both on and offline. So how did we do it? 
In this talk, learn about the techniques we employed to provide a unique online-offline experience in our Android applications.&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://davistechyinfo.blogspot.com/2016/11/talk-developing-apps-for-emerging.html#more&quot;&gt;Read more »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://davistechyinfo.blogspot.com/feeds/382178036657299312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davistechyinfo.blogspot.com/2016/11/talk-developing-apps-for-emerging.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/382178036657299312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/382178036657299312'/><link rel='alternate' type='text/html' href='http://davistechyinfo.blogspot.com/2016/11/talk-developing-apps-for-emerging.html' title='Talk: Developing Apps for Emerging Markets'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08779678670354545319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_qREkXtV0J9I21FpMhcbLVAqzxjn29LQntq6wAUbXR4JjSLiTF4BfwnGNPocm7UjZDigLO9ChTBzConFrmXTSHYGnMG0JmcPA7TNGlgGuD6i32i68ayaRo9nGs5a42BG5KWMZI9tK5Y0E/s72-c/Screen+Shot+2016-10-30+at+8.28.49+PM.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4122418037559796246.post-1783270106618100826</id><published>2016-10-25T07:58:00.000-07:00</published><updated>2016-10-25T07:58:36.469-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="tech-talk"/><title type='text'>Talk: Develop Maintainable Apps</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG0HdGs6P1CTpZCkdMFOvFv9m-JeCBp3DBzHMblnrX3TWpj0VXndqiN0BcoDCVGYM8PYbBXNaD7xrYyS0aMiYaVvtHlOwEvqUiZzlwx09v5HzeEZRu4VcmPnuWPxKNp_O_IjFpbjNngwqe/s1600/Screen+Shot+2016-10-24+at+8.03.51+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;355&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG0HdGs6P1CTpZCkdMFOvFv9m-JeCBp3DBzHMblnrX3TWpj0VXndqiN0BcoDCVGYM8PYbBXNaD7xrYyS0aMiYaVvtHlOwEvqUiZzlwx09v5HzeEZRu4VcmPnuWPxKNp_O_IjFpbjNngwqe/s640/Screen+Shot+2016-10-24+at+8.03.51+PM.png&quot; width=&quot;640&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Great Android apps only include what&amp;#39;s needed to achieve the goals of the product, not enhance the resume of the developer. What’s more, the more maintainable an application is, the more likely it will have increased user satisfaction and decreased time to market.&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://davistechyinfo.blogspot.com/2016/10/talk-develop-maintainable-apps.html#more&quot;&gt;Read more »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://davistechyinfo.blogspot.com/feeds/1783270106618100826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davistechyinfo.blogspot.com/2016/10/talk-develop-maintainable-apps.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/1783270106618100826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/1783270106618100826'/><link rel='alternate' type='text/html' href='http://davistechyinfo.blogspot.com/2016/10/talk-develop-maintainable-apps.html' title='Talk: Develop Maintainable Apps'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08779678670354545319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG0HdGs6P1CTpZCkdMFOvFv9m-JeCBp3DBzHMblnrX3TWpj0VXndqiN0BcoDCVGYM8PYbBXNaD7xrYyS0aMiYaVvtHlOwEvqUiZzlwx09v5HzeEZRu4VcmPnuWPxKNp_O_IjFpbjNngwqe/s72-c/Screen+Shot+2016-10-24+at+8.03.51+PM.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4122418037559796246.post-5803251718652760123</id><published>2016-07-29T12:45:00.000-07:00</published><updated>2016-07-29T12:45:50.685-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="conference"/><category scheme="http://www.blogger.com/atom/ns#" term="Gradle"/><category scheme="http://www.blogger.com/atom/ns#" term="Grails"/><category scheme="http://www.blogger.com/atom/ns#" term="Groovy"/><title type='text'>GR8Conf US 2016 Recap</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizYacTmIVdqjOqriICfplSsdyA4psi7vVfKCdddTu4swPnKFaZUjd7KZEFfq9tFfT9NxpyLXrwPzS5vaJZE52DULTk_awJcxwEvozwHqWuQMp6uKyt98ffj7iAEUmh0b0ZOk52NRamsDz1/s1600/Screen+Shot+2016-07-29+at+10.07.05+AM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;276&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizYacTmIVdqjOqriICfplSsdyA4psi7vVfKCdddTu4swPnKFaZUjd7KZEFfq9tFfT9NxpyLXrwPzS5vaJZE52DULTk_awJcxwEvozwHqWuQMp6uKyt98ffj7iAEUmh0b0ZOk52NRamsDz1/s400/Screen+Shot+2016-07-29+at+10.07.05+AM.png&quot; width=&quot;400&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;This was my first time attending &lt;a href=&quot;http://gr8conf.us/&quot; target=&quot;_blank&quot;&gt;GR8Conf&lt;/a&gt; and it was a really great experience. I primarily focus on Android Development now, but I enjoy dabbling in some API Development when I find the time. This conference was very inspiring and I plan on investigating many of the new things that I learned. Here are a few highlights of the event:&lt;/span&gt;&lt;br&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;/span&gt;&lt;br&gt;
&lt;a href=&quot;http://davistechyinfo.blogspot.com/2016/07/gr8conf-us-2016-recap.html#more&quot;&gt;Read more »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://davistechyinfo.blogspot.com/feeds/5803251718652760123/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davistechyinfo.blogspot.com/2016/07/gr8conf-us-2016-recap.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/5803251718652760123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/5803251718652760123'/><link rel='alternate' type='text/html' href='http://davistechyinfo.blogspot.com/2016/07/gr8conf-us-2016-recap.html' title='GR8Conf US 2016 Recap'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08779678670354545319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizYacTmIVdqjOqriICfplSsdyA4psi7vVfKCdddTu4swPnKFaZUjd7KZEFfq9tFfT9NxpyLXrwPzS5vaJZE52DULTk_awJcxwEvozwHqWuQMp6uKyt98ffj7iAEUmh0b0ZOk52NRamsDz1/s72-c/Screen+Shot+2016-07-29+at+10.07.05+AM.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4122418037559796246.post-438758258728500257</id><published>2016-07-29T05:37:00.000-07:00</published><updated>2016-07-29T05:37:28.503-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="conference"/><category scheme="http://www.blogger.com/atom/ns#" term="Gradle"/><category scheme="http://www.blogger.com/atom/ns#" term="plugin"/><category scheme="http://www.blogger.com/atom/ns#" term="tech-talk"/><title type='text'>Talk: Gradle Plugin Goodness</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2uctVqgOoHOtppfwOpb8V8JUDBdWzSkKp1l8GIouRROHo3ga4-RYQ1V_bq5MhkN9F169fZviFKJTPVMBTPf-jxIcEh8BRc52h_CU1QIfVjWDBiZwOs54MS6DZy22wy96XdtrjIialCOGz/s1600/Screen+Shot+2016-07-28+at+8.46.44+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2uctVqgOoHOtppfwOpb8V8JUDBdWzSkKp1l8GIouRROHo3ga4-RYQ1V_bq5MhkN9F169fZviFKJTPVMBTPf-jxIcEh8BRc52h_CU1QIfVjWDBiZwOs54MS6DZy22wy96XdtrjIialCOGz/s640/Screen+Shot+2016-07-28+at+8.46.44+PM.png&quot; width=&quot;640&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;If you find yourself copying and pasting code from your application&amp;#39;s &lt;i&gt;build.gradle&lt;/i&gt; file every time you start a new project, then it&amp;#39;s time you learn about creating Gradle plugins. In this presentation you will learn what it takes to create a custom Gradle plugin for use in your Android/Java applications.&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://davistechyinfo.blogspot.com/2016/07/talk-gradle-plugin-goodness.html#more&quot;&gt;Read more »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://davistechyinfo.blogspot.com/feeds/438758258728500257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davistechyinfo.blogspot.com/2016/07/talk-gradle-plugin-goodness.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/438758258728500257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/438758258728500257'/><link rel='alternate' type='text/html' href='http://davistechyinfo.blogspot.com/2016/07/talk-gradle-plugin-goodness.html' title='Talk: Gradle Plugin Goodness'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08779678670354545319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2uctVqgOoHOtppfwOpb8V8JUDBdWzSkKp1l8GIouRROHo3ga4-RYQ1V_bq5MhkN9F169fZviFKJTPVMBTPf-jxIcEh8BRc52h_CU1QIfVjWDBiZwOs54MS6DZy22wy96XdtrjIialCOGz/s72-c/Screen+Shot+2016-07-28+at+8.46.44+PM.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4122418037559796246.post-2936814436677852995</id><published>2016-07-28T08:14:00.001-07:00</published><updated>2016-07-28T08:14:02.899-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="conference"/><category scheme="http://www.blogger.com/atom/ns#" term="Grails"/><category scheme="http://www.blogger.com/atom/ns#" term="tech-talk"/><title type='text'>Talk: From Grails to Android</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik0R_brSXQxf4FqgSqm6gfZqQ9Ad93QoyJDLrGR44zByVERkAAZiuCsMQm7N6wZL3Fd_vruAs3JxNPUqBKY94SjaI1ZOF64sXIlnJt6dHbJnixzSbazZV-c0f8nvAmm1gW8Lt7fQnqBVIY/s1600/grails_to_android.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;364&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik0R_brSXQxf4FqgSqm6gfZqQ9Ad93QoyJDLrGR44zByVERkAAZiuCsMQm7N6wZL3Fd_vruAs3JxNPUqBKY94SjaI1ZOF64sXIlnJt6dHbJnixzSbazZV-c0f8nvAmm1gW8Lt7fQnqBVIY/s640/grails_to_android.png&quot; width=&quot;640&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;One of the key new features of &lt;b&gt;Grails 3&lt;/b&gt; is the use of Gradle for its build system. The &lt;b&gt;Android Framework&lt;/b&gt; also uses the Gradle build system to build, test, run and package applications. In this talk, learn how to move from developing applications for &lt;i&gt;Grails 3&lt;/i&gt; to &lt;i&gt;Android&lt;/i&gt;.&lt;/span&gt;&lt;br&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;/span&gt;&lt;br&gt;
&lt;a href=&quot;http://davistechyinfo.blogspot.com/2016/07/talk-from-grails-to-android.html#more&quot;&gt;Read more »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://davistechyinfo.blogspot.com/feeds/2936814436677852995/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davistechyinfo.blogspot.com/2016/07/talk-from-grails-to-android.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/2936814436677852995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/2936814436677852995'/><link rel='alternate' type='text/html' href='http://davistechyinfo.blogspot.com/2016/07/talk-from-grails-to-android.html' title='Talk: From Grails to Android'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08779678670354545319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik0R_brSXQxf4FqgSqm6gfZqQ9Ad93QoyJDLrGR44zByVERkAAZiuCsMQm7N6wZL3Fd_vruAs3JxNPUqBKY94SjaI1ZOF64sXIlnJt6dHbJnixzSbazZV-c0f8nvAmm1gW8Lt7fQnqBVIY/s72-c/grails_to_android.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4122418037559796246.post-7330199408748025806</id><published>2016-07-01T03:21:00.000-07:00</published><updated>2016-07-01T07:57:25.969-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="developer"/><category scheme="http://www.blogger.com/atom/ns#" term="networking"/><category scheme="http://www.blogger.com/atom/ns#" term="self promotion"/><category scheme="http://www.blogger.com/atom/ns#" term="tweets"/><category scheme="http://www.blogger.com/atom/ns#" term="Twitter"/><title type='text'>Tackling Twitter</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizEuI8LZ5_hb8BdfGSGyNSZnfU3u_-rACcW9vK9pdKuvynR7SHxjTeTGALdO4-QaP6zAxrcfj6Rki2O3sV9_hN0NlcvhGX5u1QikznRSDYC9GR0PVoyy1NTmzPw4TwuHEXmT2heg_Vq1PL/s1600/twitter_logo.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;162&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizEuI8LZ5_hb8BdfGSGyNSZnfU3u_-rACcW9vK9pdKuvynR7SHxjTeTGALdO4-QaP6zAxrcfj6Rki2O3sV9_hN0NlcvhGX5u1QikznRSDYC9GR0PVoyy1NTmzPw4TwuHEXmT2heg_Vq1PL/s200/twitter_logo.png&quot; width=&quot;200&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;So one thing people ask me &lt;b&gt;a lot&lt;/b&gt; is: &lt;i&gt;&amp;quot;How do I use Twitter?&amp;quot;&lt;/i&gt; What they&amp;#39;re really trying to find out is &amp;quot;How to use Twitter to stay in &lt;i&gt;the know&lt;/i&gt; and &lt;i&gt;promote themselves&lt;/i&gt; on the Internet.&amp;quot; This is a great question. A few months ago I asked myself the same question and ended up reading countless blogs and a few books on the subject of self promotion. Thus I&amp;#39;ve decided to expound on my current strategy for &lt;b&gt;Tackling Twitter&lt;/b&gt; in this post. So keep reading...&lt;/span&gt;&lt;br&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br&gt;&lt;/span&gt;
&lt;br&gt;
&lt;h3&gt;
&lt;/h3&gt;&lt;a href=&quot;http://davistechyinfo.blogspot.com/2016/07/tackling-twitter.html#more&quot;&gt;Read more »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://davistechyinfo.blogspot.com/feeds/7330199408748025806/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davistechyinfo.blogspot.com/2016/07/tackling-twitter.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/7330199408748025806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/7330199408748025806'/><link rel='alternate' type='text/html' href='http://davistechyinfo.blogspot.com/2016/07/tackling-twitter.html' title='Tackling Twitter'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08779678670354545319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizEuI8LZ5_hb8BdfGSGyNSZnfU3u_-rACcW9vK9pdKuvynR7SHxjTeTGALdO4-QaP6zAxrcfj6Rki2O3sV9_hN0NlcvhGX5u1QikznRSDYC9GR0PVoyy1NTmzPw4TwuHEXmT2heg_Vq1PL/s72-c/twitter_logo.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4122418037559796246.post-8187098285569696955</id><published>2016-06-19T21:21:00.001-07:00</published><updated>2016-06-19T21:21:12.731-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="conference"/><category scheme="http://www.blogger.com/atom/ns#" term="Keynote"/><category scheme="http://www.blogger.com/atom/ns#" term="recap"/><category scheme="http://www.blogger.com/atom/ns#" term="write/speak/code"/><title type='text'>Write/Speak/Code 2016 Recap</title><content type='html'>&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br&gt;&lt;/span&gt;
&lt;br&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwoMfzVkTp-ZdBwhCHQNurxVJ6z87Vqr6pIlznxjiuTYAoHTLAM9FhddaM3mIVOQ7wnA9LN0hQJOTcZOxtPCSgmKVHiMSzafPR-ZQBy2OWJfoOuaHLCU8liStGkEZvHkaKaNcrEJH4DB4K/s1600/writespeakcode.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwoMfzVkTp-ZdBwhCHQNurxVJ6z87Vqr6pIlznxjiuTYAoHTLAM9FhddaM3mIVOQ7wnA9LN0hQJOTcZOxtPCSgmKVHiMSzafPR-ZQBy2OWJfoOuaHLCU8liStGkEZvHkaKaNcrEJH4DB4K/s320/writespeakcode.jpg&quot; width=&quot;320&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;This was my first time attending &lt;a href=&quot;https://2016.writespeakcode.com/talks#say-it-with-video&quot; target=&quot;_blank&quot;&gt;Write/Speak/Code&lt;/a&gt; and it was an amazing experience. Not only did I learn useful information for advancing my career I delivered my &lt;a href=&quot;https://storify.com/brwngrldev/first-keynote-writespeakcode&quot; target=&quot;_blank&quot;&gt;first Keynote&lt;/a&gt; talk. I put together a few highlights of the event below:&lt;/span&gt;&lt;br&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;/span&gt;&lt;br&gt;
&lt;a href=&quot;http://davistechyinfo.blogspot.com/2016/06/writespeakcode-2016-recap.html#more&quot;&gt;Read more »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://davistechyinfo.blogspot.com/feeds/8187098285569696955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davistechyinfo.blogspot.com/2016/06/writespeakcode-2016-recap.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/8187098285569696955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/8187098285569696955'/><link rel='alternate' type='text/html' href='http://davistechyinfo.blogspot.com/2016/06/writespeakcode-2016-recap.html' title='Write/Speak/Code 2016 Recap'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08779678670354545319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwoMfzVkTp-ZdBwhCHQNurxVJ6z87Vqr6pIlznxjiuTYAoHTLAM9FhddaM3mIVOQ7wnA9LN0hQJOTcZOxtPCSgmKVHiMSzafPR-ZQBy2OWJfoOuaHLCU8liStGkEZvHkaKaNcrEJH4DB4K/s72-c/writespeakcode.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4122418037559796246.post-2329659494817481974</id><published>2016-06-15T08:11:00.000-07:00</published><updated>2016-06-15T08:11:56.656-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="tech-talk"/><category scheme="http://www.blogger.com/atom/ns#" term="video course"/><title type='text'>Talk: Say It With Video!</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJu4EvidoEA_638WZHCvt_Tjyg3PL2M17dEBKiGa9ojEujI3Bx-q41ZRoy0skCIrR7-wP1p-48Qp13HIIzc-0Asfno6oxmO2V3WNp4IpvOXPxh6eLr9mZb3byGhjdZqQ6DNY6IEn3U-sDH/s1600/say_it_with_video_million.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJu4EvidoEA_638WZHCvt_Tjyg3PL2M17dEBKiGa9ojEujI3Bx-q41ZRoy0skCIrR7-wP1p-48Qp13HIIzc-0Asfno6oxmO2V3WNp4IpvOXPxh6eLr9mZb3byGhjdZqQ6DNY6IEn3U-sDH/s640/say_it_with_video_million.png&quot; width=&quot;640&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Every day people watch &lt;b&gt;&lt;i&gt;hundreds of millions&lt;/i&gt;&lt;/b&gt; of hours of video on &lt;a href=&quot;https://www.youtube.com/channel/UCnvzpWwScZ6TLgG6LBuzUyw&quot; target=&quot;_blank&quot;&gt;YouTube&lt;/a&gt; and that number is steadily increasing. So how can you take advantage of video to help promote your personal brand and/or share your expertise? In this talk, I’ll walk you through the steps I took to develop my &lt;a href=&quot;http://goo.gl/xuIOvv&quot; target=&quot;_blank&quot;&gt;first video course&lt;/a&gt;, from outlining the initial structure down to actual video creation. Walk away with the tools you need in order to create short, informative online video content!&lt;/span&gt;&lt;br&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;/span&gt;&lt;br&gt;
&lt;a href=&quot;http://davistechyinfo.blogspot.com/2016/06/talk-say-it-with-video.html#more&quot;&gt;Read more »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://davistechyinfo.blogspot.com/feeds/2329659494817481974/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davistechyinfo.blogspot.com/2016/06/talk-say-it-with-video.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/2329659494817481974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/2329659494817481974'/><link rel='alternate' type='text/html' href='http://davistechyinfo.blogspot.com/2016/06/talk-say-it-with-video.html' title='Talk: Say It With Video!'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08779678670354545319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJu4EvidoEA_638WZHCvt_Tjyg3PL2M17dEBKiGa9ojEujI3Bx-q41ZRoy0skCIrR7-wP1p-48Qp13HIIzc-0Asfno6oxmO2V3WNp4IpvOXPxh6eLr9mZb3byGhjdZqQ6DNY6IEn3U-sDH/s72-c/say_it_with_video_million.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4122418037559796246.post-3024632549147138670</id><published>2016-05-28T08:33:00.001-07:00</published><updated>2016-05-28T08:33:54.110-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="book review"/><category scheme="http://www.blogger.com/atom/ns#" term="conference"/><category scheme="http://www.blogger.com/atom/ns#" term="public speaking"/><category scheme="http://www.blogger.com/atom/ns#" term="TED"/><title type='text'>Review: Talk Like TED</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-leqdRjBkeSK-ShbF6wvWad9YIP2IhTxn0LLAVg3zfDg2Dfvn86SjDiZD_i52PtjznXyo1lJ9mqSAufVlgx2ToxSZazQW8UaBJES1ETc3y2AolIZ4Xc4EXmisVT_K8J4ZfzeJC0MWdLrt/s1600/Talk+Like+TED+%25281%2529.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-leqdRjBkeSK-ShbF6wvWad9YIP2IhTxn0LLAVg3zfDg2Dfvn86SjDiZD_i52PtjznXyo1lJ9mqSAufVlgx2ToxSZazQW8UaBJES1ETc3y2AolIZ4Xc4EXmisVT_K8J4ZfzeJC0MWdLrt/s640/Talk+Like+TED+%25281%2529.jpg&quot; width=&quot;640&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;If I was offered the opportunity to give a &lt;a href=&quot;https://www.ted.com/talks&quot; target=&quot;_blank&quot;&gt;TED talk&lt;/a&gt;, let&amp;#39;s just say I wouldn&amp;#39;t turn up my nose at it. So I was really excited to find this book, &lt;/span&gt;&lt;a href=&quot;http://amzn.to/1TOO0ye&quot; style=&quot;font-size: large;&quot; target=&quot;_blank&quot;&gt;Talk Like TED: The 9 Public-Speaking Secrets of the World&amp;#39;s Top Minds&lt;/a&gt;. &lt;span style=&quot;font-size: large;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: large;&quot;&gt;In it the author analyzes hundreds of the most popular &lt;i&gt;TED&lt;/i&gt; talks and provides insights into what made them so successful. Then he goes on to share actionable advice for how anyone can give a talk that&amp;#39;s memorable and engaging. Some of my favorite tips were the following:&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://davistechyinfo.blogspot.com/2016/05/review-talk-like-ted.html#more&quot;&gt;Read more »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://davistechyinfo.blogspot.com/feeds/3024632549147138670/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davistechyinfo.blogspot.com/2016/05/review-talk-like-ted.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/3024632549147138670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/3024632549147138670'/><link rel='alternate' type='text/html' href='http://davistechyinfo.blogspot.com/2016/05/review-talk-like-ted.html' title='Review: Talk Like TED'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08779678670354545319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-leqdRjBkeSK-ShbF6wvWad9YIP2IhTxn0LLAVg3zfDg2Dfvn86SjDiZD_i52PtjznXyo1lJ9mqSAufVlgx2ToxSZazQW8UaBJES1ETc3y2AolIZ4Xc4EXmisVT_K8J4ZfzeJC0MWdLrt/s72-c/Talk+Like+TED+%25281%2529.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4122418037559796246.post-868111342718606518</id><published>2016-05-20T09:08:00.000-07:00</published><updated>2016-05-20T09:08:45.551-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Android Studio"/><category scheme="http://www.blogger.com/atom/ns#" term="conference"/><category scheme="http://www.blogger.com/atom/ns#" term="Espresso"/><category scheme="http://www.blogger.com/atom/ns#" term="Firebase"/><category scheme="http://www.blogger.com/atom/ns#" term="Google I/O"/><title type='text'>Google I/O 2016 Recap</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiecY4NPfgAxIhbi1u-Khj0W1by3Z2DyYw4w_NoZ-UMONVQBvEe-7QI5Oic84fAW7kFQGXFUg49ZYuIr4T_hLeF_Hr3MRmUz7OfHGtj1kxRDBe3NYE9UoHeBq3x0ljsxOxB9x-aQ10COSg3/s1600/20160518_082120.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiecY4NPfgAxIhbi1u-Khj0W1by3Z2DyYw4w_NoZ-UMONVQBvEe-7QI5Oic84fAW7kFQGXFUg49ZYuIr4T_hLeF_Hr3MRmUz7OfHGtj1kxRDBe3NYE9UoHeBq3x0ljsxOxB9x-aQ10COSg3/s640/20160518_082120.jpg&quot; width=&quot;640&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;This was my second time attending &lt;a href=&quot;https://events.google.com/io2016/&quot; target=&quot;_blank&quot;&gt;Google I/O&lt;/a&gt; and it was once again a great experience. I put together a few highlights of the event below:&lt;/span&gt;&lt;br&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;/span&gt;&lt;br&gt;
&lt;a href=&quot;http://davistechyinfo.blogspot.com/2016/05/google-io-2016-recap.html#more&quot;&gt;Read more »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://davistechyinfo.blogspot.com/feeds/868111342718606518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davistechyinfo.blogspot.com/2016/05/google-io-2016-recap.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/868111342718606518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/868111342718606518'/><link rel='alternate' type='text/html' href='http://davistechyinfo.blogspot.com/2016/05/google-io-2016-recap.html' title='Google I/O 2016 Recap'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08779678670354545319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiecY4NPfgAxIhbi1u-Khj0W1by3Z2DyYw4w_NoZ-UMONVQBvEe-7QI5Oic84fAW7kFQGXFUg49ZYuIr4T_hLeF_Hr3MRmUz7OfHGtj1kxRDBe3NYE9UoHeBq3x0ljsxOxB9x-aQ10COSg3/s72-c/20160518_082120.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4122418037559796246.post-70515862587086759</id><published>2016-05-09T16:42:00.000-07:00</published><updated>2016-05-09T16:43:06.682-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Espresso"/><category scheme="http://www.blogger.com/atom/ns#" term="Screen Robot"/><category scheme="http://www.blogger.com/atom/ns#" term="tech-talk"/><category scheme="http://www.blogger.com/atom/ns#" term="testing"/><title type='text'>Talk: Screen Robots UI Testing with Espresso</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-cLL1H1Nk5HNuFwbn0OS5crp-CRoDSTeFMI7hdYv-zGa7v_yeyLoYfO8OH1jKn_tVlvve9bjBd1WhcvFwTEaY7vKYELqxKLqWQ1TLEcsoLIsZWMqLy98aL7u29Adj-GeyxOp_f4-4qsjx/s1600/screen_robot_ss.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;380&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-cLL1H1Nk5HNuFwbn0OS5crp-CRoDSTeFMI7hdYv-zGa7v_yeyLoYfO8OH1jKn_tVlvve9bjBd1WhcvFwTEaY7vKYELqxKLqWQ1TLEcsoLIsZWMqLy98aL7u29Adj-GeyxOp_f4-4qsjx/s640/screen_robot_ss.png&quot; width=&quot;640&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Often when writing tests with Espresso you find a lot of &lt;i&gt;onView&lt;/i&gt;, &lt;i&gt;withId&lt;/i&gt;, &lt;i&gt;perform&lt;/i&gt; calls scattered throughout your test methods. This takes away from the simplicity of the test, tends to be verbose and also litters resource ids everywhere. There&amp;#39;s got to be a better way, right? Yes, there is...&lt;b&gt;Screen Robots&lt;/b&gt;. In this presentation you will learn how to take advantage of the Screen Robot abstraction technique.&lt;/span&gt;&lt;br&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;/span&gt;&lt;br&gt;
&lt;a href=&quot;http://davistechyinfo.blogspot.com/2016/05/talk-screen-robots-ui-testing-with.html#more&quot;&gt;Read more »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://davistechyinfo.blogspot.com/feeds/70515862587086759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davistechyinfo.blogspot.com/2016/05/talk-screen-robots-ui-testing-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/70515862587086759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/70515862587086759'/><link rel='alternate' type='text/html' href='http://davistechyinfo.blogspot.com/2016/05/talk-screen-robots-ui-testing-with.html' title='Talk: Screen Robots UI Testing with Espresso'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08779678670354545319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-cLL1H1Nk5HNuFwbn0OS5crp-CRoDSTeFMI7hdYv-zGa7v_yeyLoYfO8OH1jKn_tVlvve9bjBd1WhcvFwTEaY7vKYELqxKLqWQ1TLEcsoLIsZWMqLy98aL7u29Adj-GeyxOp_f4-4qsjx/s72-c/screen_robot_ss.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4122418037559796246.post-4041378533245196851</id><published>2016-04-24T19:54:00.001-07:00</published><updated>2016-04-24T19:54:55.486-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android tv"/><category scheme="http://www.blogger.com/atom/ns#" term="podcast"/><category scheme="http://www.blogger.com/atom/ns#" term="the blerg"/><title type='text'>The Blerg Podcast Chat</title><content type='html'>&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdSKnKQXEFORErCUBM7KZqor-sQTnOpQYCyAnf1kGqqVSGWO68i2scflM5gaNGvSQlJBNQhVwe7bVoAKCWKCZJT9TDU5gY5zoVXwX1MFg-UQYCCugnqmlQlmSqN5UwRT8NjwEVpJIJ8Bcj/s1600/the_blerg_podcast.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdSKnKQXEFORErCUBM7KZqor-sQTnOpQYCyAnf1kGqqVSGWO68i2scflM5gaNGvSQlJBNQhVwe7bVoAKCWKCZJT9TDU5gY5zoVXwX1MFg-UQYCCugnqmlQlmSqN5UwRT8NjwEVpJIJ8Bcj/s320/the_blerg_podcast.jpg&quot; width=&quot;259&quot;&gt;&lt;/a&gt;&lt;span style=&quot;font-size: large;&quot;&gt;I was recently a guest on &lt;a href=&quot;http://theblerg.net/podcast/24&quot; target=&quot;_blank&quot;&gt;The Blerg&lt;/a&gt; podcast. It&amp;#39;s a podcast that focuses on the various technologies in the Android ecosystem, featuring famed developer of &lt;b&gt;Action Launcher&lt;/b&gt;, &lt;a class=&quot;g-profile&quot; href=&quot;https://plus.google.com/104649936579980037256&quot; target=&quot;_blank&quot;&gt;+Chris Lacy&lt;/a&gt;.&lt;/span&gt;&lt;br&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;font-size: large;&quot;&gt;During our chat, we talked all about &lt;a href=&quot;https://www.android.com/tv/&quot; target=&quot;_blank&quot;&gt;Android TV&lt;/a&gt;, Google&amp;#39;s solution for streaming devices in your home. We also talked a bit about what we would love to see in the way of additions to Android TV in the future. I spent several years developing for Google TV and Android TV, it was certainly a &lt;i&gt;unique experience&lt;/i&gt; from typical Android application development. At any rate, I wanted to share some of the highlights of our chat with you.&lt;/span&gt;&lt;br&gt;

&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;/span&gt;&lt;br&gt;
&lt;a href=&quot;http://davistechyinfo.blogspot.com/2016/04/the-blerg-podcast-chat.html#more&quot;&gt;Read more »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://davistechyinfo.blogspot.com/feeds/4041378533245196851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davistechyinfo.blogspot.com/2016/04/the-blerg-podcast-chat.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/4041378533245196851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/4041378533245196851'/><link rel='alternate' type='text/html' href='http://davistechyinfo.blogspot.com/2016/04/the-blerg-podcast-chat.html' title='The Blerg Podcast Chat'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08779678670354545319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdSKnKQXEFORErCUBM7KZqor-sQTnOpQYCyAnf1kGqqVSGWO68i2scflM5gaNGvSQlJBNQhVwe7bVoAKCWKCZJT9TDU5gY5zoVXwX1MFg-UQYCCugnqmlQlmSqN5UwRT8NjwEVpJIJ8Bcj/s72-c/the_blerg_podcast.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4122418037559796246.post-1472670087780728683</id><published>2016-04-18T12:44:00.000-07:00</published><updated>2016-04-18T12:44:01.467-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Espresso"/><category scheme="http://www.blogger.com/atom/ns#" term="Screen Robot"/><category scheme="http://www.blogger.com/atom/ns#" term="testing"/><category scheme="http://www.blogger.com/atom/ns#" term="testing tricks"/><title type='text'>Testing Tricks #5 - Using Screen Robots with Espresso</title><content type='html'>&lt;head&gt;
    &lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
    &lt;script src=&quot;//cdnjs.cloudflare.com/ajax/libs/gist-embed/2.4/gist-embed.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
  &lt;/head&gt;

&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAOLwxs58QCpb6FPOilUhlb_tJ6rwPWelrlu9zQOd3uNuvosAsnzePUIKKGaALWbYvdoJjgyFP6ddxWEdu71KbLL7hz0AK2qXhbeaGfcH8xg-UvKyilmKB8aUgaYDALCuetEQvd7cOWlI6/s1600/screen_robot.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAOLwxs58QCpb6FPOilUhlb_tJ6rwPWelrlu9zQOd3uNuvosAsnzePUIKKGaALWbYvdoJjgyFP6ddxWEdu71KbLL7hz0AK2qXhbeaGfcH8xg-UvKyilmKB8aUgaYDALCuetEQvd7cOWlI6/s640/screen_robot.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;In this presentation by a developer at Square: &lt;a href=&quot;https://youtu.be/MYgDy1zXZsM?t=12m14s&quot; target=&quot;_blank&quot;&gt;&quot;Software Quality/Automation Testing&quot;&lt;/a&gt;, he discussed how they take advantage of &lt;i&gt;Robots&lt;/i&gt; to make it easier to update tests whenever UI elements change, as well as a few additional benefits. This is a very useful abstraction technique for when you&#39;re writing large numbers of tests in &lt;a href=&quot;https://google.github.io/android-testing-support-library/docs/espresso/&quot; target=&quot;_blank&quot;&gt;Espresso&lt;/a&gt;. So let&#39;s look at an example of using a Screen Robot to test a simple login flow.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Before Using a Screen Robot&lt;/span&gt;&lt;/h3&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;code data-gist-file=&quot;BeforeLoginActivityTest.java&quot; data-gist-id=&quot;f35c12bdafbf2e20f66485235f9d423f&quot; data-gist-line=&quot;17-37&quot;&gt;&lt;/code&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;So the above code is how you would typically make use of Espresso, where you have multiple calls to &lt;i&gt;onView()&lt;/i&gt;&amp;nbsp;and reference the resource ids directly in each test. Two main drawbacks of this approach is that 1) if you need to change the ids in the future you have to update multiple tests, and 2) it&#39;s not very clear from first glance what you&#39;re attempting to accomplish in a given test due to the Espresso calls. So now let&#39;s look at the same example, this time using Screen Robots.&lt;/span&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;h3&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;After Using a Screen Robot&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;code data-gist-file=&quot;LoginActivityTest.java&quot; data-gist-id=&quot;f35c12bdafbf2e20f66485235f9d423f&quot; data-gist-line=&quot;44-49&quot;&gt;&lt;/code&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Notice how the test method is more succinct and more easily conveys what we are trying to do, namely login with a given username and password and then make sure that it was a success.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Here&#39;s the code for our &lt;i&gt;LoginScreenRobot&lt;/i&gt;:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;code data-gist-file=&quot;LoginActivityTest.java&quot; data-gist-id=&quot;f35c12bdafbf2e20f66485235f9d423f&quot; data-gist-line=&quot;51-71&quot;&gt;&lt;/code&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;This allows us to have a thin abstraction layer over the Espresso calls by extending our base &lt;a href=&quot;https://gist.github.com/adavis/f35c12bdafbf2e20f66485235f9d423f#file-screenrobot-java&quot; target=&quot;_blank&quot;&gt;ScreenRobot&lt;/a&gt; class. Hope you found this short testing tip helpful!&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://davistechyinfo.blogspot.com/feeds/1472670087780728683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davistechyinfo.blogspot.com/2016/04/testing-tricks-5-using-screen-robots.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/1472670087780728683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/1472670087780728683'/><link rel='alternate' type='text/html' href='http://davistechyinfo.blogspot.com/2016/04/testing-tricks-5-using-screen-robots.html' title='Testing Tricks #5 - Using Screen Robots with Espresso'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08779678670354545319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAOLwxs58QCpb6FPOilUhlb_tJ6rwPWelrlu9zQOd3uNuvosAsnzePUIKKGaALWbYvdoJjgyFP6ddxWEdu71KbLL7hz0AK2qXhbeaGfcH8xg-UvKyilmKB8aUgaYDALCuetEQvd7cOWlI6/s72-c/screen_robot.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4122418037559796246.post-1818223733918779415</id><published>2016-03-30T16:14:00.001-07:00</published><updated>2016-03-30T16:14:28.490-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="fragmented"/><category scheme="http://www.blogger.com/atom/ns#" term="Gradle"/><category scheme="http://www.blogger.com/atom/ns#" term="podcast"/><title type='text'>Fragmented Podcast Chat</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjo_RbjtHGZ0r3tS07TCwujKeSWY-JiKbTgf5_W2nDZ0CyDVW8qgs2oc5iutz_6D56fw1DaxEHoC4wXTNgBBIwWOMraB9A6VXHtyo9Qg4z7v1VSpWsJaN98kqBSCxf_INR7VgKu74wKt8Uw/s1600/fragmented_podcast_annyce.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjo_RbjtHGZ0r3tS07TCwujKeSWY-JiKbTgf5_W2nDZ0CyDVW8qgs2oc5iutz_6D56fw1DaxEHoC4wXTNgBBIwWOMraB9A6VXHtyo9Qg4z7v1VSpWsJaN98kqBSCxf_INR7VgKu74wKt8Uw/s200/fragmented_podcast_annyce.jpg&quot; width=&quot;197&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;I was recently a guest on one of my favorite podcasts, &lt;a href=&quot;http://fragmentedpodcast.com/episodes/33/&quot; target=&quot;_blank&quot;&gt;Fragmented&lt;/a&gt;. It&amp;#39;s a podcast that focuses on tips and tricks for improving the Android Development experience. &lt;/span&gt;&lt;br&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;We talked all about &lt;a href=&quot;http://gradle.org/&quot; target=&quot;_blank&quot;&gt;Gradle&lt;/a&gt;, the build system that is used for running, testing, and packaging Android applications. I wanted to share some of the highlights.&lt;/span&gt;&lt;br&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;/span&gt;&lt;br&gt;
&lt;a href=&quot;http://davistechyinfo.blogspot.com/2016/03/fragmented-podcast-chat.html#more&quot;&gt;Read more »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://davistechyinfo.blogspot.com/feeds/1818223733918779415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davistechyinfo.blogspot.com/2016/03/fragmented-podcast-chat.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/1818223733918779415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/1818223733918779415'/><link rel='alternate' type='text/html' href='http://davistechyinfo.blogspot.com/2016/03/fragmented-podcast-chat.html' title='Fragmented Podcast Chat'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08779678670354545319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjo_RbjtHGZ0r3tS07TCwujKeSWY-JiKbTgf5_W2nDZ0CyDVW8qgs2oc5iutz_6D56fw1DaxEHoC4wXTNgBBIwWOMraB9A6VXHtyo9Qg4z7v1VSpWsJaN98kqBSCxf_INR7VgKu74wKt8Uw/s72-c/fragmented_podcast_annyce.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4122418037559796246.post-204562345549116463</id><published>2016-02-01T15:18:00.003-08:00</published><updated>2016-02-01T15:21:09.821-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="chat"/><category scheme="http://www.blogger.com/atom/ns#" term="CodeNewbie"/><category scheme="http://www.blogger.com/atom/ns#" term="Storify"/><category scheme="http://www.blogger.com/atom/ns#" term="tech community"/><category scheme="http://www.blogger.com/atom/ns#" term="TweetDeck"/><category scheme="http://www.blogger.com/atom/ns#" term="Twitter"/><category scheme="http://www.blogger.com/atom/ns#" term="Twitter chat"/><title type='text'>Joining In on Twitter Chats</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXppNlGNCksQS7KkbVF9olmuYvttqOHWknujrbUJGKshbJDe0dygEFXNUJyp1IyJbLDB3v4Xd2fnxowKzoZ3Ut6S5b7BYPdcTt4LCGdEBt-hIDdhFmGabbyWkk4htt3ZUVQGqfXvzNLVMC/s1600/Screen+Shot+2016-02-01+at+5.24.29+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;264&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXppNlGNCksQS7KkbVF9olmuYvttqOHWknujrbUJGKshbJDe0dygEFXNUJyp1IyJbLDB3v4Xd2fnxowKzoZ3Ut6S5b7BYPdcTt4LCGdEBt-hIDdhFmGabbyWkk4htt3ZUVQGqfXvzNLVMC/s640/Screen+Shot+2016-02-01+at+5.24.29+PM.png&quot; width=&quot;640&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;A great way to connect with others in the tech community is by means of joining in on a &lt;b&gt;Twitter Chat&lt;/b&gt;. So what&amp;#39;s a Twitter chat? &lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&amp;quot;A tweet chat is a &lt;i&gt;live&lt;/i&gt; Twitter event, usually moderated and focused around a &lt;i&gt;general topic&lt;/i&gt;. To filter all the chatter on Twitter into a single conversation &lt;i&gt;a hashtag&lt;/i&gt; is used. A &lt;u&gt;set time&lt;/u&gt; is also established so that the moderator, guest or host is available to engage in the conversation.&amp;quot; -- &lt;a href=&quot;http://www.forbes.com/sites/stevecooper/2013/09/30/the-ultimate-guide-to-hosting-a-tweet-chat/#7762ec4664b3&quot; target=&quot;_blank&quot;&gt;Forbes&lt;/a&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;/span&gt;&lt;br&gt;
&lt;a href=&quot;http://davistechyinfo.blogspot.com/2016/02/joining-in-on-twitter-chats.html#more&quot;&gt;Read more »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://davistechyinfo.blogspot.com/feeds/204562345549116463/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davistechyinfo.blogspot.com/2016/02/joining-in-on-twitter-chats.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/204562345549116463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/204562345549116463'/><link rel='alternate' type='text/html' href='http://davistechyinfo.blogspot.com/2016/02/joining-in-on-twitter-chats.html' title='Joining In on Twitter Chats'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08779678670354545319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXppNlGNCksQS7KkbVF9olmuYvttqOHWknujrbUJGKshbJDe0dygEFXNUJyp1IyJbLDB3v4Xd2fnxowKzoZ3Ut6S5b7BYPdcTt4LCGdEBt-hIDdhFmGabbyWkk4htt3ZUVQGqfXvzNLVMC/s72-c/Screen+Shot+2016-02-01+at+5.24.29+PM.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4122418037559796246.post-8726073529148922946</id><published>2016-01-19T09:40:00.000-08:00</published><updated>2016-01-19T09:40:57.148-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Gradle"/><category scheme="http://www.blogger.com/atom/ns#" term="plugin"/><category scheme="http://www.blogger.com/atom/ns#" term="tech-talk"/><title type='text'>Talk: Gradle Plugin Goodness</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuRqcjznzUlTD9s0cTAxjYrv14Zrqw8rURN4Yg009i6UMml0KccRbUl956fkvs6Ihh0BmcasjiIJYomHPl6c8Flj8Ea94pE018JOH54uU4B3EBSy_fhpOFJ9PajM-wSF7fUydFkNPje77f/s1600/Screen+Shot+2016-01-13+at+10.22.37+AM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;473&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuRqcjznzUlTD9s0cTAxjYrv14Zrqw8rURN4Yg009i6UMml0KccRbUl956fkvs6Ihh0BmcasjiIJYomHPl6c8Flj8Ea94pE018JOH54uU4B3EBSy_fhpOFJ9PajM-wSF7fUydFkNPje77f/s640/Screen+Shot+2016-01-13+at+10.22.37+AM.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;If you find yourself copying and pasting code from your application&#39;s &lt;i&gt;build.gradle&lt;/i&gt; file every time you start a new project, then it&#39;s time you learn about creating &lt;b&gt;Gradle plugins&lt;/b&gt;. In this presentation you will learn what it takes to create a custom Gradle plugin for use in your Android/Java applications.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;It covers: Plugin Structure, Key Plugin Components, Testing, and Publishing&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Materials&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;a href=&quot;http://www.slideshare.net/AnnyceDavis/creating-gradle-plugins&quot; target=&quot;_blank&quot;&gt;Slides&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;a href=&quot;https://goo.gl/Ytw3ah&quot; target=&quot;_blank&quot;&gt;Sample Project&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;If you would like to learn more about creating high quality Android applications, I encourage you to check out my &lt;a href=&quot;http://goo.gl/xuIOvv&quot; target=&quot;_blank&quot;&gt;video course&lt;/a&gt;. Also, follow me on &lt;a href=&quot;https://twitter.com/brwngrldev&quot; target=&quot;_blank&quot;&gt;Twitter&lt;/a&gt; for my latest updates.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://davistechyinfo.blogspot.com/feeds/8726073529148922946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davistechyinfo.blogspot.com/2016/01/talk-gradle-plugin-goodness.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/8726073529148922946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/8726073529148922946'/><link rel='alternate' type='text/html' href='http://davistechyinfo.blogspot.com/2016/01/talk-gradle-plugin-goodness.html' title='Talk: Gradle Plugin Goodness'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08779678670354545319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuRqcjznzUlTD9s0cTAxjYrv14Zrqw8rURN4Yg009i6UMml0KccRbUl956fkvs6Ihh0BmcasjiIJYomHPl6c8Flj8Ea94pE018JOH54uU4B3EBSy_fhpOFJ9PajM-wSF7fUydFkNPje77f/s72-c/Screen+Shot+2016-01-13+at+10.22.37+AM.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4122418037559796246.post-1991708648814915319</id><published>2016-01-09T09:42:00.000-08:00</published><updated>2016-01-09T09:42:16.651-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Builder Pattern"/><category scheme="http://www.blogger.com/atom/ns#" term="readability"/><category scheme="http://www.blogger.com/atom/ns#" term="testing tricks"/><category scheme="http://www.blogger.com/atom/ns#" term="unit testing"/><title type='text'>Testing Tricks #4 - Improving Readability</title><content type='html'>&lt;head&gt;
    &lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
    &lt;script src=&quot;//cdnjs.cloudflare.com/ajax/libs/gist-embed/2.4/gist-embed.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
  &lt;/head&gt;

&lt;br&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieOxneEYJEepe2JQr6v3gUTZOlw9bcr-UpwIppddb3JAjQF8VnT9mZpDJ6dyIgTBvJcPuymC70VAjI2Qe3KXgRgLTeTUk68Ygvm2hypDjEqTsc6yASnC-mO4qQzkV3PqYrVgNyXJEMjsyJ/s1600/Depositphotos_35240817_m-2015.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;265&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieOxneEYJEepe2JQr6v3gUTZOlw9bcr-UpwIppddb3JAjQF8VnT9mZpDJ6dyIgTBvJcPuymC70VAjI2Qe3KXgRgLTeTUk68Ygvm2hypDjEqTsc6yASnC-mO4qQzkV3PqYrVgNyXJEMjsyJ/s400/Depositphotos_35240817_m-2015.jpg&quot; width=&quot;400&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;i&gt;Readability&lt;/i&gt; is one of the key components to creating high quality unit and integration tests. Yet, we may hinder the readability of our tests by bogging them down with needless information. Let&amp;#39;s take a look at an example.&lt;/span&gt;


&lt;span style=&quot;font-size: large;&quot;&gt;&lt;/span&gt;&lt;br&gt;
&lt;a href=&quot;http://davistechyinfo.blogspot.com/2016/01/testing-tricks-4-improving-readability.html#more&quot;&gt;Read more »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://davistechyinfo.blogspot.com/feeds/1991708648814915319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davistechyinfo.blogspot.com/2016/01/testing-tricks-4-improving-readability.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/1991708648814915319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/1991708648814915319'/><link rel='alternate' type='text/html' href='http://davistechyinfo.blogspot.com/2016/01/testing-tricks-4-improving-readability.html' title='Testing Tricks #4 - Improving Readability'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08779678670354545319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieOxneEYJEepe2JQr6v3gUTZOlw9bcr-UpwIppddb3JAjQF8VnT9mZpDJ6dyIgTBvJcPuymC70VAjI2Qe3KXgRgLTeTUk68Ygvm2hypDjEqTsc6yASnC-mO4qQzkV3PqYrVgNyXJEMjsyJ/s72-c/Depositphotos_35240817_m-2015.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4122418037559796246.post-2103934038820520031</id><published>2016-01-01T12:50:00.001-08:00</published><updated>2016-01-01T12:53:39.440-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Camtasia"/><category scheme="http://www.blogger.com/atom/ns#" term="Google Docs"/><category scheme="http://www.blogger.com/atom/ns#" term="Keynote"/><category scheme="http://www.blogger.com/atom/ns#" term="video course"/><title type='text'>Creating Your Own Video Course, Part II: Execution</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbVhM27PRfB8z6FDmHzwIBBe6wuis5Y0JKqZvhJELTA1_0SZFRb7ZVodIEXArJEemp0htHVoS2UbozpbrzLYFt3sSQLPZd6C5F8HTbt22mlAcq2THwlvaAVjtfUo14sitrjOaHZOPfmwhz/s1600/Screen+Shot+2016-01-01+at+3.00.27+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;369&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbVhM27PRfB8z6FDmHzwIBBe6wuis5Y0JKqZvhJELTA1_0SZFRb7ZVodIEXArJEemp0htHVoS2UbozpbrzLYFt3sSQLPZd6C5F8HTbt22mlAcq2THwlvaAVjtfUo14sitrjOaHZOPfmwhz/s640/Screen+Shot+2016-01-01+at+3.00.27+PM.png&quot; title=&quot;Camtasia Video Editing&quot; width=&quot;640&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;In &lt;a href=&quot;http://www.adavis.info/2015/12/creating-your-own-video-course-part-i.html&quot; target=&quot;_blank&quot;&gt;Part I&lt;/a&gt; of this series, I discussed what it takes to prepare your own video course. In this part we&amp;#39;ll talk about the tools and processes you can use to plan for and record the actual videos. So let&amp;#39;s get started...&lt;/span&gt;&lt;br&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;/span&gt;&lt;br&gt;
&lt;a href=&quot;http://davistechyinfo.blogspot.com/2016/01/creating-your-own-video-course-part-ii.html#more&quot;&gt;Read more »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://davistechyinfo.blogspot.com/feeds/2103934038820520031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davistechyinfo.blogspot.com/2016/01/creating-your-own-video-course-part-ii.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/2103934038820520031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/2103934038820520031'/><link rel='alternate' type='text/html' href='http://davistechyinfo.blogspot.com/2016/01/creating-your-own-video-course-part-ii.html' title='Creating Your Own Video Course, Part II: Execution'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08779678670354545319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbVhM27PRfB8z6FDmHzwIBBe6wuis5Y0JKqZvhJELTA1_0SZFRb7ZVodIEXArJEemp0htHVoS2UbozpbrzLYFt3sSQLPZd6C5F8HTbt22mlAcq2THwlvaAVjtfUo14sitrjOaHZOPfmwhz/s72-c/Screen+Shot+2016-01-01+at+3.00.27+PM.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4122418037559796246.post-5249446182434747727</id><published>2015-12-30T12:14:00.001-08:00</published><updated>2015-12-30T12:16:06.155-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="2015"/><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="public speaking"/><category scheme="http://www.blogger.com/atom/ns#" term="Twitter"/><category scheme="http://www.blogger.com/atom/ns#" term="year end summary"/><title type='text'>My 2015</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6ffkBcdxORb2iiLBsc5SzynUtQ1yURmelJvhoaRSnPr9kAZy65JQEjtqvbBrba2YTVvSw0WVs2N2kRG3HoUEBAAjQMHwJhBxKM_w8VUwBbu0Tcv5ieS65rgAJBlTEsGjHjHQpykR17kHT/s1600/12309753_1013605815362169_2220895432209450283_o.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6ffkBcdxORb2iiLBsc5SzynUtQ1yURmelJvhoaRSnPr9kAZy65JQEjtqvbBrba2YTVvSw0WVs2N2kRG3HoUEBAAjQMHwJhBxKM_w8VUwBbu0Tcv5ieS65rgAJBlTEsGjHjHQpykR17kHT/s320/12309753_1013605815362169_2220895432209450283_o.jpg&quot; width=&quot;320&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Looking back on 2015, I&amp;#39;d have to say it was my year of &lt;i&gt;&amp;quot;breaking free&amp;quot;&lt;/i&gt;. I finally started to do many of things that I had been &lt;b&gt;only dreaming of&lt;/b&gt; for the past several years in my career as a Software Developer. Instead of feeling like I still &lt;i&gt;didn&amp;#39;t know enough&lt;/i&gt;, I embraced what I &lt;i&gt;did know&lt;/i&gt; and used that to increase my visibility in the Android Community. So here&amp;#39;s a recap of some of the highlights.&lt;/span&gt;&lt;br&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;/span&gt;&lt;br&gt;
&lt;a href=&quot;http://davistechyinfo.blogspot.com/2015/12/my-2015.html#more&quot;&gt;Read more »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://davistechyinfo.blogspot.com/feeds/5249446182434747727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davistechyinfo.blogspot.com/2015/12/my-2015.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/5249446182434747727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/5249446182434747727'/><link rel='alternate' type='text/html' href='http://davistechyinfo.blogspot.com/2015/12/my-2015.html' title='My 2015'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08779678670354545319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6ffkBcdxORb2iiLBsc5SzynUtQ1yURmelJvhoaRSnPr9kAZy65JQEjtqvbBrba2YTVvSw0WVs2N2kRG3HoUEBAAjQMHwJhBxKM_w8VUwBbu0Tcv5ieS65rgAJBlTEsGjHjHQpykR17kHT/s72-c/12309753_1013605815362169_2220895432209450283_o.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4122418037559796246.post-2547037750337653055</id><published>2015-12-24T15:34:00.000-08:00</published><updated>2015-12-24T15:34:27.884-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="organization"/><category scheme="http://www.blogger.com/atom/ns#" term="Trello"/><category scheme="http://www.blogger.com/atom/ns#" term="video course"/><title type='text'>Creating Your Own Video Course, Part I: Preparation</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://goo.gl/xuIOvv&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;355&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLm3zuK1l66mEinbXAHYveDi2lHwyN2FgsIhaQw-92kDrcpZvL3JSUOGRE-qrprR132HWDy3gt_ijBscVqEqTuxet4Ju9e8jXIQ1r2gCV3gohpjvyF7W8YxSRu0gdLjYFlWUDOKa-1v-bh/s640/Screen+Shot+2015-12-23+at+3.09.38+PM.png&quot; title=&quot;Developing High Quality Android Applications - Annyce Davis&quot; width=&quot;640&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;I recently launched my first video course: &lt;a href=&quot;http://goo.gl/xuIOvv&quot; target=&quot;_blank&quot;&gt;Developing High Quality Android Applications&lt;/a&gt;. It was a significant undertaking for me. But through good planning and execution I was able to create a &lt;i&gt;2 hour course&lt;/i&gt; with &lt;b&gt;over 40 videos&lt;/b&gt; in just about &lt;i&gt;2 months&lt;/i&gt;, while still working full-time! So while everything is still very fresh in my mind I wanted to share how I was able to do it. &lt;/span&gt;&lt;br&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;This is going to be a three part series where I break down the &lt;i&gt;Preparation&lt;/i&gt;, &lt;i&gt;Execution&lt;/i&gt;, and then &lt;i&gt;Marketing&lt;/i&gt; of the course. Hope you find this information useful and you can use it as a reference for your first course! So let&amp;#39;s get started...&lt;/span&gt;&lt;br&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;/span&gt;&lt;br&gt;
&lt;a href=&quot;http://davistechyinfo.blogspot.com/2015/12/creating-your-own-video-course-part-i.html#more&quot;&gt;Read more »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://davistechyinfo.blogspot.com/feeds/2547037750337653055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davistechyinfo.blogspot.com/2015/12/creating-your-own-video-course-part-i.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/2547037750337653055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/2547037750337653055'/><link rel='alternate' type='text/html' href='http://davistechyinfo.blogspot.com/2015/12/creating-your-own-video-course-part-i.html' title='Creating Your Own Video Course, Part I: Preparation'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08779678670354545319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLm3zuK1l66mEinbXAHYveDi2lHwyN2FgsIhaQw-92kDrcpZvL3JSUOGRE-qrprR132HWDy3gt_ijBscVqEqTuxet4Ju9e8jXIQ1r2gCV3gohpjvyF7W8YxSRu0gdLjYFlWUDOKa-1v-bh/s72-c/Screen+Shot+2015-12-23+at+3.09.38+PM.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4122418037559796246.post-3537857112712885502</id><published>2015-12-14T10:18:00.000-08:00</published><updated>2015-12-14T10:18:03.386-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="testing tricks"/><category scheme="http://www.blogger.com/atom/ns#" term="third party API. encapsulation"/><category scheme="http://www.blogger.com/atom/ns#" term="unit testing"/><title type='text'>Testing Tricks #3: Third Party APIs</title><content type='html'>&lt;span style=&quot;font-size: large;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_6nhVloJLot-eDtGT9LMKIudT8tmX_3eXMb6rLqOS3NSCuZEmQY-qbQ77ofMPfpbalp1_Nkc6nnMvLDPM6bjuqTvOm7GaqOjNJS1SuAslmwj4ZFJwq7oaKOBUOOCEfi-iPbvJ0SHEkrhM/s1600/Screen+Shot+2015-12-14+at+12.26.28+PM.png&quot; imageanchor=&quot;1&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;208&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_6nhVloJLot-eDtGT9LMKIudT8tmX_3eXMb6rLqOS3NSCuZEmQY-qbQ77ofMPfpbalp1_Nkc6nnMvLDPM6bjuqTvOm7GaqOjNJS1SuAslmwj4ZFJwq7oaKOBUOOCEfi-iPbvJ0SHEkrhM/s640/Screen+Shot+2015-12-14+at+12.26.28+PM.png&quot; width=&quot;640&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;br&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;When you&amp;#39;re writing unit tests for your Android applications, you will often need to handle interactions with &lt;b&gt;third party APIs&lt;/b&gt;. In the above image we&amp;#39;re using the &lt;a href=&quot;http://square.github.io/picasso/&quot; target=&quot;_blank&quot;&gt;Picasso&lt;/a&gt; Image Loading library in our classes. Picasso has a very clean API, so it&amp;#39;s relatively simple to work with; but with other libraries you may not be so fortunate. So what can we do to &lt;i&gt;simplify&lt;/i&gt; our interactions with those APIs and also set ourselves up for more &lt;i&gt;maintainable code&lt;/i&gt; in the future?&lt;/span&gt;&lt;br&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;/span&gt;&lt;br&gt;
&lt;a href=&quot;http://davistechyinfo.blogspot.com/2015/12/testing-tricks-3-third-party-apis.html#more&quot;&gt;Read more »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://davistechyinfo.blogspot.com/feeds/3537857112712885502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davistechyinfo.blogspot.com/2015/12/testing-tricks-3-third-party-apis.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/3537857112712885502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/3537857112712885502'/><link rel='alternate' type='text/html' href='http://davistechyinfo.blogspot.com/2015/12/testing-tricks-3-third-party-apis.html' title='Testing Tricks #3: Third Party APIs'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08779678670354545319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_6nhVloJLot-eDtGT9LMKIudT8tmX_3eXMb6rLqOS3NSCuZEmQY-qbQ77ofMPfpbalp1_Nkc6nnMvLDPM6bjuqTvOm7GaqOjNJS1SuAslmwj4ZFJwq7oaKOBUOOCEfi-iPbvJ0SHEkrhM/s72-c/Screen+Shot+2015-12-14+at+12.26.28+PM.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4122418037559796246.post-3693954370592901197</id><published>2015-12-07T08:12:00.000-08:00</published><updated>2015-12-07T08:12:05.604-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Espresso"/><category scheme="http://www.blogger.com/atom/ns#" term="testing tricks"/><category scheme="http://www.blogger.com/atom/ns#" term="uiautomatorviewer"/><title type='text'>Testing Tricks #2: Finding UI Views</title><content type='html'>&lt;span style=&quot;font-size: large;&quot;&gt;When you&amp;#39;re writing &lt;a href=&quot;https://google.github.io/android-testing-support-library/docs/espresso/index.html&quot; target=&quot;_blank&quot;&gt;Espresso&lt;/a&gt; tests for your Android applications, you will often need to reference the &lt;i&gt;resource&lt;/i&gt; &lt;i&gt;id&lt;/i&gt; of a particular view in order to make your assertions. Instead of digging through code you can take advantage of the &lt;a href=&quot;http://developer.android.com/tools/testing-support-library/index.html#uia-viewer&quot; target=&quot;_blank&quot;&gt;UIAutomatorViewer&lt;/a&gt; tool. It&amp;#39;s very simple to use and helps you to visualize the hierarchy of the views in your application. &lt;/span&gt;&lt;br&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;/span&gt;&lt;br&gt;
&lt;a href=&quot;http://davistechyinfo.blogspot.com/2015/12/testing-tricks-2-finding-ui-views.html#more&quot;&gt;Read more »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://davistechyinfo.blogspot.com/feeds/3693954370592901197/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davistechyinfo.blogspot.com/2015/12/testing-tricks-2-finding-ui-views.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/3693954370592901197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4122418037559796246/posts/default/3693954370592901197'/><link rel='alternate' type='text/html' href='http://davistechyinfo.blogspot.com/2015/12/testing-tricks-2-finding-ui-views.html' title='Testing Tricks #2: Finding UI Views'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08779678670354545319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/C600jqFnRnc/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry></feed>