Compare commits

..

2 Commits

Author SHA1 Message Date
888332ed82 Merge branch 'feature-issues1865_content_provider_sync_certification' into 'feature-issues1865_content_provider'
feat: 添加同步实名的 ContentProvider

See merge request halo/android/assistant-android!260
2022-06-10 11:26:57 +08:00
2bcf8bf330 feat: 添加同步实名的 ContentProvider 2022-06-10 11:26:57 +08:00
8 changed files with 263 additions and 47 deletions

View File

@ -0,0 +1,97 @@
package com.gh.common.dialog
import android.app.Dialog
import android.content.DialogInterface
import android.os.Bundle
import android.view.*
import androidx.fragment.app.FragmentActivity
import androidx.fragment.app.FragmentTransaction
import com.gh.base.fragment.BaseDialogFragment
import com.gh.gamecenter.R
import com.gh.gamecenter.databinding.DialogSyncCertificationBinding
class SyncCertificationDialogFragment : BaseDialogFragment() {
private var mCallBack: ((isSuccess: Boolean) -> Unit)? = null
private val mBinding by lazy { DialogSyncCertificationBinding.inflate(layoutInflater) }
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
return mBinding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initUI()
}
private fun initUI() {
mBinding.contentTv.text = getString(R.string.dialog_sync_certification_content)
mBinding.refuseTv.setOnClickListener {
dismissAllowingStateLoss()
}
mBinding.agreeTv.setOnClickListener {
mCallBack?.invoke(true)
dismissAllowingStateLoss()
}
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val createDialog = super.onCreateDialog(savedInstanceState)
createDialog.setCanceledOnTouchOutside(false)
createDialog.setOnKeyListener(object : DialogInterface.OnKeyListener {
override fun onKey(dialog: DialogInterface?, keyCode: Int, event: KeyEvent?): Boolean {
if (keyCode == KeyEvent.KEYCODE_BACK) {
return true
}
return false
}
})
val window = createDialog.window
window?.setGravity(Gravity.CENTER)
return createDialog
}
//
// override fun onStart() {
// super.onStart()
// val width = requireContext().resources.displayMetrics.widthPixels - 60F.dip2px()
// val height = ViewGroup.LayoutParams.WRAP_CONTENT
// dialog?.window?.setLayout(width, height)
// }
companion object {
@JvmStatic
fun show(activity: FragmentActivity, callBack: ((isSuccess: Boolean) -> Unit)?) {
var certificationDialogFragment =
activity.supportFragmentManager.findFragmentByTag(SyncCertificationDialogFragment::class.java.simpleName) as? SyncCertificationDialogFragment
if (certificationDialogFragment != null) {
certificationDialogFragment.mCallBack = callBack
val transaction: FragmentTransaction =
activity.supportFragmentManager.beginTransaction()
transaction.show(certificationDialogFragment)
transaction.commit()
} else {
certificationDialogFragment = SyncCertificationDialogFragment().apply {
mCallBack = callBack
}
}
certificationDialogFragment.show(
activity.supportFragmentManager,
SyncCertificationDialogFragment::class.java.simpleName
)
}
}
}

View File

@ -205,6 +205,7 @@ public class DataUtils {
.getCertification()
.subscribeOn(Schedulers.io())
.subscribe(new BiResponse<UserInfoEntity>() {
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onSuccess(UserInfoEntity data) {
SPUtils.setString(Constants.SP_DEVICE_CERTIFICATION_PREFIX + gid, GsonUtils.toJson(data));

View File

@ -0,0 +1,11 @@
package com.gh.gamecenter.entity
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
@Parcelize
data class CertificationDialogEntity(
var realName: String = "",
var idCard: String = "") : Parcelable

View File

@ -33,8 +33,12 @@ data class SettingsEntity(
var gameDomeSwitch: String = "",//试玩显示开关on打开
@SerializedName("permission_popup_switch")
var permissionPopupSwitch: String = "off",//权限引导弹窗开关on/off
@SerializedName("certification_sync_switch")
var certificationSyncSwitch: String = "off",//实名信息同步开关on/off默认off
@SerializedName("permission_popup_applied_versions")
var permissionPopupAppliedVersions: PermissionPopupAppliedVersions = PermissionPopupAppliedVersions()
) {
fun setCommunityEntrance(communityEntrance: String) {

View File

@ -4,14 +4,15 @@ import android.graphics.Bitmap;
import android.graphics.PorterDuff;
import android.graphics.drawable.Animatable;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.CheckedTextView;
import android.widget.ImageView;
import androidx.annotation.ColorRes;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProviders;
@ -27,13 +28,13 @@ import com.facebook.imagepipeline.image.ImageInfo;
import com.gh.base.OnDoubleTapListener;
import com.gh.base.fragment.BaseFragment_ViewPager_Checkable;
import com.gh.common.constant.Config;
import com.gh.common.constant.Constants;
import com.gh.common.dialog.PrivacyPolicyDialogFragment;
import com.gh.common.dialog.SyncCertificationDialogFragment;
import com.gh.common.syncpage.SyncPageRepository;
import com.gh.common.tracker.TrackerLogger;
import com.gh.common.util.BiCallback;
import com.gh.common.util.DataUtils;
import com.gh.common.util.DialogUtils;
import com.gh.common.util.DisplayUtils;
import com.gh.common.util.EntranceUtils;
import com.gh.common.util.ExtensionsKt;
@ -43,11 +44,9 @@ import com.gh.common.util.ImageUtils;
import com.gh.common.util.IntegralLogHelper;
import com.gh.common.util.LogUtils;
import com.gh.common.util.NightModeUtils;
import com.gh.common.util.SPUtils;
import com.gh.common.view.ReserveDialog;
import com.gh.gamecenter.R;
import com.gh.gamecenter.databinding.FragmentMainBinding;
import com.gh.gamecenter.entity.PrivacyPolicyEntity;
import com.gh.gamecenter.entity.SettingsEntity;
import com.gh.gamecenter.entity.SubjectRecommendEntity;
import com.gh.gamecenter.entity.WelcomeDialogEntity;
@ -59,6 +58,7 @@ import com.gh.gamecenter.game.GameFragment;
import com.gh.gamecenter.message.MessageUnreadRepository;
import com.gh.gamecenter.message.MessageUnreadViewModel;
import com.gh.gamecenter.personal.PersonalFragment;
import com.gh.gamecenter.user.UserRepository;
import com.gh.gamecenter.video.detail.HomeVideoFragment;
import com.halo.assistant.HaloApp;
import com.lightgame.listeners.OnBackPressedListener;
@ -185,14 +185,25 @@ public class MainWrapperFragment extends BaseFragment_ViewPager_Checkable implem
if (reserveData != null && !reserveData.isEmpty()) {
ReserveDialog reserveDialog = ReserveDialog.getInstance(reserveData);
reserveDialog.setOnDismissListener(() -> {
mViewModel.showSyncCertificationDialog();
MessageUnreadRepository.INSTANCE.loadMessageUnreadData();
return null;
});
reserveDialog.show(getChildFragmentManager(), "reserveDialog");
} else {
mViewModel.showSyncCertificationDialog();
MessageUnreadRepository.INSTANCE.loadMessageUnreadData();
}
});
mViewModel.getSyncCertificationDialog().observe(this,certificationDialogEntity -> {
if (certificationDialogEntity != null){
SyncCertificationDialogFragment.show(requireActivity(), isSuccess -> {
//发送同步实名认证请求
UserRepository.getInstance().syncCertificate(certificationDialogEntity.getRealName(), certificationDialogEntity.getIdCard());
return null;
});
}
});
ViewModelProviders.of(this)
.get(MessageUnreadViewModel.class)
.getUnreadMessageTotalLiveData().observe(this, isShow -> ExtensionsKt.goneIf(mBinding.mainIvMessageHint, !isShow));
@ -224,6 +235,7 @@ public class MainWrapperFragment extends BaseFragment_ViewPager_Checkable implem
WelcomeDialogFragment welcomeDialog = WelcomeDialogFragment.getInstance(welcomeDialogEntity);
welcomeDialog.setOnDismissListener(() -> {
mViewModel.requestReserveDialog();
return null;
});

View File

@ -2,19 +2,21 @@ package com.gh.gamecenter.fragment
import android.annotation.SuppressLint
import android.app.Application
import android.net.Uri
import android.preference.PreferenceManager
import android.text.TextUtils
import android.util.Base64
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.MutableLiveData
import com.gh.common.constant.Config
import com.gh.common.constant.Constants
import com.gh.common.runOnIoThread
import com.gh.common.util.CheckLoginUtils
import com.gh.common.util.HomeBottomBarHelper
import com.gh.common.util.PackageUtils
import com.gh.common.util.SPUtils
import com.gh.gamecenter.BuildConfig
import com.gh.gamecenter.entity.DialogEntity
import com.gh.gamecenter.entity.SimpleGameEntity
import com.gh.gamecenter.entity.SubjectRecommendEntity
import com.gh.gamecenter.entity.WelcomeDialogEntity
import com.gh.gamecenter.entity.*
import com.gh.gamecenter.manager.UserManager
import com.gh.gamecenter.retrofit.BiResponse
import com.gh.gamecenter.retrofit.RetrofitManager
@ -29,10 +31,11 @@ class MainWrapperViewModel(application: Application) : AndroidViewModel(applicat
val navBar = MutableLiveData<SubjectRecommendEntity?>()
// 弹窗优先级: 隐私政策弹窗->启动弹窗->预约弹窗->消息弹窗
// 弹窗优先级: 隐私政策弹窗->启动弹窗->预约弹窗->同步认证弹窗
val openingDialog = MutableLiveData<WelcomeDialogEntity?>()
val reserveDialog = MutableLiveData<List<SimpleGameEntity>?>()
val privacyPolicyDialog = MutableLiveData<DialogEntity.PrivacyPolicyEntity?>()
val syncCertificationDialog = MutableLiveData<CertificationDialogEntity?>()
init {
getHomeNavBar()
@ -100,7 +103,8 @@ class MainWrapperViewModel(application: Application) : AndroidViewModel(applicat
// 全新安装忽略隐私弹窗
if (privacyPolicyDialogEntity != null) {
val id = privacyPolicyDialogEntity.id
val lastAcceptedId = SPUtils.getString(Constants.SP_LAST_ACCEPTED_PRIVACY_DIALOG_ID, "")
val lastAcceptedId =
SPUtils.getString(Constants.SP_LAST_ACCEPTED_PRIVACY_DIALOG_ID, "")
if (HaloApp.getInstance().isBrandNewInstall) {
SPUtils.setString(Constants.SP_LAST_ACCEPTED_PRIVACY_DIALOG_ID, id)
privacyPolicyDialog.postValue(null)
@ -138,9 +142,49 @@ class MainWrapperViewModel(application: Application) : AndroidViewModel(applicat
reserveDialog.postValue(null)
}
})
} else {
showSyncCertificationDialog()
}
}
@SuppressLint("NewApi")
fun showSyncCertificationDialog() {
val uri = Uri.parse("content://com.gh.gamecenter.provider/sync_certification")
runOnIoThread {
val settings = Config.getSettings()
//查询是否已经在光环进行实名认证
val certificationStr = SPUtils.getString(Constants.SP_DEVICE_CERTIFICATION_PREFIX + HaloApp.getInstance().gid)
//后台配置中 开启了同步实名且光环没有进行实名认证才执行
if ((settings?.certificationSyncSwitch ?: "off") == "on" && TextUtils.isEmpty(certificationStr)) {
var realName = ""
var idCard = ""
val cursor = HaloApp.getInstance().contentResolver.query(uri, null, null, null)
if (cursor != null && cursor.count > 0) {
cursor.moveToFirst()
do {
realName = cursor.getString(1)
idCard = cursor.getString(2)
} while (cursor.moveToNext())
cursor.close()
}
if (!TextUtils.isEmpty(realName) && !TextUtils.isEmpty(idCard)) {
//base64解密存储的数据
val finalRealName = String(Base64.decode(realName, Base64.DEFAULT))
val finalIdCard = String(Base64.decode(idCard, Base64.DEFAULT))
val certificationDialogEntity = CertificationDialogEntity()
certificationDialogEntity.realName = finalRealName
certificationDialogEntity.idCard = finalIdCard
syncCertificationDialog.postValue(certificationDialogEntity)
//删除contentprovider数据库中的数据
HaloApp.getInstance().contentResolver.delete(uri, null, null)
}
}
}
}
/**
* 特殊渠道隐藏视频 tab
*/

View File

@ -8,15 +8,7 @@ import android.database.Cursor
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
import android.net.Uri
import android.text.TextUtils
import android.util.Base64
import com.gh.common.constant.Constants
import com.gh.common.util.GsonUtils
import com.gh.common.util.SPUtils
import com.gh.gamecenter.BuildConfig
import com.gh.gamecenter.entity.UserInfoEntity
import com.gh.gamecenter.user.UserRepository
import com.halo.assistant.HaloApp
import com.lightgame.utils.Utils
class GhContentProvider : ContentProvider() {
@ -65,7 +57,8 @@ class GhContentProvider : ContentProvider() {
selectionArgs: Array<out String>?,
sortOrder: String?
): Cursor? {
when(mUriMatcher.match(uri)){
val match = mUriMatcher.match(uri);
when(match){
1 -> return mSqLiteDatabase?.query(
CERTIFICATION_TABLE_NAME,
null,
@ -110,34 +103,23 @@ class GhContentProvider : ContentProvider() {
Utils.log("CertificationContentProvider", "insert success:" + uri.authority + ", status => " + values?.toString())
return nameUri
}
} else if (mUriMatcher.match(uri) == 2) {
val certificationStr =
SPUtils.getString(Constants.SP_DEVICE_CERTIFICATION_PREFIX + HaloApp.getInstance().gid)
val isCertification = if (TextUtils.isEmpty(certificationStr)) {
false
} else {
val userInfo: UserInfoEntity =
GsonUtils.fromJson(certificationStr, UserInfoEntity::class.java)
if (userInfo != null) {
!TextUtils.isEmpty(userInfo.idCard?.id)
} else {
false
}
}
if (!isCertification) {//如果未实名的话 就直接将写入的信息进行实名信息绑定
val realName = values?.getAsString(KEY_REAL_NAME)
val idCard = values?.getAsString(KEY_ID_CARD)
if (!TextUtils.isEmpty(realName) && !TextUtils.isEmpty(idCard)) {
//base64解密存储的数据
val finalRealName = String(Base64.decode(realName, Base64.DEFAULT))
val finalIdCard = String(Base64.decode(idCard, Base64.DEFAULT))
// Utils.log("解密后的数据:$finalRealName ------ $finalIdCard")
//发送同步实名认证请求
UserRepository.getInstance().syncCertificate(finalRealName, finalIdCard)
return ContentUris.withAppendedId(uri, 1)
}
}
else if (mUriMatcher.match(uri) == 2) {
// 固定主键(只保留一条数据即可)
values?.put(KEY_PRIMARY_KEY, 1)
// 如果已存在则直接替换
val rowId: Long? = mSqLiteDatabase?.insertWithOnConflict(
SYNC_CERTIFICATION_TABLE_NAME,
null,
values,
SQLiteDatabase.CONFLICT_REPLACE
)
if (rowId != null && rowId > 0) {
val nameUri = ContentUris.withAppendedId(uri, rowId)
context.contentResolver.notifyChange(nameUri, null)
Utils.log("SyncCertificationContentProvider", "insert success:" + uri.authority + ", status => " + values?.toString())
return nameUri
}
}
return null

View File

@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center">
<LinearLayout
android:layout_width="@dimen/default_dialog_width"
android:layout_height="wrap_content"
android:background="@drawable/background_shape_white_radius_5"
android:orientation="vertical"
android:padding="24dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawablePadding="4dp"
android:text="实名提示"
android:textColor="@color/text_title"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/contentTv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="11dp"
android:lineSpacingExtra="4dp"
android:textColor="@color/text_subtitleDesc"
android:textSize="14sp"
tools:text="@string/dialog_sync_certification_content" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp">
<TextView
android:id="@+id/refuseTv"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_weight="1"
android:background="@drawable/button_round_f5f5f5"
android:gravity="center"
android:text="拒绝"
android:textColor="@color/text_title"
android:textSize="14sp" />
<TextView
android:id="@+id/agreeTv"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_marginLeft="24dp"
android:layout_weight="1"
android:background="@drawable/button_blue_oval"
android:gravity="center"
android:text="同意"
android:textColor="@color/white"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>