1:添加权限说明

2:聊天添加举报按钮
This commit is contained in:
2025-10-30 18:13:59 +08:00
parent a5ebc83dea
commit a993a7710f
21 changed files with 423 additions and 361 deletions

View File

@@ -18,11 +18,7 @@ import com.xscm.modulelogin.present.ImproveInfoPresenter;
import com.xscm.modulemain.activity.MainActivity;
import com.xscm.moduleutil.activity.BaseMvpActivity;
import com.xscm.moduleutil.bean.UserBean;
import com.xscm.moduleutil.utils.DateSelectDialog;
import com.xscm.moduleutil.utils.GlideEngine;
import com.xscm.moduleutil.utils.ImageLoader;
import com.xscm.moduleutil.utils.ImageUtils;
import com.xscm.moduleutil.utils.SpUtil;
import com.xscm.moduleutil.utils.*;
import com.xscm.moduleutil.widget.Constants;
@@ -201,6 +197,7 @@ public class ImproveInfoActivity extends BaseMvpActivity<ImproveInfoPresenter, A
.setSelectorUIStyle(new PictureSelectorStyle())
.isGif(false)
.setImageEngine(GlideEngine.createGlideEngine())
.setPermissionDescriptionListener(PermissionDescriptionHelper.createListener())
.setMaxSelectNum(1)
.isPreviewImage(true)
.isDisplayCamera(false)

View File

@@ -169,7 +169,7 @@ dependencies {
//播放器
//腾讯直播sdk
api('com.tencent.liteav:LiteAVSDK_Professional:10.9.0.13102')
// api('com.tencent.liteav:LiteAVSDK_Professional:10.9.0.13102')
api('com.google.android.exoplayer:exoplayer-core:2.19.1')
api('com.google.android.exoplayer:exoplayer-ui:2.19.1')
api("com.egame.vap:animplayer:2.0.8")

File diff suppressed because one or more lines are too long

View File

@@ -220,85 +220,4 @@ public abstract class BaseMvpActivity<P extends IPresenter, VDB extends ViewData
return resources;
}
/**
* 显示全局飘屏消息(支持任意位置飘过)
*
*/
// @Subscribe(threadMode = ThreadMode.MAIN)
// public void showPiaoPingMessage(MqttBean mqttBean) {
// WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
// if (windowManager == null) return;
//
// int screenWidth = getResources().getDisplayMetrics().widthPixels;
// int screenHeight = getResources().getDisplayMetrics().heightPixels;
//
// WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
// WindowManager.LayoutParams.MATCH_PARENT,
// WindowManager.LayoutParams.WRAP_CONTENT,
// Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ?
// WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY :
// WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
// WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
// WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN |
// WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
// PixelFormat.TRANSLUCENT);
//
// // 设置 Gravity 为左上角
// layoutParams.gravity = Gravity.TOP | Gravity.START;
//
// // Y 轴随机位置
//// layoutParams.y = (int) ((Math.random() * (screenHeight - 200)));
//
// // 初始 X 设为负值,确保 View 在屏幕左侧外
// layoutParams.x = -screenWidth;
//
// View piaoPingView = LayoutInflater.from(this).inflate(R.layout.item_piaoping, null);
// TextView textView = piaoPingView.findViewById(R.id.tv_name);
// TextView textView2 = piaoPingView.findViewById(R.id.tv_to_name);
// textView2.setText("送给"+mqttBean.getList().getToUserName());
// textView.setText(mqttBean.getList().getFromUserName());
// ImageUtils.loadHeadCC(mqttBean.getList().getGift_picture(), piaoPingView.findViewById(R.id.iv_piaoping));
// TextView tv_time = piaoPingView.findViewById(R.id.tv_num);
// tv_time.setText(mqttBean.getList().getNumber());
// windowManager.addView(piaoPingView, layoutParams);
//
// piaoPingView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
// @Override
// public void onGlobalLayout() {
// piaoPingView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
//
// // 设置锚点为左上角,避免偏移干扰
// piaoPingView.setPivotX(0);
// piaoPingView.setPivotY(0);
//
// // 启动动画:从左外滑入 -> 右外滑出
// ObjectAnimator animator = ObjectAnimator.ofFloat(
// piaoPingView,
// "translationX",
// 0f, // 初始偏移为 0此时 View 在左侧外)
// screenWidth // 向右移动整个屏幕宽度
// );
// animator.setDuration(2000); // 整个动画的时长为2秒
//
// // 强制 GPU 渲染
// piaoPingView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
//
// // 延迟显示2秒后开始滑出屏幕的动画
// piaoPingView.postDelayed(new Runnable() {
// @Override
// public void run() {
// animator.start();
// }
// }, 3000);
//
// animator.addListener(new AnimatorListenerAdapter() {
// @Override
// public void onAnimationEnd(Animator animation) {
// windowManager.removeView(piaoPingView);
// }
// });
// }
// });
// }
}

View File

@@ -72,18 +72,67 @@ public class MessageListenerSingleton {
private List<PublicScreenMessageListener> publicScreenListeners = new ArrayList<>();
// 添加监听器
// 替换原有的 addPublicScreenMessageListener 方法
public void addPublicScreenMessageListener(PublicScreenMessageListener listener) {
if (listener == null) {
return;
}
synchronized (publicScreenListeners) {
if (!publicScreenListeners.contains(listener)) {
try {
publicScreenListeners.add(listener);
} catch (Exception e) {
LogUtils.e("MessageListener", "添加 PublicScreenMessageListener 失败: " + e.getMessage());
}
}
}
}
// 移除监听器
// 同时修改 removePublicScreenMessageListener 方法
public void removePublicScreenMessageListener(PublicScreenMessageListener listener) {
publicScreenListeners.remove(listener);
if (listener == null) {
return;
}
synchronized (publicScreenListeners) {
try {
publicScreenListeners.remove(listener);
} catch (Exception e) {
LogUtils.e("MessageListener", "移除 PublicScreenMessageListener 失败: " + e.getMessage());
}
}
}
// 修改 notify 方法以增加保护
private void notifyPublicScreenListeners(RoomMessageEvent message) {
synchronized (publicScreenListeners) {
// 创建副本以避免并发修改异常
List<PublicScreenMessageListener> listenersCopy = new ArrayList<>(publicScreenListeners);
for (PublicScreenMessageListener listener : listenersCopy) {
try {
listener.onPublicScreenMessageReceived(message);
} catch (Exception e) {
LogUtils.e("MessageListener", "通知 PublicScreenMessageListener 失败: " + e.getMessage());
}
}
}
}
// 添加监听器
// public void addPublicScreenMessageListener(PublicScreenMessageListener listener) {
// if (!publicScreenListeners.contains(listener)) {
// publicScreenListeners.add(listener);
// }
// }
//
// // 移除监听器
// public void removePublicScreenMessageListener(PublicScreenMessageListener listener) {
// publicScreenListeners.remove(listener);
// }
private MessageListenerSingleton() {
if (!isInitialized) {
isInitialized = true;

View File

@@ -35,7 +35,7 @@ public class GmsLocationProvider implements LocationProvider {
callback.onFailed("无法获取位置");
}
})
.addOnFailureListener(e -> callback.onFailed("Google Play 定位失败:" + e.getMessage()));
.addOnFailureListener(e -> callback.onFailed("Google Play 定位失败:" ));
}
@SuppressLint("MissingPermission")

View File

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

View File

@@ -9,6 +9,7 @@ import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
@@ -38,6 +39,7 @@ import com.xscm.moduleutil.bean.HeatedBean;
import com.xscm.moduleutil.color.ThemeableDrawableUtils;
import com.xscm.moduleutil.utils.ColorManager;
import com.xscm.moduleutil.utils.GlideEngine;
import com.xscm.moduleutil.utils.PermissionDescriptionHelper;
import com.xscm.moduleutil.utils.location.LocationProvider;
import com.xscm.moduleutil.utils.location.LocationServiceFactory;
import com.xscm.moduleutil.widget.Constants;
@@ -142,7 +144,7 @@ public class ReleaseActivity extends BaseMvpActivity<ReleasePresenter, ActivityR
mBinding.tvFb.setOnClickListener(this::onClick);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
PermissionDescriptionHelper.addPermissionDescription(false, (ViewGroup) mBinding.getRoot(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION});
// 请求定位权限
ActivityCompat.requestPermissions(
(Activity) this,
@@ -164,7 +166,7 @@ public class ReleaseActivity extends BaseMvpActivity<ReleasePresenter, ActivityR
@Override
public void onFailed(String errorMessage) {
Toast.makeText(ReleaseActivity.this, "定位失败:" + errorMessage, Toast.LENGTH_SHORT).show();
Toast.makeText(ReleaseActivity.this, "定位失败:" , Toast.LENGTH_SHORT).show();
}
});
@@ -218,6 +220,7 @@ public class ReleaseActivity extends BaseMvpActivity<ReleasePresenter, ActivityR
.openGallery(mimeType)
.isGif(isVideo)
.setImageEngine(GlideEngine.createGlideEngine())
.setPermissionDescriptionListener(PermissionDescriptionHelper.createListener())
.setMaxSelectNum(type)
.isPreviewImage(true)
.isDisplayCamera(false)
@@ -352,7 +355,7 @@ public class ReleaseActivity extends BaseMvpActivity<ReleasePresenter, ActivityR
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
PermissionDescriptionHelper.removePermissionDescription((ViewGroup) mBinding.getRoot());
if (requestCode == 1001) {
LocationProvider provider = LocationServiceFactory.createBestProvider(this);
provider.getLastKnownLocation(this, new LocationProvider.LocationCallback() {
@@ -364,7 +367,7 @@ public class ReleaseActivity extends BaseMvpActivity<ReleasePresenter, ActivityR
@Override
public void onFailed(String errorMessage) {
Toast.makeText(ReleaseActivity.this, "定位失败:" + errorMessage, Toast.LENGTH_SHORT).show();
Toast.makeText(ReleaseActivity.this, "定位失败:", Toast.LENGTH_SHORT).show();
}
});
}

View File

@@ -8,9 +8,16 @@
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
@@ -22,7 +29,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
app:layout_constraintTop_toTopOf="parent" />
app:layout_constraintTop_toTopOf="parent"/>
<RelativeLayout
android:id="@+id/rl_1"
@@ -44,7 +51,7 @@
android:gravity="center"
android:text="选择话题"
android:textColor="@color/color_FF333333"
android:textSize="16sp" />
android:textSize="16sp"/>
<ImageView
android:layout_width="@dimen/dp_16"
@@ -52,7 +59,7 @@
android:layout_alignParentEnd="true"
android:layout_centerInParent="true"
android:layout_marginEnd="@dimen/dp_12"
android:src="@mipmap/up_t" />
android:src="@mipmap/up_t"/>
</RelativeLayout>
<RelativeLayout
@@ -78,7 +85,7 @@
android:maxLength="1200"
android:textColor="#333333"
android:textColorHint="@color/color_FF999999"
android:textSize="@dimen/sp_15" />
android:textSize="@dimen/sp_15"/>
<TextView
android:id="@+id/tv_sz"
@@ -92,7 +99,7 @@
android:gravity="bottom"
android:text="0/1200"
android:textColor="@color/color_FF666666"
android:textSize="@dimen/sp_12" />
android:textSize="@dimen/sp_12"/>
</RelativeLayout>
<androidx.recyclerview.widget.RecyclerView
@@ -102,7 +109,7 @@
android:layout_marginStart="@dimen/dp_16"
android:layout_marginTop="@dimen/dp_12"
android:layout_marginEnd="@dimen/dp_16"
app:layout_constraintTop_toBottomOf="@+id/rl_2" />
app:layout_constraintTop_toBottomOf="@+id/rl_2"/>
<TextView
android:id="@+id/tv_fb"
@@ -116,8 +123,9 @@
android:text="立即发布"
android:textColor="@color/color_FF333333"
android:textSize="@dimen/sp_14"
app:layout_constraintTop_toBottomOf="@+id/rv_photo_wall" />
app:layout_constraintTop_toBottomOf="@+id/rv_photo_wall"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

View File

@@ -1,20 +1,24 @@
package com.xscm.modulemain.activity;
import android.Manifest;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
@@ -22,6 +26,9 @@ import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import com.alibaba.android.arouter.facade.annotation.Route;
@@ -33,8 +40,11 @@ import com.example.modulecircle.fragment.CircleFragment;
import com.example.modulenews.fragment.NewsFragment;
import com.example.modulevocal.fragment.VocalRangeFragment;
import com.example.modulevoice.fragment.VoiceFragment;
import com.google.android.material.snackbar.Snackbar;
import com.permissionx.guolindev.PermissionX;
import com.permissionx.guolindev.callback.ExplainReasonCallback;
import com.permissionx.guolindev.callback.RequestCallback;
import com.permissionx.guolindev.request.ExplainScope;
import com.stx.xhb.xbanner.XBanner;
import com.xscm.modulemain.R;
import com.xscm.modulemain.contacts.HomeContacts;
@@ -63,6 +73,7 @@ import com.tencent.imsdk.v2.V2TIMValueCallback;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.HashMap;
@@ -565,15 +576,15 @@ public class MainActivity extends BaseMvpActivity<HomePresenter, ActivityMainBin
}
private void requestGpsPermissions() {
PermissionDescriptionHelper.addPermissionDescription(false, (ViewGroup) mBinding.getRoot(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION});
PermissionX.init(this)
// 请求精确位置权限包含GPS定位能力
.permissions(
Manifest.permission.ACCESS_FINE_LOCATION
)
// 权限请求结果回调
.permissions(Manifest.permission.ACCESS_FINE_LOCATION)
.request(new RequestCallback() {
@Override
public void onResult(boolean allGranted, List<String> grantedList, List<String> deniedList) {
PermissionDescriptionHelper.removePermissionDescription((ViewGroup) mBinding.getRoot());
if (allGranted) {
// Toast.makeText(MainActivity.this, "GPS权限已授予可开始定位", Toast.LENGTH_SHORT).show();
initLocation(); // 启动GPS定位逻辑
@@ -583,6 +594,83 @@ public class MainActivity extends BaseMvpActivity<HomePresenter, ActivityMainBin
}
});
}
private static final int REQUEST_CODE_LOCATION_PERMISSION = 1001;
private void requestLocationPermission() {
// 检查是否已拥有权限
if (ContextCompat.checkSelfPermission(
this,
Manifest.permission.ACCESS_FINE_LOCATION
) == PackageManager.PERMISSION_GRANTED) {
// 已授权,执行定位相关任务
performLocationTask();
}
// 判断是否需要展示解释性说明
else if (ActivityCompat.shouldShowRequestPermissionRationale(
this,
Manifest.permission.ACCESS_FINE_LOCATION
)) {
// 展示自定义的解释对话框
showPermissionExplanationDialog();
}
else {
// 首次请求,或用户选择了"不再询问",直接请求权限
directlyRequestPermissions();
}
}
private void showPermissionExplanationDialog() {
new AlertDialog.Builder(this)
.setTitle("需要位置权限")
.setMessage("我们使用您的位置信息来为您提供周边的地图导航服务、展示订单热力图,并为您推荐附近的订单。此功能需要获取您的位置信息。")
.setPositiveButton("同意", (dialog, which) -> {
// 用户点击同意后,请求权限
directlyRequestPermissions();
})
.setNegativeButton("取消", (dialog, which) -> {
// 处理用户取消的情况
})
.show();
}
private void directlyRequestPermissions() {
String[] permissionsToRequest;
// 根据Android版本决定请求的权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
// Android 10 (API 29) 及以上可以同时请求前台和后台定位权限注意在Android 11及以后策略有变
permissionsToRequest = new String[] {
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
// 在Android 11上不建议在此同时申请后台权限
};
} else {
// Android 9及以下
permissionsToRequest = new String[] {
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
};
}
ActivityCompat.requestPermissions(
this,
permissionsToRequest,
REQUEST_CODE_LOCATION_PERMISSION // 定义你的请求码,例如 1001
);
}
private void performLocationTask() {
// 执行定位任务
initLocation();
}
private void handlePermissionDenial() {
// 处理权限被拒绝的情况
Toast.makeText(this, "位置权限被拒绝,相关功能无法使用", Toast.LENGTH_SHORT).show();
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(UnreadCountEvent event) {

View File

@@ -1184,6 +1184,7 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
override fun initData() {
if (!EasyPermissions.hasPermissions(this, *permissions)) {
PermissionDescriptionHelper.addPermissionDescription(false,mBinding?.root as ViewGroup,permissions)
EasyPermissions.requestPermissions(
this, "请开启录音使用权限",
1, *permissions
@@ -3127,26 +3128,26 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
if (pit_number != 0) View.VISIBLE else View.GONE
rl_more?.visibility =
if (pit_number == 9) View.VISIBLE else View.GONE
rl_misc?.visibility = View.VISIBLE
rl_misc?.visibility = View.GONE
}
0 -> {
rl_voice?.visibility = View.VISIBLE
rl_mic?.visibility =
if (pit_number != 0) View.VISIBLE else View.GONE
rl_misc?.visibility = View.VISIBLE
rl_misc?.visibility = View.GONE
}
5 -> {
rl_voice?.visibility = View.VISIBLE
rl_more?.visibility = View.GONE
rl_misc?.visibility = View.VISIBLE
rl_misc?.visibility = View.GONE
}
else -> {}
}
if (roleType != 5) {
rl_misc?.visibility = View.VISIBLE
rl_misc?.visibility = View.GONE
if (userPitNumber == 9) {
rl_more?.visibility = View.VISIBLE
}
@@ -3156,7 +3157,7 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
// label_id 和 type_id 联合判断
if (mutableListOf<String>("1").contains(typeId) && "1" == labelId) {
rl_more?.visibility = View.VISIBLE
rl_misc?.visibility = View.VISIBLE
rl_misc?.visibility = View.GONE
}else{
rl_more?.visibility = View.GONE
rl_misc?.visibility = View.GONE
@@ -3994,11 +3995,6 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
override fun postRoomInfo(resp: RoomInfoResp?) {
if (resp == null) {
// CommonAppContext.getInstance().isShow = false;
// CommonAppContext.getInstance().isPlaying = false;
// ToastUtils.showShort("您已经掉线,需要重新进入房间!");
// ARouter.getInstance().build(ARouteConstants.ME)
// .navigation();
// 只有在没有房间信息时才重新获取
if (mRoomInfoResp == null) {
cleanupResources()
@@ -4009,91 +4005,6 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
this.mRoomInfoResp = resp
setview(resp)
// val roomBean = resp.room_info
// if (roomBean!!.type_id.equals("6")) {
//
//// upHeight()
// initPublicScreenFragment()
// if (!isFinishing && !isDestroyed) {
// resetFragment()
// upHeight()
// } else {
// Log.e("Fragment", "Fragment transaction skipped due to state loss.")
// }
// return
// }
// this.mRoomBean = roomBean
// this.mRoomUserBean = resp.user_info
// this.mRoomOwnerBean = resp.room_owner
// this.mPitList = mRoomBean!!.pit_list!!
//
// ImageUtils.loadHeadCC(resp.room_info.room_cover, mBinding!!.roomTop.avatar)
// mBinding!!.roomTop.name.text = roomBean.room_name
// mBinding!!.roomTop.idVal.text = roomBean.room_number
// if (mRoomUserBean?.getIs_room_owner() == 1) {
// mBinding!!.roomTop.btnFollow.visibility = View.GONE
// } else {
// mBinding!!.roomTop.btnFollow.visibility = View.VISIBLE
// if (resp.isCollect) {
// mBinding!!.roomTop.btnFollow.background =
// resources.getDrawable(com.xscm.moduleutil.R.mipmap.collected)
// mBinding!!.roomTop.btnFollow.text = ""
// }
// }
// initPublicScreenFragment()
// if (!isFinishing && !isDestroyed) {
// resetFragment()
// upHeight()
// } else {
// Log.e("Fragment", "Fragment transaction skipped due to state loss.")
// }
//
// if (mRoomUserBean?.getIs_collect() == 1) {
// mBinding!!.roomTop.btnFollow.background =
// resources.getDrawable(com.xscm.moduleutil.R.mipmap.yishouc)
// mBinding!!.roomTop.btnFollow.text = ""
// } else {
//// mBinding.roomTop.btnFollow.setBackground(getResources().getDrawable(com.xscm.moduleutil.R.mipmap.collect));
// ThemeableDrawableUtils.setThemeableRoundedBackground(
// mBinding!!.roomTop.btnFollow,
// ColorManager.getInstance().primaryColorInt,
// 53
// )
// mBinding!!.roomTop.btnFollow.setTextColor(ColorManager.getInstance().buttonColorInt)
// mBinding!!.roomTop.btnFollow.text = "收藏"
// }
// if ((resp.room_info.type_id == "3" || resp.room_info.type_id == "1" || resp.room_info.type_id == "4") && resp.room_info.label_id == "2") {
// AgoraManager.getInstance(this).isBjMusic = false
// } else {
// AgoraManager.getInstance(this).isBjMusic = true
// }
//
//
// AgoraManager.stopMuisc()
// if (!CommonAppContext.getInstance().isMai) {
// initializeAudio()
// }
//
// if (mRoomInfoResp!!.room_info.label_id == "2" || mRoomInfoResp!!.room_info.type_id == "7") {
// mBinding!!.rlMore.visibility = View.GONE
// // mBinding.rlMisc.setVisibility(GONE);
// } else if (mRoomInfoResp!!.room_info.label_id == "1" || mRoomInfoResp!!.room_info.type_id == "3" || mRoomInfoResp!!.room_info.type_id == "4" ||
// mRoomInfoResp!!.room_info.type_id == "8"
// ) {
// mBinding!!.rlMore.visibility = View.GONE
// mBinding!!.rlMisc.visibility = View.VISIBLE
// }
//
// if (resp.room_info.type_id == "7" || resp.room_info.type_id == "2") {
// mBinding!!.rlMore.visibility = View.GONE
// mBinding!!.rlMisc.visibility = View.GONE
// }
//
// if (mRoomInfoResp!!.hour_ranking_open == 1) {
// mBinding!!.clXsb.visibility = View.VISIBLE
// } else {
// mBinding!!.clXsb.visibility = View.GONE
// }
}
fun upHeight() {
@@ -4211,15 +4122,6 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
"@@@",
"上一个房间的roonid" + AgoraManager.getInstance(OkDownloadProvider.context).lastRoomId
)
// MvpPre.getRoomIn(AgoraManager.getInstance(context).getLastRoomId(), "");
// ARouter.getInstance().build(ARouteConstants.ROOM_DETAILS).withString("form", "电影房")
// .withString("roomId", AgoraManager.getInstance(OkDownloadProvider.context).lastRoomId)
// .navigation()
// RoomManager.getInstance().fetchRoomDataAndEnter(
// this,
// AgoraManager.getInstance(OkDownloadProvider.context).lastRoomId,
// ""
// )
if (AgoraManager.getInstance(OkDownloadProvider.context).lastRoomId != null && !AgoraManager.getInstance(
OkDownloadProvider.context
).lastRoomId.isEmpty()
@@ -4227,8 +4129,6 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
MvpPre?.getRoomIn(AgoraManager.getInstance(OkDownloadProvider.context).lastRoomId, "")
}
AgoraManager.getInstance(OkDownloadProvider.context).lastRoomId = ""
// setviewyc(true);
// exitFullScreen()
}
override fun userGuanzSuccess(s: String) {
@@ -4529,12 +4429,14 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
}
override fun onPermissionsGranted(requestCode: Int, perms: List<String>) {
PermissionDescriptionHelper.removePermissionDescription(mBinding?.root as ViewGroup)
if (perms.contains(Manifest.permission.RECORD_AUDIO)) {
Log.d("Permission", "录音权限已授权")
}
}
override fun onPermissionsDenied(requestCode: Int, perms: List<String>) {
PermissionDescriptionHelper.removePermissionDescription(mBinding?.root as ViewGroup)
if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
AppSettingsDialog.Builder(this).build().show()
} else {

View File

@@ -29,6 +29,7 @@ import com.xscm.moduleutil.bean.RoomBgBean;
import com.xscm.moduleutil.dialog.ConfirmDialog;
import com.xscm.moduleutil.utils.GlideEngine;
import com.xscm.moduleutil.utils.ImageUtils;
import com.xscm.moduleutil.utils.PermissionDescriptionHelper;
import com.xscm.moduleutil.widget.Constants;
import org.greenrobot.eventbus.EventBus;
@@ -106,6 +107,7 @@ public class RoomBackgroundDialogFragment extends BaseMvpDialogFragment<RoomBack
.openGallery(mimeType)
.isGif(isVideo)
.setImageEngine(GlideEngine.createGlideEngine())
.setPermissionDescriptionListener(PermissionDescriptionHelper.createListener())
.setMaxSelectNum(type)
.isPreviewImage(true)
.isDisplayCamera(false)

View File

@@ -31,10 +31,7 @@ import com.luck.picture.lib.config.PictureConfig;
import com.luck.picture.lib.entity.LocalMedia;
import com.xscm.moduleutil.activity.BaseMvpActivity;
import com.xscm.moduleutil.bean.AlbumBean;
import com.xscm.moduleutil.utils.ARouteConstants;
import com.xscm.moduleutil.utils.GlideEngine;
import com.xscm.moduleutil.utils.ImageUtils;
import com.xscm.moduleutil.utils.SpUtil;
import com.xscm.moduleutil.utils.*;
import com.xscm.moduleutil.widget.Constants;
import com.xscm.moduleutil.widget.dialog.ShareDialog;
import com.scwang.smartrefresh.layout.api.RefreshLayout;
@@ -205,7 +202,7 @@ public class AlbumDetailActivity extends BaseMvpActivity<AlbumDetailPresenter, A
.isDisplayCamera(false)
.setOutputCameraDir(Constants.FILE_PATH)
.isOriginalSkipCompress(true)
.setPermissionDescriptionListener(PermissionDescriptionHelper.createListener())
.forResult(requestCode); //结果回调onActivityResult code
}

View File

@@ -21,10 +21,7 @@ import com.luck.picture.lib.entity.LocalMedia;
import com.xscm.moduleutil.activity.BaseMvpActivity;
import com.xscm.moduleutil.bean.AlbumBean;
import com.xscm.moduleutil.color.ThemeableDrawableUtils;
import com.xscm.moduleutil.utils.ARouteConstants;
import com.xscm.moduleutil.utils.ColorManager;
import com.xscm.moduleutil.utils.GlideEngine;
import com.xscm.moduleutil.utils.ImageUtils;
import com.xscm.moduleutil.utils.*;
import com.xscm.moduleutil.widget.Constants;
import com.zcw.togglebutton.ToggleButton;
@@ -189,7 +186,7 @@ public class CreateAlbumActivity extends BaseMvpActivity<MyAlbumPresenter, Activ
.isDisplayCamera(false)
.setOutputCameraDir(Constants.FILE_PATH)
.isOriginalSkipCompress(true)
.setPermissionDescriptionListener(PermissionDescriptionHelper.createListener())
.forResult(requestCode); //结果回调onActivityResult code
}

View File

@@ -26,10 +26,7 @@ import com.luck.picture.lib.entity.LocalMedia;
import com.xscm.moduleutil.activity.BaseMvpActivity;
import com.xscm.moduleutil.bean.room.RoomInfoResp;
import com.xscm.moduleutil.color.ThemeableDrawableUtils;
import com.xscm.moduleutil.utils.ARouteConstants;
import com.xscm.moduleutil.utils.ColorManager;
import com.xscm.moduleutil.utils.GlideEngine;
import com.xscm.moduleutil.utils.ImageUtils;
import com.xscm.moduleutil.utils.*;
import com.xscm.moduleutil.widget.Constants;
import java.io.File;
@@ -224,7 +221,7 @@ public class CreatedRoomActivity extends BaseMvpActivity<CreatedRoomPresenter, A
.isDisplayCamera(false)
.setOutputCameraDir(Constants.FILE_PATH)
.isOriginalSkipCompress(true)
.setPermissionDescriptionListener(PermissionDescriptionHelper.createListener())
.forResult(requestCode); //结果回调onActivityResult code
}

View File

@@ -1,17 +1,28 @@
package com.example.modulevocal.activity;
import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.text.Html;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.ForegroundColorSpan;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.ConstraintSet;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.GridLayoutManager;
@@ -30,15 +41,16 @@ import com.luck.picture.lib.basic.PictureSelector;
import com.luck.picture.lib.config.PictureConfig;
import com.luck.picture.lib.engine.CropFileEngine;
import com.luck.picture.lib.entity.LocalMedia;
import com.luck.picture.lib.interfaces.OnPermissionDescriptionListener;
import com.luck.picture.lib.permissions.PermissionConfig;
import com.luck.picture.lib.utils.DensityUtil;
import com.luck.picture.lib.widget.MediumBoldTextView;
import com.xscm.moduleutil.activity.BaseMvpActivity;
import com.xscm.moduleutil.bean.HeatedBean;
import com.xscm.moduleutil.bean.UserBean;
import com.xscm.moduleutil.bean.UserInfo;
import com.xscm.moduleutil.bean.XBannerData;
import com.xscm.moduleutil.utils.DateSelectDialog;
import com.xscm.moduleutil.utils.GlideEngine;
import com.xscm.moduleutil.utils.ImageUtils;
import com.xscm.moduleutil.utils.SpUtil;
import com.xscm.moduleutil.utils.*;
import com.xscm.moduleutil.widget.Constants;
import com.xscm.moduleutil.widget.img.FullScreenUtil;
import com.xscm.moduleutil.widget.picker.PictureSelectorUtil;
@@ -188,7 +200,7 @@ public class EditUserInfoActivity extends BaseMvpActivity<EditUserPresenter, Act
.isDisplayCamera(false)
.setOutputCameraDir(Constants.FILE_PATH)
.isOriginalSkipCompress(true)
.setPermissionDescriptionListener(PermissionDescriptionHelper.createListener())
.forResult(requestCode); //结果回调onActivityResult code
} else {
@@ -202,6 +214,7 @@ public class EditUserInfoActivity extends BaseMvpActivity<EditUserPresenter, Act
.isDisplayCamera(false)
.setImageEngine(GlideEngine.createGlideEngine())
.setImageEngine(GlideEngine.createGlideEngine()) // 选择器展示不出图片则添加
.setPermissionDescriptionListener(PermissionDescriptionHelper.createListener())
.setCropEngine(new CropFileEngine() {
@Override
public void onStartCrop(Fragment fragment, Uri srcUri, Uri destinationUri, ArrayList<String> dataSource, int requestCode) {
@@ -240,6 +253,8 @@ public class EditUserInfoActivity extends BaseMvpActivity<EditUserPresenter, Act
}
}
private int totalUploadCount;//需要上传的数据的总数
private int uploadedCount;//已经上传的数据的个数
@Override

View File

@@ -21,6 +21,7 @@ import com.xscm.moduleutil.base.CommonAppContext;
import com.xscm.moduleutil.bean.FirstChargeGiftBean;
import com.xscm.moduleutil.dialog.FirstChargeDialog;
import com.xscm.moduleutil.dialog.RealNameDialog;
import com.xscm.moduleutil.dialog.YouthModelDialog;
import com.xscm.moduleutil.utils.ARouteConstants;
import com.xscm.moduleutil.utils.SpUtil;
import com.xscm.moduleutil.utils.config.ConfigManager;
@@ -63,7 +64,8 @@ public class SettingActivity extends BaseMvpActivity<SettingPresenter, ActivityS
private void onClick(View view) {
if (view.getId() == R.id.ll_youth) {
startActivity(new Intent(this, UnderageActivity.class));
// startActivity(new Intent(this, UnderageActivity.class));
showYouthModelDialog();
} else if (view.getId() == R.id.ll_notification) {
startActivity(new Intent(this, NotificationActivity.class));
} else if (view.getId() == R.id.ll_hmd) {
@@ -162,7 +164,19 @@ public class SettingActivity extends BaseMvpActivity<SettingPresenter, ActivityS
}
}
private void showYouthModelDialog() {
YouthModelDialog youthModelDialog = new YouthModelDialog(this, null);
youthModelDialog.show();
youthModelDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
// 记录已经显示过青少年模式弹窗
dialog.dismiss();
}
});
}
@Override
protected int getLayoutId() {
return R.layout.activity_setting;

View File

@@ -3,10 +3,14 @@ package com.example.modulevocal.presenter;
import android.content.Context;
import com.example.modulevocal.conacts.SettingConacts;
import com.xscm.moduleutil.bean.ActivitiesPermission;
import com.xscm.moduleutil.http.BaseObserver;
import com.xscm.moduleutil.presenter.BasePresenter;
import io.reactivex.disposables.Disposable;
import org.jetbrains.annotations.NotNull;
import java.lang.ref.WeakReference;
public class SettingPresenter extends BasePresenter<SettingConacts.View> implements SettingConacts.IMePre {
public SettingPresenter(SettingConacts.View view, Context context) {
@@ -43,4 +47,5 @@ public class SettingPresenter extends BasePresenter<SettingConacts.View> impleme
}
});
}
}

View File

@@ -53,7 +53,7 @@
android:id="@+id/ll_youth"
style="@style/My_Info_Item_LL_Style"
android:background="@drawable/bg_r15_white"
android:visibility="gone"
>
<TextView

View File

@@ -1,23 +1,32 @@
package com.tencent.qcloud.tuikit.tuichat.classicui.page;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.Nullable;
import com.alibaba.android.arouter.launcher.ARouter;
import com.google.gson.Gson;
import com.tencent.imsdk.relationship.UserInfo;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUICore;
import com.tencent.qcloud.tuicore.interfaces.TUIExtensionEventListener;
import com.tencent.qcloud.tuicore.interfaces.TUIExtensionInfo;
import com.tencent.qcloud.tuicore.interfaces.TUIValueCallback;
import com.tencent.qcloud.tuikit.timcommon.bean.UserBean;
import com.tencent.qcloud.tuikit.tuichat.R;
import com.tencent.qcloud.tuikit.tuichat.TUIChatConstants;
import com.tencent.qcloud.tuikit.tuichat.bean.C2CChatInfo;
import com.tencent.qcloud.tuikit.tuichat.bean.ChatInfo;
import com.tencent.qcloud.tuikit.tuichat.classicui.widget.input.InputView;
import com.tencent.qcloud.tuikit.tuichat.presenter.C2CChatPresenter;
import com.tencent.qcloud.tuikit.tuichat.presenter.FriendProfilePresenter;
import com.tencent.qcloud.tuikit.tuichat.util.TUIChatLog;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
@@ -63,36 +72,89 @@ public class TUIC2CChatFragment extends TUIBaseChatFragment {
}
private void setTitleBarExtension() {
titleBar.getRightGroup().setVisibility(View.GONE);
titleBar.getRightGroup().setVisibility(View.VISIBLE);
titleBar.setRightIcon(R.drawable.chat_title_bar_more_menu_icon);
titleBar.setOnRightClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Map<String, Object> param = new HashMap<>();
param.put(TUIConstants.TUIChat.Extension.ChatNavigationMoreItem.USER_ID, chatInfo.getId());
List<TUIExtensionInfo> extensionInfoList =
TUICore.getExtensionList(TUIConstants.TUIChat.Extension.ChatNavigationMoreItem.CLASSIC_EXTENSION_ID, param);
if (!extensionInfoList.isEmpty()) {
Collections.sort(extensionInfoList, new Comparator<TUIExtensionInfo>() {
// Map<String, Object> param = new HashMap<>();
// param.put(TUIConstants.TUIChat.Extension.ChatNavigationMoreItem.USER_ID, chatInfo.getId());
// List<TUIExtensionInfo> extensionInfoList =
// TUICore.getExtensionList(TUIConstants.TUIChat.Extension.ChatNavigationMoreItem.CLASSIC_EXTENSION_ID, param);
// if (!extensionInfoList.isEmpty()) {
// Collections.sort(extensionInfoList, new Comparator<TUIExtensionInfo>() {
// @Override
// public int compare(TUIExtensionInfo o1, TUIExtensionInfo o2) {
// return o2.getWeight() - o1.getWeight();
// }
// });
// TUIExtensionInfo extensionInfo = extensionInfoList.get(0);
// TUIExtensionEventListener eventListener = extensionInfo.getExtensionListener();
// if (eventListener != null) {
// Map<String, Object> map = new HashMap<>();
// map.put(TUIConstants.TUIChat.Extension.ChatNavigationMoreItem.USER_ID, chatInfo.getId());
// map.put(TUIChatConstants.CHAT_BACKGROUND_URI, mChatBackgroundThumbnailUrl);
// eventListener.onClicked(map);
// }
// } else {
// String userId = chatInfo.getId();
// openFriendProfile(userId);
// }
// 显示默认菜单,包含举报功能
showReportPopupMenu(v);
}
});
}
private void showReportPopupMenu(View anchorView) {
// 创建 PopupMenu 或自定义 PopupWindow
android.widget.PopupMenu popupMenu = new android.widget.PopupMenu(getContext(), anchorView);
// 添加举报选项
popupMenu.getMenu().add("举报");
// 设置点击监听
popupMenu.setOnMenuItemClickListener(new android.widget.PopupMenu.OnMenuItemClickListener() {
@Override
public int compare(TUIExtensionInfo o1, TUIExtensionInfo o2) {
return o2.getWeight() - o1.getWeight();
public boolean onMenuItemClick(android.view.MenuItem item) {
if ("举报".equals(item.getTitle())) {
ARouter.getInstance().build("/moduleUtil/WebViewActivity").withString("url", "https://vespa.qxyushen.top/h5/web/index.html#/pages/feedback/report?id=?id="+getToken()+"&fromType=1&fromId="+ getUserInfo().getUser_id()).navigation();
return true;
}
return false;
}
});
TUIExtensionInfo extensionInfo = extensionInfoList.get(0);
TUIExtensionEventListener eventListener = extensionInfo.getExtensionListener();
if (eventListener != null) {
Map<String, Object> map = new HashMap<>();
map.put(TUIConstants.TUIChat.Extension.ChatNavigationMoreItem.USER_ID, chatInfo.getId());
map.put(TUIChatConstants.CHAT_BACKGROUND_URI, mChatBackgroundThumbnailUrl);
eventListener.onClicked(map);
popupMenu.show();
}
} else {
String userId = chatInfo.getId();
openFriendProfile(userId);
private String getToken(){
SharedPreferences sp = getContext().getSharedPreferences("Vespa", Context.MODE_PRIVATE);
return sp.getString("token","");
}
private UserIfo getUserInfo(){
SharedPreferences sp = getContext().getSharedPreferences("Vespa", Context.MODE_PRIVATE);
String s= sp.getString("userInfo","");
if (TextUtils.isEmpty(s)){
return null;
}
Gson Gson = new Gson();
UserIfo userInd =Gson.fromJson(s, UserIfo.class);
return userInd;
}
public static class UserIfo{
String user_id;
public String getUser_id() {
return user_id;
}
public void setUser_id(String user_id) {
this.user_id = user_id;
}
});
}
private void openFriendProfile(String userId) {

Binary file not shown.

After

Width:  |  Height:  |  Size: 250 B