liaocheng преди 5 години
родител
ревизия
60da59cca6
променени са 60 файла, в които са добавени 73513 реда и са изтрити 0 реда
  1. 13 0
      im/.gitignore
  2. 1 0
      im/app/.gitignore
  3. 83 0
      im/app/build.gradle
  4. 48 0
      im/app/google-services.json
  5. 24 0
      im/app/src/androidTest/java/com/sinata/bc_chat/ExampleInstrumentedTest.kt
  6. 64 0
      im/app/src/main/AndroidManifest.xml
  7. 630 0
      im/app/src/main/java/com/sinata/bc_chat/MainActivity.kt
  8. 60 0
      im/app/src/main/java/com/sinata/bc_chat/SplashActivity.kt
  9. 171 0
      im/app/src/main/java/com/sinata/bc_chat/fragment/Nav1Fragment.java
  10. 172 0
      im/app/src/main/java/com/sinata/bc_chat/fragment/Nav2Fragment.java
  11. 58 0
      im/app/src/main/java/com/sinata/bc_chat/fragment/NoticeDialogFragment.java
  12. 86 0
      im/app/src/main/java/com/sinata/bc_chat/receiver/NotificationReceiver.java
  13. 235 0
      im/app/src/main/java/com/sinata/bc_chat/utils/GsonUtil.java
  14. 77 0
      im/app/src/main/java/com/sinata/bc_chat/utils/MainTab.java
  15. 31 0
      im/app/src/main/java/com/sinata/bc_chat/utils/NavDataUtil.java
  16. 10 0
      im/app/src/main/java/com/sinata/bc_chat/utils/ReminderId.java
  17. 34 0
      im/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
  18. 10 0
      im/app/src/main/res/drawable/a_bg_for_ad_confirm.xml
  19. 6 0
      im/app/src/main/res/drawable/a_bg_for_code.xml
  20. 7 0
      im/app/src/main/res/drawable/home_tab_text_selector.xml
  21. 170 0
      im/app/src/main/res/drawable/ic_launcher_background.xml
  22. 5 0
      im/app/src/main/res/drawable/selector_text_color_nav.xml
  23. 4 0
      im/app/src/main/res/drawable/skin_global_bg.xml
  24. 7 0
      im/app/src/main/res/drawable/tab_icon_chat.xml
  25. 7 0
      im/app/src/main/res/drawable/tab_icon_circle.xml
  26. 7 0
      im/app/src/main/res/drawable/tab_icon_contact.xml
  27. 7 0
      im/app/src/main/res/drawable/tab_icon_mine.xml
  28. 7 0
      im/app/src/main/res/drawable/tab_icon_score.xml
  29. 38 0
      im/app/src/main/res/layout/activity_main.xml
  30. 21 0
      im/app/src/main/res/layout/activity_main2.xml
  31. 35 0
      im/app/src/main/res/layout/fragment_website.xml
  32. 55 0
      im/app/src/main/res/layout/home_tab_layout.xml
  33. 117 0
      im/app/src/main/res/layout/layout_main_footbar.xml
  34. 86 0
      im/app/src/main/res/layout/notice_dialog.xml
  35. BIN
      im/app/src/main/res/mipmap-xxhdpi/tab_chat_0.png
  36. BIN
      im/app/src/main/res/mipmap-xxhdpi/tab_chat_1.png
  37. BIN
      im/app/src/main/res/mipmap-xxhdpi/tab_circle_0.png
  38. BIN
      im/app/src/main/res/mipmap-xxhdpi/tab_circle_1.png
  39. BIN
      im/app/src/main/res/mipmap-xxhdpi/tab_contact_0.png
  40. BIN
      im/app/src/main/res/mipmap-xxhdpi/tab_contact_1.png
  41. BIN
      im/app/src/main/res/mipmap-xxhdpi/tab_mine_0.png
  42. BIN
      im/app/src/main/res/mipmap-xxhdpi/tab_mine_1.png
  43. BIN
      im/app/src/main/res/mipmap-xxhdpi/tab_score_0.png
  44. BIN
      im/app/src/main/res/mipmap-xxhdpi/tab_score_1.png
  45. 4 0
      im/app/src/main/res/values/colors.xml
  46. 5 0
      im/app/src/main/res/values/strings.xml
  47. 20 0
      im/app/src/main/res/values/styles.xml
  48. 17 0
      im/app/src/test/java/com/sinata/bc_chat/ExampleUnitTest.kt
  49. 1 0
      im/bc_account/.gitignore
  50. 37 0
      im/bc_account/build.gradle
  51. 21 0
      im/bc_account/proguard-rules.pro
  52. BIN
      im/bc_chat.keystore
  53. 51 0
      im/build.gradle
  54. 61 0
      im/gradle.properties
  55. 172 0
      im/gradlew
  56. 84 0
      im/gradlew.bat
  57. BIN
      im/liaoqiu.keystore
  58. 70281 0
      im/log.txt
  59. 372 0
      im/proguard-rules.pro
  60. 1 0
      im/settings.gradle

+ 13 - 0
im/.gitignore

@@ -0,0 +1,13 @@
+*.iml
+.gradle
+.idea
+/local.properties
+/.idea/caches/build_file_checksums.ser
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+APK

+ 1 - 0
im/app/.gitignore

@@ -0,0 +1 @@
+/build

+ 83 - 0
im/app/build.gradle

@@ -0,0 +1,83 @@
+if (!isNeedMainModule.toBoolean()) {
+    apply plugin: 'com.android.application'
+} else {
+    apply plugin: 'com.android.library'
+}
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+apply plugin: 'kotlin-kapt'
+apply from: "../gradle_component/baseconfig.gradle"
+apply plugin: 'com.google.gms.google-services'
+
+static def releaseTime() {
+    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
+}
+
+android {
+    defaultConfig {
+        if (!isNeedMainModule.toBoolean()) {
+            applicationId "com.sinata.feixin"
+        }
+//      javaCompileOptions {
+//            annotationProcessorOptions {
+//                arguments = [moduleName: project.getName()]
+//            }
+//        }
+        kapt {
+            arguments {
+                arg("AROUTER_MODULE_NAME", project.getName())
+            }
+        }
+    }
+
+    buildTypes {
+        release {
+            if (!isNeedMainModule.toBoolean()) {
+                //修改生成的apk名字
+                applicationVariants.all { variant ->
+                    // 更新至Android Studio 3.3 gradle 4.10.1
+                    variant.outputs.all {
+                        outputFileName = "飞信${rootProject.ext.versionName}(${rootProject.ext.versionCode})_${(releaseTime())}.apk"
+                    }
+//                variant.outputs.each { output ->
+//                    def outputFile = output.outputFile
+//                    if (outputFile != null && outputFile.name.endsWith('.apk') && variant.buildType.name.equals("release")) {
+//                        def fileName = "bc_chat${rootProject.ext.versionName}(${rootProject.ext.versionCode})_${(releaseTime())}.apk"
+//                        output.outputFileName = new File(fileName)
+//                    }
+//                }
+                }
+            }
+        }
+    }
+}
+
+dependencies {
+    implementation fileTree(dir: 'libs', include: ['*.jar'])
+    testImplementation 'junit:junit:4.12'
+    androidTestImplementation 'com.android.support.test:runner:1.0.2'
+    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
+    if (isNeedAccoutModule.toBoolean()) {
+        implementation project(':bc_account')
+    }
+    if (isNeedImModule.toBoolean()) {
+        implementation project(':bc_im')
+    }
+    if (isNeedMineModule.toBoolean()) {
+        implementation project(':bc_mine')
+    }
+    if (isNeedContactModule.toBoolean()) {
+        implementation project(':bc_contacts')
+    }
+    kapt "com.alibaba:arouter-compiler:1.2.2"
+    // 靠谱点的圆形视图库
+    implementation 'com.makeramen:roundedimageview:2.3.0'
+//    api 'com.google.firebase:firebase-core:17.2.0'
+//    api 'com.google.firebase:firebase-messaging:20.0.0'
+//    api 'com.google.android.gms:play-services:12.0.1'
+    implementation("com.google.android.gms:play-services-gcm:12.0.1") {
+        force = true
+    }
+    api 'com.google.firebase:firebase-messaging:17.6.0'
+
+}

+ 48 - 0
im/app/google-services.json

@@ -0,0 +1,48 @@
+{
+  "project_info": {
+    "project_number": "299357380471",
+    "firebase_url": "https://liaoqiu-d127b.firebaseio.com",
+    "project_id": "liaoqiu-d127b",
+    "storage_bucket": "liaoqiu-d127b.appspot.com"
+  },
+  "client": [
+    {
+      "client_info": {
+        "mobilesdk_app_id": "1:299357380471:android:8a4849d3955d92f35e4b72",
+        "android_client_info": {
+          "package_name": "com.sinata.feixin"
+        }
+      },
+      "oauth_client": [
+        {
+          "client_id": "299357380471-6gdp9cfao9nqp22j112lempjgh34n192.apps.googleusercontent.com",
+          "client_type": 1,
+          "android_info": {
+            "package_name": "com.sinata.feixin",
+            "certificate_hash": "6a6f9ae284dc616cfcc7a2f31854ce8a1da775b1"
+          }
+        },
+        {
+          "client_id": "299357380471-ijl17puulf1di87g2vb1ncmsru7lig4l.apps.googleusercontent.com",
+          "client_type": 3
+        }
+      ],
+      "api_key": [
+        {
+          "current_key": "AIzaSyBH0377NXQJK1NxRk6c70gtgCpRfyXNU4Q"
+        }
+      ],
+      "services": {
+        "appinvite_service": {
+          "other_platform_oauth_client": [
+            {
+              "client_id": "299357380471-ijl17puulf1di87g2vb1ncmsru7lig4l.apps.googleusercontent.com",
+              "client_type": 3
+            }
+          ]
+        }
+      }
+    }
+  ],
+  "configuration_version": "1"
+}

+ 24 - 0
im/app/src/androidTest/java/com/sinata/bc_chat/ExampleInstrumentedTest.kt

@@ -0,0 +1,24 @@
+package com.sinata.bc_chat
+
+import android.support.test.InstrumentationRegistry
+import android.support.test.runner.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+    @Test
+    fun useAppContext() {
+        // Context of the app under test.
+        val appContext = InstrumentationRegistry.getTargetContext()
+        assertEquals("com.sinata.bc_chat", appContext.packageName)
+    }
+}

+ 64 - 0
im/app/src/main/AndroidManifest.xml

@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.sinata.bc_chat">
+
+    <application
+        android:name="com.bc_chat.bc_base.BCApplication"
+        android:allowBackup="true"
+        android:icon="@mipmap/ic_launcher"
+        android:label="@string/app_name"
+        android:supportsRtl="true"
+        android:theme="@style/AppTheme">
+        <activity
+            android:name=".MainActivity"
+            android:screenOrientation="fullSensor">
+            <intent-filter>
+                <action android:name="android.intent.action.VIEW" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <data
+                    android:host="com.sinata.feixin"
+                    android:pathPrefix="/conversationlist"
+                    android:scheme="rong" />
+            </intent-filter>
+        </activity>
+        <activity
+            android:name=".SplashActivity"
+            android:theme="@style/SplashTheme"
+            android:windowSoftInputMode="adjustResize|stateHidden">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+
+        <receiver
+            android:name=".receiver.NotificationReceiver"
+            android:exported="true">
+            <intent-filter>
+                <action android:name="io.rong.push.intent.MESSAGE_ARRIVED" />
+                <action android:name="io.rong.push.intent.MI_MESSAGE_ARRIVED" />
+                <action android:name="io.rong.push.intent.MESSAGE_CLICKED" />
+                <action android:name="io.rong.push.intent.MI_MESSAGE_CLICKED" />
+                <action android:name="io.rong.push.intent.THIRD_PARTY_PUSH_STATE" />
+            </intent-filter>
+        </receiver>
+
+        <meta-data
+            android:name="firebase_messaging_auto_init_enabled"
+            android:value="false" />
+        <meta-data
+            android:name="firebase_analytics_collection_enabled"
+            android:value="false" />
+
+        <service
+            android:name="io.rong.push.platform.google.RongFirebaseMessagingService"
+            android:exported="false"
+            android:stopWithTask="false">
+            <intent-filter>
+                <action android:name="com.google.firebase.MESSAGING_EVENT" />
+            </intent-filter>
+        </service>
+    </application>
+
+</manifest>

+ 630 - 0
im/app/src/main/java/com/sinata/bc_chat/MainActivity.kt

@@ -0,0 +1,630 @@
+package com.sinata.bc_chat
+
+import android.Manifest
+import android.app.Activity
+import android.app.Dialog
+import android.content.ActivityNotFoundException
+import android.content.DialogInterface
+import android.content.Intent
+import android.net.Uri
+import android.os.Bundle
+import android.text.TextUtils
+import android.view.LayoutInflater
+import android.view.View
+import android.widget.ImageView
+import android.widget.TextView
+import com.alibaba.android.arouter.facade.annotation.Route
+import com.alibaba.android.arouter.launcher.ARouter
+import com.bc_chat.bc_base.ImService.ImRongService
+import com.bc_chat.bc_base.config.RouteConfig
+import com.bc_chat.bc_base.contract.MainContract
+import com.bc_chat.bc_base.entity.ApkVersion
+import com.bc_chat.bc_base.entity.FriendApplyRecordBean
+import com.bc_chat.bc_base.entity.NavEntity
+import com.bc_chat.bc_base.entity.User
+import com.bc_chat.bc_base.entity.group.Group
+import com.bc_chat.bc_base.entity.wallet.NoticeEntity
+import com.bc_chat.bc_base.presenter.MainPresenter
+import com.bc_chat.bc_base.utils.*
+import com.bc_chat.contacts.ContactListFragment.Companion.tips_message_add
+import com.bc_chat.contacts.ContactListFragment.Companion.tips_message_clear
+import com.sinata.bc_chat.databinding.ActivityMainBinding
+import com.sinata.bc_chat.fragment.Nav1Fragment
+import com.sinata.bc_chat.fragment.Nav2Fragment
+import com.sinata.bc_chat.fragment.NoticeDialogFragment
+import com.sinata.bc_chat.utils.GsonUtil
+import com.sinata.bc_chat.utils.MainTab
+import com.sinata.bc_chat.utils.NavDataUtil
+import com.sinata.bc_chat.utils.ReminderId
+import com.sinata.download.DownloadLibrary
+import com.sinata.download.entity.Version
+import com.sinata.download.utils.Logger
+import com.sinata.download.utils.Utils
+import com.sinata.download.utils.VersionUpdateUtils
+import com.zhaohaoting.framework.abs.AbsV4Fragment
+import com.zhaohaoting.framework.abs.BaseNoActionBarActivity
+import com.zhaohaoting.framework.abs.contract.BaseContract
+import com.zhaohaoting.framework.ui.dialog.CustomDialog
+import com.zhaohaoting.framework.utils.NotifyHelper
+import com.zhaohaoting.framework.utils.Preferences
+import com.zhaohaoting.framework.utils.ToastUtils
+import com.zhaohaoting.framework.utils.observer.Observer
+import com.zhaohaoting.framework.utils.observer.ObserverManager
+import io.rong.imkit.RongIM
+import io.rong.imlib.RongIMClient
+import io.rong.imlib.model.Conversation
+import org.jetbrains.anko.bundleOf
+import org.jetbrains.anko.find
+import org.json.JSONException
+import org.json.JSONObject
+
+/**
+ * 消息提醒应建立消息管理类统一处理
+ * 此处先简单处理
+ */
+@Route(path = RouteConfig.MAIN_ACTIVITY)
+class MainActivity : BaseNoActionBarActivity<MainPresenter>(), MainContract.View,
+        VersionUpdateUtils.TipsDialogProvider {
+
+
+    private val binding by lazy {
+        rootDataBinding as ActivityMainBinding
+    }
+    private var bundle: Bundle = bundleOf("select " to 0, "new_msg" to false) //select选中tab  new_msg是否有新消息
+    private var inflater: LayoutInflater? = null
+    private var apkLocalPath = ""
+
+    override fun onNewIntent(intent: Intent) {
+        super.onNewIntent(intent)
+        setIntent(intent)
+        parseIntent()
+    }
+
+    private fun parseIntent() {
+        val action = intent.getStringExtra("action")
+        if (Const.Action.DISSOLUTION_GROUP.equals(action)) {
+            setSelectPage(MainTab.CHAT.reminderId)
+        }
+//        else if (Const.Action.CIRCLE_LIKE.equals(action)) {
+//            setSelectPage(MainTab.CIRCLE.reminderId)
+//            val circleFragment = getChildFragment<AbsV4Fragment<BaseContract.BasePresenter>>(MainTab.CIRCLE.reminderId)
+//            bundle.putInt("select", 1)
+//            bundle.putBoolean("new_msg", true)
+//            circleFragment?.arguments = bundle
+//        }
+    }
+
+    private fun pushResult() {
+        ObserverManager.getInstance().notifyObserver(Const.Action.NOTICE_START_MAIN, "1")
+        if ("rong".equals(intent.data?.scheme) && intent.data?.getQueryParameter("isFromPush") != null) {
+            if (intent.data?.getQueryParameter("isFromPush").equals("true")) {
+                val options = intent.getStringExtra("options") // 获取 intent 里携带的附加数据
+                try {
+                    val jsonObject = JSONObject(options)
+                    if (jsonObject.has("appData")) {   // appData 对应的是客户端 sendMessage() 时的参数 pushData
+                        val appDataString = jsonObject.getString("appData")
+                        val appData = JSONObject(appDataString)
+                        val extra = appData.getJSONObject("extra")
+                        val type = extra.optString("type")
+                        when (type) {
+                            Const.PushMethod.DISS_GROUP -> {//解散群
+                                val groupId = extra.optString("groupId")
+                                RongIM.getInstance().clearMessages(
+                                        Conversation.ConversationType.GROUP,
+                                        groupId,
+                                        object : RongIMClient.ResultCallback<Boolean>() {
+                                            override fun onSuccess(aBoolean: Boolean?) {
+                                                RongIM.getInstance()
+                                                        .removeConversation(Conversation.ConversationType.GROUP, groupId, null)
+                                            }
+
+                                            override fun onError(errorCode: RongIMClient.ErrorCode) {}
+                                        })
+                                setSelectPage(MainTab.CHAT.reminderId)
+                            }
+//                            Const.PushMethod.FOLLOW_LIST -> {
+//                                setSelectPage(MainTab.CIRCLE.reminderId)
+//                                val circleFragment =
+//                                    getChildFragment<AbsV4Fragment<BaseContract.BasePresenter>>(MainTab.CIRCLE.reminderId)
+//                                bundle.putInt("select", 1)
+//                                bundle.putBoolean("new_msg", true)
+//                                circleFragment?.arguments = bundle
+//                                MessageHelper.instance.isFllowTopic = true
+//                            }
+                            Const.PushMethod.TOPIC_COMMENT -> {
+                                val intent = Intent()
+                                intent.action = "com.bc_chat.circle.activity.TopicDetailsActivity"
+                                intent.putExtra("cid", extra.getString("cid"))
+                                intent.putExtra("commentId", extra.getString("commentId"))
+                                intent.putExtra("selection", extra.getString("type"))
+                                startActivity(intent)
+                                MessageHelper.instance.isNewComment = true
+                            }
+                            Const.PushMethod.TOPIC_CHILD_COMMENT -> {
+                                val intent = Intent()
+                                intent.action = "com.bc_chat.circle.activity.TopicDetailsActivity"
+                                intent.putExtra("cid", extra.getString("cid"))
+                                intent.putExtra("commentId", extra.getString("commentId"))
+                                intent.putExtra("selection", extra.getString("type"))
+                                startActivity(intent)
+                                MessageHelper.instance.isChildNewComment = true
+                            }
+                        }
+                    }
+                } catch (e: JSONException) {
+                    e.printStackTrace()
+                }
+            }
+        }
+    }
+
+    override fun initPresenter(): MainPresenter = MainPresenter(this)
+
+    override fun onInit() {
+        Preferences.saveBoolean("isShow", false)
+        setLightMode(resources.getColor(R.color.title_bg_color), false, false)
+        inflater = LayoutInflater.from(this)
+        initData()
+        DownloadLibrary.setApkDownLoadListener { localPath ->
+            apkLocalPath = localPath
+            Utils.startInstall(this, localPath, 9999)
+        }
+        judgePermission(
+                1,
+                Manifest.permission.ACCESS_FINE_LOCATION,
+                Manifest.permission.ACCESS_COARSE_LOCATION,
+                Manifest.permission.READ_PHONE_STATE,
+                Manifest.permission.RECORD_AUDIO,
+                Manifest.permission.READ_CONTACTS,
+                Manifest.permission.CAMERA,
+                Manifest.permission.READ_EXTERNAL_STORAGE,
+                Manifest.permission.WRITE_EXTERNAL_STORAGE,
+                Manifest.permission.CALL_PHONE
+        )
+        parseIntent()
+        if (!NotifyHelper.checkNotify(this)) {
+            CustomDialog.Builder(this)
+                    .setMessage("检测到您未开启通知推送")
+                    .setNegativeButton("取消", null)
+                    .setPositiveButton("开启") { dialog, which ->
+                        NotifyHelper.toSystemNotify(this)
+                    }.create().show()
+        }
+        pushResult()
+    }
+
+    private fun initData() {
+        presenter.userInfoTask(AppConfig.instance.getUser().userId)
+        presenter.isSetPayKey()
+        presenter.getLastestNotice()
+        presenter.getNavData()
+        presenter.applyFriendList(1, 1000)
+        ObserverManager.getInstance().registerObserver(Const.ObserverKey.UN_READ_CHANGE, unReadChangeObserver)
+        ObserverManager.getInstance().registerObserver(Const.ObserverKey.TOPIC_CHILD_COMMENT, newMsgObserver)
+        ObserverManager.getInstance().registerObserver(Const.ObserverKey.TOPIC_COMMENT, newMsgObserver)
+        ObserverManager.getInstance().registerObserver(Const.ObserverKey.FOLLOW_TOPIC, newMsgObserver)
+        ObserverManager.getInstance().registerObserver(Const.ObserverKey.SCANNER_QRCODE, qrcodeObserver)
+        ObserverManager.getInstance().registerObserver(Const.ObserverKey.NEW_FRIEND, newFriendObserver)
+    }
+
+    private fun getTabItemView(tab: MainTab): View? {
+        val view = inflater?.inflate(R.layout.home_tab_layout, null)
+        val tabView = view?.findViewById<TextView>(R.id.tabView)
+        val tabIcon = view?.findViewById<ImageView>(R.id.tab_icon)
+        tabIcon?.setImageResource(tab.resIcon)
+        tabView?.text = tab.resName
+        return view
+    }
+
+    private fun <T : AbsV4Fragment<*>> getChildFragment(tag: Int): T? {
+        return supportFragmentManager.findFragmentByTag(tag.toString()) as T?
+    }
+
+    override fun userInfoSuccess(user: User?) {
+        val currentUser = AppConfig.instance.getUser()
+        if (!user?.userId.equals(currentUser.userId)) {
+            //获取到的用户资料不是自己
+            // 走加好友流程
+            if (user?.is_myFriend == 0) {
+                ARouter.getInstance().build(RouteConfig.ADD_FRIEND_ACTIVITY).withParcelable("userInfo", user)
+                        .navigation()
+            } else {
+                ARouter.getInstance().navigation(ImRongService::class.java).startConversation(
+                        this,
+                        Conversation.ConversationType.PRIVATE,
+                        user!!.userId,
+                        user.nickname!!,
+                        null
+                )
+            }
+            return
+        }
+        currentUser.city = user?.city
+        currentUser.introduction = user?.introduction
+        currentUser.is_block = user?.is_block
+        currentUser.is_report = user?.is_report
+        currentUser.phone = user?.phone
+        currentUser.nickname = user?.nickname
+        currentUser.province = user?.province
+        currentUser.photo = user?.photo
+        ARouter.getInstance().navigation(ImRongService::class.java)
+                .setCurrentUserInfo(currentUser.userId, currentUser.accessToken)
+    }
+
+    override fun userInfoFailure(e: Exception) {
+    }
+
+    override fun groupinfoSuccess(groupInfo: Group) {
+        if ("1".equals(groupInfo.isInGroup)) {//如果已经在群里面
+            ARouter.getInstance().navigation(ImRongService::class.java).startConversation(
+                    this,
+                    Conversation.ConversationType.GROUP,
+                    groupInfo.groupId!!,
+                    groupInfo.group_name!!,
+                    null
+            )
+        } else {
+            val currentUser = AppConfig.instance.getUser()
+            presenter.addGroupMember(
+                    groupInfo.groupId!!,
+                    groupInfo.group_name!!,
+                    currentUser.nickname!!,
+                    currentUser.userId
+            )
+        }
+        return
+    }
+
+    override fun groupinfoFailure(exception: Exception) {
+    }
+
+    override fun addGroupSuccess(groupId: String, groupName: String) {
+        ARouter.getInstance().navigation(ImRongService::class.java)
+                .startConversation(this, Conversation.ConversationType.GROUP, groupId, groupName, null)
+    }
+
+    override fun isSetPayKeySuccess(isSet: Boolean) {
+        Preferences.setIsSetPayPwd(isSet);
+    }
+
+    override fun getLastestNoticeSuccess(noticeEntity: NoticeEntity?) {
+        val dialogFragment = NoticeDialogFragment()
+        dialogFragment.setNoticeEntity(noticeEntity)
+        dialogFragment.isCancelable = false
+        dialogFragment.show(supportFragmentManager, null)
+    }
+
+    override fun getNavDataSuccess(dataList: List<NavEntity>?) {
+        if (dataList != null && dataList.size > 0) {
+            var navJsonStr = GsonUtil.gsonString(dataList)
+            Preferences.setNavJson(navJsonStr)
+            showNav(dataList);
+        }
+    }
+
+    override fun getNavDataFailed() {
+        showNav(NavDataUtil.getNavData())
+    }
+
+    override fun applyFriendListSuccess(data: List<FriendApplyRecordBean>?) {
+        if (NavDataUtil.isShowTipsMsg(data)) {
+            ObserverManager.getInstance().notifyObserver(Const.ObserverKey.NEW_FRIEND, "add")
+        }
+    }
+
+    private fun showNav(dataList: List<NavEntity>) {
+        var nav1Name = ""
+        var nav2Name = ""
+        if (dataList.size == 1) {
+            Nav1Fragment.homeUrl = dataList[0].url;
+            nav1Name = dataList[0].title
+        } else if (dataList.size == 2) {
+            Nav1Fragment.homeUrl = dataList[0].url;
+            Nav2Fragment.homeUrl = dataList[1].url;
+            nav1Name = dataList[0].title
+            nav2Name = dataList[1].title
+        }
+
+        binding.tabhost.setup(this, supportFragmentManager, R.id.contentPanel)
+        for (tab in MainTab.values()) {
+            if (tab.reminderId == ReminderId.NAV1) {
+                if (!TextUtils.isEmpty(nav1Name)) {
+                    tab.resName = nav1Name
+                }
+            } else if (tab.reminderId == ReminderId.NAV2) {
+                if (!TextUtils.isEmpty(nav2Name)) {
+                    tab.resName = nav2Name
+                }
+            }
+            val tabSpec = binding.tabhost.newTabSpec(tab.reminderId.toString()).setIndicator(getTabItemView(tab))
+            binding.tabhost.addTab(tabSpec, tab.clz, null)
+            binding.tabhost.tabWidget.dividerDrawable = null
+        }
+        binding.tabhost.setOnTabChangedListener {
+            if (it.equals(MainTab.NAV2.reminderId.toString())) {
+                //跳转浏览器打开
+                try {
+                    val intent = Intent()
+                    intent.action = Intent.ACTION_VIEW
+                    intent.data = Uri.parse(Nav2Fragment.homeUrl)
+                    startActivity(intent)
+                } catch (e: ActivityNotFoundException) {
+                    ToastUtils.show("手机还没有安装支持打开此网页的应用!")
+                }
+            }
+        }
+    }
+
+    private fun setSelectPage(tag: Int) {
+        binding.tabhost.setCurrentTabByTag(tag.toString())
+    }
+
+    private var firstTime: Long = 0
+
+    override fun onBackPressed() {
+        hideSoftInput()
+        val intent = Intent(Intent.ACTION_MAIN)
+        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
+        intent.addCategory(Intent.CATEGORY_HOME)
+        startActivity(intent)
+    }
+
+    /**
+     * 接收消息回调
+     */
+    private val unReadChangeObserver = Observer<Int> { key, var1 ->
+        when (key) {
+            Const.ObserverKey.UN_READ_CHANGE -> {
+                runOnUiThread {
+                    if (binding.tabhost.tabWidget != null) {
+                        val view1 = binding.tabhost.tabWidget.getChildTabViewAt(0)
+                        if (view1 != null) {
+                            val view = view1.find<TextView>(R.id.tv_msg_count)
+                            if (var1 > 0) {
+                                view.visible()
+                                if (var1 > 99) {
+                                    view.text = "99+"
+                                } else {
+                                    view.text = var1.toString()
+                                }
+                            } else {
+                                view.gone()
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private val newMsgObserver = Observer<String> { key, var1 ->
+        when (key) {
+            Const.ObserverKey.TOPIC_CHILD_COMMENT, Const.ObserverKey.TOPIC_COMMENT, Const.ObserverKey.FOLLOW_TOPIC -> {
+                val view1 = binding.tabhost.tabWidget.getChildTabViewAt(3)
+                if (view1 != null) {
+                    view1.find<TextView>(R.id.tv_new_msg).visible()
+                }
+                if (key == Const.ObserverKey.TOPIC_CHILD_COMMENT) {
+                    MessageHelper.instance.isChildNewComment = true
+                }
+                if (key == Const.ObserverKey.TOPIC_COMMENT) {
+                    MessageHelper.instance.isNewComment = true
+                }
+                if (key == Const.ObserverKey.FOLLOW_TOPIC) {
+                    MessageHelper.instance.isFllowTopic = true
+                }
+                if (Const.ObserverKey.FOLLOW_TOPIC.equals(key)) {
+//                    val circleFragment =
+//                        getChildFragment<AbsV4Fragment<BaseContract.BasePresenter>>(MainTab.CIRCLE.reminderId)
+//                    bundle.putInt("select", -1)
+//                    bundle.putBoolean("new_msg", true)
+//                    circleFragment?.arguments = bundle
+                }
+            }
+        }
+    }
+
+    override fun requestPermissionSuccess(requestCode: Int) {
+        presenter.getUpdateVerson(false)
+    }
+
+    override fun getVersionUpdateDialog(
+            version: Version?,
+            confirmClickListener: DialogInterface.OnClickListener?,
+            cancelClickListener: DialogInterface.OnClickListener?
+    ): Dialog {
+        return CustomDialog.Builder(this)
+                .setTitle(getString(R.string._has_new_version, version?.releaseCode))
+                .setMessage(
+                        getString(
+                                R.string.version_content_tip1_,
+                                if (version?.tipsData == null) "" else version.tipsData
+                        )
+                )
+                .setNegativeButton(R.string.talk_later, cancelClickListener)
+                .setPositiveButton(R.string.immediately_update, confirmClickListener)
+                .create()
+    }
+
+    override fun getForceUpdateDialog(version: Version?, onClickListener: DialogInterface.OnClickListener?): Dialog {
+        return CustomDialog.Builder(this)
+                .setTitle(getString(R.string._has_new_version, version?.releaseCode))
+                .setMessage(
+                        getString(
+                                R.string.version_content_tips_,
+                                if (version?.tipsData == null) "" else version.tipsData
+                        )
+                )
+                .setPositiveButton(R.string.immediately_update, onClickListener)
+                .setCancelable(false)
+                .create()
+    }
+
+    override fun getUpdateVersonFailure(e: Exception) {
+    }
+
+    override fun getUpdateVersonSuccess(verson: ApkVersion) {
+        verson?.let {
+            val versionUpdateUtils = VersionUpdateUtils(this, false, this)
+            versionUpdateUtils.checkNewVersion(
+                    Version.Builder().setMandatory(it.mandatory == 2).setReleaseCode(
+                            it.version
+                    ).setUrl(verson.url).setTipsData(it.content).build()
+            )
+        }
+    }
+
+    override fun onResume() {
+        super.onResume()
+        loginIM()
+    }
+
+    override fun getLayoutResId(): Int {
+        return R.layout.activity_main
+    }
+
+    /**
+     * 登录融云
+     */
+    private fun loginIM() {
+        val user = AppConfig.instance.getUser()
+        ARouter.getInstance().navigation(ImRongService::class.java)
+                .loginIM(user.userId, user.accessToken, Observer { key, var1 ->
+                    if (key.equals(Const.ObserverKey.USER_LOGIN)) {
+                        if (var1) {
+                            getUnreadMsgCount()
+                        } else {
+                            ToastUtils.show("无法连接聊天服务器")
+                        }
+                    }
+                })
+    }
+
+    /**
+     * 识别二维码
+     */
+    private val qrcodeObserver = Observer<String> { key, var1 ->
+        parseQrCode(var1)
+    }
+
+    private val newFriendObserver = Observer<String> { key, var1 ->
+        runOnUiThread {
+            if (binding.tabhost.tabWidget != null) {
+                val view1 = binding.tabhost.tabWidget.getChildTabViewAt(1)
+                if (view1 != null) {
+                    val view = view1.find<TextView>(R.id.tv_new_msg)
+                    if (var1.equals(tips_message_add)) {
+                        view.visible()
+                        Preferences.saveBoolean("isShow", true)
+                    } else if (var1.equals(tips_message_clear)) {
+                        view.gone()
+                    } else {
+                        view.gone()
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 获取未读
+     */
+    private fun getUnreadMsgCount() {
+        ARouter.getInstance().navigation(ImRongService::class.java).getUnreadMsgCount()
+    }
+
+    /**
+     * 由于Arouter 不能使用frangment回传
+     * 故此使用宿主activity的onActivityResult分发
+     */
+    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+        super.onActivityResult(requestCode, resultCode, data)
+        if (resultCode != Activity.RESULT_OK) return
+        if (requestCode == 9999) {
+            Utils.installApk(this, apkLocalPath)
+        }
+        when (requestCode) {
+            in 10..19 -> {
+                getChildFragment<AbsV4Fragment<BaseContract.BasePresenter>>(ReminderId.CHAT)?.onActivityResult(
+                        requestCode,
+                        resultCode,
+                        data
+                )
+            }
+            in 20..29 -> {
+                getChildFragment<AbsV4Fragment<BaseContract.BasePresenter>>(ReminderId.CONTACT)?.onActivityResult(
+                        requestCode,
+                        resultCode,
+                        data
+                )
+            }
+            in 30..39 -> {
+                getChildFragment<AbsV4Fragment<BaseContract.BasePresenter>>(ReminderId.MINE)?.onActivityResult(
+                        requestCode,
+                        resultCode,
+                        data
+                )
+            }
+//            in 40..41 -> {
+//                getChildFragment<AbsV4Fragment<BaseContract.BasePresenter>>(ReminderId.NAV1)?.onActivityResult(
+//                        requestCode,
+//                        resultCode,
+//                        data
+//                )
+//            }
+            Const.RequestCode.SCANNER -> {
+                //二维码
+//                type=bc_chat&userId=${user.userId}&nickname=${user.nickname}&phone=${user.phone}&photo=${user.photo}
+                if (data == null) return
+                val result = data.getStringExtra("result")
+                parseQrCode(result)
+            }
+        }
+    }
+
+    private fun parseQrCode(result: String?) {
+        if (!result.isNullOrEmpty()) {
+            val uri = Uri.parse(result)
+            if (uri == null) {
+                ToastUtils.show("无法识别")
+                return
+            }
+            Logger.e("MainActivity", uri.toString())
+            val source = uri.getQueryParameter("source")
+            if (Const.QR_CODE_URL_SOURCE.equals(source)) {
+                val type = uri.getQueryParameter("type")
+                if (Const.QrType.USER_TYPE.equals(type)) {
+                    val userId = uri.getQueryParameter("id")
+                    presenter.userInfoTask(userId)
+                } else if (Const.QrType.GROUP_TYPE.equals(type)) {
+                    val groupId = uri.getQueryParameter("id")
+                    val name = uri.getQueryParameter("name")
+                    presenter.groupinfoTask(groupId!!, name)
+                } else {
+                    ToastUtils.show("无法识别")
+                }
+            } else {
+                if (result.startsWith("http") || result.startsWith("https")) {
+                    val intent = Intent()
+                    intent.action = "android.intent.action.VIEW"
+                    val content_url = Uri.parse(result)
+                    intent.data = content_url
+                    startActivity(intent)
+                }
+            }
+        } else {
+            ToastUtils.show("无法识别")
+        }
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+        ObserverManager.getInstance().unregisterObserver(Const.ObserverKey.UN_READ_CHANGE, unReadChangeObserver)
+        ObserverManager.getInstance().unregisterObserver(Const.ObserverKey.TOPIC_CHILD_COMMENT, newMsgObserver)
+        ObserverManager.getInstance().unregisterObserver(Const.ObserverKey.TOPIC_COMMENT, newMsgObserver)
+        ObserverManager.getInstance().unregisterObserver(Const.ObserverKey.FOLLOW_TOPIC, newMsgObserver)
+        ObserverManager.getInstance().unregisterObserver(Const.ObserverKey.SCANNER_QRCODE, qrcodeObserver)
+        ObserverManager.getInstance().unregisterObserver(Const.ObserverKey.NEW_FRIEND, newFriendObserver)
+    }
+
+}

+ 60 - 0
im/app/src/main/java/com/sinata/bc_chat/SplashActivity.kt

@@ -0,0 +1,60 @@
+package com.sinata.bc_chat
+
+import android.content.Intent
+import android.os.Handler
+import android.os.Looper
+import com.bc_chat.account.GuideActivity
+import com.bc_chat.account.task.SplashTask
+import com.bc_chat.bc_base.entity.SplashAndAdImage
+import com.bc_chat.bc_base.utils.Const
+import com.zhaohaoting.framework.abs.BaseNoActionBarActivity
+import com.zhaohaoting.framework.abs.contract.BaseContract
+import com.zhaohaoting.framework.requset.NetWorkCallBack
+import com.zhaohaoting.framework.utils.observer.Observer
+import com.zhaohaoting.framework.utils.observer.ObserverManager
+
+/**
+ * author:Created by zhaohaoting on 2019/3/19
+ * email:526309416@qq.com
+ * desc:
+ */
+class SplashActivity : BaseNoActionBarActivity<BaseContract.BasePresenter>() {
+
+    private val handler: Handler = Handler(Looper.getMainLooper())
+
+    override fun initPresenter(): BaseContract.BasePresenter? = null
+
+    override fun getLayoutResId(): Int = R.layout.activity_splash
+
+    override fun onInit() {
+        setLightMode(resources.getColor(com.bc_chat.account.R.color.transparent), false, true)
+        taskHelper.execute<Any>(SplashTask(), object : NetWorkCallBack<SplashAndAdImage>() {
+            override fun onPostExecuteFailure(task: Any, exception: Exception) {
+                super.onPostExecuteFailure(task, exception)
+                handler.postDelayed({ enterGuide(SplashAndAdImage()) }, 100)
+            }
+
+            override fun onPostExecuteSuccess(task: Any, splashImages: SplashAndAdImage?) {
+                handler.postDelayed({ enterGuide(splashImages) }, 100)
+            }
+        })
+    }
+
+    private fun enterGuide(splashImages: SplashAndAdImage?) {
+        val intent = Intent(this, GuideActivity::class.java)
+        intent.putExtra("splashImages", splashImages)
+        startActivity(intent)
+        finish()
+    }
+
+    private val observer = Observer<Any> { key, var1 ->
+        handler.removeCallbacksAndMessages(null)
+        finish()
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+        handler.removeCallbacksAndMessages(null)
+        ObserverManager.getInstance().unregisterObserver(Const.Action.NOTICE_START_MAIN, observer)
+    }
+}

+ 171 - 0
im/app/src/main/java/com/sinata/bc_chat/fragment/Nav1Fragment.java

@@ -0,0 +1,171 @@
+package com.sinata.bc_chat.fragment;
+
+
+import android.content.ActivityNotFoundException;
+import android.content.Intent;
+import android.net.http.SslError;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.webkit.CookieManager;
+import android.webkit.CookieSyncManager;
+import android.webkit.SslErrorHandler;
+import android.webkit.WebChromeClient;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+import android.widget.ProgressBar;
+import android.widget.Toast;
+
+import com.bc_chat.bc_base.view.CustomWebView;
+import com.sinata.bc_chat.R;
+
+/**
+ * 导航1
+ */
+public class Nav1Fragment extends Fragment {
+
+    private CustomWebView mWebView;
+    private ProgressBar mLoadBar;
+    private WebSettings mWs;
+    public static String homeUrl = "https://www.baidu.com";
+
+    public Nav1Fragment
+            () {
+    }
+
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        return inflater.inflate(R.layout.fragment_website, container, false);
+    }
+
+    @Override
+    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        initView();
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+    }
+
+    private void initActionBar() {
+//        TextView mTvTitle = getView().findViewById(R.id.tvTitle);
+//        mTvTitle.setText(title);
+//        TextView tvHome = getView().findViewById(R.id.tvHome);
+//        tvHome.setOnClickListener(view -> mWebView.loadUrl(homeUrl));
+//        tvHome.setVisibility(View.VISIBLE);
+//        TextView tvRefresh = getView().findViewById(R.id.tvRefresh);
+//        tvRefresh.setOnClickListener(view -> mWebView.reload());
+//        tvRefresh.setVisibility(View.VISIBLE);
+    }
+
+    private void initView() {
+
+        initActionBar();
+
+        mWebView = getView().findViewById(R.id.wv_web);
+        mLoadBar = getView().findViewById(R.id.pb_load_bar);
+
+        mWs = mWebView.getSettings();
+        // 设置可以支持缩放
+        mWs.setSupportZoom(true);
+        // 设置出现缩放工具
+        mWs.setBuiltInZoomControls(true);
+        //设置可在大视野范围内上下左右拖动,并且可以任意比例缩放
+        mWs.setUseWideViewPort(true);
+        //设置默认加载的可视范围是大视野范围
+        mWs.setLoadWithOverviewMode(true);
+        //自适应屏幕
+        mWs.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
+        //支持js
+        mWs.setJavaScriptEnabled(true);
+
+        mWebView.setWebChromeClient(new WebChromeClient() {
+            @Override
+            public void onProgressChanged(WebView webView, int progress) {
+                mLoadBar.setProgress(progress);
+            }
+        });
+
+        mWebView.getSettings().setDomStorageEnabled(true);
+
+        mWebView.setWebViewClient(new WebViewClient() {
+
+            @Override
+            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+                    mWebView.getSettings()
+                            .setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
+                }
+            }
+
+            @Override
+            public void onPageFinished(WebView webView, String url) {
+                mLoadBar.setVisibility(View.GONE);
+
+                CookieManager cookieManager = CookieManager.getInstance();
+                cookieManager.setAcceptCookie(true);
+                String endCookie = cookieManager.getCookie(url);
+                Log.i("XWEBVIEW", "onPageFinished: endCookie : " + endCookie);
+                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
+                    CookieSyncManager.getInstance().sync();//同步cookie
+                } else {
+                    CookieManager.getInstance().flush();
+                }
+            }
+
+            @Override
+            public boolean shouldOverrideUrlLoading(WebView view, String url) {
+                //返回值是true的时候控制去WebView打开,
+                // 为false调用系统浏览器或第三方浏览器
+                if (url.startsWith("http") || url.startsWith("https") || url.startsWith("ftp")) {
+                    return false;
+                } else {
+                    try {
+//                        Intent intent = new Intent();
+//                        intent.setAction(Intent.ACTION_VIEW);
+//                        intent.setData(Uri.parse(url));
+//                        view.getContext().startActivity(intent);
+                    } catch (ActivityNotFoundException e) {
+                        Toast.makeText(view.getContext(), "手机还没有安装支持打开此网页的应用!", Toast.LENGTH_SHORT).show();
+                    }
+                    return true;
+                }
+            }
+        });
+
+
+        mWebView.loadUrl(homeUrl);
+
+    }
+
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+
+    }
+
+    public boolean onKeyDown(int keyCode, KeyEvent event) {
+        if (keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack()) {
+            mWebView.goBack(); //goBack()表示返回WebView的上一页面
+            return true;
+        }
+        return false;
+    }
+
+}

+ 172 - 0
im/app/src/main/java/com/sinata/bc_chat/fragment/Nav2Fragment.java

@@ -0,0 +1,172 @@
+package com.sinata.bc_chat.fragment;
+
+
+import android.content.ActivityNotFoundException;
+import android.content.Intent;
+import android.net.http.SslError;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.webkit.CookieManager;
+import android.webkit.CookieSyncManager;
+import android.webkit.SslErrorHandler;
+import android.webkit.WebChromeClient;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.bc_chat.bc_base.view.CustomWebView;
+import com.sinata.bc_chat.R;
+
+
+/**
+ * 导航1
+ */
+public class Nav2Fragment extends Fragment {
+
+    private CustomWebView mWebView;
+    private ProgressBar mLoadBar;
+    private WebSettings mWs;
+    public static String homeUrl = "https://www.baidu.com";
+    public static String title = "百度";
+
+
+    public Nav2Fragment
+            () {
+    }
+
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        return inflater.inflate(R.layout.fragment_website, container, false);
+    }
+
+    @Override
+    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        initView();
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+    }
+
+    private void initActionBar() {
+//        TextView mTvTitle = getView().findViewById(R.id.tvTitle);
+//        mTvTitle.setText(title);
+//        TextView tvHome = getView().findViewById(R.id.tvHome);
+//        tvHome.setOnClickListener(view -> mWebView.loadUrl(homeUrl));
+//        tvHome.setVisibility(View.VISIBLE);
+//        TextView tvRefresh = getView().findViewById(R.id.tvRefresh);
+//        tvRefresh.setOnClickListener(view -> mWebView.reload());
+//        tvRefresh.setVisibility(View.VISIBLE);
+    }
+
+    private void initView() {
+
+        initActionBar();
+
+        mWebView = getView().findViewById(R.id.wv_web);
+        mLoadBar = getView().findViewById(R.id.pb_load_bar);
+
+        mWs = mWebView.getSettings();
+        // 设置可以支持缩放
+        mWs.setSupportZoom(true);
+        // 设置出现缩放工具
+        mWs.setBuiltInZoomControls(true);
+        //设置可在大视野范围内上下左右拖动,并且可以任意比例缩放
+        mWs.setUseWideViewPort(true);
+        //设置默认加载的可视范围是大视野范围
+        mWs.setLoadWithOverviewMode(true);
+        //自适应屏幕
+        mWs.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
+        //支持js
+        mWs.setJavaScriptEnabled(true);
+
+        mWebView.setWebChromeClient(new WebChromeClient() {
+            @Override
+            public void onProgressChanged(WebView webView, int progress) {
+                mLoadBar.setProgress(progress);
+            }
+        });
+
+        mWebView.getSettings().setDomStorageEnabled(true);
+
+        mWebView.setWebViewClient(new WebViewClient() {
+
+            @Override
+            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
+                handler.proceed();
+            }
+
+            @Override
+            public void onPageFinished(WebView webView, String url) {
+                mLoadBar.setVisibility(View.GONE);
+
+                CookieManager cookieManager = CookieManager.getInstance();
+                cookieManager.setAcceptCookie(true);
+                String endCookie = cookieManager.getCookie(url);
+                Log.i("XWEBVIEW", "onPageFinished: endCookie : " + endCookie);
+                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
+                    CookieSyncManager.getInstance().sync();//同步cookie
+                } else {
+                    CookieManager.getInstance().flush();
+                }
+            }
+
+            @Override
+            public boolean shouldOverrideUrlLoading(WebView view, String url) {
+                //返回值是true的时候控制去WebView打开,
+                // 为false调用系统浏览器或第三方浏览器
+                if (url.startsWith("http") || url.startsWith("https") || url.startsWith("ftp")) {
+                    return false;
+                } else {
+                    try {
+//                        Intent intent = new Intent();
+//                        intent.setAction(Intent.ACTION_VIEW);
+//                        intent.setData(Uri.parse(url));
+//                        view.getContext().startActivity(intent);
+                    } catch (ActivityNotFoundException e) {
+                        Toast.makeText(view.getContext(), "手机还没有安装支持打开此网页的应用!", Toast.LENGTH_SHORT).show();
+                    }
+                    return true;
+                }
+            }
+        });
+
+
+        mWebView.loadUrl(homeUrl);
+
+    }
+
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+
+    }
+
+    public boolean onKeyDown(int keyCode, KeyEvent event) {
+        if (keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack()) {
+            mWebView.goBack(); //goBack()表示返回WebView的上一页面
+            return true;
+        }
+        return false;
+    }
+
+}

+ 58 - 0
im/app/src/main/java/com/sinata/bc_chat/fragment/NoticeDialogFragment.java

@@ -0,0 +1,58 @@
+package com.sinata.bc_chat.fragment;
+
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.app.DialogFragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.widget.TextView;
+
+import com.bc_chat.bc_base.entity.wallet.NoticeEntity;
+import com.makeramen.roundedimageview.RoundedImageView;
+import com.sinata.bc_chat.R;
+import com.zhaohaoting.framework.utils.glid.GlideUtils;
+
+
+public class NoticeDialogFragment extends DialogFragment {
+
+    private NoticeEntity noticeEntity;
+
+    public void setNoticeEntity(NoticeEntity noticeEntity) {
+        this.noticeEntity = noticeEntity;
+    }
+
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        if (getDialog() != null && getDialog().getWindow() != null) {
+            // 设置背景透明
+            getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
+            getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
+        }
+        View view = inflater.inflate(R.layout.notice_dialog, container, false);
+        view.findViewById(R.id.tvAdOk).setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                dissDialog();
+            }
+        });
+        if (noticeEntity != null) {
+            RoundedImageView roundImageView = view.findViewById(R.id.ivAdImg);
+            GlideUtils.loadCenterCropImage(getContext(), noticeEntity.getPic(), roundImageView);
+            TextView tvContent = view.findViewById(R.id.tvContent);
+            tvContent.setText(noticeEntity.getContent());
+        }
+
+        return view;
+    }
+
+    public void dissDialog() {
+        this.dismiss();
+    }
+
+}

+ 86 - 0
im/app/src/main/java/com/sinata/bc_chat/receiver/NotificationReceiver.java

@@ -0,0 +1,86 @@
+package com.sinata.bc_chat.receiver;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+
+import com.bc_chat.bc_base.utils.Const;
+import com.bc_chat.im.service.CommentPushEntity;
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import com.zhaohaoting.framework.utils.Logger;
+import com.zhaohaoting.framework.utils.observer.ObserverManager;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import io.rong.push.PushType;
+import io.rong.push.notification.PushMessageReceiver;
+import io.rong.push.notification.PushNotificationMessage;
+
+/**
+ * author:Created by zhaohaoting on 2019/3/29
+ * email:526309416@qq.com
+ * desc:
+ */
+public class NotificationReceiver extends PushMessageReceiver {
+    @Override
+    public boolean onNotificationMessageArrived(Context context, PushType pushType, PushNotificationMessage pushNotificationMessage) {
+//        String pushContent = pushNotificationMessage.getExtra();
+//        if (!TextUtils.isEmpty(pushContent)) {
+//            try {
+//                JSONObject jsonObject = new JSONObject(pushContent);
+//                String type = jsonObject.optString("pushType");
+//                if (Const.PushMethod.DISS_GROUP.equals(type)) {
+//                    String groupId = jsonObject.optString("groupId");
+//                    RongIM.getInstance().clearMessages(Conversation.ConversationType.GROUP, groupId, new RongIMClient.ResultCallback<Boolean>() {
+//                        @Override
+//                        public void onSuccess(Boolean aBoolean) {
+//                            RongIM.getInstance().removeConversation(Conversation.ConversationType.GROUP, groupId, null);
+//                        }
+//
+//                        @Override
+//                        public void onError(RongIMClient.ErrorCode errorCode) {
+//                        }
+//                    });
+//                }
+//            } catch (JSONException e) {
+//                e.printStackTrace();
+//            }
+//        }
+        return false;
+    }
+
+    @Override
+    public boolean onNotificationMessageClicked(Context context, PushType pushType, PushNotificationMessage pushNotificationMessage) {
+        Logger.e("onNotificationMessageClicked", pushType + "===============" + pushNotificationMessage.getExtra() + " 1 " + pushNotificationMessage.getPushData() + " 2 " + pushNotificationMessage.getPushContent());
+
+        if (String.valueOf(-1).equals(pushNotificationMessage.getSenderId())) {
+            String isFromPush = !pushNotificationMessage.getSourceType().equals(PushNotificationMessage.PushSourceType.FROM_OFFLINE_MESSAGE) && !pushNotificationMessage.getSourceType().equals(PushNotificationMessage.PushSourceType.FROM_ADMIN) ? "false" : "true";
+            Intent intent = new Intent();
+            Uri.Builder builder = Uri.parse("rong://" + context.getPackageName()).buildUpon()
+                    .appendPath("conversationlist").appendQueryParameter("isFromPush", isFromPush);
+            JSONObject options = new JSONObject();
+            JSONObject appData = new JSONObject();
+            try {
+//                {"content":"用户18123292546回复了你的评论。","extra":{"cid":"1026","commentId":"110","type":12}}
+                appData.put("extra", new JSONObject(pushNotificationMessage.getPushData()).getJSONObject("extra"));
+                options.put("appData", appData.toString());
+            } catch (JSONException e) {
+                e.printStackTrace();
+            }
+            intent.putExtra("options", options.toString());
+            intent.setData(builder.build());
+            intent.setPackage(context.getPackageName());
+            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+            context.startActivity(intent);
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public void onThirdPartyPushState(PushType pushType, String action, long resultCode) {
+        super.onThirdPartyPushState(pushType, action, resultCode);
+    }
+}

+ 235 - 0
im/app/src/main/java/com/sinata/bc_chat/utils/GsonUtil.java

@@ -0,0 +1,235 @@
+package com.sinata.bc_chat.utils;
+
+import android.text.TextUtils;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParser;
+import com.google.gson.reflect.TypeToken;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class GsonUtil {
+    private static Gson gson = null;
+
+    static {
+        if (gson == null) {
+            gson = new Gson();
+        }
+    }
+
+    private GsonUtil() {
+    }
+
+    /**
+     * 转成json
+     *
+     * @param object
+     * @return
+     */
+    public static String gsonString(Object object) {
+        String gsonString = null;
+        if (gson != null) {
+            gsonString = gson.toJson(object);
+        }
+        return gsonString;
+    }
+
+    /**
+     * 转成bean
+     *
+     * @param gsonString
+     * @param cls
+     * @return
+     */
+    public static <T> T gsonToBean(String gsonString, Type cls) {
+        T t = null;
+        if (gson != null) {
+            t = gson.fromJson(gsonString, cls);
+        }
+        return t;
+    }
+
+    /**
+     * 转成list
+     * 泛型在编译期类型被擦除导致报错
+     *
+     * @param gsonString
+     * @param cls
+     * @return
+     */
+    public static <T> List<T> gsonToList(String gsonString, Class<T> cls) {
+        List<T> list = null;
+        if (gson != null) {
+            list = gson.fromJson(gsonString, new TypeToken<List<T>>() {
+            }.getType());
+        }
+        return list;
+    }
+
+    /**
+     * 转成list
+     * 解决泛型问题
+     *
+     * @param json
+     * @param cls
+     * @param <T>
+     * @return
+     */
+    public static <T> List<T> jsonToList(String json, Class<T> cls) {
+        Gson gson = new Gson();
+        List<T> list = new ArrayList<T>();
+        JsonArray array = new JsonParser().parse(json).getAsJsonArray();
+        for (final JsonElement elem : array) {
+            list.add(gson.fromJson(elem, cls));
+        }
+        return list;
+    }
+
+
+    /**
+     * 转成list中有map的
+     *
+     * @param gsonString
+     * @return
+     */
+    public static <T> List<Map<String, T>> gsonToListMaps(String gsonString) {
+        List<Map<String, T>> list = null;
+        if (gson != null) {
+            list = gson.fromJson(gsonString,
+                    new TypeToken<List<Map<String, T>>>() {
+                    }.getType());
+        }
+        return list;
+    }
+
+    /**
+     * 转成map的
+     *
+     * @param gsonString
+     * @return
+     */
+    public static <T> Map<String, T> gsonToMaps(String gsonString) {
+        Map<String, T> map = null;
+        if (gson != null) {
+            map = gson.fromJson(gsonString, new TypeToken<Map<String, T>>() {
+            }.getType());
+        }
+        return map;
+    }
+
+    // -------
+
+    /**
+     * 按章节点得到相应的内容
+     *
+     * @param jsonString json字符串
+     * @param note       节点
+     * @return 节点对应的内容
+     */
+    public static String getNoteJsonString(String jsonString, String note) {
+        if (TextUtils.isEmpty(jsonString)) {
+            throw new RuntimeException("json字符串");
+        }
+        if (TextUtils.isEmpty(note)) {
+            throw new RuntimeException("note标签不能为空");
+        }
+        JsonElement element = new JsonParser().parse(jsonString);
+        if (element.isJsonNull()) {
+            throw new RuntimeException("得到的jsonElement对象为空");
+        }
+        return element.getAsJsonObject().get(note).toString();
+    }
+
+    /**
+     * 按照节点得到节点内容,然后传化为相对应的bean数组
+     *
+     * @param jsonString 原json字符串
+     * @param note       节点标签
+     * @param beanClazz  要转化成的bean class
+     * @return 返回bean的数组
+     */
+    public static <T> List<T> parserJsonToArrayBeans(String jsonString, String note, Class<T> beanClazz) {
+        String noteJsonString = getNoteJsonString(jsonString, note);
+        return parserJsonToArrayBeans(noteJsonString, beanClazz);
+    }
+
+    /**
+     * 按照节点得到节点内容,转化为一个数组
+     *
+     * @param jsonString json字符串
+     * @param beanClazz  集合里存入的数据对象
+     * @return 含有目标对象的集合
+     */
+    public static <T> List<T> parserJsonToArrayBeans(String jsonString, Class<T> beanClazz) {
+        if (TextUtils.isEmpty(jsonString)) {
+            throw new RuntimeException("json字符串为空");
+        }
+        JsonElement jsonElement = new JsonParser().parse(jsonString);
+        if (jsonElement.isJsonNull()) {
+            throw new RuntimeException("得到的jsonElement对象为空");
+        }
+        if (!jsonElement.isJsonArray()) {
+            throw new RuntimeException("json字符不是一个数组对象集合");
+        }
+        JsonArray jsonArray = jsonElement.getAsJsonArray();
+        List<T> beans = new ArrayList<T>();
+        for (JsonElement jsonElement2 : jsonArray) {
+            T bean = new Gson().fromJson(jsonElement2, beanClazz);
+            beans.add(bean);
+        }
+        return beans;
+    }
+
+    /**
+     * 把相对应节点的内容封装为对象
+     *
+     * @param jsonString json字符串
+     * @param clazzBean  要封装成的目标对象
+     * @return 目标对象
+     */
+    public static <T> T parserJsonToArrayBean(String jsonString, Class<T> clazzBean) {
+        if (TextUtils.isEmpty(jsonString)) {
+            throw new RuntimeException("json字符串为空");
+        }
+        JsonElement jsonElement = new JsonParser().parse(jsonString);
+        if (jsonElement.isJsonNull()) {
+            throw new RuntimeException("json字符串为空");
+        }
+        if (!jsonElement.isJsonObject()) {
+            throw new RuntimeException("json不是一个对象");
+        }
+        return new Gson().fromJson(jsonElement, clazzBean);
+    }
+
+    /**
+     * 按照节点得到节点内容,转化为一个数组
+     *
+     * @param jsonString json字符串
+     * @param note       json标签
+     * @param clazzBean  集合里存入的数据对象
+     * @return 含有目标对象的集合
+     */
+    public static <T> T parserJsonToArrayBean(String jsonString, String note, Class<T> clazzBean) {
+        String noteJsonString = getNoteJsonString(jsonString, note);
+        return parserJsonToArrayBean(noteJsonString, clazzBean);
+    }
+
+    /**
+     * 把bean对象转化为json字符串
+     *
+     * @param obj bean对象
+     * @return 返回的是json字符串
+     */
+    public static String toJsonString(Object obj) {
+        if (obj != null) {
+            return new Gson().toJson(obj);
+        } else {
+            throw new RuntimeException("对象不能为空");
+        }
+    }
+}

+ 77 - 0
im/app/src/main/java/com/sinata/bc_chat/utils/MainTab.java

@@ -0,0 +1,77 @@
+package com.sinata.bc_chat.utils;
+
+import android.support.v4.app.Fragment;
+
+import com.alibaba.android.arouter.core.LogisticsCenter;
+import com.alibaba.android.arouter.facade.Postcard;
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.bc_chat.bc_base.config.RouteConfig;
+import com.sinata.bc_chat.R;
+import com.sinata.bc_chat.fragment.Nav1Fragment;
+import com.sinata.bc_chat.fragment.Nav2Fragment;
+
+/**
+ * author:Created by zhaohaoting on 2019/2/20
+ * email:526309416@qq.com
+ * desc:
+ */
+public enum MainTab {
+
+    CHAT(ReminderId.CHAT, "消息", R.drawable.tab_icon_chat, getFragmentClass(RouteConfig.CHAT_FRAGMENT)),
+
+    CONTACT(ReminderId.CONTACT, "联系人", R.drawable.tab_icon_contact, getFragmentClass(RouteConfig.CONTACTS_FRAGMENT)),
+
+    NAV1(ReminderId.NAV1, "百度", R.drawable.tab_icon_score, Nav1Fragment.class),
+
+    NAV2(ReminderId.NAV2, "百度", R.drawable.tab_icon_score, Nav2Fragment.class),
+
+    MINE(ReminderId.MINE, "我的", R.drawable.tab_icon_mine, getFragmentClass(RouteConfig.MINE_FRAGMENT));
+
+    private int reminderId;
+    private String resName;
+    private int resIcon;
+    private Class<?> clz;
+
+    MainTab(int reminderId, String resName, int resIcon, Class<? extends Fragment> clz) {
+        this.reminderId = reminderId;
+        this.resName = resName;
+        this.resIcon = resIcon;
+        this.clz = clz;
+    }
+
+    public int getReminderId() {
+        return reminderId;
+    }
+
+    public String getResName() {
+        return resName;
+    }
+
+    public void setResName(String resName) {
+        this.resName = resName;
+    }
+
+    public int getResIcon() {
+        return resIcon;
+    }
+
+    public Class<?> getClz() {
+        return clz;
+    }
+
+    public static MainTab fromReminderId(int reminderId) {
+        for (MainTab value : MainTab.values()) {
+            if (value.reminderId == reminderId) {
+                return value;
+            }
+        }
+        return null;
+    }
+
+    public static Class getFragmentClass(String routerPath) {
+        Postcard postcard = ARouter.getInstance().build(routerPath);
+        LogisticsCenter.completion(postcard);
+        return postcard.getDestination();
+    }
+
+}

+ 31 - 0
im/app/src/main/java/com/sinata/bc_chat/utils/NavDataUtil.java

@@ -0,0 +1,31 @@
+package com.sinata.bc_chat.utils;
+
+import android.text.TextUtils;
+
+import com.bc_chat.bc_base.entity.FriendApplyRecordBean;
+import com.bc_chat.bc_base.entity.NavEntity;
+import com.google.gson.reflect.TypeToken;
+import com.zhaohaoting.framework.utils.Preferences;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class NavDataUtil {
+    public static List<NavEntity> getNavData() {
+        String json = Preferences.getNavJson();
+        if (!TextUtils.isEmpty(json)) {
+            return GsonUtil.gsonToBean(json, new TypeToken<List<NavEntity>>() {
+            }.getType());
+        }
+        return new ArrayList<>();
+    }
+
+    public static boolean isShowTipsMsg(List<FriendApplyRecordBean> dataBean) {
+        for (int index = 0; index < dataBean.size(); index++) {
+            if (dataBean.get(index).getType() == 2 && dataBean.get(index).getState() == 1) {
+                return true;
+            }
+        }
+        return false;
+    }
+}

+ 10 - 0
im/app/src/main/java/com/sinata/bc_chat/utils/ReminderId.java

@@ -0,0 +1,10 @@
+package com.sinata.bc_chat.utils;
+
+public interface ReminderId {
+    int CHAT = 0;//聊天
+    int CONTACT = 1; //联系人
+    int NAV1 = 2;//网页
+    int NAV2 = 3;//圈子
+    int MINE = 4;//我的
+
+}

Файловите разлики са ограничени, защото са твърде много
+ 34 - 0
im/app/src/main/res/drawable-v24/ic_launcher_foreground.xml


+ 10 - 0
im/app/src/main/res/drawable/a_bg_for_ad_confirm.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <corners
+        android:bottomLeftRadius="10dp"
+        android:bottomRightRadius="10dp" />
+
+    <solid android:color="#fc7466" />
+
+</shape>

+ 6 - 0
im/app/src/main/res/drawable/a_bg_for_code.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <corners android:radius="10dp" />
+    <solid android:color="@color/white" />
+
+</shape>

+ 7 - 0
im/app/src/main/res/drawable/home_tab_text_selector.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="@color/theme_text_color" android:state_pressed="true" />
+    <item android:color="@color/theme_text_color" android:state_checked="true" />
+    <item android:color="@color/theme_text_color" android:state_selected="true" />
+    <item android:color="@color/tab_default_color" />
+</selector>

+ 170 - 0
im/app/src/main/res/drawable/ic_launcher_background.xml

@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="utf-8"?>
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="108dp"
+    android:height="108dp"
+    android:viewportWidth="108"
+    android:viewportHeight="108">
+    <path
+        android:fillColor="#008577"
+        android:pathData="M0,0h108v108h-108z" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M9,0L9,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,0L19,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M29,0L29,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M39,0L39,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M49,0L49,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M59,0L59,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M69,0L69,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M79,0L79,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M89,0L89,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M99,0L99,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,9L108,9"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,19L108,19"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,29L108,29"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,39L108,39"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,49L108,49"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,59L108,59"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,69L108,69"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,79L108,79"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,89L108,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,99L108,99"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,29L89,29"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,39L89,39"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,49L89,49"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,59L89,59"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,69L89,69"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,79L89,79"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M29,19L29,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M39,19L39,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M49,19L49,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M59,19L59,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M69,19L69,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M79,19L79,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+</vector>

+ 5 - 0
im/app/src/main/res/drawable/selector_text_color_nav.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="#1E81D1" android:state_checked="true" />
+    <item android:color="@color/black" android:state_checked="false" />
+</selector>

+ 4 - 0
im/app/src/main/res/drawable/skin_global_bg.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<color xmlns:android="http://schemas.android.com/apk/res/android" 
+    android:color="@color/white">
+</color>

+ 7 - 0
im/app/src/main/res/drawable/tab_icon_chat.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@mipmap/tab_contact_1" android:state_pressed="true" />
+    <item android:drawable="@mipmap/tab_contact_1" android:state_checked="true" />
+    <item android:drawable="@mipmap/tab_contact_1" android:state_selected="true" />
+    <item android:drawable="@mipmap/tab_contact_0" />
+</selector>

+ 7 - 0
im/app/src/main/res/drawable/tab_icon_circle.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@mipmap/tab_circle_1" android:state_pressed="true" />
+    <item android:drawable="@mipmap/tab_circle_1" android:state_checked="true" />
+    <item android:drawable="@mipmap/tab_circle_1" android:state_selected="true" />
+    <item android:drawable="@mipmap/tab_circle_0" />
+</selector>

+ 7 - 0
im/app/src/main/res/drawable/tab_icon_contact.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@mipmap/tab_chat_1" android:state_pressed="true" />
+    <item android:drawable="@mipmap/tab_chat_1" android:state_checked="true" />
+    <item android:drawable="@mipmap/tab_chat_1" android:state_selected="true" />
+    <item android:drawable="@mipmap/tab_chat_0" />
+</selector>

+ 7 - 0
im/app/src/main/res/drawable/tab_icon_mine.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@mipmap/tab_mine_1" android:state_pressed="true" />
+    <item android:drawable="@mipmap/tab_mine_1" android:state_checked="true" />
+    <item android:drawable="@mipmap/tab_mine_1" android:state_selected="true" />
+    <item android:drawable="@mipmap/tab_mine_0" />
+</selector>

+ 7 - 0
im/app/src/main/res/drawable/tab_icon_score.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@mipmap/tab_score_1" android:state_pressed="true" />
+    <item android:drawable="@mipmap/tab_score_1" android:state_checked="true" />
+    <item android:drawable="@mipmap/tab_score_1" android:state_selected="true" />
+    <item android:drawable="@mipmap/tab_score_0" />
+</selector>

+ 38 - 0
im/app/src/main/res/layout/activity_main.xml

@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <data></data>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical">
+
+        <FrameLayout
+            android:id="@id/contentPanel"
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            android:layout_weight="1" />
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1px"
+            android:background="#1A000000" />
+
+        <com.zhaohaoting.framework.ui.utils.FragmentTabHost
+            android:id="@android:id/tabhost"
+            android:layout_width="match_parent"
+            android:layout_height="50dp"
+            android:background="@color/white">
+
+            <FrameLayout
+                android:id="@android:id/tabcontent"
+                android:layout_width="0dp"
+                android:layout_height="0dp"
+                android:layout_weight="0" />
+        </com.zhaohaoting.framework.ui.utils.FragmentTabHost>
+    </LinearLayout>
+
+</layout>

+ 21 - 0
im/app/src/main/res/layout/activity_main2.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@drawable/skin_global_bg"
+    android:orientation="vertical">
+
+    <FrameLayout
+        android:id="@+id/flContent"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1" />
+
+    <!--底部-->
+    <include
+        layout="@layout/layout_main_footbar"
+        android:layout_width="match_parent"
+        android:layout_height="54dp" />
+
+</LinearLayout>

+ 35 - 0
im/app/src/main/res/layout/fragment_website.xml

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <!--    <include layout="@layout/a_view_actionbar" />-->
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1">
+
+        <com.bc_chat.bc_base.view.CustomWebView
+            android:id="@+id/wv_web"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent" />
+
+        <ProgressBar
+            android:id="@+id/pb_load_bar"
+            style="@style/Widget.AppCompat.ProgressBar.Horizontal"
+            android:layout_width="match_parent"
+            android:layout_height="3dp"
+            android:background="@android:color/transparent"
+            android:indeterminate="false"
+            android:max="100"
+            android:progress="50" />
+    </RelativeLayout>
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="1px"
+        android:background="#c4c4c4" />
+
+</LinearLayout>

+ 55 - 0
im/app/src/main/res/layout/home_tab_layout.xml

@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="60dp"
+        android:layout_gravity="center"
+        android:gravity="center"
+        android:orientation="vertical">
+
+        <ImageView
+            android:id="@+id/tab_icon"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" />
+
+        <TextView
+            android:id="@+id/tabView"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:drawablePadding="2dp"
+            android:textColor="@drawable/home_tab_text_selector"
+            android:textSize="12sp" />
+    </LinearLayout>
+
+    <TextView
+        android:id="@+id/tv_msg_count"
+        android:layout_width="14dp"
+        android:layout_height="14dp"
+        android:layout_gravity="center_horizontal"
+        android:layout_marginLeft="15dp"
+        android:layout_marginTop="3dp"
+        android:background="@drawable/shape_red_dot"
+        android:gravity="center"
+        android:textColor="@color/white"
+        android:textSize="9sp"
+        android:visibility="gone"
+        tools:text="99" />
+
+    <TextView
+        android:id="@+id/tv_new_msg"
+        android:layout_width="14dp"
+        android:layout_height="14dp"
+        android:layout_gravity="center_horizontal"
+        android:layout_marginLeft="15dp"
+        android:layout_marginTop="3dp"
+        android:background="@drawable/shape_red_dot"
+        android:gravity="center"
+        android:textColor="@color/white"
+        android:textSize="9sp"
+        android:visibility="gone" />
+
+</FrameLayout>

+ 117 - 0
im/app/src/main/res/layout/layout_main_footbar.xml

@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical">
+
+    <RadioGroup
+        android:id="@+id/main_rg"
+        android:layout_width="match_parent"
+        android:layout_height="53dp"
+        android:layout_alignParentBottom="true"
+        android:background="#f1f1f1"
+        android:orientation="horizontal">
+
+        <RadioButton
+            android:id="@+id/rb_tab_seesion"
+            style="@style/SkMainTabStyle"
+            android:drawableTop="@drawable/tab_icon_chat"
+            android:text="消息" />
+
+        <RadioButton
+            android:id="@+id/rb_tab_contact"
+            style="@style/SkMainTabStyle"
+            android:drawableTop="@drawable/tab_icon_contact"
+            android:text="联系人" />
+
+        <RadioButton
+            android:id="@+id/rb_tab_nav1"
+            style="@style/SkMainTabStyle"
+            android:drawableTop="@drawable/tab_icon_score"
+            android:text="导航1"
+            android:visibility="visible" />
+
+        <RadioButton
+            android:id="@+id/rb_tab_nav2"
+            style="@style/SkMainTabStyle"
+            android:drawableTop="@drawable/tab_icon_score"
+            android:text="导航2"
+            android:visibility="visible" />
+
+        <RadioButton
+            android:id="@+id/rb_tab_setting"
+            style="@style/SkMainTabStyle"
+            android:drawableTop="@drawable/tab_icon_mine"
+            android:text="我的" />
+
+    </RadioGroup>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_alignTop="@id/main_rg"
+        android:layout_marginTop="2dp"
+        android:orientation="horizontal">
+
+        <FrameLayout
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1">
+
+            <TextView
+                android:id="@+id/main_tab_session_point"
+                android:layout_width="18dp"
+                android:layout_height="18dp"
+                android:layout_gravity="top|right"
+                android:layout_marginRight="15dp"
+                android:background="@drawable/shape_red_dot"
+                android:gravity="center"
+                android:textColor="@android:color/white"
+                android:textSize="10dp"
+                android:visibility="invisible" />
+
+        </FrameLayout>
+
+        <FrameLayout
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:visibility="visible">
+
+            <TextView
+                android:id="@+id/main_tab_contact_point"
+                android:layout_width="18dp"
+                android:layout_height="18dp"
+                android:layout_gravity="top|right"
+                android:layout_marginRight="15dp"
+                android:background="@drawable/shape_red_dot"
+                android:gravity="center"
+                android:textColor="@android:color/white"
+                android:textSize="10dp"
+                android:visibility="invisible" />
+
+        </FrameLayout>
+
+        <FrameLayout
+            android:id="@+id/flNavPoint1"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:visibility="gone" />
+
+        <FrameLayout
+            android:id="@+id/flNavPoint2"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:visibility="gone" />
+
+        <FrameLayout
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:visibility="visible" />
+
+    </LinearLayout>
+
+</RelativeLayout>

+ 86 - 0
im/app/src/main/res/layout/notice_dialog.xml

@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:layout_gravity="center_horizontal|center_vertical"
+    android:layout_marginTop="150dp"
+    android:layout_marginBottom="150dp"
+    android:background="@drawable/a_bg_for_code"
+    android:orientation="vertical">
+
+    <LinearLayout
+        android:layout_width="300dp"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_horizontal"
+        android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/tvTitle"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:padding="10dp"
+            android:text="最新公告"
+            android:textColor="#b3000000"
+            android:textSize="16sp"
+            android:textStyle="bold" />
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:layout_marginLeft="10dp"
+            android:layout_marginRight="10dp"
+            android:background="#A5A5A5" />
+
+        <com.makeramen.roundedimageview.RoundedImageView xmlns:app="http://schemas.android.com/apk/res-auto"
+            android:id="@+id/ivAdImg"
+            android:layout_width="match_parent"
+            android:layout_height="160dp"
+            android:layout_gravity="center_horizontal"
+            android:layout_marginLeft="10dp"
+            android:layout_marginTop="10dp"
+            android:layout_marginRight="10dp"
+            android:scaleType="fitXY"
+            app:riv_border_color="@color/white"
+            app:riv_corner_radius="5dp"
+            app:riv_oval="false" />
+
+        <ScrollView
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            android:layout_weight="1">
+
+            <TextView
+                android:id="@+id/tvContent"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:padding="10dp"
+                android:textColor="#b3000000" />
+
+        </ScrollView>
+
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:background="@drawable/a_bg_for_ad_confirm"
+            android:orientation="horizontal">
+
+            <TextView
+                android:id="@+id/tvAdOk"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:clickable="true"
+                android:gravity="center_horizontal"
+                android:paddingTop="10dp"
+                android:paddingBottom="10dp"
+                android:text="知道了"
+                android:textColor="@color/white"
+                android:textSize="16sp" />
+
+        </LinearLayout>
+
+    </LinearLayout>
+
+</LinearLayout>

BIN
im/app/src/main/res/mipmap-xxhdpi/tab_chat_0.png


BIN
im/app/src/main/res/mipmap-xxhdpi/tab_chat_1.png


BIN
im/app/src/main/res/mipmap-xxhdpi/tab_circle_0.png


BIN
im/app/src/main/res/mipmap-xxhdpi/tab_circle_1.png


BIN
im/app/src/main/res/mipmap-xxhdpi/tab_contact_0.png


BIN
im/app/src/main/res/mipmap-xxhdpi/tab_contact_1.png


BIN
im/app/src/main/res/mipmap-xxhdpi/tab_mine_0.png


BIN
im/app/src/main/res/mipmap-xxhdpi/tab_mine_1.png


BIN
im/app/src/main/res/mipmap-xxhdpi/tab_score_0.png


BIN
im/app/src/main/res/mipmap-xxhdpi/tab_score_1.png


+ 4 - 0
im/app/src/main/res/values/colors.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="tab_default_color">#A0A3AA</color>
+</resources>

+ 5 - 0
im/app/src/main/res/values/strings.xml

@@ -0,0 +1,5 @@
+<resources>
+    <string name="app_name">飞信</string>
+    <string name="digits" translatable="false">0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</string>
+
+</resources>

+ 20 - 0
im/app/src/main/res/values/styles.xml

@@ -0,0 +1,20 @@
+<resources>
+
+    <!-- Base application theme. -->
+    <style name="AppTheme" parent="BC_BaseTheme">
+    </style>
+
+    <style name="SkMainTabStyle">
+        <item name="android:layout_width">0dp</item>
+        <item name="android:layout_weight">1</item>
+        <item name="android:layout_height">match_parent</item>
+        <item name="android:paddingTop">5dp</item>
+        <item name="android:paddingBottom">4.5dp</item>
+        <item name="android:background">@null</item>
+        <item name="android:button">@null</item>
+        <item name="android:gravity">bottom|center_horizontal</item>
+        <item name="android:textSize">12sp</item>
+        <item name="android:textColor">@drawable/selector_text_color_nav</item>
+    </style>
+
+</resources>

+ 17 - 0
im/app/src/test/java/com/sinata/bc_chat/ExampleUnitTest.kt

@@ -0,0 +1,17 @@
+package com.sinata.bc_chat
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+    @Test
+    fun addition_isCorrect() {
+        assertEquals(4, 2 + 2)
+    }
+}

+ 1 - 0
im/bc_account/.gitignore

@@ -0,0 +1 @@
+/build

+ 37 - 0
im/bc_account/build.gradle

@@ -0,0 +1,37 @@
+if (!isNeedAccoutModule.toBoolean()) {
+    apply plugin: 'com.android.application'
+} else {
+    apply plugin: 'com.android.library'
+}
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+apply plugin: 'kotlin-kapt'
+apply from: "../gradle_component/baseconfig.gradle"
+
+android {
+    defaultConfig {
+        if (!isNeedAccoutModule.toBoolean()) {
+            applicationId "com.bc_chat.account"
+        }
+//        javaCompileOptions {
+//            annotationProcessorOptions {
+//                arguments = [moduleName: project.getName()]
+//            }
+//        }
+        kapt {
+            arguments {
+                arg("AROUTER_MODULE_NAME", project.getName())
+            }
+        }
+    }
+}
+
+
+dependencies {
+    implementation fileTree(dir: 'libs', include: ['*.jar'])
+    testImplementation 'junit:junit:4.12'
+    androidTestImplementation 'com.android.support.test:runner:1.0.2'
+    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
+    api project(':bc_base')
+    kapt "com.alibaba:arouter-compiler:1.2.2"
+}

+ 21 - 0
im/bc_account/proguard-rules.pro

@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile

BIN
im/bc_chat.keystore


+ 51 - 0
im/build.gradle

@@ -0,0 +1,51 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+    ext.kotlin_version = '1.3.10'
+
+    repositories {
+        google()
+        jcenter()
+        mavenCentral()
+        maven { url 'https://dl.bintray.com/umsdk/release' }
+        maven {
+            url 'https://maven.google.com/'
+            name 'Google'
+        }
+    }
+    dependencies {
+        classpath 'com.android.tools.build:gradle:3.4.1'
+        // NOTE: Do not place your application dependencies here; they belong
+        // in the individual module build.gradle files
+        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+        classpath 'com.google.gms:google-services:4.2.0'
+    }
+}
+
+allprojects {
+    repositories {
+        google()
+        jcenter()
+        maven { url 'https://dl.bintray.com/umsdk/release' }
+        maven { url 'http://developer.huawei.com/repo/' }
+    }
+}
+
+task clean(type: Delete) {
+    delete rootProject.buildDir
+}
+ext {
+    compileSdkVersion = 28
+    buildToolsVersion = '29.0.1'
+    minSdkVersion = 16
+    targetSdkVersion = 27
+    appTargetSdkVersion = 27
+    versionCode = 11
+    versionName = '2.0'
+    kotlin_version = '1.3.10'
+    anko_version = '0.10.5'
+    sdkSourceCompatibility = 1.7
+    sdkTargetCompatibility = 1.7
+    appSourceCompatibility = 1.7
+    appTargetCompatibility = 1.7
+}

+ 61 - 0
im/gradle.properties

@@ -0,0 +1,61 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx4536m
+-Dfile.encoding=UTF-8
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
+org.gradle.parallel=true
+# 高版本Gradle去掉aapt2
+#android.enableAapt2=false
+#3.0打包无效
+android.injected.testOnly=false
+android.enableR8=false
+android.enableD8=true
+#android.useAndroidX = true
+#android.enableJetifier = true
+V7_APPCOMPAT_VERSION=28.0.0
+V4_SUPPORT_VERSION=28.0.0
+DESIGIN_SUPPORT_VERSION=28.0.0
+ANNOTATION_SUPPORT_VERSION=28.0.0
+RECYCLER_VIEW_SUPPORT_VERSION=28.0.0
+CONSTRAIT_SUPPORT_VERSION=1.1.3
+RETROFIT_VERSION=2.3.0
+OKHTTP_VERSION=3.11.0
+GSON_VERSION=2.8.2
+GLIDE_VERSION=4.7.1
+#org.gradle.jvmargs=-Xmx4608M
+#android.enableAapt2=false
+PROGUARD_RULES=../proguard-rules.pro
+RELEASE_STORE_FILE=../liaoqiu.keystore
+RELEASE_STORE_PASSWORD=sinata0826
+RELEASE_KEY_ALIAS=聊球
+RELEASE_KEY_PASSWORD=sinata0826
+#动态配置参数
+#VERSION_CODE=1
+#VERSION_NAME=1.0
+#BaseUrl=http://wphuxley.com/
+BaseUrl=http://43.255.39.52/
+#BaseUrl=http://192.168.0.42/
+# 是否需要单独编译 true表示不需要,false表示需要
+#isNeedMainModule=true
+isNeedMainModule=false
+isNeedImModule=true
+#isNeedImModule=false
+isNeedAccoutModule=true
+#isNeedAccoutModule=false
+isNeedMineModule=true
+#isNeedMineModule=false
+isNeedContactModule=true
+#isNeedContactModule=false
+MD5:0D:D2:6A:C3:EE:1D:6B:CC:D5:D0:8C:99:E0:F3:08:C6
+SHA1:6A:6F:9A:E2:84:DC:61:6C:FC:C7:A2:F3:18:54:CE:8A:1D:A7:75:B1
+SHA256:5D:79:8A:70:0F:F0:80:93:B2:A8:18:CD:BD:AB:9F:9F:D3:47:DA:D6:1B:F4:47:52:B7:85:A9:DE:AA:FF:E1:43
+

+ 172 - 0
im/gradlew

@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+    echo "$*"
+}
+
+die () {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Escape application args
+save () {
+    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+    echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+  cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"

+ 84 - 0
im/gradlew.bat

@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega

BIN
im/liaoqiu.keystore


Файловите разлики са ограничени, защото са твърде много
+ 70281 - 0
im/log.txt


+ 372 - 0
im/proguard-rules.pro

@@ -0,0 +1,372 @@
+-optimizations !code/simplification/cast,!field/*,!class/merging/*
+-optimizationpasses 5
+-allowaccessmodification
+-dontpreverify
+
+-dontusemixedcaseclassnames
+-dontskipnonpubliclibraryclasses
+-verbose
+# 保留Annotation不混淆
+-keepattributes *Annotation*,InnerClasses
+### Android support
+-dontwarn org.apache.http.**
+-dontwarn android.support.**
+-keep class android.support.** {*;}
+-keep class android.webkit.** {*;}
+
+-keep public class * extends android.app.Activity
+-keep public class * extends android.support.v4.app.Fragment
+-keep public class * extends android.app.Application
+-keep public class * extends android.app.Service
+-keep public class * extends android.content.BroadcastReceiver
+-keep public class * extends android.content.ContentProvider
+-keep public class * extends android.app.backup.BackupAgentHelper
+-keep public class * extends android.preference.Preference
+-keep public class * extends android.view.View
+-keep public class com.google.vending.licensing.ILicensingService
+-keep public class com.android.vending.licensing.ILicensingService
+
+-keepattributes *Annotation*,InnerClasses
+-keepattributes SourceFile,LineNumberTable
+-keepattributes Exceptions
+-keepattributes Signature
+#高德
+-dontwarn com.amap.api.**
+-dontwarn com.a.a.**
+-dontwarn com.autonavi.**
+-keep class com.amap.api.**  {*;}
+-keep class com.autonavi.**  {*;}
+-keep class com.a.a.**  {*;}
+#微信
+-dontwarn com.tencent.mm.**
+-keep class com.tencent.mm.**{*;}
+#支付宝
+-dontwarn com.alipay.**
+-keep class com.alipay.**{*;}
+-dontwarn org.json.alipay.**
+-keep class org.json.alipay.**{*;}
+#okhttp
+-dontwarn okhttp3.**
+-keep class okhttp3.**{*;}
+#okio
+-dontwarn okio.**
+-keep class okio.**{*;}
+
+### glide 4
+-keep public class * implements com.bumptech.glide.module.GlideModule
+-keep public class * extends com.bumptech.glide.module.AppGlideModule
+-keep class com.bumptech.glide.GeneratedAppGlideModuleImpl
+-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
+    **[] $VALUES;
+    public *;
+}
+##litepal混淆
+-dontwarn org.litepal.*
+-keep class org.litepal.** { *; }
+-keep enum org.litepal.**
+-keep interface org.litepal.** { *; }
+-keep public class * extends org.litepal.**
+-keepattributes *Annotation*
+-keepclassmembers enum * {
+    public static **[] values();
+    public static ** valueOf(java.lang.String);
+}
+#gson
+-keep class sun.misc.Unsafe { *; }
+-keep class * extends com.google.gson.JsonElement { *; }
+
+-keepclasseswithmembernames class * {
+    native <methods>;
+}
+
+-keepclasseswithmembers class * {
+    public <init>(android.content.Context, android.util.AttributeSet);
+    public <init>(android.content.Context, android.util.AttributeSet, int);
+}
+
+-keep class * implements android.os.Parcelable {
+  public static final android.os.Parcelable$Creator *;
+}
+
+-keepclassmembers class * implements java.io.Serializable {
+    static final long serialVersionUID;
+    private static final java.io.ObjectStreamField[] serialPersistentFields;
+    private void writeObject(java.io.ObjectOutputStream);
+    private void readObject(java.io.ObjectInputStream);
+    java.lang.Object writeReplace();
+    java.lang.Object readResolve();
+}
+
+-keep class **.R$* {*;}
+#讯飞
+-dontwarn com.iflytek.**
+-keep class com.iflytek.** {*;}
+
+#不混淆实体涉及gson解析
+-keep class com.bc_chat.account.entity.**{*;}
+-keep class com.bc_chat.bc_base.entity.**{*;}
+-keep class com.bc_chat.im.entity.**{*;}
+# ARouter
+-keep public class com.alibaba.android.arouter.routes.**{*;}
+-keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;}
+-keep interface * implements com.alibaba.android.arouter.facade.template.IProvider
+### glide 3
+-keepnames class com.zhaohaoting.framework.utils.glid.CustomCachingGlideModule
+#Zhtlibrary
+-keep class com.zhaohaoting.framework.view.**{*;}
+-keep class com.zhaohaoting.framework.abs.entity.**{*;}
+#里面涉及反射
+-keep class * extends com.zhaohaoting.framework.recyclerview.adapter.BaseMultiItemFetchLoadAdapter{*;}
+-keep class * extends com.zhaohaoting.framework.recyclerview.adapter.BaseMultiItemQuickAdapter{*;}
+
+#----------------netty-------
+-dontwarn io.netty.**
+-keep class io.netty.** { *;}
+-dontwarn io.reactivex.netty.**
+-keep class io.reactivex.netty.** { *;}
+-dontwarn org.slf4j.**
+-keep class org.slf4j.** { *;}
+#----------------netty-------
+
+# 对于带有回调函数的onXXEvent、**On*Listener的,不能被混淆
+-keepclassmembers class * {
+    void *(**On*Event);
+    void *(**On*Listener);
+}
+
+#Support 混淆配置
+-keep class android.support.** { *; }
+-dontwarn android.support.**
+
+#sheraSdk
+-keep class android.net.http.SslError
+-keep class android.webkit.**{*;}
+-keep class cn.sharesdk.**{*;}
+-keep class com.sina.**{*;}
+-keep class m.framework.**{*;}
+
+#百度统计
+-keep class com.baidu.bottom.** { *; }
+-keep class com.baidu.kirin.** { *; }
+-keep class com.baidu.mobstat.** { *; }
+
+#junit 混淆配置
+-keep class junit.** { *; }
+-dontwarn junit.**
+-keep class org.junit.** { *; }
+-dontwarn org.junit.**
+-keep class org.hamcrest.** { *; }
+-dontwarn org.hamcrest.**
+#--------retrofit2--------
+-dontwarn retrofit2.**
+-keep class retrofit2.** { *; }
+-keepattributes Signature
+-keepattributes Exceptions
+
+-dontwarn okio.**
+-dontwarn javax.annotation.Nullable
+-dontwarn javax.annotation.ParametersAreNonnullByDefault
+-keep class okio.** { *;}
+-dontwarn okhttp3.**
+-keep class okhttp3.** { *;}
+
+-dontwarn rx.internal.**
+-keep class rx.internal.** { *;}
+
+-dontwarn io.reactivex.**
+-keep class io.reactivex.** { *;}
+# Keep native methods
+#apache
+-keep class org.apache.** {*;}
+-dontwarn  org.apache.**
+-keep class android.net.** {*;}
+-dontwarn  android.net.**
+#华为
+-keep class com.huawei.android.** {*;}
+-dontwarn  com.huawei.android.**
+-keepattributes *Annotation*
+-keepattributes Exceptions
+-keepattributes InnerClasses
+-keepattributes Signature
+-keepattributes SourceFile,LineNumberTable
+-keep class com.hianalytics.android.**{*;}
+-keep class com.huawei.updatesdk.**{*;}
+-keep class com.huawei.hms.**{*;}
+-keep class com.huawei.gamebox.plugin.gameservice.**{*;}
+-keep public class com.huawei.android.hms.agent.** extends android.app.Activity { public *; protected *; }
+-keep interface com.huawei.android.hms.agent.common.INoProguard {*;}
+-keep class * extends com.huawei.android.hms.agent.common.INoProguard {*;}
+#google gcm
+-keep class com.google.android.gms.** {*;}
+-dontwarn  com.google.android.gms.**
+#fcm
+-dontwarn com.xiaomi.mipush.sdk.**
+-keep public class com.xiaomi.mipush.sdk.* {*;}
+-keep public class com.google.firebase.* {*;}
+#小米
+-dontwarn com.xiaomi.push.**
+-keep class com.xiaomi.** {*;}
+#魅族
+-dontwarn com.meizu.cloud.**
+-keep class com.meizu.cloud.** {*;}
+#vivo
+-dontwarn com.vivo.push.**
+-keep class com.vivo.push.** {*;}
+-keep class com.vivo.vms.** {*;}
+#魅族
+-dontwarn com.coloros.mcssdk.**
+-keep class com.coloros.mcssdk.** {*;}
+#RongRTCLib
+-keep public class cn.rongcloud.** {*;}
+# RongCloud SDK
+-keep class io.rong.** {*;}
+-keep class cn.rongcloud.** {*;}
+-keep class * extends io.rong.imlib.model.MessageContent {*;}
+-dontwarn io.rong.push.**
+-dontnote com.xiaomi.**
+-dontnote com.google.android.gms.gcm.**
+-dontnote io.rong.**
+-keepattributes Exceptions,InnerClasses
+-keepattributes Signature
+-ignorewarnings
+# VoIP
+-keep class io.agora.rtc.** {*;}
+
+# Location
+-keep class com.amap.api.**{*;}
+-keep class com.amap.api.services.**{*;}
+
+#混淆融云的eventbus回调方法
+-keepclassmembers class * {
+    void **MainThread*(...);
+    void **BackgroundThread*(...);
+    void **Async*(...);
+}
+# 红包
+-keep class com.google.gson.** { *; }
+-keep class com.uuhelper.Application.** {*;}
+-keep class net.sourceforge.zbar.** { *; }
+-keep class com.google.android.gms.** { *; }
+-keep class com.alipay.** {*;}
+-keep class com.jrmf360.rylib.** {*;}
+#电话 9.1.3版本以下使用
+-keep class cn.rongcloud.rtc.core.**  { *; }
+-keep class cn.rongcloud.rtc.engine.binstack.json.**  { *; }
+-keep class com.blink.**  { *; }
+-keep class com.bailingcloud.bailingvideo.engine.binstack.json.**  { *; }
+-keep class bailingquic.**{*;}
+-keep class go.**{*;}
+
+-keepclassmembers class * {
+    @org.greenrobot.eventbus.Subscribe <methods>;
+}
+-keep enum org.greenrobot.eventbus.ThreadMode { *; }
+
+# Only required if you use AsyncExecutor
+-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
+    <init>(java.lang.Throwable);
+}
+
+-keepclassmembers class * {
+    native <methods>;
+}
+
+#友盟
+-dontshrink
+-dontoptimize
+-dontwarn com.google.android.maps.**
+-dontwarn android.webkit.WebView
+-dontwarn com.umeng.**
+-dontwarn com.tencent.weibo.sdk.**
+-dontwarn com.facebook.**
+-keep class com.umeng.** {*;}
+-keep public class javax.**
+-keep public class android.webkit.**
+-dontwarn android.support.v4.**
+-keep enum com.facebook.**
+-keepattributes Exceptions,InnerClasses,Signature
+-keepattributes *Annotation*
+-keepattributes SourceFile,LineNumberTable
+-keep public interface com.facebook.**
+-keep public interface com.tencent.**
+-keep public interface com.umeng.socialize.**
+-keep public interface com.umeng.socialize.sensor.**
+-keep public interface com.umeng.scrshot.**
+-keep public class com.umeng.socialize.* {*;}
+-keep class com.facebook.**
+-keep class com.facebook.** { *; }
+-keep class com.umeng.scrshot.**
+-keep public class com.tencent.** {*;}
+-keep class com.umeng.socialize.sensor.**
+-keep class com.umeng.socialize.handler.**
+-keep class com.umeng.socialize.handler.*
+-keep class com.umeng.weixin.handler.**
+-keep class com.umeng.weixin.handler.*
+-keep class com.umeng.qq.handler.**
+-keep class com.umeng.qq.handler.*
+-keep class UMMoreHandler{*;}
+-keep class com.tencent.mm.sdk.modelmsg.WXMediaMessage {*;}
+-keep class com.tencent.mm.sdk.modelmsg.** implements com.tencent.mm.sdk.modelmsg.WXMediaMessage$IMediaObject {*;}
+-keep class im.yixin.sdk.api.YXMessage {*;}
+-keep class im.yixin.sdk.api.** implements im.yixin.sdk.api.YXMessage$YXMessageData{*;}
+-keep class com.tencent.mm.sdk.** {
+   *;
+}
+-keep class com.tencent.mm.opensdk.** {
+   *;
+}
+-keep class com.tencent.wxop.** {
+   *;
+}
+-keep class com.tencent.mm.sdk.** {
+   *;
+}
+-keep class com.twitter.** { *; }
+-keep class com.tencent.** {*;}
+-dontwarn com.tencent.**
+-keep class com.kakao.** {*;}
+-dontwarn com.kakao.**
+-keep public class com.umeng.com.umeng.soexample.R$*{
+    public static final int *;
+}
+-keep public class com.linkedin.android.mobilesdk.R$*{
+    public static final int *;
+}
+-keepclassmembers enum * {
+    public static **[] values();
+    public static ** valueOf(java.lang.String);
+}
+-keep class com.tencent.open.TDialog$*
+-keep class com.tencent.open.TDialog$* {*;}
+-keep class com.tencent.open.PKDialog
+-keep class com.tencent.open.PKDialog {*;}
+-keep class com.tencent.open.PKDialog$*
+-keep class com.tencent.open.PKDialog$* {*;}
+-keep class com.umeng.socialize.impl.ImageImpl {*;}
+-keep class com.sina.** {*;}
+-dontwarn com.sina.**
+-keep class  com.alipay.share.sdk.** {
+   *;
+}
+-keepnames class * implements android.os.Parcelable {
+    public static final ** CREATOR;
+}
+-keep class com.linkedin.** { *; }
+-keep class com.android.dingtalk.share.ddsharemodule.** { *; }
+-keepattributes Signature
+#友盟
+
+-dontwarn okio.**
+-dontwarn com.squareup.okhttp.**
+-dontwarn okhttp3.**
+-dontwarn javax.annotation.**
+-dontwarn com.android.volley.toolbox.**
+-dontwarn com.facebook.infer.**
+
+-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+    public *;
+}
+-keepclassmembers class * extends android.webkit.webViewClient {
+    public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
+    public boolean *(android.webkit.WebView, java.lang.String);
+}

+ 1 - 0
im/settings.gradle

@@ -0,0 +1 @@
+include ':app', ':bc_account', ':bc_im', ':bc_mine', ':bc_contacts', ':bc_base','zht_library',':IMKit', ':IMLib', ':RedPacket', ':locationlib',':CallKit',':CallLib',':contactcard',':Sight',':umeng_sdk', ':download'