Aplikasi Pesan Singkat Sederhana Menggunakan Rainbow SDK – Inisialisasi Komponen Rainbow API
Halo,
Apa kabar kawan-kawan developer? Semoga semua dalam keadaan baik ya!
💻 Mulai Belajar Pemrograman
Belajar pemrograman di Dicoding Academy dan mulai perjalanan Anda sebagai developer profesional.
Daftar SekarangBeberapa waktu yang lalu kita sempat membuat tutorial Menampilkan List Kontak Rainbow pada Android Apps. Kini kita akan membuat sebuah aplikasi pesan singkat sederhana dengan kontak yang kita miliki dengan menggunakan Rainbow SDK. Nantinya aplikasi yang akan kita buat akan jadi seperti di bawah ini:
Pembuatan Project
Dalam project kali ini kita akan menulis kode dengan menggunakan bahasa pemrograman Kotlin. Pertama buat project baru di Android Studio lalu buka berkas (file) build.gradle (Project) dan tambahkan beberapa baris kode sehingga menjadi seperti berikut:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
buildscript { ext { kotlin_version = '1.3.50' rainbow_version = '1.64.0' androidXVersion = '1.0.0' androidXTestVersion = '1.1.0' androidXAnnotations = '1.0.1' androidXLegacySupport = '1.0.0' materialVersion = '1.0.0' cardVersion = '1.0.0' recyclerViewVersion = '1.1.0' appCompatVersion = '1.0.2' constraintLayoutVersion = "1.1.3" archLifecycleVersion = '2.1.0' archVersion = '1.1.1' glideVersion = '4.9.0' } repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.5.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { google() jcenter() maven { url "http://maven.openrainbow.io" } } } task clean(type: Delete) { delete rootProject.buildDir } |
Kemudian ubah baris kode pada berkas build.gradle (App) menjadi seperti berikut:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' android { compileSdkVersion 29 buildToolsVersion "29.0.2" defaultConfig { applicationId "com.dicoding.rainbowapi" minSdkVersion 21 targetSdkVersion 29 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility 1.8 targetCompatibility 1.8 } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.core:core-ktx:1.1.0' // Rainbow API SDK implementation "com.ale:rainbowsdk:$rainbow_version" // Rounded Image implementation 'de.hdodenhof:circleimageview:3.0.1' // Dependencies for Android Support implementation "androidx.appcompat:appcompat:$appCompatVersion" implementation "androidx.cardview:cardview:$cardVersion" implementation "com.google.android.material:material:$materialVersion" implementation "androidx.recyclerview:recyclerview:$recyclerViewVersion" implementation "androidx.constraintlayout:constraintlayout:$constraintLayoutVersion" implementation "androidx.annotation:annotation:$androidXAnnotations" implementation "androidx.legacy:legacy-support-v4:$androidXLegacySupport" implementation "androidx.lifecycle:lifecycle-extensions:$archLifecycleVersion" implementation 'androidx.constraintlayout:constraintlayout:1.1.3' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' } |
Jika semua sudah disesuaikan dengan project kamu, sinkronkan project dengan menekan tombol Sync Now di pojok kanan atas. Yey kita telah berhasil melakukan import library yang kita butuhkan! Setelah selesai buatlah kelas baru dengan nama App yang akan digunakan untuk inisialisasi Rainbow seperti berikut:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class App : Application() { override fun onCreate() { super.onCreate() RainbowSdk .instance() .initialize( this, "ad0e6660223311eab5828dd44f5e3313", "DsAWuRlXjGXcRLdudjpymiNSI8EkLrUqs7F2S33pysHet1C3kgBMaXBd6osyYXzu" ) } } |
Jangan lupa mendaftarkan kelas tersebut dan menambahkan beberapa permission ke dalam berkas (file) AndroidManifest.xml sehingga berkas menjadi seperti berikut :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.dicoding.rainbowapi"> <uses-permission android:name="android.permission.READ_PROFILE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <application android:name=".app.App" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".ui.chatroom.ChatRoomActivity"></activity> <activity android:name=".ui.listroom.ContactListActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> |
Untuk struktur kelas dan package dari project kali ini akan menjadi seperti berikut :
Komponen Rainbow SDK
Pertama kita akan membuat beberapa kelas yang berguna untuk berinteraksi dengan library Rainbow SDK. Kelas yang pertama kita buat adalah RainbowConnectionListener. Kode pada kelas RainbowConnectionListener akan seperti berikut:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
class RainbowConnectionListener { abstract class Contact : IRainbowContact.IContactListener { override fun onCompanyChanged(p0: String?) { // TODO: will added some magic letter } override fun onPresenceChanged(p0: IRainbowContact?, p1: RainbowPresence?) { Handler(Looper.getMainLooper()) .post { contactUpdated() } } override fun onActionInProgress(p0: Boolean) { // TODO: will added some magic letter } override fun contactUpdated(p0: IRainbowContact?) { Handler(Looper.getMainLooper()) .post { contactUpdated() } } abstract fun contactUpdated() } interface Connection { fun onConnectionSuccess() fun onConnectionFailed(error: String) } interface Login { fun onSignInSuccess() fun onSignInFailed(error: String) } } |
Pada kelas RainbowConnectionListener di atas terdapat beberapa interfaces yang akan digunakan sebagai Callback Listener dari kelas berikutnya yaitu RainbowConnection. Isi dari kelas RainbowConnection adalah seperti berikut :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
object RainbowConnection { val rainbowContacts: List<IRainbowContact> get() = RainbowSdk.instance().contacts().rainbowContacts.copyOfDataList fun startConnection(connection: RainbowConnectionListener.Connection) { RainbowSdk.instance().connection().start(object : StartResponseListener() { override fun onStartSucceeded() { Handler(Looper.getMainLooper()) .post(connection::onConnectionSuccess) } override fun onRequestFailed(errorCode: RainbowSdk.ErrorCode, s: String) { Handler(Looper.getMainLooper()) .post { connection.onConnectionFailed(s) } } }) } fun startSignIn(email: String, password: String, login: RainbowConnectionListener.Login) { RainbowSdk.instance().connection() .signin(email, password, "sandbox.openrainbow.com", object : SigninResponseListener() { override fun onSigninSucceeded() { Handler(Looper.getMainLooper()) .post(login::onSignInSuccess) } override fun onRequestFailed(errorCode: RainbowSdk.ErrorCode, s: String) { Handler(Looper.getMainLooper()) .post { login.onSignInFailed(s) } } }) } fun getConversationFromContact(contactJid: String?): IRainbowConversation = RainbowSdk.instance().conversations().getConversationFromContact(contactJid) fun getMessagesFromConversation(conversation: IRainbowConversation) = RainbowSdk.instance().im().getMessagesFromConversation(conversation, 100) fun sendMessageToConversation(conversation: IRainbowConversation, message: String) = RainbowSdk.instance().im().sendMessageToConversation(conversation, message) fun registerAllRainbowContact(listener: IItemListChangeListener) = RainbowSdk.instance().contacts().rainbowContacts.registerChangeListener(listener) fun unregisterAllRainbowContact(listener: IItemListChangeListener) = RainbowSdk.instance().contacts().rainbowContacts.unregisterChangeListener(listener) fun registerContactChangeListener(listener: IRainbowContact.IContactListener) { rainbowContacts.forEach { it.registerChangeListener(listener) } } fun unregisterContactChangeListener(listener: IRainbowContact.IContactListener) { rainbowContacts.forEach { it.unregisterChangeListener(listener) } } } |
Di dalam kelas RainbowConnection terdapat beberapa static method dengan detail fungsi sebagai berikut :
- startConnection()
Menjalankan service Rainbow agar fungsi seperti Sign In bisa digunakan.
- startSignIn()
Masuk / Sign In (masuk) ke platform Rainbow.
- getConversationFromContact
Mendapatkan data percakapan dari kontak yang dipilih.
- getMessagesFromConversation
Mendapatkan daftar pesan dari data percakapan.
- sendMessageToConversation
Mengirimkan data pesan ke data percakapan.
- registerAllRainbowContact
Mendaftarkan semua kontak ke dalam listener agar jika terjadi perubahan dapat langsung ditampilkan secara realtime.
- unregisterAllRainbowContact
Menghapus kontak yang terdaftar pada listener agar tidak terjadi Leaks (kebocoran) pada memory.
- getRainbowContacts()
Mendapatkan seluruh kontak pengguna yang telah melakukan Sign In.
Penggunaan komponen Handler pada fungsi start() dan fungsi sign() bertujuan agar komponen yang berjalan pada UI Thread bisa dipanggil dan dijalankan. Sebabnya, Callback Listener dari beberapa fungsi Rainbow SDK masih berada pada Background Thread.
Untuk mendapatkan list kontak, data percakapan, dan data pesan kita menggunakan beberapa module pada Rainbow SDK yang detailnya bisa kamu baca pada tautan berikut:
https://hub.openrainbow.com/#/documentation/doc/sdk/android/objects/IRainbowContact
https://hub.openrainbow.com/#/documentation/doc/sdk/android/objects/IRainbowConversation
https://hub.openrainbow.com/#/documentation/doc/sdk/android/objects/IMMessage
Sekian tutorial aplikasi pesan singkat sederhana menggunakan Rainbow SDK pada bagian inisialisasi SDK pada project.
Selanjutnya kita akan membuat aplikasi kita dapat menerima dan mengirimkan pesan secara real time pada tutorial berikutnya yaitu Aplikasi Pesan Singkat Sederhana Menggunakan Rainbow SDK – Menerima dan membalas pesan. Semoga artikel ini bermanfaat buatmu yah.
Jika ada pertanyaan, silakan tinggalkan komentar di halaman blog ini. Kami akan membantumu.
Aplikasi Pesan Singkat Sederhana Menggunakan Rainbow SDK – Inisialisasi Komponen Rainbow API – end
Simak artikel terkait: