18034727885
2026-03-26 3ebe05b13f1a04048073ce9cf741bc6116fb6c90
更改隐私弹窗显示逻辑,处理应用市场问题
升级本版
7个文件已修改
279 ■■■■■ 已修改文件
app/build.gradle 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/igo/user/ui/MainActivity.kt 197 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/igo/user/ui/SplashActivity.kt 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/dialog_tip.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values-en/strings.xml 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values-fr/strings.xml 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values/strings.xml 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/build.gradle
@@ -19,8 +19,8 @@
    defaultConfig {
        applicationId "com.gopost.user"
        minSdkVersion 23
        targetSdkVersion 35
        minSdkVersion 24
        targetSdkVersion 36
        versionCode 7
        versionName "1.7"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
app/src/main/java/com/igo/user/ui/MainActivity.kt
@@ -1,6 +1,7 @@
package com.igo.user.ui
import android.Manifest
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Intent
import android.graphics.Paint
@@ -17,10 +18,8 @@
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentPagerAdapter
import androidx.lifecycle.lifecycleScope
import androidx.transition.Visibility
import androidx.viewpager.widget.PagerAdapter
import androidx.viewpager.widget.ViewPager
import androidx.viewpager.widget.ViewPager.OnPageChangeListener
import cn.sinata.rxnetty.NettyClient
import cn.sinata.xldutils.gone
import cn.sinata.xldutils.invisible
@@ -28,12 +27,9 @@
import cn.sinata.xldutils.utils.SpanBuilder
import cn.sinata.xldutils.utils.myToast
import cn.sinata.xldutils.utils.optInt
import cn.sinata.xldutils.utils.optString
import cn.sinata.xldutils.utils.showAllowingStateLoss
import cn.sinata.xldutils.visible
import com.facebook.drawee.view.SimpleDraweeView
import com.flyco.tablayout.SlidingTabLayout
import com.flyco.tablayout.listener.OnTabSelectListener
import com.google.android.gms.maps.CameraUpdateFactory
import com.google.android.gms.maps.model.LatLng
import com.igo.user.BuildConfig
@@ -42,7 +38,6 @@
import com.igo.user.dialog.AlertDialog
import com.igo.user.dialog.BannerDialog
import com.igo.user.dialog.TipDialog
import com.igo.user.dialog.UserRuleDialog
import com.igo.user.network.HttpManager
import com.igo.user.network.entity.Function
import com.igo.user.network.entity.UserInfo
@@ -50,13 +45,10 @@
import com.igo.user.ui.HomeActivity.Companion.funcHome
import com.igo.user.ui.HomeActivity.Companion.latHome
import com.igo.user.ui.HomeActivity.Companion.lonHome
import com.igo.user.ui.charter.CharterFragment
import com.igo.user.ui.crosscity.CrossCityFragment
import com.igo.user.ui.crosscity.PayCrossActivity
import com.igo.user.ui.login.LoginActivity
import com.igo.user.ui.logistics.LogisticsFragment
import com.igo.user.ui.mine.FeedbackActivity
import com.igo.user.ui.mine.FinishMailActivity
import com.igo.user.ui.mine.InvokeListActivity
import com.igo.user.ui.mine.MsgActivity
import com.igo.user.ui.mine.MyCouponActivity
@@ -74,10 +66,7 @@
import com.igo.user.ui.trip.ScanActivity
import com.igo.user.ui.trip.TripActivity
import com.igo.user.utils.Const
import com.igo.user.utils.PlaceHolderFragment
import com.tbruyelle.rxpermissions2.RxPermissions
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import org.jetbrains.anko.find
import org.jetbrains.anko.sdk27.coroutines.onClick
import org.jetbrains.anko.startActivity
@@ -100,9 +89,10 @@
    }
    private val taxiFragment by lazy { MapTripFragment() }
   // private val crossCityFragment by lazy { CrossCityFragment() }
    // private val crossCityFragment by lazy { CrossCityFragment() }
    private val logisticsFragment by lazy { LogisticsFragment() }
   // private val charterFragment by lazy { CharterFragment() }
    // private val charterFragment by lazy { CharterFragment() }
    //起点信息,传递给扫码下单页面
    var startLat = 0.0
@@ -262,14 +252,6 @@
    private val fragments = arrayListOf<Fragment>()
    override fun initView() {
        fragments.clear()
        func.clear()
        funcHome.add(Function(1, getString(R.string.专车)))
        funcHome.add(Function(4, getString(R.string.快件)))
        IGoApplication.mainActivity = this
        /* if (checkLogin(false)&&SPUtils.instance().getString(Const.User.EMAIL).isEmpty()){ //当前登录但没有设置邮箱,强制设置邮箱
             startActivity<FinishMailActivity>("isRegister" to true)
         }*/
        titleBar.gone()
        tv_city.text = IGoApplication.chooseCityName
        val i = 0
@@ -286,61 +268,58 @@
            ).build()
        tv_tip.text = stringBuilder
        tv_tip.isVisible = mViewPager.currentItem != 1
        /* if (isOpen&&func.isNotEmpty()){
             checkNewVersion()
             getPhone()
             getAgreement()
            // titles.addAll(func.map { it.name })
         }else{
            // fragments.add(taxiFragment)
             showAlert()
         }*/
        checkNewVersion()
        getPhone()
        getAgreement()
        titles.addAll(arrayOf(getString(R.string.专车), getString(R.string.快件)))
        fragments.add(taxiFragment)
        fragments.add(logisticsFragment)
        taxiFragment.callback = {
            tv_tip.visibility = if (this) View.VISIBLE else View.GONE
        }
        /* func.forEach {
             if (it.id in (1..2)&&!fragments.contains(taxiFragment))
             else if (it.id == Const.OrderType.TYPE_CROSS_CITY)
                 fragments.add(crossCityFragment)
             else if (it.id in (4..5)&&!fragments.contains(logisticsFragment))
             else if (it.id == Const.OrderType.TYPE_CHARTER)
                 fragments.add(charterFragment)
         }*/
        drawer_main.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
        showLocationDescDialog {
            fragments.clear()
            func.clear()
            funcHome.add(Function(1, getString(R.string.专车)))
            funcHome.add(Function(4, getString(R.string.快件)))
            IGoApplication.mainActivity = this
        mViewPager.adapter = object : FragmentPagerAdapter(
            supportFragmentManager,
            BEHAVIOR_SET_USER_VISIBLE_HINT
        ) {
            override fun getItem(position: Int) = fragments[position]
            checkNewVersion()
            getPhone()
            if (isOpen)
                getAds()
            override fun getCount() = fragments.size
            override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
            titles.addAll(arrayOf(getString(R.string.专车), getString(R.string.快件)))
            fragments.add(taxiFragment)
            fragments.add(logisticsFragment)
            taxiFragment.callback = {
                tv_tip.visibility = if (this) View.VISIBLE else View.GONE
            }
            /* func.forEach {
                 if (it.id in (1..2)&&!fragments.contains(taxiFragment))
                 else if (it.id == Const.OrderType.TYPE_CROSS_CITY)
                     fragments.add(crossCityFragment)
                 else if (it.id in (4..5)&&!fragments.contains(logisticsFragment))
                 else if (it.id == Const.OrderType.TYPE_CHARTER)
                     fragments.add(charterFragment)
             }*/
            mViewPager.adapter = object : FragmentPagerAdapter(
                supportFragmentManager,
                BEHAVIOR_SET_USER_VISIBLE_HINT
            ) {
                override fun getItem(position: Int) = fragments[position]
                override fun getCount() = fragments.size
                override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
//                super.destroyItem(container, position, `object`)
            }
                }
            override fun getItemPosition(`object`: Any): Int {
                return PagerAdapter.POSITION_NONE
                override fun getItemPosition(`object`: Any): Int {
                    return PagerAdapter.POSITION_NONE
                }
            }
        }
        initTab()
        NettyClient.getInstance().startService()
            initTab()
            NettyClient.getInstance().startService()
//                       Facebook散列字符串
//        try {
@@ -356,17 +335,18 @@
//
//        }
        mViewPager.currentItem = intent.getIntExtra("pos", 0).apply {
            if (this == 0) {
                iv_scan.visible()
                tabview1.textColor = getColor(R.color.colorPrimary)
                tabview2.textColor = getColor(cn.sinata.xldutils.R.color.textColor99)
            } else {
                iv_scan.gone()
                tabview1.textColor = getColor(cn.sinata.xldutils.R.color.textColor99)
                tabview2.textColor = getColor(R.color.colorPrimary)
            mViewPager.currentItem = intent.getIntExtra("pos", 0).apply {
                if (this == 0) {
                    iv_scan.visible()
                    tabview1.textColor = getColor(R.color.colorPrimary)
                    tabview2.textColor = getColor(cn.sinata.xldutils.R.color.textColor99)
                } else {
                    iv_scan.gone()
                    tabview1.textColor = getColor(cn.sinata.xldutils.R.color.textColor99)
                    tabview2.textColor = getColor(R.color.colorPrimary)
                }
                if (this == 1) tv_tip.gone()
            }
            if (this == 1) tv_tip.gone()
        }
    }
@@ -685,35 +665,40 @@
        }
    }
    private var privacy: String? = null //隐私协议
    private var user: String? = null //用户协议
    private fun getAgreement() {
        if (!SPUtils.instance().getBoolean(Const.User.IS_AGREE, false)) {
            HttpManager.getH5(1).request(this) { _, data ->
                privacy = data?.optString("content") ?: ""
                showPrivacyAgreement()
            }
            HttpManager.getH5(2).request(this) { _, data ->
                user = data?.optString("content") ?: ""
                showPrivacyAgreement()
            }
        } else if (isOpen)
            getAds()
    }
    ///显示定位描述弹窗
    private fun showLocationDescDialog(sureCallback:()-> Unit) {
        val rxPermissions = RxPermissions(this);
        if (!rxPermissions.isGranted(Manifest.permission.ACCESS_FINE_LOCATION)) {
            val tipDialog = TipDialog()
            tipDialog.arguments = bundleOf(
                "msg" to getString(R.string.定位权限说明),
                "ok" to getString(R.string.ok),
                "cancel" to getString(R.string.取消)
            )
            tipDialog.setCallback(object : TipDialog.OnClickCallback {
                @SuppressLint("CheckResult")
                override fun onOk() {
                    rxPermissions.request(
                        Manifest.permission.ACCESS_FINE_LOCATION,
                        Manifest.permission.ACCESS_COARSE_LOCATION
                    ).subscribe {
                        if (it) {
                            sureCallback.invoke()
                        } else {
                            myToast(getString(R.string.没有权限))
                            finish()
                        }
                    }
                }
    private fun showPrivacyAgreement() {
        if (privacy != null && user != null) {
            val userRuleDialog = UserRuleDialog()
            userRuleDialog.arguments = bundleOf("privacy" to privacy, "user" to user)
            userRuleDialog.setDismissCallback(object : UserRuleDialog.OnDismiss {
                override fun onDismiss() {
                    if (!SPUtils.instance().getBoolean(Const.User.IS_AGREE, false))
                        finish()
                    else
                        getAds()
                override fun onCancel() {
                    finish()
                }
            })
            userRuleDialog.show(supportFragmentManager, "rule")
            tipDialog.isCancelable = false
            tipDialog.show(supportFragmentManager, "locationDesc")
        } else {
            sureCallback.invoke()
        }
    }
app/src/main/java/com/igo/user/ui/SplashActivity.kt
@@ -1,16 +1,18 @@
package com.igo.user.ui
import android.Manifest
import android.content.pm.PackageManager
import android.os.Bundle
import android.os.CountDownTimer
import android.util.Log
import android.view.Window
import android.view.WindowManager
import androidx.core.app.ActivityCompat
import androidx.core.os.bundleOf
import cn.sinata.xldutils.activity.BaseActivity
import cn.sinata.xldutils.utils.SPUtils
import cn.sinata.xldutils.utils.myToast
import cn.sinata.xldutils.utils.optString
import com.blankj.utilcode.util.ToastUtils
import com.google.android.gms.maps.model.LatLng
import com.google.gson.Gson
import com.igo.user.IGoApplication
@@ -18,20 +20,20 @@
import com.igo.user.IGoApplication.Companion.lat
import com.igo.user.IGoApplication.Companion.lon
import com.igo.user.R
import com.igo.user.dialog.UserRuleDialog
import com.igo.user.network.HttpManager
import com.igo.user.network.entity.Function
import com.igo.user.network.request
import com.igo.user.ui.HomeActivity.Companion.latHome
import com.igo.user.ui.HomeActivity.Companion.lonHome
import com.igo.user.ui.login.LoginActivity
import com.igo.user.utils.Const
import com.igo.user.utils.google.AMapKit
import com.tbruyelle.rxpermissions2.RxPermissions
import com.twitter.sdk.android.core.DefaultLogger
import com.twitter.sdk.android.core.Twitter
import com.twitter.sdk.android.core.TwitterAuthConfig
import com.twitter.sdk.android.core.TwitterConfig
import org.jetbrains.anko.startActivity
import java.util.concurrent.atomic.AtomicInteger
class SplashActivity : BaseActivity() {
@@ -39,6 +41,9 @@
    private var timer: CountDownTimer? = null
    private var startedMain = false //控制只进入一次首页
    private var privacy: String? = null //隐私协议
    private var user: String? = null //用户协议
    override fun onCreate(savedInstanceState: Bundle?) {
        window.requestFeature(Window.FEATURE_NO_TITLE)
@@ -58,20 +63,58 @@
            )
            .debug(true).build()
        Twitter.initialize(build)
        requestLocation()
        getAgreement()
    }
    private fun getAgreement() {
        if (!SPUtils.instance().getBoolean(Const.User.IS_AGREE, false)) {
            val count = AtomicInteger(0)
            HttpManager.getH5(1).request(this) { _, data ->
                privacy = data?.optString("content") ?: ""
                if (count.addAndGet(1) == 2) {
                    showPrivacyAgreement()
                }
            }
            HttpManager.getH5(2).request(this) { _, data ->
                user = data?.optString("content") ?: ""
                if (count.addAndGet(1) == 2) {
                    showPrivacyAgreement()
                }
            }
        } else {
            requestLocation()
        }
    }
    private fun showPrivacyAgreement() {
        if (privacy != null && user != null) {
            val userRuleDialog = UserRuleDialog()
            userRuleDialog.arguments = bundleOf("privacy" to privacy, "user" to user)
            userRuleDialog.setDismissCallback(object : UserRuleDialog.OnDismiss {
                override fun onDismiss() {
                    if (!SPUtils.instance().getBoolean(Const.User.IS_AGREE, false))
                        finish()
                    else {
                        requestLocation()
                    }
                }
            })
            userRuleDialog.show(supportFragmentManager, "rule")
        } else {
            requestLocation()
        }
    }
    private fun requestLocation() {
        val disposable =
            RxPermissions(this@SplashActivity).request(Manifest.permission.ACCESS_FINE_LOCATION)
                .subscribe {
                    if (it) {
                        initLocationOption()
                    } else {
                        startMain(false)
                    }
                }
        onBindHelper(disposable)
        if (ActivityCompat.checkSelfPermission(
                this,
                Manifest.permission.ACCESS_FINE_LOCATION
            ) == PackageManager.PERMISSION_GRANTED
        ) {
            initLocationOption()
        } else {
            startMain(false)
        }
    }
    /**
@@ -159,7 +202,7 @@
    private fun startMain(isOpen: Boolean) {
        if (!startedMain) {
            startedMain = true
                startActivity<HomeActivity>("isOpen" to isOpen, "func" to func)
            startActivity<HomeActivity>("isOpen" to isOpen, "func" to func)
        }
        finish()
    }
app/src/main/res/layout/dialog_tip.xml
@@ -36,7 +36,7 @@
    <TextView
        android:id="@+id/tv_msg"
        android:layout_width="wrap_content"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginHorizontal="20dp"
        android:layout_marginTop="23dp"
app/src/main/res/values-en/strings.xml
@@ -2038,4 +2038,5 @@
    <string name="选择区号">Select Area Code</string>
    <string name="科特迪瓦">Côte d\'Ivoire</string>
    <string name="中国">China</string>
    <string name="定位权限说明" >GOPOST Passenger requires location permission to:\n1. Determine if our ride-hailing service is available in your current city,\n2. Automatically fill in your trip\'s starting location based on your current position,\n3. Display route and distance information during your trip.\n\nWe will only access your location data when you actively use the app (foreground only), and will not collect or share your location data in the background. Your location data will only be used for the above three core service purposes.\nIf you deny location authorization, you will need to manually enter your city and trip starting point, which may affect your service experience.\nDo you confirm the authorization?</string>
</resources>
app/src/main/res/values-fr/strings.xml
@@ -2010,4 +2010,5 @@
    <string name="选择区号">Choisir le code régional</string>
    <string name="科特迪瓦">Côte d\'Ivoire</string>
    <string name="中国">Chine</string>
    <string name="定位权限说明" >GOPOST Passager a besoin de l\'autorisation de localisation pour :\n1. Vérifier si notre service de réservation de trajets est disponible dans votre ville actuelle,\n2. Remplir automatiquement le point de départ de votre trajet en fonction de votre position actuelle,\n3. Afficher les informations de trajet et de distance pendant votre voyage.\n\nNous accéderons à vos données de localisation uniquement lorsque vous utilisez activement l\'application (uniquement en premier plan) et ne collecterons ni ne partagerons vos données de localisation en arrière-plan. Vos données de localisation ne seront utilisées que pour les trois services de base mentionnés ci-dessus.\nSi vous refusez l\'autorisation de localisation, vous devrez saisir manuellement votre ville et le point de départ de votre trajet, ce qui pourrait affecter votre expérience de service.\nConfirmez-vous l\'autorisation ?</string>
</resources>
app/src/main/res/values/strings.xml
@@ -1065,5 +1065,6 @@
    <string name="选择区号">选择区号</string>
    <string name="科特迪瓦">科特迪瓦</string>
    <string name="中国">中国</string>
    <string name="定位权限说明"> GOPOST 乘客端需要获取位置权限,用于:\n1. 判断您当前所在城市是否已开通出行服务,\n2. 根据您的当前位置自动填充行程起点,\n3. 在行程中展示路线和距离等信息。\n\n我们仅在您主动使用应用期间(仅前台)访问您的位置数据,不会在后台收集或共享您的位置信息。您的位置数据仅用于上述三项核心服务目的。\n若您拒绝位置授权,您需要手动输入所在城市和行程起点,可能会影响您的服务体验。\n是否确认授权?</string>
</resources>