├── .gitignore ├── .idea ├── .name ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── encodings.xml ├── gradle.xml ├── misc.xml ├── modules.xml └── runConfigurations.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── devis │ │ └── chatrobot │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── devis │ │ │ └── chatrobot │ │ │ ├── MainActivity.kt │ │ │ ├── ViewHolder │ │ │ ├── BaseViewHolder.kt │ │ │ ├── LeftViewHolder.kt │ │ │ └── RightViewHolder.kt │ │ │ ├── WebViewActivity.kt │ │ │ ├── adapter │ │ │ └── MyRecyclerViewAdapter.kt │ │ │ └── model │ │ │ └── Msg.kt │ └── res │ │ ├── drawable-v21 │ │ ├── ic_menu_camera.xml │ │ ├── ic_menu_gallery.xml │ │ ├── ic_menu_manage.xml │ │ ├── ic_menu_send.xml │ │ ├── ic_menu_share.xml │ │ └── ic_menu_slideshow.xml │ │ ├── drawable-xxhdpi │ │ ├── chat_arrow_left.9.png │ │ ├── chat_arrow_right.9.png │ │ ├── chat_receive_bg_normal.9.png │ │ ├── chat_receive_bg_pressed.9.png │ │ ├── chat_send_bg_normal.9.png │ │ └── chat_send_bg_pressed.9.png │ │ ├── drawable │ │ ├── chat_receive_bg.xml │ │ ├── chat_send_bg.xml │ │ ├── side_nav_bar.xml │ │ └── transparent_bg_selector.xml │ │ ├── layout │ │ ├── activity_main.xml │ │ ├── activity_web_view.xml │ │ ├── app_bar_main.xml │ │ ├── left_text_chat_item.xml │ │ ├── nav_header_main.xml │ │ └── right_text_chat_item.xml │ │ ├── menu │ │ ├── activity_main_drawer.xml │ │ └── main.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_send64.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values-v21 │ │ └── styles.xml │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── drawables.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── devis │ └── chatrobot │ └── ExampleUnitTest.java ├── build.gradle ├── chatrobot.jks ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── screen_shoot.png └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | ChatRobot -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 23 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 19 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 46 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### 用Kotlin语言写的一个聊天机器人的Demo 2 | 3 | - APK安装包下载试用 [http://fir.im/ChatRobot ](http://fir.im/ChatRobot) 4 | 5 | ##### 注意事项: 6 | ######本项目是用Android Studio开发,使用前请确保Android Studio安装Kotlin的插件,如下 7 | 8 | Android Studio -> Preferences -> Plugins -> Browse Repositories : 搜索关键字“kotlin” 9 | 安装搜索到的 Kotlin 和 Kotlin Extensions For Android(obsolete),然后重启Android Studio即可。 10 | 11 | 12 | ##### 界面截图: 13 | 14 | 15 | 16 | 17 | 18 | ##### 参考资料: 19 | 20 | [JetBrains/kotlin](https://github.com/JetBrains/kotlin) 21 | 22 | [Kotlin/anko](https://github.com/Kotlin/anko) 23 | 24 | [《Kotlin for android developers》中文版翻译](https://wangjiegulu.gitbooks.io/kotlin-for-android-developers-zh/content/index.html) 25 | 26 | 本项目仅用于学习Kotlin入门, 代码比较简单直接,主要是熟悉一下用Kotlin开发的一些常用代码的使用,不定期更新。希望请Star一下 ^ ^。 27 | 28 | 聊天机器人用的是[图灵机器人API接口](http://www.tuling123.com/) -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | 4 | android { 5 | compileSdkVersion 23 6 | buildToolsVersion "23.0.2" 7 | 8 | defaultConfig { 9 | applicationId "com.devis.chatrobot" 10 | minSdkVersion 15 11 | targetSdkVersion 22 12 | versionCode 2 13 | versionName "1.1" 14 | } 15 | buildTypes { 16 | release { 17 | minifyEnabled false 18 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 19 | } 20 | } 21 | sourceSets { 22 | main.java.srcDirs += 'src/main/kotlin' 23 | } 24 | } 25 | 26 | dependencies { 27 | compile fileTree(dir: 'libs', include: ['*.jar']) 28 | testCompile 'junit:junit:4.12' 29 | compile "com.android.support:appcompat-v7:$support_version" 30 | compile "com.android.support:design:$support_version" 31 | compile "com.android.support:recyclerview-v7:$support_version" 32 | compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" 33 | 34 | compile "org.jetbrains.anko:anko-sdk23:$anko_version" //sdk15, sdk19, sdk21, sdk23 are also available 35 | compile "org.jetbrains.anko:anko-support-v4:$anko_version" // In case you need support.v4 bindings 36 | compile "org.jetbrains.anko:anko-appcompat-v7:$anko_version" // For appcompat-v7 bindings 37 | 38 | } 39 | buildscript { 40 | ext.kotlin_version = '1.0.0' 41 | ext.support_version = '23.2.0' 42 | ext.anko_version = '0.8.2' 43 | repositories { 44 | mavenCentral() 45 | } 46 | dependencies { 47 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 48 | } 49 | } 50 | repositories { 51 | mavenCentral() 52 | } 53 | -------------------------------------------------------------------------------- /app/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/Devis/AndroidSDK/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 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/devis/chatrobot/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.devis.chatrobot; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 14 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/devis/chatrobot/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.devis.chatrobot 2 | 3 | import android.os.Bundle 4 | import android.support.design.widget.NavigationView 5 | import android.support.v4.view.GravityCompat 6 | import android.support.v4.widget.DrawerLayout 7 | import android.support.v7.app.ActionBarDrawerToggle 8 | import android.support.v7.app.AppCompatActivity 9 | import android.support.v7.widget.LinearLayoutManager 10 | import android.support.v7.widget.RecyclerView 11 | import android.support.v7.widget.Toolbar 12 | import android.telephony.TelephonyManager 13 | import android.text.TextUtils 14 | import android.util.Log 15 | import android.view.Menu 16 | import android.view.MenuItem 17 | import android.widget.EditText 18 | import android.widget.LinearLayout 19 | import android.widget.Toast 20 | import com.devis.chatrobot.adapter.MyRecyclerViewAdapter 21 | import org.jetbrains.anko.* 22 | import org.json.JSONObject 23 | import java.net.URL 24 | import java.net.URLEncoder 25 | import java.util.* 26 | 27 | class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener { 28 | 29 | //初始化控件,用lazy方式滞后,在第一次调用该成员时进行线程安全的初始化操作 30 | private val recyclerView: RecyclerView by lazy { findViewById(R.id.recyclerview) as RecyclerView } 31 | private val sendButton: LinearLayout by lazy { findViewById(R.id.input_text_send_layout) as LinearLayout } 32 | private val inputEditText: EditText by lazy { findViewById(R.id.input_text_send_edittext) as EditText } 33 | 34 | //图灵机器人API 获取KEY请访问 : http://www.tuling123.com/ 35 | private val BASE_URL: String = "http://www.tuling123.com/openapi/api" 36 | private val API_KEY: String = "4f3664efdfacd7f7968f72d2dd594113" //请使用自己申请的图灵机器人的KEY哦 37 | private var USER_ID: String = "default" //用户唯一ID 38 | 39 | private var messages = ArrayList() 40 | 41 | private var adapter: MyRecyclerViewAdapter? = null 42 | 43 | override fun onCreate(savedInstanceState: Bundle?) { 44 | super.onCreate(savedInstanceState) 45 | setContentView(R.layout.activity_main) 46 | 47 | initData() 48 | initView() 49 | } 50 | 51 | fun initData() { 52 | //获取用户唯一ID 53 | val TelephonyMgr: TelephonyManager = getSystemService(TELEPHONY_SERVICE) as TelephonyManager; 54 | USER_ID = TelephonyMgr.getDeviceId(); 55 | Log.e(javaClass.simpleName, "USER_ID = $USER_ID") 56 | } 57 | 58 | fun initView() { 59 | val toolbar = findViewById(R.id.toolbar) as Toolbar 60 | setSupportActionBar(toolbar) 61 | 62 | //侧滑菜单,目前没用到,后面再弄 63 | val drawer = findViewById(R.id.drawer_layout) as DrawerLayout 64 | val toggle = ActionBarDrawerToggle( 65 | this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) 66 | drawer.setDrawerListener(toggle) 67 | toggle.syncState() 68 | 69 | val navigationView = findViewById(R.id.nav_view) as NavigationView 70 | navigationView.setNavigationItemSelectedListener(this) 71 | 72 | //发送按钮 73 | sendButton.onClick { 74 | sendMessage(inputEditText.text.toString()) 75 | } 76 | 77 | //欢迎语 78 | var message: Msg = Msg("嗨!你好,我是小花猫,很高兴认识你~", "", 0, false) 79 | messages.add(message) 80 | 81 | //聊天内容列表 82 | adapter = MyRecyclerViewAdapter(this, messages) 83 | recyclerView.layoutManager = LinearLayoutManager(this) 84 | recyclerView.adapter = adapter 85 | 86 | } 87 | 88 | /** 89 | * 发送消息请求 90 | */ 91 | fun sendMessage(content: String) { 92 | if (TextUtils.isEmpty(content)) { 93 | toast("请输入您要说的话") 94 | return; 95 | } 96 | var message: Msg = Msg(content, "", 0, true) 97 | messages.add(message) 98 | adapter!!.refreshAdapter(messages) 99 | recyclerView.scrollToPosition(messages.size - 1) 100 | 101 | //开始请求API 102 | async() { 103 | //拼接请求 104 | val url: String = "$BASE_URL?key=$API_KEY&info=${URLEncoder.encode(content)}&userid=$USER_ID" 105 | //发送请求,获取返回的字符串 106 | val data = URL(url).readText() 107 | Log.e(javaClass.simpleName, "url = $url") 108 | Log.e(javaClass.simpleName, "data = $data") 109 | 110 | //JSON解析 111 | var jsonObject: JSONObject = JSONObject(data) 112 | var text: String = jsonObject.optString("text") 113 | Log.e(javaClass.simpleName, "text = $text") 114 | var imgUrl: String = jsonObject.optString("url") 115 | Log.e(javaClass.simpleName, "imgUrl = $imgUrl") 116 | //加入新消息 117 | var message: Msg = Msg(text, imgUrl, 0, false) 118 | messages.add(message) 119 | //返回主线程更新UI 120 | uiThread { 121 | adapter!!.refreshAdapter(messages) 122 | recyclerView.scrollToPosition(messages.size - 1) 123 | inputEditText.setText("") 124 | } 125 | } 126 | } 127 | 128 | 129 | override fun onBackPressed() { 130 | val drawer = findViewById(R.id.drawer_layout) as DrawerLayout 131 | if (drawer.isDrawerOpen(GravityCompat.START)) { 132 | drawer.closeDrawer(GravityCompat.START) 133 | } else { 134 | 135 | super.onBackPressed() 136 | } 137 | } 138 | 139 | override fun onCreateOptionsMenu(menu: Menu): Boolean { 140 | // Inflate the menu; this adds items to the action bar if it is present. 141 | menuInflater.inflate(R.menu.main, menu) 142 | return true 143 | } 144 | 145 | override fun onOptionsItemSelected(item: MenuItem): Boolean { 146 | // Handle action bar item clicks here. The action bar will 147 | // automatically handle clicks on the Home/Up button, so long 148 | // as you specify a parent activity in AndroidManifest.xml. 149 | val id = item.itemId 150 | 151 | //noinspection SimplifiableIfStatement 152 | if (id == R.id.action_settings) { 153 | return true 154 | } 155 | 156 | return super.onOptionsItemSelected(item) 157 | } 158 | 159 | @SuppressWarnings("StatementWithEmptyBody") 160 | override fun onNavigationItemSelected(item: MenuItem): Boolean { 161 | // Handle navigation view item clicks here. 162 | val id = item.itemId 163 | 164 | if (id == R.id.nav_camera) { 165 | // Handle the camera action 166 | } else if (id == R.id.nav_gallery) { 167 | 168 | } else if (id == R.id.nav_slideshow) { 169 | 170 | } else if (id == R.id.nav_manage) { 171 | 172 | } else if (id == R.id.nav_share) { 173 | 174 | } else if (id == R.id.nav_send) { 175 | 176 | } 177 | 178 | val drawer = findViewById(R.id.drawer_layout) as DrawerLayout 179 | drawer.closeDrawer(GravityCompat.START) 180 | return true 181 | } 182 | } 183 | -------------------------------------------------------------------------------- /app/src/main/java/com/devis/chatrobot/ViewHolder/BaseViewHolder.kt: -------------------------------------------------------------------------------- 1 | package com.devis.chatrobot.ViewHolder 2 | 3 | import android.support.v7.widget.RecyclerView 4 | import android.view.View 5 | import android.widget.TextView 6 | import com.devis.chatrobot.Msg 7 | 8 | /** 9 | * Created by Devis on 16/2/25. 10 | */ 11 | abstract class BaseViewHolder(val view: View) : RecyclerView.ViewHolder(view) { 12 | 13 | abstract fun bindData(msg: Msg) 14 | 15 | } -------------------------------------------------------------------------------- /app/src/main/java/com/devis/chatrobot/ViewHolder/LeftViewHolder.kt: -------------------------------------------------------------------------------- 1 | package com.devis.chatrobot.ViewHolder 2 | 3 | import android.content.Context 4 | import android.content.Intent 5 | import android.graphics.Color 6 | import android.text.TextUtils 7 | import android.view.View 8 | import android.widget.TextView 9 | import com.devis.chatrobot.MainActivity 10 | import com.devis.chatrobot.Msg 11 | import com.devis.chatrobot.R 12 | import com.devis.chatrobot.WebViewActivity 13 | import org.jetbrains.anko.onClick 14 | import org.jetbrains.anko.textColor 15 | 16 | /** 17 | * Created by Devis on 16/2/25. 18 | */ 19 | class LeftViewHolder(val myContext: Context, val myView: View) : BaseViewHolder(myView) { 20 | var content: TextView = itemView.findViewById(R.id.content) as TextView 21 | 22 | override fun bindData(message: Msg) { 23 | content.text = message.text 24 | if (!TextUtils.isEmpty(message.url)) { 25 | content.text = message.text + "【点此查看链接内容】" 26 | content.textColor = Color.BLUE 27 | content.onClick { 28 | //跳转至系统浏览器查看url内容 29 | val intent = Intent(myContext, WebViewActivity::class.java) 30 | intent.putExtra("url", message.url) 31 | intent.putExtra("title", message.text) 32 | myContext.startActivity(intent) 33 | } 34 | } else { 35 | content.onClick {} 36 | content.textColor = Color.BLACK 37 | } 38 | } 39 | 40 | } -------------------------------------------------------------------------------- /app/src/main/java/com/devis/chatrobot/ViewHolder/RightViewHolder.kt: -------------------------------------------------------------------------------- 1 | package com.devis.chatrobot.ViewHolder 2 | 3 | import android.support.v7.widget.RecyclerView 4 | import android.view.View 5 | import android.widget.TextView 6 | import com.devis.chatrobot.Msg 7 | import com.devis.chatrobot.R 8 | 9 | /** 10 | * Created by Devis on 16/2/25. 11 | */ 12 | class RightViewHolder(val myView: View) : BaseViewHolder(myView) { 13 | var content: TextView = itemView.findViewById(R.id.content) as TextView 14 | 15 | override fun bindData(message: Msg) { 16 | content.text = message.text 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /app/src/main/java/com/devis/chatrobot/WebViewActivity.kt: -------------------------------------------------------------------------------- 1 | package com.devis.chatrobot 2 | 3 | import android.os.Bundle 4 | import android.support.design.widget.FloatingActionButton 5 | import android.support.design.widget.Snackbar 6 | import android.support.v7.app.AppCompatActivity 7 | import android.support.v7.widget.Toolbar 8 | import android.view.MenuItem 9 | import android.view.View 10 | import android.webkit.WebChromeClient 11 | import android.webkit.WebSettings 12 | import android.webkit.WebView 13 | import android.webkit.WebViewClient 14 | import org.jetbrains.anko.onClick 15 | 16 | class WebViewActivity : AppCompatActivity() { 17 | 18 | val webView: WebView by lazy { findViewById(R.id.webview) as WebView } 19 | 20 | var url: String = "" 21 | var title: String = "" 22 | 23 | override fun onCreate(savedInstanceState: Bundle?) { 24 | super.onCreate(savedInstanceState) 25 | setContentView(R.layout.activity_web_view) 26 | 27 | url = intent.getStringExtra("url") 28 | title = intent.getStringExtra("title") 29 | 30 | val toolbar = findViewById(R.id.toolbar) as Toolbar 31 | toolbar.title = title 32 | setSupportActionBar(toolbar) 33 | 34 | val webSettings = webView.settings 35 | 36 | webSettings.javaScriptEnabled = true 37 | webSettings.useWideViewPort = true 38 | webSettings.loadWithOverviewMode = true 39 | webSettings.domStorageEnabled = true 40 | webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH) 41 | webSettings.cacheMode = WebSettings.LOAD_DEFAULT 42 | webSettings.databaseEnabled = true 43 | webSettings.setSupportZoom(false) 44 | val cacheDirPath = filesDir.absolutePath + "/webview_data" 45 | webSettings.databasePath = cacheDirPath 46 | webSettings.setAppCachePath(cacheDirPath) 47 | webSettings.setAppCacheEnabled(true) 48 | 49 | webView.loadUrl(url) 50 | webView.setWebChromeClient(object : WebChromeClient() { 51 | override fun onProgressChanged(view: WebView, newProgress: Int) { 52 | super.onProgressChanged(view, newProgress) 53 | } 54 | }) 55 | webView.setWebViewClient(object : WebViewClient() { 56 | override fun onPageFinished(view: WebView, url: String) { 57 | super.onPageFinished(view, url) 58 | } 59 | 60 | override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean { 61 | webView.loadUrl(url) 62 | return true 63 | } 64 | }) 65 | } 66 | 67 | override fun onBackPressed() { 68 | if (webView.canGoBack()) { 69 | webView.goBack() 70 | } else { 71 | finish() 72 | } 73 | } 74 | 75 | 76 | override fun onResume() { 77 | webView.onResume() 78 | super.onResume() 79 | } 80 | 81 | override fun onPause() { 82 | webView.onPause() 83 | super.onPause() 84 | } 85 | 86 | override fun onDestroy() { 87 | webView.destroy() 88 | super.onDestroy() 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /app/src/main/java/com/devis/chatrobot/adapter/MyRecyclerViewAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.devis.chatrobot.adapter 2 | 3 | import android.content.Context 4 | import android.support.v7.widget.RecyclerView 5 | import android.view.LayoutInflater 6 | import android.view.View 7 | import android.view.ViewGroup 8 | import com.devis.chatrobot.Msg 9 | import com.devis.chatrobot.R 10 | import com.devis.chatrobot.ViewHolder.BaseViewHolder 11 | import com.devis.chatrobot.ViewHolder.LeftViewHolder 12 | import com.devis.chatrobot.ViewHolder.RightViewHolder 13 | 14 | /** 15 | * Created by Devis on 16/2/25. 16 | */ 17 | class MyRecyclerViewAdapter(var context: Context, var items: List) : 18 | RecyclerView.Adapter() { 19 | 20 | val LEFT: Int = 1 //接收到的消息 21 | val RIGHT: Int = 2 //自己发的消息 22 | 23 | fun refreshAdapter(data: List){ 24 | this.items = data 25 | this.notifyDataSetChanged() 26 | } 27 | 28 | override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) { 29 | (holder as BaseViewHolder).bindData(items.get(position)) 30 | } 31 | 32 | override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): RecyclerView.ViewHolder? { 33 | when (viewType) { 34 | LEFT -> return LeftViewHolder(context, LayoutInflater.from(context).inflate(R.layout.left_text_chat_item, null)) 35 | RIGHT -> return RightViewHolder(LayoutInflater.from(context).inflate(R.layout.right_text_chat_item, null)) 36 | } 37 | return return RightViewHolder(View(context)) 38 | } 39 | 40 | override fun getItemCount(): Int { 41 | return if (items == null) 0 else items.count() 42 | } 43 | 44 | //判断消息是自己发出的 还是接收到的,以此来显示不同布局 45 | override fun getItemViewType(position: Int): Int { 46 | return if (items.get(position).isMe) RIGHT else LEFT 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/java/com/devis/chatrobot/model/Msg.kt: -------------------------------------------------------------------------------- 1 | package com.devis.chatrobot 2 | 3 | /** 4 | * Created by Devis on 16/2/25. 5 | * 消息实体类 6 | * text 文本内容 7 | * code 状态码 8 | * isMe 是不是我自己发的消息 9 | */ 10 | 11 | class Msg(){ 12 | 13 | var text: String = "" //文本内容 14 | var url: String = "" //图片路径 15 | var code: Int = 0 //状态码 16 | var isMe: Boolean = false //是不是我自己发的消息 17 | 18 | constructor(text:String, url:String, code:Int, isMe:Boolean):this(){ 19 | this.text = text 20 | this.url = url 21 | this.code = code 22 | this.isMe = isMe 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_camera.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_gallery.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_manage.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_send.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_share.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_slideshow.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/chat_arrow_left.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColorfulCat/ChatRobot/e17d13776da925b4eb908d74aaeb6086cb0b3c0e/app/src/main/res/drawable-xxhdpi/chat_arrow_left.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/chat_arrow_right.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColorfulCat/ChatRobot/e17d13776da925b4eb908d74aaeb6086cb0b3c0e/app/src/main/res/drawable-xxhdpi/chat_arrow_right.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/chat_receive_bg_normal.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColorfulCat/ChatRobot/e17d13776da925b4eb908d74aaeb6086cb0b3c0e/app/src/main/res/drawable-xxhdpi/chat_receive_bg_normal.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/chat_receive_bg_pressed.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColorfulCat/ChatRobot/e17d13776da925b4eb908d74aaeb6086cb0b3c0e/app/src/main/res/drawable-xxhdpi/chat_receive_bg_pressed.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/chat_send_bg_normal.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColorfulCat/ChatRobot/e17d13776da925b4eb908d74aaeb6086cb0b3c0e/app/src/main/res/drawable-xxhdpi/chat_send_bg_normal.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/chat_send_bg_pressed.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColorfulCat/ChatRobot/e17d13776da925b4eb908d74aaeb6086cb0b3c0e/app/src/main/res/drawable-xxhdpi/chat_send_bg_pressed.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/chat_receive_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/chat_send_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/side_nav_bar.xml: -------------------------------------------------------------------------------- 1 | 3 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/transparent_bg_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 15 | 16 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_web_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 14 | 15 | 21 | 22 | 23 | 24 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /app/src/main/res/layout/app_bar_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 14 | 15 | 21 | 22 | 23 | 24 | 35 | 36 | 48 | 49 | 58 | 59 | 68 | 69 | 74 | 75 | 76 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /app/src/main/res/layout/left_text_chat_item.xml: -------------------------------------------------------------------------------- 1 | 9 | 10 | 17 | 18 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/res/layout/nav_header_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 20 | 21 | 27 | 28 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/layout/right_text_chat_item.xml: -------------------------------------------------------------------------------- 1 | 9 | 10 | 11 | 18 | 19 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/res/menu/activity_main_drawer.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 13 | 17 | 21 | 22 | 23 | 24 | 25 | 29 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /app/src/main/res/menu/main.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColorfulCat/ChatRobot/e17d13776da925b4eb908d74aaeb6086cb0b3c0e/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColorfulCat/ChatRobot/e17d13776da925b4eb908d74aaeb6086cb0b3c0e/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColorfulCat/ChatRobot/e17d13776da925b4eb908d74aaeb6086cb0b3c0e/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColorfulCat/ChatRobot/e17d13776da925b4eb908d74aaeb6086cb0b3c0e/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_send64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColorfulCat/ChatRobot/e17d13776da925b4eb908d74aaeb6086cb0b3c0e/app/src/main/res/mipmap-xxhdpi/ic_send64.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColorfulCat/ChatRobot/e17d13776da925b4eb908d74aaeb6086cb0b3c0e/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/values-v21/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 64dp 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | #00000000 8 | #11000000 9 | #ffffffff 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 160dp 5 | 6 | 16dp 7 | 16dp 8 | 16dp 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/values/drawables.xml: -------------------------------------------------------------------------------- 1 | 2 | @android:drawable/ic_menu_camera 3 | @android:drawable/ic_menu_gallery 4 | @android:drawable/ic_menu_slideshow 5 | @android:drawable/ic_menu_manage 6 | @android:drawable/ic_menu_share 7 | @android:drawable/ic_menu_send 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 小花猫 3 | 4 | Open navigation drawer 5 | Close navigation drawer 6 | 7 | Settings 8 | WebViewActivity 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 15 | 16 |