Browse Source

1. 예외처리 추가.
2. 서버IP 변경.

aaron 7 năm trước cách đây
mục cha
commit
2de0efa1d7

+ 4 - 4
app/build.gradle

@@ -20,15 +20,15 @@ android {
     }
     buildTypes {
         debug {
-            buildConfigField("String", "BASE_URL", "\"http://61.40.220.139:8080/\"")
-            buildConfigField("String", "BASE_WEBSOCKET_URL", "\"ws://61.40.220.139:8080/\"")
+            buildConfigField("String", "BASE_URL", "\"http://219.250.188.83:8080/\"")
+            buildConfigField("String", "BASE_WEBSOCKET_URL", "\"ws://219.250.188.83:8080/\"")
             buildConfigField("boolean", "IS_DEBUG", "true")
         }
         release {
             minifyEnabled false
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
-            buildConfigField("String", "BASE_URL", "\"http://61.40.220.139:8080/\"")
-            buildConfigField("String", "BASE_WEBSOCKET_URL", "\"ws://61.40.220.139:8080/\"")
+            buildConfigField("String", "BASE_URL", "\"http://219.250.188.83:8080/\"")
+            buildConfigField("String", "BASE_WEBSOCKET_URL", "\"ws://219.250.188.83:8080/\"")
             buildConfigField("boolean", "IS_DEBUG", "false")
         }
     }

+ 3 - 1
app/src/main/java/com/ntels/product/chatbot/data/model/api/response/ChatHistoryResponse.kt

@@ -11,6 +11,7 @@ import com.ntels.product.chatbot.data.model.api.response.ChatHistoryResponse.Com
 import com.ntels.product.chatbot.data.model.api.response.ChatHistoryResponse.Companion.TYPING
 import com.ntels.product.chatbot.data.model.websocket.chat.receive.WSChatReceive
 import io.realm.RealmObject
+import io.realm.annotations.Ignore
 import io.realm.annotations.PrimaryKey
 
 /**
@@ -20,7 +21,8 @@ open class ChatHistoryResponse(
         @PrimaryKey open var messageId: Long = 0,
         @Expose @SerializedName("_id") open var id: String = "",
         @Expose open var timestamp: Long? = 0,
-        @Expose open var message: WSChatReceive? = null
+        @Expose open var message: WSChatReceive? = null,
+        @Expose @Ignore val errors: List<Error>? = null
 ) : RealmObject() {
     companion object {
         const val MESSAGE_RECEIVED = 1

+ 39 - 0
app/src/main/java/com/ntels/product/chatbot/data/model/api/response/ResponseErrors.kt

@@ -0,0 +1,39 @@
+package com.ntels.product.chatbot.data.model.api.response
+
+import com.google.gson.JsonParseException
+import com.google.gson.annotations.Expose
+import com.google.gson.annotations.SerializedName
+import org.json.JSONArray
+import org.json.JSONObject
+import retrofit2.HttpException
+
+/**
+ * Created by aaron on 2018-07-10
+ */
+
+data class ResponseErrors(
+        @Expose @SerializedName("error_code") val errorCode: String,
+        @Expose @SerializedName("error_msg") val errorMsg: String
+)
+
+fun Throwable.convertResponseError(): ArrayList<ResponseErrors> {
+
+    lateinit var jsonArray: JSONArray
+
+    if (this is HttpException && response().errorBody() != null) {
+        try {
+            jsonArray = JSONObject(response().errorBody()!!.string()).getJSONArray("errors")
+        } catch (e: JsonParseException) {
+            return ArrayList()
+        }
+
+        return ArrayList<ResponseErrors>().apply {
+            for (i in 0 until jsonArray.length()) {
+                val errorCode = jsonArray.getJSONObject(i).getString("error_code")
+                val errorMsg = jsonArray.getJSONObject(i).getString("error_msg")
+                add(ResponseErrors(errorCode, errorMsg))
+            }
+        }
+    }
+    return ArrayList()
+}

+ 0 - 1
app/src/main/java/com/ntels/product/chatbot/di/module/AppModule.kt

@@ -49,7 +49,6 @@ class AppModule {
     @PreferenceInfo
     fun providePreferenceName() = AppPreferencesHelper.PREF_NAME
 
-    // TODO: DB 구현 시 같이 구현.
 //    @Provides
 //    @Singleton
 //    fun provideAppDatabase(@DatabaseInfo dbName: String, context: Context) {}

+ 15 - 0
app/src/main/java/com/ntels/product/chatbot/ui/BaseActivity.kt

@@ -5,8 +5,11 @@ import android.databinding.ViewDataBinding
 import android.os.Bundle
 import android.support.annotation.LayoutRes
 import android.support.v4.app.Fragment
+import android.support.v7.app.AlertDialog
 import android.support.v7.app.AppCompatActivity
+import com.ntels.product.chatbot.R
 import dagger.android.AndroidInjection
+import timber.log.Timber
 
 /**
  * Created by aaron on 2018-05-30
@@ -28,6 +31,7 @@ abstract class BaseActivity<T : ViewDataBinding, V : BaseViewModel<*>> : AppComp
         performDependencyInjection()
         performDataBinding()
         _viewModel!!.onViewCreated()
+        _viewModel!!.showErrorDialog = ::showErrorDialog
     }
 
     override fun onDestroy() {
@@ -47,6 +51,17 @@ abstract class BaseActivity<T : ViewDataBinding, V : BaseViewModel<*>> : AppComp
         TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
     }
 
+    fun showErrorDialog(errorCode: String, errorMsg: String) {
+        Timber.i("error_code: $errorCode, error_msg: $errorMsg")
+        AlertDialog.Builder(this)
+                .setMessage(errorMsg)
+                .setCancelable(true)
+                .setPositiveButton(R.string.ok) { dialog, _ ->
+                    dialog.dismiss()
+                }
+                .show()
+    }
+
     private fun performDataBinding() {
         viewDataBinding = DataBindingUtil.setContentView(this, layoutId)
         _viewModel = if (_viewModel == null) viewModel else _viewModel

+ 1 - 1
app/src/main/java/com/ntels/product/chatbot/ui/BaseViewModel.kt

@@ -15,9 +15,9 @@ abstract class BaseViewModel<N : BaseNavigator>(val dataManager : DataManager, v
 
     var navigator: N? = null
     val isLoading = ObservableBoolean(false)
+    lateinit var showErrorDialog: (String, String) -> Unit
     lateinit var compositeDisposable: CompositeDisposable
         private set
-    // TODO: access token 가져오기.
 //    val accessToken: String?
 //        get() = dataManager.accessToken
 

+ 0 - 17
app/src/main/java/com/ntels/product/chatbot/ui/chat/ChatActivity.kt

@@ -211,15 +211,6 @@ class ChatActivity : BaseActivity<ActivityChatBinding, ChatViewModel>(), ChatNav
         val linearLayoutManager = LinearLayoutManager(this).apply { stackFromEnd = true }
 
         rvChat.run { setHasFixedSize(true); layoutManager = linearLayoutManager }
-
-        // TODO: Test 후 삭제
-//        val msgList = ArrayList<ChatMessage>().apply {
-//            for (x in 1..5) {
-//                add(ChatMessage("user", "Hi!", 1))
-//                add(ChatMessage("bot", "Hello!", 2))
-//            }
-//        }
-
         rvChat.adapter = ChatVerticalAdapter(this, viewModel.allDbData)
         rvChat.adapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
             override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
@@ -246,14 +237,6 @@ class ChatActivity : BaseActivity<ActivityChatBinding, ChatViewModel>(), ChatNav
             flexWrap = FlexWrap.WRAP; flexDirection = FlexDirection
                 .ROW; justifyContent = JustifyContent.FLEX_START
         }
-
-        // TODO: Test 후 삭제
-//        val msgList = ArrayList<ChatMessage>().apply {
-//            for (x in 1..5) {
-//                add(ChatMessage("user", "Hi!", 1))
-//                add(ChatMessage("bot", "Hello!", 2))
-//            }
-//        }
         rvQuickReply.adapter = QuickReplyAdapter(ArrayList())
     }
 

+ 3 - 1
app/src/main/java/com/ntels/product/chatbot/ui/chat/ChatViewModel.kt

@@ -5,6 +5,7 @@ import com.ntels.product.chatbot.data.DataManager
 import com.ntels.product.chatbot.data.model.api.request.ChatHistoryRequest
 import com.ntels.product.chatbot.data.model.api.request.toMap
 import com.ntels.product.chatbot.data.model.api.response.ChatHistoryResponse
+import com.ntels.product.chatbot.data.model.api.response.convertResponseError
 import com.ntels.product.chatbot.data.model.websocket.chat.ControlInfo
 import com.ntels.product.chatbot.data.model.websocket.chat.receive.WSChatReceive
 import com.ntels.product.chatbot.data.model.websocket.chat.receive.WSChatReceive.Companion.SEND_STATUS_FAIL
@@ -92,8 +93,9 @@ class ChatViewModel(dataManager: DataManager, schedulerProvider: SchedulerProvid
 //                        completeHistoryRequest.onNext(true)
                     }
                 }, {
-                    // TODO("예외처리")
                     isLoading.set(false)
+                    val errors = it.convertResponseError()
+                    if (errors.isNotEmpty()) showErrorDialog(errors[0].errorCode, errors[0].errorMsg)
                 })
     }
 

+ 1 - 5
app/src/main/java/com/ntels/product/chatbot/ui/login/LoginActivity.kt

@@ -1,15 +1,11 @@
 package com.ntels.product.chatbot.ui.login
 
-import android.app.Activity
-import android.content.Context
 import android.content.Intent
 import android.os.Bundle
-import android.os.PersistableBundle
-import com.github.omadahealth.lollipin.lib.managers.AppLock
 import com.github.omadahealth.lollipin.lib.managers.AppLock.EXTRA_TYPE
 import com.github.omadahealth.lollipin.lib.managers.AppLock.UNLOCK_PIN
-import com.ntels.product.chatbot.R
 import com.ntels.product.chatbot.BR
+import com.ntels.product.chatbot.R
 import com.ntels.product.chatbot.databinding.ActivityLoginBinding
 import com.ntels.product.chatbot.ui.BaseActivity
 import com.ntels.product.chatbot.ui.chat.ChatActivity

+ 7 - 1
app/src/main/java/com/ntels/product/chatbot/ui/login/LoginViewModel.kt

@@ -7,9 +7,11 @@ import android.view.View
 import com.google.firebase.iid.FirebaseInstanceId
 import com.ntels.product.chatbot.data.DataManager
 import com.ntels.product.chatbot.data.model.api.request.LoginRequest
+import com.ntels.product.chatbot.data.model.api.response.convertResponseError
 import com.ntels.product.chatbot.ui.BaseViewModel
 import com.ntels.product.chatbot.util.CommonUtils
 import com.ntels.product.chatbot.util.rx.SchedulerProvider
+import retrofit2.HttpException
 
 /**
  * Created by aaron on 2018-06-01
@@ -48,7 +50,11 @@ class LoginViewModel(dataManager: DataManager, schedulerProvider: SchedulerProvi
                     dataManager.loginId = if (saveId.get()) loginId.get()!! else ""
                     dataManager.autoLogin = autoLogin.get()
                     doRegisterPushToken(context)
-                }, { TODO("익셉션 처리") })
+                }, {
+                    isLoading.set(false)
+                    val errors = it.convertResponseError()
+                    if (errors.isNotEmpty()) showErrorDialog(errors[0].errorCode, errors[0].errorMsg)
+                })
                 .run { compositeDisposable.add(this) }
     }
 

+ 4 - 1
app/src/main/java/com/ntels/product/chatbot/ui/setting/SettingViewModel.kt

@@ -5,6 +5,7 @@ import android.widget.CompoundButton
 import com.github.omadahealth.lollipin.lib.managers.AppLock
 import com.github.omadahealth.lollipin.lib.managers.AppLock.*
 import com.ntels.product.chatbot.data.DataManager
+import com.ntels.product.chatbot.data.model.api.response.convertResponseError
 import com.ntels.product.chatbot.ui.BaseViewModel
 import com.ntels.product.chatbot.util.rx.SchedulerProvider
 import timber.log.Timber
@@ -40,7 +41,9 @@ class SettingViewModel(dataManager: DataManager, schedulerProvider: SchedulerPro
                         onLogout()
                     }
                 }, {
-                    // TODO("예외처리")
+                    isLoading.set(false)
+                    val errors = it.convertResponseError()
+                    if (errors.isNotEmpty()) showErrorDialog(errors[0].errorCode, errors[0].errorMsg)
                 })
                 .run { compositeDisposable.add(this) }
     }

+ 4 - 1
app/src/main/java/com/ntels/product/chatbot/ui/splash/SplashViewModel.kt

@@ -9,6 +9,7 @@ import com.ntels.product.chatbot.R
 import com.ntels.product.chatbot.data.DataManager
 import com.ntels.product.chatbot.data.model.api.request.VersionCheckRequest
 import com.ntels.product.chatbot.data.model.api.request.toMap
+import com.ntels.product.chatbot.data.model.api.response.convertResponseError
 import com.ntels.product.chatbot.ui.BaseViewModel
 import com.ntels.product.chatbot.util.CommonUtils
 import com.ntels.product.chatbot.util.rx.SchedulerProvider
@@ -95,7 +96,9 @@ class SplashViewModel(dataManager: DataManager, schedulerProvider: SchedulerProv
                         goNextActivity(dataManager.autoLogin, dataManager.doubleCert)
                     }
                 }, {
-                    // TODO: 예외처리
+                    isLoading.set(false)
+                    val errors = it.convertResponseError()
+                    if (errors.isNotEmpty()) showErrorDialog(errors[0].errorCode, errors[0].errorMsg)
                 })
                 .run { compositeDisposable.add(this) }
     }

+ 4 - 2
app/src/main/res/layout/activity_setting.xml

@@ -24,7 +24,8 @@
                 android:layout_width="match_parent"
                 android:layout_height="68dp"
                 app:layout_constraintTop_toBottomOf="@id/settingToolbar"
-                android:padding="20dp">
+                android:padding="20dp"
+                android:visibility="gone">
             <TextView
                     android:id="@+id/changePw"
                     android:layout_width="wrap_content"
@@ -46,7 +47,8 @@
                 android:layout_height="wrap_content"
                 app:layout_constraintStart_toStartOf="parent"
                 app:layout_constraintEnd_toEndOf="parent"
-                app:layout_constraintTop_toBottomOf="@id/layout1"/>
+                app:layout_constraintTop_toBottomOf="@id/layout1"
+                android:visibility="invisible"/>
 
         <TextView
                 android:id="@+id/secondCert"