Slide 1

Slide 1 text

10 Extension Functions of Kotlin in Android Development @magiepooh

Slide 2

Slide 2 text

About me @magiepooh @magie_pooh Takuma Fujita

Slide 3

Slide 3 text

Company CyberAgent, Inc.

Slide 4

Slide 4 text

10 Extension Functions of Kotlin in Android Development @magiepooh

Slide 5

Slide 5 text

What’s Kotlin?

Slide 6

Slide 6 text

Kotlin • By JetBrains • Lambdas • Nullable(NonNull) • Higher-Order Functions (Stream) • Extension Functions

Slide 7

Slide 7 text

Kotlin • By JetBrains • Lambdas -> Retrolambda • Nullable(NonNull) • Higher-Order Functions (Stream) • Extension Functions

Slide 8

Slide 8 text

Kotlin • By JetBrains • Lambdas -> Retrolambda • Nullable(NonNull) -> Optional • Higher-Order Functions (Stream) • Extension Functions

Slide 9

Slide 9 text

Kotlin • By JetBrains • Lambdas -> Retrolambda • Nullable(NonNull) -> Optional • Higher-Order Functions (Stream) -> RxJava • Extension Functions

Slide 10

Slide 10 text

Kotlin • By JetBrains • Lambdas -> Retrolambda • Nullable(NonNull) -> Optional • Higher-Order Functions (Stream) -> RxJava • Extension Functions

Slide 11

Slide 11 text

Functions in Kotlin

Slide 12

Slide 12 text

Functions in Kotlin fun sum(a: Int, b: Int): Int {
 return a + b
 }

Slide 13

Slide 13 text

Functions in Kotlin fun sum(a: Int, b: Int): Int {
 return a + b
 }

Slide 14

Slide 14 text

Functions in Kotlin fun sum(a: Int, b: Int): Int {
 return a + b
 }

Slide 15

Slide 15 text

Functions in Kotlin fun sum(a: Int, b: Int): Int {
 return a + b
 }

Slide 16

Slide 16 text

Functions in Kotlin fun sum(a: Int, b: Int): Int = a + b

Slide 17

Slide 17 text

Functions in Kotlin fun sum(a: Int, b: Int): Int = a + b

Slide 18

Slide 18 text

Functions in Kotlin fun sum(a: Int, b: Int) = a + b

Slide 19

Slide 19 text

Extension Functions

Slide 20

Slide 20 text

Extension Functions static void toast(Context context, String text) { Toast.makeText(context, text, Toast.LENGTH_SHORT).show(); }

Slide 21

Slide 21 text

Extension Functions void toast(Context context, String text) { Toast.makeText(context, text, Toast.LENGTH_SHORT).show(); }

Slide 22

Slide 22 text

Extension Functions fun toast(Context context, String text) { Toast.makeText(context, text, Toast.LENGTH_SHORT).show(); }

Slide 23

Slide 23 text

Extension Functions fun toast(Context context, String text) { Toast.makeText(context, text, Toast.LENGTH_SHORT).show(); }

Slide 24

Slide 24 text

Extension Functions fun toast(context: Context, text: String) { Toast.makeText(context, text, Toast.LENGTH_SHORT).show() }

Slide 25

Slide 25 text

fun Activity.toast(context: Context, text: String) { Toast.makeText(context, text, Toast.LENGTH_SHORT).show() } Extension Functions

Slide 26

Slide 26 text

fun Activity.toast(context: Context, text: String) { Toast.makeText(context, text, Toast.LENGTH_SHORT).show() } Extension Functions

Slide 27

Slide 27 text

fun Activity.toast(context: Context, text: String) { Toast.makeText(this, text, Toast.LENGTH_SHORT).show() } Extension Functions

Slide 28

Slide 28 text

fun Activity.toast(context: Context, text: String) { Toast.makeText(this, text, Toast.LENGTH_SHORT).show() } Extension Functions

Slide 29

Slide 29 text

fun Activity.toast(text: String) { Toast.makeText(this, text, Toast.LENGTH_SHORT).show() } Extension Functions

Slide 30

Slide 30 text

fun Activity.toast(text: String) { Toast.makeText(this, text, Toast.LENGTH_SHORT).show() } override fun onCreate(savedInstanceState : Bundle?) { toast(“Hello, Toast!”) } Extension Functions

Slide 31

Slide 31 text

fun Activity.toast(text: String) = Toast.makeText(this, text, Toast.LENGTH_SHORT).show() override fun onCreate(savedInstanceState : Bundle?) { toast(“Hello, Toast!”) } Extension Functions

Slide 32

Slide 32 text

Some Extension Functions

Slide 33

Slide 33 text

toVisible

Slide 34

Slide 34 text

toVisible fun View.toVisible() { visibility = View.VISIBLE } textView.toVisible()

Slide 35

Slide 35 text

toVisible fun View.toVisible() { visibility = View.VISIBLE } textView.toVisible() textView.toGone() textView.isVisible() textView.isGone()

Slide 36

Slide 36 text

setFragment

Slide 37

Slide 37 text

setFragment fun FragmentActivity.setFragment(fragment: Fragment, containerId: Int) = supportFragmentManager .beginTransaction() .add(containerId, fragment) .commit()

Slide 38

Slide 38 text

setFragment fun FragmentActivity.setFragment(fragment: Fragment, containerId: Int) = supportFragmentManager .beginTransaction() .add(containerId, fragment) .commit() setFragment(MainFragment.newInstance(), android.R.id.content)

Slide 39

Slide 39 text

setFragment fun FragmentActivity.setFragment(fragment: Fragment, containerId: Int) = supportFragmentManager .beginTransaction() .add(containerId, fragment) .commit() setFragment(MainFragment.newInstance(), android.R.id.content)

Slide 40

Slide 40 text

setFragment fun FragmentActivity.setFragment(fragment: Fragment, containerId: Int = android.R.id.content) = supportFragmentManager .beginTransaction() .add(containerId, fragment) .commit() setFragment(MainFragment.newInstance(), android.R.id.content)

Slide 41

Slide 41 text

setFragment fun FragmentActivity.setFragment(fragment: Fragment, containerId: Int = android.R.id.content) = supportFragmentManager .beginTransaction() .add(containerId, fragment) .commit() setFragment(MainFragment.newInstance())

Slide 42

Slide 42 text

setFragment fun FragmentActivity.setFragment(fragment: Fragment, containerId: Int = android.R.id.content) = supportFragmentManager .beginTransaction() .add(containerId, fragment) .commit() setFragment(MainFragment.newInstance()) setFragment(MainFragment.newInstance(), R.id.my_content)

Slide 43

Slide 43 text

getString

Slide 44

Slide 44 text

getString(Java) getActivity().getResources().getString(resId)

Slide 45

Slide 45 text

getString fun Fragment.getString(@StringRes resId: Int) = getActivity().getResources().getString(resId)

Slide 46

Slide 46 text

getString fun Fragment.getString(@StringRes resId: Int) = activity.resources.getString(resId)

Slide 47

Slide 47 text

let

Slide 48

Slide 48 text

let public inline fun T.let(f: (T) -> R): R = f(this)

Slide 49

Slide 49 text

let someObject?.let { // `it` is non-null }

Slide 50

Slide 50 text

Compat

Slide 51

Slide 51 text

isAttachedToWindow

Slide 52

Slide 52 text

isAttachedToWindow fun View.isAttachedToWindowCompat () = if (Build.VERSION.SDK_INT < 19) { ViewCompat.isAttachedToWindow(this) } else { isAttachedToWindow() }

Slide 53

Slide 53 text

Cast

Slide 54

Slide 54 text

WindowManager

Slide 55

Slide 55 text

WindowManager(Java) WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE)

Slide 56

Slide 56 text

WindowManager fun Context.getWindowManager() = getSystemService(Context.WINDOW_SERVICE) as WindowManager

Slide 57

Slide 57 text

WindowManager fun Context.getWindowManager() = getSystemService(Context.WINDOW_SERVICE) as WindowManager

Slide 58

Slide 58 text

WindowManager fun Context.getWindowManager() = getSystemService(Context.WINDOW_SERVICE) as WindowManager val windowManager = getWindowManager() val display = windowManager.getDefaultDisplay() val width = display.width val height = display.height

Slide 59

Slide 59 text

Extension Properties

Slide 60

Slide 60 text

WindowManager fun Context.getWindowManager() = getSystemService(Context.WINDOW_SERVICE) as WindowManager val windowManager = getWindowManager() val display = windowManager.getDefaultDisplay() val width = display.width val height = display.height

Slide 61

Slide 61 text

WindowManager val Context.windowManager = get() = getSystemService(Context.WINDOW_SERVICE) as WindowManager val windowManager = getWindowManager() val display = windowManager.getDefaultDisplay() val width = display.width val height = display.height

Slide 62

Slide 62 text

WindowManager val Context.windowManager = get() = getSystemService(Context.WINDOW_SERVICE) as WindowManager val display = windowManager.getDefaultDisplay() val width = display.width val height = display.height

Slide 63

Slide 63 text

Extends Library

Slide 64

Slide 64 text

Glide Extension http://www.example.com/12345?width=300&height=300

Slide 65

Slide 65 text

Glide Extension http://www.example.com/12345?width=300&height=300

Slide 66

Slide 66 text

Glide Extension fun RequestManager.loadOptimize(url: String?, width: Int, height: Int): DrawableTypeRequest = load(url?.let { "$it?width=$width&height=$height" })

Slide 67

Slide 67 text

Glide Extension fun RequestManager.loadOptimize(url: String?, width: Int, height: Int): DrawableTypeRequest = load(url?.let { "$it?width=$width&height=$height" })

Slide 68

Slide 68 text

Glide Extension fun RequestManager.loadOptimize(url: String?, width: Int, height: Int): DrawableTypeRequest = load(url?.let { "$it?width=$width&height=$height" })

Slide 69

Slide 69 text

Glide Extension fun RequestManager.loadOptimize(url: String?, width: Int, height: Int): DrawableTypeRequest = load(url?.let { "$it?width=$width&height=$height" }) Glide.with(context) .loadOptimize(url, 300, 300) .into(imageView)

Slide 70

Slide 70 text

Listener

Slide 71

Slide 71 text

addOnPageChangeListener

Slide 72

Slide 72 text

ViewPager# OnPageChangeListener(Java) pager.addOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int position) { // no op } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { // no op } @Override public void onPageScrollStateChanged(int state) { onStateChange(state); } });

Slide 73

Slide 73 text

ViewPager# OnPageChangeListener(Java) pager.addOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int position) { // no op } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { // no op } @Override public void onPageScrollStateChanged(int state) { onStateChange(state); } });

Slide 74

Slide 74 text

ViewPager# OnPageChangeListener(Java) pager.addOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int position) { // no op } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { // no op } @Override public void onPageScrollStateChanged(int state) { onStateChange(state); } });

Slide 75

Slide 75 text

fun ViewPager.addOnPageChangeListener( onPageScrolled: (position: Int, positionOffset: Float, positionOffsetPixels: Int) -> Unit = { position, positionOffset, positionOffsetPixels -> }, onPageScrollStateChanged: (state: Int) -> Unit = {}, onPageSelected: (position: Int) -> Unit = {} ) = addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { onPageScrolled(position, positionOffset, positionOffsetPixels) } override fun onPageScrollStateChanged(state: Int) { onPageScrollStateChanged(state) } override fun onPageSelected(position: Int) { onPageSelected(position) } })

Slide 76

Slide 76 text

OnPageChangeListener(Java) pager.addOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int position) { // no op } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { // no op } @Override public void onPageScrollStateChanged(int state) { onStateChange(state); } });

Slide 77

Slide 77 text

Extends addOnPageChangeListener pager.addOnPageChangeListener(onPageScrollStateChanged = { onStateChange(state) })

Slide 78

Slide 78 text

Extends addOnPageChangeListener pager.addOnPageChangeListener(onPageScrollStateChanged = { onStateChange(state) })

Slide 79

Slide 79 text

Animator

Slide 80

Slide 80 text

Animator(Java) anim.addListener(new AnimatorListener() { ... @Override public void onAnimationEnd(Animator animation) { animDrawable.stop() } ... }); anim.setDuration(300) .start();

Slide 81

Slide 81 text

Animator fun Animator.addListener( onAnimationStart: (Animator) -> Unit = {}, onAnimationEnd: (Animator) -> Unit = {}, onAnimationCancel: (Animator) -> Unit = {}, onAnimationRepeat: (Animator) -> Unit = {}): Animator { addListener(object : Animator.AnimatorListener { override fun onAnimationStart(animation: Animator) { onAnimationStart(animation) } // ….. }) return this }

Slide 82

Slide 82 text

Animator fun Animator.addListener( onAnimationStart: (Animator) -> Unit = {}, onAnimationEnd: (Animator) -> Unit = {}, onAnimationCancel: (Animator) -> Unit = {}, onAnimationRepeat: (Animator) -> Unit = {}): Animator { addListener(object : Animator.AnimatorListener { override fun onAnimationStart(animation: Animator) { onAnimationStart(animation) } // ….. }) return this }

Slide 83

Slide 83 text

Animator fun Animator.addListener( onAnimationStart: (Animator) -> Unit = {}, onAnimationEnd: (Animator) -> Unit = {}, onAnimationCancel: (Animator) -> Unit = {}, onAnimationRepeat: (Animator) -> Unit = {}): Animator { addListener(object : Animator.AnimatorListener { override fun onAnimationStart(animation: Animator) { onAnimationStart(animation) } // ….. }) return this }

Slide 84

Slide 84 text

Animator anim .addListener(onAnimationEnd = { animDrawable.stop() }) .setDuration(300) .start();

Slide 85

Slide 85 text

Animator anim .addListener(onAnimationEnd = { animDrawable.stop() }) .setDuration(300) .start();

Slide 86

Slide 86 text

Thank you !!