├── .gitignore ├── README.md ├── build.gradle ├── chapter3 ├── .gitignore ├── build.gradle ├── fabric.properties ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── backstopmedia │ │ └── kotlin │ │ └── chapter3 │ │ ├── api │ │ ├── ApiDemoJava.java │ │ └── ApiDemoKotlin.kt │ │ ├── hello │ │ ├── HelloActivityJava.java │ │ └── HelloActivityKotlin.kt │ │ └── twitter │ │ ├── Kallback.kt │ │ └── TwitterExtensions.kt │ └── res │ ├── layout │ └── activity_hello.xml │ ├── mipmap-hdpi │ └── ic_launcher.png │ ├── mipmap-mdpi │ └── ic_launcher.png │ ├── mipmap-xhdpi │ └── ic_launcher.png │ ├── mipmap-xxhdpi │ └── ic_launcher.png │ ├── mipmap-xxxhdpi │ └── ic_launcher.png │ └── values │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml ├── chapter6 ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── main │ ├── AndroidManifest.xml │ └── res │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── backstopmedia │ └── kotlin │ └── chapter6 │ ├── collections │ ├── Arrays.kt │ ├── Lists.kt │ └── Maps.kt │ └── generics │ ├── Bounds.kt │ └── Generics.kt ├── chapter7 ├── build.gradle └── src │ └── test │ └── kotlin │ └── com │ └── backstopmedia │ └── kotlin │ └── chapter7 │ ├── decompose.kt │ ├── option.kt │ ├── patterns.kt │ ├── sequences.kt │ └── various.kt ├── chapter8 ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── backstopmedia │ │ │ └── kotlin │ │ │ └── chapter6 │ │ │ └── FindOperators.kt │ └── res │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── backstopmedia │ └── kotlin │ └── chapter6 │ └── ExampleUnitTest.java ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── proguard-com.twitter.sdk.android.twitter.txt ├── settings.gradle └── twitter-app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src └── main ├── AndroidManifest.xml ├── java └── com │ └── backstopmedia │ └── kotlin │ └── ktwitter │ ├── KotlinApplication.kt │ ├── api │ └── KTwitterApiClient.kt │ ├── entities │ └── Entities.kt │ ├── interactors │ ├── FollowersInteractor.kt │ ├── TopImagesInteractor.kt │ ├── TopUsersInteractor.kt │ └── UserInteractor.kt │ ├── presenters │ ├── FollowersPresenter.kt │ ├── NavigationDrawerPresenter.kt │ ├── Presenter.kt │ ├── TopImagesPresenter.kt │ └── TopUsersPresenter.kt │ ├── ui │ ├── NavigationHelper.kt │ ├── activities │ │ ├── FollowersActivity.kt │ │ ├── LoginActivity.kt │ │ ├── MainActivity.kt │ │ ├── TimelineActivity.kt │ │ ├── TopImagesActivity.kt │ │ └── TopUsersActivity.kt │ ├── adapter │ │ ├── FollowersAdapter.kt │ │ ├── FollowersWithHeadersAdapter.kt │ │ ├── TopImagesAdapter.kt │ │ └── TopUsersAdapter.kt │ └── view │ │ ├── FollowersView.kt │ │ ├── NavigationDrawerView.kt │ │ ├── TopImagesView.kt │ │ └── TopUsersView.kt │ └── utils │ ├── BaseSubscriber.kt │ ├── Kallback.kt │ ├── MyTwitter.kt │ ├── dsl │ └── TweetDsl.kt │ ├── functional │ └── _Collections.kt │ ├── glide │ └── CircleTransformation.java │ ├── os │ └── _Intents.kt │ └── twitter │ ├── _Tweets.kt │ └── _Users.kt └── res ├── drawable-hdpi ├── background.jpg ├── ic_collections_black_24dp.png ├── ic_collections_bookmark_black_24dp.png ├── ic_people_black_24dp.png ├── ic_plus.png ├── kotlin_logo.png └── retweet_light.png ├── drawable-mdpi └── ic_people_black_24dp.png ├── drawable-xhdpi └── ic_people_black_24dp.png ├── drawable-xxhdpi └── ic_people_black_24dp.png ├── drawable-xxxhdpi └── ic_people_black_24dp.png ├── layout ├── activity_coordinator_recycler.xml ├── activity_followers.xml ├── activity_login.xml ├── activity_timeline.xml ├── activity_top_images.xml ├── drawer_header.xml ├── grid_item_top_image.xml ├── list_item_follower.xml ├── list_item_header.xml ├── list_item_user.xml └── navigation_drawer_base.xml ├── menu └── navigation_view_items.xml ├── mipmap-hdpi └── ic_launcher.png ├── mipmap-mdpi └── ic_launcher.png ├── mipmap-xhdpi └── ic_launcher.png ├── mipmap-xxhdpi └── ic_launcher.png ├── mipmap-xxxhdpi └── ic_launcher.png └── values ├── colors.xml ├── dimens.xml ├── strings.xml ├── strings_accessibility.xml └── styles.xml /.gitignore: -------------------------------------------------------------------------------- 1 | # built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # files for the dex VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # generated files 12 | gen/ 13 | 14 | # Local configuration file (sdk path, etc) 15 | local.properties 16 | 17 | # Eclipse project files 18 | .classpath 19 | .project 20 | 21 | # Android Studio 22 | .idea 23 | .gradle 24 | /*/local.properties 25 | /*/out 26 | /*/build 27 | /*/*/build 28 | /*/*/production 29 | *.iml 30 | *.iws 31 | *.ipr 32 | *~ 33 | *.swp 34 | .DS_Store 35 | .keys 36 | 37 | build 38 | out.map 39 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # kotlin 2 | Kotlin Bleeding Edge Book Example 3 | 4 | Need to add a detailed description 5 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | ext.kotlin_version = '1.0.0-beta-1103' 5 | ext.anko_version = '0.7.2' 6 | repositories { 7 | jcenter() 8 | maven { url 'https://maven.fabric.io/public' } 9 | } 10 | dependencies { 11 | classpath 'com.android.tools.build:gradle:1.3.1' 12 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 13 | classpath 'io.fabric.tools:gradle:1.+' 14 | } 15 | } 16 | 17 | allprojects { 18 | repositories { 19 | jcenter() 20 | maven { url 'https://maven.fabric.io/public' } 21 | } 22 | } 23 | 24 | task clean(type: Delete) { 25 | delete rootProject.buildDir 26 | } 27 | -------------------------------------------------------------------------------- /chapter3/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /chapter3/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | 4 | buildscript { 5 | repositories { 6 | jcenter() 7 | } 8 | dependencies { 9 | classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version" 10 | } 11 | } 12 | 13 | android { 14 | compileSdkVersion 23 15 | buildToolsVersion "23.0.1" 16 | 17 | defaultConfig { 18 | applicationId "com.backstopmedia.kotlin.chapter1" 19 | minSdkVersion 16 20 | targetSdkVersion 23 21 | versionCode 1 22 | versionName "1.0" 23 | } 24 | buildTypes { 25 | release { 26 | minifyEnabled false 27 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 28 | } 29 | } 30 | } 31 | 32 | dependencies { 33 | compile fileTree(dir: 'libs', include: ['*.jar']) 34 | compile 'com.android.support:appcompat-v7:23.0.1' 35 | compile 'com.android.support:recyclerview-v7:23.0.1' 36 | compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" 37 | compile('com.twitter.sdk.android:twitter:1.8.0@aar') { 38 | transitive = true; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /chapter3/fabric.properties: -------------------------------------------------------------------------------- 1 | #Contains API Secret used to validate your application. Commit to internal source control; avoid making secret public. 2 | #Mon Oct 12 11:22:53 PDT 2015 3 | apiSecret=b811d7a69452a60ba82cfcef6ab416a5f10172a4f04c3958e57781966faf67b9 4 | -------------------------------------------------------------------------------- /chapter3/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/asarazan/Library/Android/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /chapter3/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 12 | 13 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /chapter3/src/main/java/com/backstopmedia/kotlin/chapter3/api/ApiDemoJava.java: -------------------------------------------------------------------------------- 1 | package com.backstopmedia.kotlin.chapter3.api; 2 | 3 | import android.util.Log; 4 | 5 | import com.twitter.sdk.android.Twitter; 6 | import com.twitter.sdk.android.core.AppSession; 7 | import com.twitter.sdk.android.core.Callback; 8 | import com.twitter.sdk.android.core.Result; 9 | import com.twitter.sdk.android.core.TwitterException; 10 | import com.twitter.sdk.android.core.models.Search; 11 | 12 | public class ApiDemoJava { 13 | 14 | public static void basicSearch() { 15 | Twitter.getInstance().core.logInGuest(new Callback() { 16 | @Override 17 | public void success(Result result) { 18 | Twitter.getApiClient().getSearchService().tweets("Kotlin", null, null, null, null, null, null, null, null, null, new Callback() { 19 | @Override 20 | public void success(Result result) { 21 | int tweetCount = result.data.tweets.size(); 22 | Log.i("ApiDemoKotlin", "Found " + tweetCount + " tweets."); 23 | } 24 | 25 | @Override 26 | public void failure(TwitterException e) { 27 | } 28 | }); 29 | } 30 | 31 | @Override 32 | public void failure(TwitterException e) { 33 | } 34 | }); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /chapter3/src/main/java/com/backstopmedia/kotlin/chapter3/api/ApiDemoKotlin.kt: -------------------------------------------------------------------------------- 1 | package com.backstopmedia.kotlin.chapter3.api 2 | 3 | import android.util.Log 4 | import com.backstopmedia.kotlin.chapter3.twitter.kallback 5 | import com.backstopmedia.kotlin.chapter3.twitter.tweets 6 | import com.twitter.sdk.android.Twitter 7 | 8 | object ApiDemoKotlin { 9 | 10 | fun basicSearch() { 11 | Twitter.getInstance().core.logInGuest(kallback { 12 | Twitter.getApiClient().searchService.tweets("Kotlin", callback = kallback { 13 | Log.i("ApiDemoKotlin", "Found ${it.data.tweets.size} tweets.") 14 | }) 15 | }) 16 | } 17 | } -------------------------------------------------------------------------------- /chapter3/src/main/java/com/backstopmedia/kotlin/chapter3/hello/HelloActivityJava.java: -------------------------------------------------------------------------------- 1 | package com.backstopmedia.kotlin.chapter3.hello; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.view.View; 6 | import android.widget.Button; 7 | import android.widget.EditText; 8 | 9 | import com.backstopmedia.kotlin.chapter3.R; 10 | 11 | import static android.view.View.OnClickListener; 12 | 13 | public class HelloActivityJava extends AppCompatActivity { 14 | 15 | @Override 16 | protected void onCreate(Bundle savedInstanceState) { 17 | super.onCreate(savedInstanceState); 18 | setContentView(R.layout.activity_hello); 19 | 20 | final EditText editText = (EditText) findViewById(R.id.editText); 21 | final Button button = (Button) findViewById(R.id.button); 22 | 23 | button.setOnClickListener(new OnClickListener() { 24 | @Override 25 | public void onClick(View v) { 26 | String name = editText.getText().toString(); 27 | button.setText("Hello " + name + "!"); 28 | } 29 | }); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /chapter3/src/main/java/com/backstopmedia/kotlin/chapter3/hello/HelloActivityKotlin.kt: -------------------------------------------------------------------------------- 1 | package com.backstopmedia.kotlin.chapter3.hello 2 | 3 | import android.os.Bundle 4 | import android.support.v7.app.AppCompatActivity 5 | import com.backstopmedia.kotlin.chapter3.R 6 | import kotlinx.android.synthetic.activity_hello.button 7 | import kotlinx.android.synthetic.activity_hello.editText 8 | 9 | class HelloActivityKotlin : AppCompatActivity() { 10 | 11 | override fun onCreate(savedInstanceState: Bundle?) { 12 | super.onCreate(savedInstanceState) 13 | setContentView(R.layout.activity_hello) 14 | button.setOnClickListener { 15 | val name = editText.text.toString() 16 | button.text = "Hello $name!" 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /chapter3/src/main/java/com/backstopmedia/kotlin/chapter3/twitter/Kallback.kt: -------------------------------------------------------------------------------- 1 | package com.backstopmedia.kotlin.chapter3.twitter 2 | 3 | import android.util.Log 4 | import com.twitter.sdk.android.core.Callback 5 | import com.twitter.sdk.android.core.Result 6 | import com.twitter.sdk.android.core.TwitterException 7 | 8 | /** 9 | * A convenience method for generating callbacks. 10 | * 11 | * @param onSuccess block to call on successful return 12 | * @return A [Callback] object with basic error logging. 13 | */ 14 | fun kallback(onSuccess: (Result) -> Unit = {}): Kallback { 15 | return Kallback(onSuccess).onFail { 16 | Log.w("kallback", "Something went wrong: $it") 17 | } 18 | } 19 | 20 | /** 21 | * A streamlined subclass of [Callback] with optional failure behavior. 22 | * 23 | * @param T the response type, passed up to [Callback] 24 | * @param onSuccess block to call on successful return 25 | * @see onFail for optional fail block. 26 | */ 27 | open class Kallback(private val onSuccess: (Result) -> Unit) : Callback() { 28 | 29 | private var onFail: ((TwitterException) -> Unit)? = null 30 | 31 | /** 32 | * Sets failure behavior. Can be chained from [kallback] or constructor. 33 | * 34 | * @param onFail block to run on failed request. 35 | */ 36 | fun onFail(onFail: (TwitterException) -> Unit): Kallback { 37 | this.onFail = onFail 38 | return this 39 | } 40 | 41 | override fun success(result: Result) { 42 | onSuccess.invoke(result) 43 | } 44 | 45 | override fun failure(exception: TwitterException) { 46 | onFail?.invoke(exception) 47 | } 48 | } -------------------------------------------------------------------------------- /chapter3/src/main/java/com/backstopmedia/kotlin/chapter3/twitter/TwitterExtensions.kt: -------------------------------------------------------------------------------- 1 | package com.backstopmedia.kotlin.chapter3.twitter 2 | 3 | import com.twitter.sdk.android.core.Callback 4 | import com.twitter.sdk.android.core.models.Search 5 | import com.twitter.sdk.android.core.services.SearchService 6 | import com.twitter.sdk.android.core.services.params.Geocode 7 | 8 | /** 9 | * Extension function for tweets method on [SearchService] 10 | * 11 | * Provides default values for all params except [callback] 12 | */ 13 | fun SearchService.tweets(query: String? = null, 14 | geocode: Geocode? = null, 15 | lang: String? = null, 16 | locale: String? = null, 17 | resultType: String? = null, 18 | count: Int? = null, 19 | until: String? = null, 20 | sinceId: Long? = null, 21 | maxId: Long? = null, 22 | includeEntities: Boolean? = null, 23 | callback: Callback) 24 | { 25 | return tweets(query, geocode, lang, locale, resultType, count, until, sinceId, maxId, includeEntities, callback) 26 | } 27 | -------------------------------------------------------------------------------- /chapter3/src/main/res/layout/activity_hello.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 15 | 16 | 23 | 24 |