Slide 1

Slide 1 text

Tools & tips of the trade for the Android Developer Saúl Molinero Spanish GDGs Summit 2015

Slide 2

Slide 2 text

Android UI

Slide 3

Slide 3 text

Material Design

Slide 4

Slide 4 text

Material design Spec https://www.google.com/design/spec/material-design/introduction.html

Slide 5

Slide 5 text

Android Niceties http://androidniceties.tumblr.com

Slide 6

Slide 6 text

materialup http://www.materialup.com

Slide 7

Slide 7 text

https://dribbble.com/

Slide 8

Slide 8 text

+ = https://github.com/saulmm/OpenLibra-Material

Slide 9

Slide 9 text

TabLayout FloatingActionButton CollapsingActionBarLayout NavigationView        compile  ‘com.android.support:design:23.x.x’  

Slide 10

Slide 10 text

TabLayout FloatingActionButton CollapsingActionBarLayout NavigationView https://github.com/chrisbanes/cheesesquare

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

CoordinatorLayout

Slide 13

Slide 13 text

    
               
                           Coordinator Layout: Anchor attributes

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

                  CoordinatorLayout: Flexible Space https://github.com/saulmm/CoordinatorExamples

Slide 16

Slide 16 text

https://github.com/saulmm/CoordinatorBehaviorExample Coordinator Layout: Behaviors

Slide 17

Slide 17 text

Child

Slide 18

Slide 18 text

Coordinator Layout Behaviors Dependency

Slide 19

Slide 19 text


 public static class AvatarImageBehavior extends 
 CoordinatorLayout.Behavior { @Override public boolean layoutDependsOn(
 CoordinatorLayout parent, CircleImageView, child, View dependency) { return dependency instanceof Toolbar; }
 
 public boolean onDependentViewChanged(
 CoordinatorLayout parent, CircleImageView avatar, View dependency) {
 modifyAvatarDependingDependencyState(avatar, dependency); } }

Slide 20

Slide 20 text


 public static class AvatarImageBehavior extends 
 CoordinatorLayout.Behavior { @Override public boolean layoutDependsOn(
 CoordinatorLayout parent, CircleImageView, child, View dependency) { return dependency instanceof Toolbar; } 
 
 public boolean onDependentViewChanged(
 CoordinatorLayout parent, CircleImageView avatar, View dependency) {
 modifyAvatarDependingDependencyState(avatar, dependency); } }

Slide 21

Slide 21 text


 public static class AvatarImageBehavior extends 
 CoordinatorLayout.Behavior { @Override public boolean layoutDependsOn(
 CoordinatorLayout parent, CircleImageView, child, View dependency) { return dependency instanceof Toolbar; } 
 
 public boolean onDependentViewChanged(
 CoordinatorLayout parent, CircleImageView avatar, View dependency) {
 modifyAvatarDependingDependencyState(avatar, dependency); } }

Slide 22

Slide 22 text


 public static class AvatarImageBehavior extends 
 CoordinatorLayout.Behavior { @Override public boolean layoutDependsOn(
 CoordinatorLayout parent, CircleImageView, child, View dependency) { return dependency instanceof Toolbar; } 
 
 public boolean onDependentViewChanged(
 CoordinatorLayout parent, CircleImageView avatar, View dependency) {
 modifyAvatarDependingDependencyState(avatar, dependency); } }

Slide 23

Slide 23 text


 public static class AvatarImageBehavior extends 
 CoordinatorLayout.Behavior { @Override public boolean layoutDependsOn(
 CoordinatorLayout parent, CircleImageView, child, View dependency) { return dependency instanceof Toolbar; }
 
 public boolean onDependentViewChanged(
 CoordinatorLayout parent, CircleImageView avatar, View dependency) {
 modifyAvatarDependingDependencyState(avatar, dependency); } }

Slide 24

Slide 24 text

Multiple Parallax Effects https://github.com/saulmm/CoordinatorBehaviorExample 
 public  void  initParallaxValues  {
      CollapsingToolbarLayout.LayoutParams  lp1  =
              (CollapsingToolbarLayout.LayoutParams)  
                        mPetImage.getLayoutParams();
 
      CollapsingToolbarLayout.LayoutParams  lp2  =
              (CollapsingToolbarLayout.LayoutParams)  
                        mPetTextContainer.getLayoutParams();
 
      lp1.setParallaxMultiplier(0.9f);        lp2.setPArallaxMultiplier(0.3f);
 
      mPetImage.setLayoutParams(lp1);
      mPetTextContainer.setLayoutParams(lp2);
 }

Slide 25

Slide 25 text

Android Resources

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

56dp

Slide 28

Slide 28 text

Reuse available styles

Slide 29

Slide 29 text

Built-in decompiler

Slide 30

Slide 30 text

  2dp
 4dp
 8dp
 16dp
 32dp   No  results   You  need  to  be  logged   Network  error   Couldn’t  fetch  films   Couldn’t  fetch  %s  data Organise your resources, DRY https://github.com/futurice/android-best-practices   12sp
 14sp
 16sp
 18sp
 
 
   2dp
 4dp
 8dp
 12dp
 16dp

Slide 31

Slide 31 text

         <item  name=“android:textColor”>?colorAccent</item>        <item  name=“android:fontFamily”>sans-­‐serif-­‐medium</item>        <item  name=“android:textAllCaps”>true</item>            <item  name=“android:textColor”>@color/gray_dark</item>            <item  name=“android:minHeight”>@dimen/grid_size_medium</item>        <item  name=“android:gravity”>center_vertical</item>          <item  name=“android:textAppearance”>@style/TextAppearance.Header</item>          <item  name=“android:textAppearance”>@style/TextAppearance.Field</item>            <item  name=“android:clickable”>true</item>        <item  name=“android:background”>?android:attr/selectableItemBackground</item>    

Slide 32

Slide 32 text

Vector graphics generator

Slide 33

Slide 33 text

Architecture

Slide 34

Slide 34 text

Entities Use cases Controllers UI Clean architecture

Slide 35

Slide 35 text

No content

Slide 36

Slide 36 text

public  interface  MoviewView  {
      public  void  showMovieTitle  (String  title);
 
      public  void  showMovieImage  (String  imageUri);
          public  void  showTagLine  (String  tagLine);
 
      public  void  showDescription  (String  descrpition);
 
      public  void  showWebPage  (String  webPage);   
      public  void  showProducer  (String  producer);  
 
      public  void  showLoadingIndicator  ();
 
      public  void  hideLoadingIndicator  ();
 }

Slide 37

Slide 37 text

public  class  MovieActivity  implements  MovieView  {
      private  MoviePresenter  mPresenter;
 
      public  void  onCreate  ()  {  …  mPresenter.onCreate();  }  
 
      public  void  onResume  ()  {  …  mPresenter.onResume();  }
 
      public  void  showMovieTitle  (String  title)  {
            mTitleTextView.setText(title);
      }
 
      public  void  showMovieImage  (String  imageUri)  {
            Glide.with(this).load(imageUri).into(mFilmImageView);
      }
 
        public  void  showLoadingIndicator  ()  {
            mLoadingIndicator.setVisibility(View.VISIBLE);
      }
 
      public  void  hideLoadingIndicator  ()  {
            mLoadingIndicator.setVisibility(View.GONE);
      }
 }

Slide 38

Slide 38 text

public  interface  MoviePresenter  {
      private  MovieView  mMoviewView;
      private  MovieUsecase  mMovieUsecase;
 
      public  void  MoviePresenter  (MovieView  movieView)  {
            mMovieView  =  movieView;
      }
 
      public  void  onCreate  ()  {              mMoviewView.showLoadingMoview();              mMovieUsecase.subscribe(movie::bindMovie)        }  
              public  void  bindMovie  (Movie  movie)  {
            mMovieView.hideLoadingIndicator();
            mMovieView.showMovieTitle(movie.getTitle());
            mMovieView.showMovieImage(movie.getImage());
      }
 }

Slide 39

Slide 39 text

public  class  MovieUsecase  implements  Usecase  {
      private  Repository  mRepository;          public  Observable  execute  {
            return  mRepository.getRandomMovie();
      }
 }

Slide 40

Slide 40 text

//  settings.gradle   include:  ‘:presentation’,                    ‘:domain’,
                  ‘:model’,                    ‘:common’ //  your  module  build.gradle   compile  project:  ‘(:{your  module})’     Layers as modules

Slide 41

Slide 41 text

Libraries & resources

Slide 42

Slide 42 text

ButterKnife http://jakewharton.github.io/butterknife/

Slide 43

Slide 43 text

Stetho https://github.com/facebook/stetho

Slide 44

Slide 44 text

RetroLambda https://github.com/orfjackal/ RxAndroid https://github.com/ReactiveX/RxAndroid RxJava https://github.com/ReactiveX/RxJava Be reactive!

Slide 45

Slide 45 text

To-do list

Slide 46

Slide 46 text

https://code.facebook.com/posts/android/ http://panavtec.me/ https://github.com/lgvalle/Material-Animations http://www.technotalkative.com/part-4-playing-with-navigationview/ https://medium.com/ribot-labs/exploring-the-new-android-design-support-library-b7cda56d2c32 http://androcode.es/ http://google.github.io/dagger/ http://blog.sqisland.com/ https://medium.com/ribot-labs/exploring-the-new-android-design-support-library-b7cda56d2c32 https://github.com/JakeWharton

Slide 47

Slide 47 text

https://blog.stylingandroid.com/ http://androidweekly.net/ http://antonioleiva.com https://developers.google.com/experts/all/technology/android https://github.com/trending?l=java http://fernandocejas.com/ http://gradleplease.appspot.com/ https://github.com/futurice/android-best-practices https://github.com/googlesamples?utf8=%E2%9C%93&query=android

Slide 48

Slide 48 text

Thanks ! https://github.com/saulmm https://twitter.com/_saulmm http://saulmm.github.io/