honghengqiang 3 years ago
parent
commit
caf77181d0
27 changed files with 491 additions and 88 deletions
  1. 1 0
      .idea/misc.xml
  2. 147 0
      app/src/main/java/com/swago/app/CrashHandler.java
  3. 1 0
      app/src/main/java/com/swago/app/SwagoApp.kt
  4. 1 1
      baseswago/src/main/java/com/swago/baseswago/inter/LoginApi.kt
  5. 6 1
      baseswago/src/main/java/com/swago/baseswago/inter/RoomApi.kt
  6. 1 3
      baseswago/src/main/java/com/swago/baseswago/model/live/gift/GiftModel.java
  7. 28 0
      baseswago/src/main/java/com/swago/baseswago/model/live/gift/GiftSendModel.java
  8. 1 0
      baseswago/src/main/java/com/swago/baseswago/util/BaseViewModel.kt
  9. 1 1
      baseswago/src/main/java/com/swago/baseswago/util/NoDoubleClickListener.kt
  10. 10 0
      baseswago/src/main/res/values-zh/strings.xml
  11. 10 0
      baseswago/src/main/res/values/strings.xml
  12. 4 0
      home/src/main/java/com/swago/home/HomeActivity.kt
  13. 93 35
      login/src/main/java/com/swago/login/LoginActivity.kt
  14. 23 15
      login/src/main/java/com/swago/login/LoginVm.kt
  15. 56 6
      login/src/main/res/layout/activity_login.xml
  16. 43 1
      room/src/main/java/com/swago/room/gift/GiftDialog.kt
  17. 8 17
      room/src/main/java/com/swago/room/gift/GiftFragment.kt
  18. 38 1
      room/src/main/java/com/swago/room/gift/GiftVm.kt
  19. 5 1
      room/src/main/java/com/swago/room/user/UserRoomFragment.kt
  20. 5 0
      room/src/main/res/drawable/selector_gift_send.xml
  21. 2 3
      room/src/main/res/layout/dialog_gift.xml
  22. 0 1
      room/src/main/res/layout/dialog_user_for_anchor_close.xml
  23. 1 0
      room/src/main/res/layout/layout_user_footer_view.xml
  24. 3 0
      user/src/main/java/com/swago/user/recharge/RechargeActivity.kt
  25. 1 0
      user/src/main/res/layout/activity_level.xml
  26. 1 1
      user/src/main/res/layout/fragment_anchor_level.xml
  27. 1 1
      user/src/main/res/layout/fragment_rich_level.xml

+ 1 - 0
.idea/misc.xml

@@ -64,6 +64,7 @@
         <entry key="home/src/main/res/layout/layout_view_header.xml" value="0.2203125" />
         <entry key="login/src/main/res/drawable/shape_white_5.xml" value="0.39375" />
         <entry key="login/src/main/res/layout/activity_login.xml" value="0.22" />
+        <entry key="room/src/main/res/drawable/selector_gift_send.xml" value="0.3851851851851852" />
         <entry key="room/src/main/res/drawable/shape_80000000_20.xml" value="0.3723076923076923" />
         <entry key="room/src/main/res/layout/activity_anchor_room.xml" value="0.21302083333333333" />
         <entry key="room/src/main/res/layout/activity_rank_list.xml" value="0.3776041666666667" />

+ 147 - 0
app/src/main/java/com/swago/app/CrashHandler.java

@@ -0,0 +1,147 @@
+package com.swago.app;
+
+import android.content.Context;
+import android.os.Environment;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+
+import com.swago.baseswago.util.AppContext;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @date 2021/7/15 19:06
+ * description:
+ */
+public class CrashHandler implements Thread.UncaughtExceptionHandler {
+
+    public static final String TAG = "CrashHandler";
+    //CrashHandler实例
+    private static CrashHandler INSTANCE = new CrashHandler();
+    //系统默认的UncaughtException处理类
+    private Thread.UncaughtExceptionHandler mDefaultHandler;
+    //程序的Context对象
+    private Context mContext;
+    //用来存储设备信息和异常信息
+    private Map<String, String> infos = new HashMap<String, String>();
+
+    //用于格式化日期,作为日志文件名的一部分
+    private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
+
+    /**
+     * 保证只有一个CrashHandler实例
+     */
+    private CrashHandler() {
+    }
+
+    /**
+     * 获取CrashHandler实例 ,单例模式
+     */
+    public static CrashHandler getInstance() {
+        return INSTANCE;
+    }
+
+    /**
+     * 初始化
+     *
+     * @param context
+     */
+    public void init(Context context) {
+        mContext = context;
+        //获取系统默认的UncaughtException处理器
+        mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
+        //设置该CrashHandler为程序的默认处理器
+        Thread.setDefaultUncaughtExceptionHandler(this);
+    }
+
+
+    @Override
+    public void uncaughtException(@NonNull Thread thread, @NonNull Throwable ex) {
+        handleException(ex);
+        if (mDefaultHandler != null) {
+            //如果用户没有处理则让系统默认的异常处理器来处理
+            mDefaultHandler.uncaughtException(thread, ex);
+        }
+    }
+
+    /**
+     * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.
+     *
+     * @param ex
+     * @return true:如果处理了该异常信息;否则返回false.
+     */
+    private boolean handleException(Throwable ex) {
+        if (ex == null) {
+            return false;
+        }
+//        //使用Toast来显示异常信息
+//        new Thread() {
+//            @Override
+//            public void run() {
+//                Looper.prepare();
+//                Toast.makeText(mContext, "Your app is tired.", Toast.LENGTH_LONG).show();
+//                Looper.loop();
+//            }
+//        }.start();
+        //保存日志文件
+        saveCrashInfo2File(ex);
+        return true;
+    }
+
+    /**
+     * 保存错误信息到文件中
+     *
+     * @param ex
+     * @return 返回文件名称, 便于将文件传送到服务器
+     */
+    private String saveCrashInfo2File(Throwable ex) {
+
+        StringBuffer sb = new StringBuffer();
+        for (Map.Entry<String, String> entry : infos.entrySet()) {
+            String key = entry.getKey();
+            String value = entry.getValue();
+            sb.append(key + "=" + value + "\n");
+        }
+
+        Writer writer = new StringWriter();
+        PrintWriter printWriter = new PrintWriter(writer);
+        ex.printStackTrace(printWriter);
+        Throwable cause = ex.getCause();
+        while (cause != null) {
+            cause.printStackTrace(printWriter);
+            cause = cause.getCause();
+        }
+        printWriter.close();
+        String result = writer.toString();
+        sb.append(result);
+        try {
+            long timestamp = System.currentTimeMillis();
+            String time = formatter.format(new Date());
+            String fileName = "crash-" + time + "-" + timestamp + ".log";
+            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
+                String path = AppContext.getContext().getExternalFilesDir("").getAbsolutePath() + "/swago/";
+                File file = new File(path);
+                if (!file.exists()) {
+                    file.mkdirs();
+                }
+                FileOutputStream fos = new FileOutputStream(path + fileName);
+                fos.write(sb.toString().getBytes());
+                fos.close();
+            }
+            return fileName;
+        } catch (Exception e) {
+            Log.e(TAG, "an error occured while writing file...", e);
+        }
+        return null;
+    }
+}

+ 1 - 0
app/src/main/java/com/swago/app/SwagoApp.kt

@@ -25,6 +25,7 @@ class SwagoApp : Application() {
         if (BuildConfig.DEBUG) {
             ARouter.openLog()
             ARouter.openDebug()
+            CrashHandler.getInstance().init(this)
         }
         ActivityManagerUtil.get().init(this)
         ARouter.init(this)

+ 1 - 1
baseswago/src/main/java/com/swago/baseswago/inter/LoginApi.kt

@@ -18,6 +18,6 @@ interface LoginApi {
 
     @FormUrlEncoded
     @POST("/v1/user/login")
-    suspend fun loginByAccount(@Field("login_source")source:String,@Field("secret")token:String): LoginModel
+    suspend fun loginByAccount(@Field("user_account")user_account:String,@Field("secret")token:String,@Field("login_source")source:String="app"): LoginModel
 
 }

+ 6 - 1
baseswago/src/main/java/com/swago/baseswago/inter/RoomApi.kt

@@ -5,6 +5,7 @@ import com.swago.baseswago.model.live.RankListModel
 import com.swago.baseswago.model.live.RoomModel
 import com.swago.baseswago.model.live.RoomUserModel
 import com.swago.baseswago.model.live.gift.GiftAllModel
+import com.swago.baseswago.model.live.gift.GiftSendModel
 import retrofit2.http.*
 
 /**
@@ -67,5 +68,9 @@ interface RoomApi {
      */
     @FormUrlEncoded
     @POST("/v1/rtc/buy/gift")
-    suspend fun sendGift(@Query("room_id")room_id:String):Any
+    suspend fun sendGift(@Field("room_id")room_id:String,
+                         @Field("gift_id")gift_id:String,
+                         @Field("gift_batch")gift_batch:Int,
+                         @Field("gift_receive_id")gift_receive_id:String,
+                         @Field("gift_num")gift_num:Int): GiftSendModel
 }

+ 1 - 3
baseswago/src/main/java/com/swago/baseswago/model/live/gift/GiftModel.java

@@ -22,7 +22,7 @@ public class GiftModel implements Parcelable {
     private String gift_coins;
     private String gift_icon_url;
     private String gift_svg_url;
-    private boolean isSelected = false;
+    private boolean isSelected;
 
     protected GiftModel(Parcel in) {
         id = in.readString();
@@ -30,7 +30,6 @@ public class GiftModel implements Parcelable {
         gift_coins = in.readString();
         gift_icon_url = in.readString();
         gift_svg_url = in.readString();
-        isSelected = in.readBoolean();
     }
 
     public static final Creator<GiftModel> CREATOR = new Creator<GiftModel>() {
@@ -105,6 +104,5 @@ public class GiftModel implements Parcelable {
         dest.writeString(gift_coins);
         dest.writeString(gift_icon_url);
         dest.writeString(gift_svg_url);
-        dest.writeBoolean(isSelected);
     }
 }

+ 28 - 0
baseswago/src/main/java/com/swago/baseswago/model/live/gift/GiftSendModel.java

@@ -0,0 +1,28 @@
+package com.swago.baseswago.model.live.gift;
+
+/**
+ * @date 2021/12/14 18:19
+ * description:
+ */
+public class GiftSendModel {
+
+    private int gift_batch;
+    private String user_coins;
+
+
+    public int getGift_batch() {
+        return gift_batch;
+    }
+
+    public void setGift_batch(int gift_batch) {
+        this.gift_batch = gift_batch;
+    }
+
+    public String getUser_coins() {
+        return user_coins;
+    }
+
+    public void setUser_coins(String user_coins) {
+        this.user_coins = user_coins;
+    }
+}

+ 1 - 0
baseswago/src/main/java/com/swago/baseswago/util/BaseViewModel.kt

@@ -70,6 +70,7 @@ open class BaseViewModel(application: Application) : AndroidViewModel(applicatio
             try {
                 block.requestData.invoke(this)
             } catch (e: Exception) {
+                Toast.makeText(AppContext.getContext(), e.message, Toast.LENGTH_SHORT).show()
                 if (e is SwagoException) {
                     if (e.code == 403) {
                         if (UserInfo.getLoginModel()?.token?.isNotEmpty() == true){

+ 1 - 1
baseswago/src/main/java/com/swago/baseswago/util/NoDoubleClickListener.kt

@@ -9,7 +9,7 @@ import android.view.View
 abstract class NoDoubleClickListener : View.OnClickListener{
 
     companion object{
-        const val delayTime = 800
+        const val delayTime = 500
     }
 
     var lastClickTime = 0L

+ 10 - 0
baseswago/src/main/res/values-zh/strings.xml

@@ -81,4 +81,14 @@
     <string name="send">赠送</string>
     <string name="hot">热门</string>
     <string name="luxury">高级</string>
+    <string name="pay_cancel">支付取消</string>
+    <string name="pay_fail">支付失败</string>
+    <string name="send_to">赠送给%s</string>
+    <string name="install_facebook">请您先安装Facebook</string>
+    <string name="acccount_login">账号登陆</string>
+    <string name="input_account">请输入账号</string>
+    <string name="input_secret">请输入密码</string>
+    <string name="login">登录</string>
+    <string name="facebook_google_login">其他登录方式</string>
+    <string name="google_service_error">您的谷歌服务存在问题</string>
 </resources>

+ 10 - 0
baseswago/src/main/res/values/strings.xml

@@ -86,4 +86,14 @@
     <string name="send">Send</string>
     <string name="hot">Hot</string>
     <string name="luxury">Luxury</string>
+    <string name="pay_cancel">Pay Cancel</string>
+    <string name="pay_fail">Pay Fail</string>
+    <string name="send_to">Send to %s</string>
+    <string name="install_facebook">Please install Facebook Application</string>
+    <string name="acccount_login">Account Login</string>
+    <string name="input_account">Please input your account</string>
+    <string name="input_secret">Please input your secret</string>
+    <string name="login">Login</string>
+    <string name="facebook_google_login">Other login ways</string>
+    <string name="google_service_error">Your google service is abnormal</string>
 </resources>

+ 4 - 0
home/src/main/java/com/swago/home/HomeActivity.kt

@@ -20,6 +20,7 @@ import com.swago.baseswago.im.IMMessageManager
 import com.swago.baseswago.libpay.IPayCallback
 import com.swago.baseswago.libpay.PayManager
 import com.swago.baseswago.model.pay.PayModel
+import com.swago.baseswago.util.AppContext
 import com.swago.home.databinding.ActivityHomeBinding
 import com.swago.home.official.OfficialVm
 
@@ -146,15 +147,18 @@ class HomeActivity : BaseXActivity<ActivityHomeBinding>(), IPayCallback {
     }
 
     override fun onPaySuccess(data: List<Purchase>?) {
+        //调用谷歌支付回调支付成功
     }
 
     override fun onQueryProductPrice(data: List<PayModel>) {
     }
 
     override fun onPayError(code: Int) {
+        Toast.makeText(AppContext.getContext(), AppContext.getContext().resources.getString(R.string.pay_fail)+"-$code", Toast.LENGTH_SHORT).show()
     }
 
     override fun onPayCancel() {
+        Toast.makeText(AppContext.getContext(), AppContext.getContext().resources.getString(R.string.pay_cancel), Toast.LENGTH_SHORT).show()
     }
 
     override fun onUnConsumeOrder(data: List<Purchase>) {

+ 93 - 35
login/src/main/java/com/swago/login/LoginActivity.kt

@@ -1,14 +1,16 @@
 package com.swago.login
 
 import android.Manifest
+import android.app.Activity
 import android.content.Intent
+import android.view.View
 import android.widget.Toast
 import androidx.activity.viewModels
 import com.alibaba.android.arouter.facade.annotation.Route
 import com.alibaba.android.arouter.launcher.ARouter
 import com.google.android.gms.auth.api.signin.GoogleSignIn
-import com.google.android.gms.auth.api.signin.GoogleSignInAccount
 import com.google.android.gms.auth.api.signin.GoogleSignInStatusCodes
+import com.google.android.gms.common.GoogleApiAvailability
 import com.google.android.gms.common.api.ApiException
 import com.google.android.gms.common.api.CommonStatusCodes
 import com.permissionx.guolindev.PermissionX
@@ -29,6 +31,8 @@ import com.swago.login.databinding.ActivityLoginBinding
 class LoginActivity : BaseXActivity<ActivityLoginBinding>() {
 
     private val loginVm by viewModels<LoginVm>()
+    private var isAccountLogin = false
+
 
     override fun loadData() {
 
@@ -43,47 +47,57 @@ class LoginActivity : BaseXActivity<ActivityLoginBinding>() {
             }
         })
 
+
         binding.clFaceBook.setOnClickListener(object : NoDoubleClickListener() {
             override fun onClick() {
-                PermissionX.init(this@LoginActivity)
-                    .permissions(
-                        Manifest.permission.CAMERA,
-                        Manifest.permission.RECORD_AUDIO,
-                        Manifest.permission.READ_EXTERNAL_STORAGE
-                    )
-                    .request { allGranted, grantedList, deniedList ->
-                        if (allGranted) {
-                            FBLogin.login(this@LoginActivity)
-                        } else {
-                            Toast.makeText(
-                                this@LoginActivity,
-                                "These permissions are denied: $deniedList",
-                                Toast.LENGTH_LONG
-                            ).show()
+                if (isInstall(this@LoginActivity,FACEBOOK)){
+                    PermissionX.init(this@LoginActivity)
+                        .permissions(
+                            Manifest.permission.CAMERA,
+                            Manifest.permission.RECORD_AUDIO,
+                            Manifest.permission.READ_EXTERNAL_STORAGE
+                        )
+                        .request { allGranted, grantedList, deniedList ->
+                            if (allGranted) {
+                                FBLogin.login(this@LoginActivity)
+                            } else {
+                                Toast.makeText(
+                                    this@LoginActivity,
+                                    "These permissions are denied: $deniedList",
+                                    Toast.LENGTH_LONG
+                                ).show()
+                            }
                         }
-                    }
+                }else{
+                    Toast.makeText(AppContext.getContext(), AppContext.getContext().resources.getString(R.string.install_facebook), Toast.LENGTH_SHORT).show()
+                }
+
             }
         })
 
         binding.clGoogle.setOnClickListener(object : NoDoubleClickListener() {
             override fun onClick() {
-                PermissionX.init(this@LoginActivity)
-                    .permissions(
-                        Manifest.permission.CAMERA,
-                        Manifest.permission.RECORD_AUDIO,
-                        Manifest.permission.READ_EXTERNAL_STORAGE
-                    )
-                    .request { allGranted, grantedList, deniedList ->
-                        if (allGranted) {
-                            GoogleLogin.login(this@LoginActivity)
-                        } else {
-                            Toast.makeText(
-                                this@LoginActivity,
-                                "These permissions are denied: $deniedList",
-                                Toast.LENGTH_LONG
-                            ).show()
+                if (isInstall(this@LoginActivity,GOOGLE)) {
+                    PermissionX.init(this@LoginActivity)
+                        .permissions(
+                            Manifest.permission.CAMERA,
+                            Manifest.permission.RECORD_AUDIO,
+                            Manifest.permission.READ_EXTERNAL_STORAGE
+                        )
+                        .request { allGranted, grantedList, deniedList ->
+                            if (allGranted) {
+                                GoogleLogin.login(this@LoginActivity)
+                            } else {
+                                Toast.makeText(
+                                    this@LoginActivity,
+                                    "These permissions are denied: $deniedList",
+                                    Toast.LENGTH_LONG
+                                ).show()
+                            }
                         }
-                    }
+                }else{
+                    Toast.makeText(AppContext.getContext(), "", Toast.LENGTH_SHORT).show()
+                }
             }
         })
 
@@ -111,9 +125,33 @@ class LoginActivity : BaseXActivity<ActivityLoginBinding>() {
             }
         })
 
-        binding.bt.setOnClickListener(object: NoDoubleClickListener() {
+        binding.tvAccountLogin.setOnClickListener(object: NoDoubleClickListener() {
             override fun onClick() {
-                loginVm.loginByAccount("app", "xx")
+                if (isAccountLogin){
+                    binding.etAccount.visibility = View.GONE
+                    binding.etSecret.visibility = View.GONE
+                    binding.tvLogin.visibility = View.GONE
+                    binding.clFaceBook.visibility = View.VISIBLE
+                    binding.clGoogle.visibility = View.VISIBLE
+                    binding.tvAccountLogin.text = AppContext.getContext().resources.getString(R.string.acccount_login)
+                }else{
+                    binding.etAccount.visibility = View.VISIBLE
+                    binding.etSecret.visibility = View.VISIBLE
+                    binding.tvLogin.visibility = View.VISIBLE
+                    binding.clFaceBook.visibility = View.GONE
+                    binding.clGoogle.visibility = View.GONE
+                    binding.tvAccountLogin.text = AppContext.getContext().resources.getString(R.string.facebook_google_login)
+
+                }
+                isAccountLogin = !isAccountLogin
+            }
+        })
+
+        binding.tvLogin.setOnClickListener(object:NoDoubleClickListener(){
+            override fun onClick() {
+                val account = binding.etAccount.text.toString()
+                val secret = binding.etSecret.text.toString()
+                loginVm.loginByAccount(account, secret)
             }
         })
     }
@@ -162,4 +200,24 @@ class LoginActivity : BaseXActivity<ActivityLoginBinding>() {
         }
     }
 
+
+    val FACEBOOK = "com.facebook.katana"
+    val GOOGLE = "google"
+    fun isInstall(activity: Activity, platform:String):Boolean{
+        if (platform == GOOGLE){
+            val available = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(activity)
+            return available == 0
+        }
+        val packageManager = activity.packageManager
+        val info = packageManager.getInstalledPackages(0)
+        if (info.isEmpty()){
+            return false
+        }
+        info.forEach {
+            if (platform == it.packageName){
+                return true
+            }
+        }
+        return false
+    }
 }

+ 23 - 15
login/src/main/java/com/swago/login/LoginVm.kt

@@ -65,21 +65,29 @@ class LoginVm(application: Application) : BaseViewModel(application) {
     }
 
     fun loginByAccount(account: String, pwd: String) {
-        requestData {
-            val data = ApiManager.loginApi.loginByAccount(account,pwd)
-            SpUtil.putString("login_info", Gson().toJson(data))
-            TUIKit.login(data.user_account,data.user_sig,object:
-                IUIKitCallBack {
-                override fun onSuccess(data: Any?) {
-                    ARouter.getInstance().build(ARouteConstant.Home.home).navigation()
-
-                }
-
-                override fun onError(module: String?, errCode: Int, errMsg: String?) {
-                    Log.d("ddd","$errCode")
-                }
-
-            })
+        requestData2 {
+            requestData {
+                SwagoLoading.showLoadingDialog(ActivityManagerUtil.get().currentActivity())
+                val data = ApiManager.loginApi.loginByAccount(account,pwd)
+                SpUtil.putString("login_info", Gson().toJson(data))
+                TUIKit.login(data.user_account,data.user_sig,object:
+                    IUIKitCallBack {
+                    override fun onSuccess(data: Any?) {
+                        SwagoLoading.cancelLoadingDialog()
+                        IMUtil.joinGroup(loginFun,joinGroupCallback)
+                    }
+
+                    override fun onError(module: String?, errCode: Int, errMsg: String?) {
+                        SwagoLoading.cancelLoadingDialog()
+                        Toast.makeText(AppContext.getContext(), "Login fail code=$errCode", Toast.LENGTH_SHORT).show()
+                    }
+                })
+            }
+
+            requestError {
+                Toast.makeText(AppContext.getContext(), it.message, Toast.LENGTH_SHORT).show()
+                SwagoLoading.cancelLoadingDialog()
+            }
         }
     }
 

+ 56 - 6
login/src/main/res/layout/activity_login.xml

@@ -1,15 +1,30 @@
 <?xml version="1.0" encoding="utf-8"?>
 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tool="http://schemas.android.com/tools"
     android:background="@mipmap/login_bg"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
+
+    <TextView
+        android:id="@+id/tvAccountLogin"
+        android:text="@string/acccount_login"
+        android:layout_width="wrap_content"
+        android:layout_marginBottom="10dp"
+        android:textSize="16dp"
+        android:textColor="#fff"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintBottom_toTopOf="@+id/tvAgreement"
+        android:layout_height="wrap_content"/>
+
     <androidx.constraintlayout.widget.ConstraintLayout
         android:id="@+id/clFaceBook"
         android:layout_marginBottom="176dp"
         android:layout_marginStart="40dp"
         android:layout_marginEnd="40dp"
+        android:visibility="visible"
         android:background="@drawable/shape_white_5"
         app:layout_constraintBottom_toBottomOf="parent"
         android:layout_width="match_parent"
@@ -44,7 +59,6 @@
         android:layout_marginBottom="112dp"
         android:layout_marginStart="40dp"
         android:layout_marginEnd="40dp"
-        android:visibility="visible"
         android:background="@drawable/shape_white_5"
         app:layout_constraintBottom_toBottomOf="parent"
         android:layout_width="match_parent"
@@ -73,16 +87,52 @@
 
     </androidx.constraintlayout.widget.ConstraintLayout>
 
-
-    <Button
-        android:id="@+id/bt"
+    <EditText
+        android:id="@+id/etAccount"
+        android:layout_marginBottom="230dp"
         android:layout_marginStart="40dp"
         android:layout_marginEnd="40dp"
+        android:hint="@string/input_account"
+        android:gravity="center"
+        android:textColor="#000"
+        android:textSize="18dp"
         android:visibility="gone"
-        app:layout_constraintTop_toBottomOf="@+id/clGoogle"
+        android:background="@drawable/shape_white_5"
+        app:layout_constraintBottom_toBottomOf="parent"
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"/>
+        android:layout_height="44dp"/>
+
+    <EditText
+        android:id="@+id/etSecret"
+        android:hint="@string/input_secret"
+        android:gravity="center"
+        android:textColor="#000"
+        android:textSize="18dp"
+        android:visibility="gone"
+        android:inputType="textPassword"
+        android:layout_marginBottom="176dp"
+        android:layout_marginStart="40dp"
+        android:layout_marginEnd="40dp"
+        android:background="@drawable/shape_white_5"
+        app:layout_constraintBottom_toBottomOf="parent"
+        android:layout_width="match_parent"
+        android:layout_height="44dp"/>
 
+    <TextView
+        android:id="@+id/tvLogin"
+        android:hint="@string/input_secret"
+        android:gravity="center"
+        android:text="@string/login"
+        android:textColor="#100F0F"
+        android:textSize="18dp"
+        android:visibility="gone"
+        android:layout_marginStart="40dp"
+        android:layout_marginEnd="40dp"
+        android:layout_marginTop="10dp"
+        app:layout_constraintTop_toBottomOf="@+id/etSecret"
+        android:background="@drawable/shape_9ffd88_6ef2df_5"
+        android:layout_width="match_parent"
+        android:layout_height="44dp"/>
 
 
     <TextView

+ 43 - 1
room/src/main/java/com/swago/room/gift/GiftDialog.kt

@@ -5,16 +5,21 @@ import android.graphics.Color
 import android.os.Bundle
 import android.util.Log
 import android.view.Gravity
+import androidx.fragment.app.viewModels
 import androidx.viewpager.widget.ViewPager
+import com.facebook.internal.AppCall
 import com.swago.baseswago.GradientIndicator
 import com.swago.baseswago.SwagoAdapter
+import com.swago.baseswago.baseroom.SwagoRoomManager
 import com.swago.baseswago.dialog.BaseXDFragment
 import com.swago.baseswago.model.live.gift.GiftModel
 import com.swago.baseswago.util.AppContext
 import com.swago.baseswago.util.DpPxUtil
 import com.swago.baseswago.util.LogUtil
+import com.swago.baseswago.util.UserInfo
 import com.swago.room.R
 import com.swago.room.databinding.DialogGiftBinding
+import com.swago.room.gift.GiftConfig.giftSelectedWhichType
 import net.lucode.hackware.magicindicator.ViewPagerHelper
 import net.lucode.hackware.magicindicator.buildins.commonnavigator.CommonNavigator
 import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.CommonNavigatorAdapter
@@ -28,6 +33,12 @@ import net.lucode.hackware.magicindicator.buildins.commonnavigator.titles.Simple
  */
 class GiftDialog : BaseXDFragment<DialogGiftBinding>() {
 
+    private val giftVm by viewModels<GiftVm>()
+    private var giftBatch = 0
+    private var returnGiftBatch = 0
+    private var receiveId = ""
+    private var receiveName = ""
+
     private val titleList = arrayListOf(
         AppContext.getContext().resources.getString(R.string.hot),
         AppContext.getContext().resources.getString(R.string.luxury)
@@ -50,12 +61,16 @@ class GiftDialog : BaseXDFragment<DialogGiftBinding>() {
 
     companion object {
         fun newInstance(
+            receiveName:String,
+            receiveId: String,
             hotData: ArrayList<GiftModel>,
             luxuryData: ArrayList<GiftModel>,
             luckyData: ArrayList<GiftModel>
         ): GiftDialog {
             val giftDialog = GiftDialog()
             val bundle = Bundle()
+            bundle.putString("receiveId",receiveId)
+            bundle.putString("receiveName",receiveName)
             bundle.putParcelableArrayList("hot", hotData)
             bundle.putParcelableArrayList("luxury", luxuryData)
             bundle.putParcelableArrayList("lucky", luckyData)
@@ -66,9 +81,15 @@ class GiftDialog : BaseXDFragment<DialogGiftBinding>() {
 
     override fun initOther() {
         arguments?.let {
+            receiveId = it.getString("receiveId","")
+            receiveName = it.getString("receiveName","")
             hotData = it.getParcelableArrayList<GiftModel>("hot")
             luxuryData = it.getParcelableArrayList<GiftModel>("luxury")
             val luckyData = it.getParcelableArrayList<GiftModel>("lucky") as ArrayList<GiftModel>
+
+            binding.tvCoins.text = UserInfo.getUserInfo()?.user_coins?:"0"
+            binding.tvSender.text = AppContext.getContext().resources.getString(R.string.send_to).format(receiveName)
+
             hotFragment = GiftFragment.newInstance(1, hotData!!)
             luxuryFragment = GiftFragment.newInstance(2, luxuryData!!)
             giftFragmentList.add(hotFragment!!)
@@ -163,6 +184,8 @@ class GiftDialog : BaseXDFragment<DialogGiftBinding>() {
                         hotData?.let {
                             val gifModel = it[GiftConfig.giftSelectedPageIndex*8+GiftConfig.giftSelectedPageSelectedPosition]
                             LogUtil.d("礼物id","${gifModel.gift_name}")
+                            sendGift(gifModel)
+
                         }
                     }
 
@@ -171,18 +194,37 @@ class GiftDialog : BaseXDFragment<DialogGiftBinding>() {
                         luxuryData?.let {
                             val gifModel = it[GiftConfig.giftSelectedPageIndex*8+GiftConfig.giftSelectedPageSelectedPosition]
                             LogUtil.d("礼物id","${gifModel.gift_name}")
+                            sendGift(gifModel)
                         }
                     }
 
                     3 -> {
 
                     }
-
                 }
+
+
+
+            }
+        }
+    }
+
+
+    private fun sendGift(giftModel: GiftModel,giftNum:Int=1){
+        giftBatch ++
+        if (receiveId.isNotEmpty()){
+            SwagoRoomManager.iRoomInfo?.let {
+                giftVm.sendGift(it.getRoomId(),giftModel.id,giftBatch,receiveId,giftNum)
             }
         }
     }
 
     override fun initLiveData() {
+        giftVm.sendResultLiveData.observe(this){
+            if (returnGiftBatch<it.gift_batch){
+                binding.tvCoins.text = it.user_coins?:"0"
+                returnGiftBatch = it.gift_batch
+            }
+        }
     }
 }

+ 8 - 17
room/src/main/java/com/swago/room/gift/GiftFragment.kt

@@ -14,7 +14,9 @@ import com.swago.room.databinding.FragmentGiftBinding
  *description:
  */
 class GiftFragment : BaseXFragment<FragmentGiftBinding>() {
-
+    /**
+     * type礼物类型
+     */
     private var type = -1
     private var data: ArrayList<GiftModel>? = null
 
@@ -52,24 +54,13 @@ class GiftFragment : BaseXFragment<FragmentGiftBinding>() {
             horizontalPagerSnapHelper.attachToRecyclerView(binding.recyclerView)
             binding.recyclerView.adapter = adapter
 
+
             data?.let {
                 if (it.isEmpty()) return@let
-                when (GiftConfig.giftSelectedWhichType) {
-                    1 -> {
-                        it[GiftConfig.giftSelectedPageIndex * 8 + GiftConfig.giftSelectedPageSelectedPosition].isSelected =
-                            true
-                        binding.recyclerView.scrollToPosition(GiftConfig.giftSelectedPageIndex)
-                    }
-                    2 -> {
-                        it[GiftConfig.giftSelectedPageIndex * 8 + GiftConfig.giftSelectedPageSelectedPosition].isSelected =
-                            true
-                        binding.recyclerView.scrollToPosition(GiftConfig.giftSelectedPageIndex)
-                    }
-                    3 -> {
-                        it[GiftConfig.giftSelectedPageIndex * 8 + GiftConfig.giftSelectedPageSelectedPosition].isSelected =
-                            true
-                        binding.recyclerView.scrollToPosition(GiftConfig.giftSelectedPageIndex)
-                    }
+                if (GiftConfig.giftSelectedWhichType == type){
+                    it[GiftConfig.giftSelectedPageIndex * 8 + GiftConfig.giftSelectedPageSelectedPosition].isSelected =
+                        true
+                    binding.recyclerView.scrollToPosition(GiftConfig.giftSelectedPageIndex)
                 }
 
                 val isEight = it.size % 8 == 0

+ 38 - 1
room/src/main/java/com/swago/room/gift/GiftVm.kt

@@ -1,11 +1,16 @@
 package com.swago.room.gift
 
 import android.app.Application
+import android.widget.Toast
 import androidx.lifecycle.MutableLiveData
 import com.swago.baseswago.inter.ApiManager
+import com.swago.baseswago.model.SwagoException
 import com.swago.baseswago.model.live.gift.GiftAllModel
 import com.swago.baseswago.model.live.gift.GiftModel
+import com.swago.baseswago.model.live.gift.GiftSendModel
+import com.swago.baseswago.util.AppContext
 import com.swago.baseswago.util.BaseViewModel
+import retrofit2.http.Field
 
 /**
  *@date 2021/12/12 17:03
@@ -17,11 +22,43 @@ class GiftVm(application: Application) : BaseViewModel(application) {
         MutableLiveData<List<GiftAllModel>>()
     }
 
-    fun getGiftList(){
+    /**
+     * 获取礼物列表
+     */
+    fun getGiftList() {
         requestData {
             val data = ApiManager.roomApi.getGiftList()
             allGiftLiveData.value = data
         }
     }
 
+
+    /**
+     * 送礼
+     */
+    val sendResultLiveData by lazy {
+        MutableLiveData<GiftSendModel>()
+    }
+
+    fun sendGift(
+        room_id: String,
+        gift_id: String,
+        gift_batch: Int,
+        gift_receive_id: String,
+        gift_num: Int = 1,
+    ) {
+        requestData2 {
+            requestData {
+                val data = ApiManager.roomApi.sendGift(room_id, gift_id, gift_batch, gift_receive_id, gift_num)
+                sendResultLiveData.value = data
+            }
+
+            requestError {
+                if (it is SwagoException){
+                    Toast.makeText(AppContext.getContext(), it.message, Toast.LENGTH_SHORT).show()
+                }
+            }
+        }
+    }
+
 }

+ 5 - 1
room/src/main/java/com/swago/room/user/UserRoomFragment.kt

@@ -66,7 +66,11 @@ class UserRoomFragment : BaseComFragment<FragmentBaseComBinding>() {
         footerView.openGiftPanelFun = {
             if (hotList.isNotEmpty()||luxuryList.isNotEmpty()){
                 //打开礼物列表
-                GiftDialog.newInstance(hotList,luxuryList,luckyData).show(childFragmentManager,"GiftDialog")
+                    SwagoRoomManager.iRoomInfo?.let {
+                        if (it.getAnchorId().isNotEmpty()){
+                            GiftDialog.newInstance(it.getAnchorName(),it.getAnchorId(),hotList,luxuryList,luckyData).show(childFragmentManager,"GiftDialog")
+                        }
+                    }
             }
         }
 

+ 5 - 0
room/src/main/res/drawable/selector_gift_send.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@drawable/shape_9ffd88_6ef2df_5" android:state_pressed="false"/>
+    <item android:drawable="@drawable/shape_black_5" android:state_pressed="true"/>
+</selector>

+ 2 - 3
room/src/main/res/layout/dialog_gift.xml

@@ -20,7 +20,6 @@
 
         <TextView
             android:id="@+id/tvSender"
-            android:text="Send to %s"
             android:textColor="#fff"
             app:layout_constraintTop_toTopOf="@+id/magicIndicator"
             app:layout_constraintBottom_toBottomOf="@+id/magicIndicator"
@@ -60,10 +59,10 @@
         <TextView
             android:id="@+id/tvToSend"
             android:textSize="14dp"
-            android:textColor="#fff"
+            android:textColor="#2E2D2B"
             android:text="@string/send"
             android:gravity="center"
-            android:background="@drawable/shape_9ffd88_6ef2df_5"
+            android:background="@drawable/selector_gift_send"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintTop_toBottomOf="@+id/viewPager"
             app:layout_constraintBottom_toBottomOf="parent"

+ 0 - 1
room/src/main/res/layout/dialog_user_for_anchor_close.xml

@@ -2,7 +2,6 @@
 <androidx.constraintlayout.widget.ConstraintLayout 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"
-    android:background="@mipmap/anchor_close_bg"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 

+ 1 - 0
room/src/main/res/layout/layout_user_footer_view.xml

@@ -32,6 +32,7 @@
         app:layout_constraintTop_toTopOf="parent"
         app:layout_constraintStart_toEndOf="@+id/ivMirror"
         android:src="@mipmap/live_gift"
+        android:visibility="gone"
         android:layout_width="40dp"
         android:layout_height="40dp"/>
 

+ 3 - 0
user/src/main/java/com/swago/user/recharge/RechargeActivity.kt

@@ -2,6 +2,7 @@ package com.swago.user.recharge
 
 import android.graphics.Rect
 import android.view.View
+import android.widget.Toast
 import androidx.activity.viewModels
 import androidx.recyclerview.widget.GridLayoutManager
 import androidx.recyclerview.widget.RecyclerView
@@ -129,10 +130,12 @@ class RechargeActivity : BaseXActivity<ActivityRechargeBinding>(), IPayCallback
 
     override fun onPayError(code: Int) {
         SwagoLoading.cancelLoadingDialog()
+        Toast.makeText(AppContext.getContext(), AppContext.getContext().resources.getString(R.string.pay_fail)+"-$code", Toast.LENGTH_SHORT).show()
         payVm.payOrderToServer(null, 2)
     }
 
     override fun onPayCancel() {
+        Toast.makeText(AppContext.getContext(), AppContext.getContext().resources.getString(R.string.pay_cancel), Toast.LENGTH_SHORT).show()
         payVm.payOrderToServer(null, 3)
     }
 

+ 1 - 0
user/src/main/res/layout/activity_level.xml

@@ -15,6 +15,7 @@
     <ImageView
         android:id="@+id/ivBack"
         android:layout_marginTop="25dp"
+        android:padding="4dp"
         android:src="@mipmap/back_white"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent"

+ 1 - 1
user/src/main/res/layout/fragment_anchor_level.xml

@@ -159,7 +159,7 @@
         app:layout_constraintEnd_toEndOf="parent"
         android:textSize="12dp"
         android:textColor="#868686"
-        android:text="@string/exp_explain"
+        android:text="@string/exp_explain2"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>
 

+ 1 - 1
user/src/main/res/layout/fragment_rich_level.xml

@@ -187,7 +187,7 @@
         app:layout_constraintEnd_toEndOf="parent"
         android:textSize="12dp"
         android:textColor="#868686"
-        android:text="@string/exp_explain2"
+        android:text="@string/exp_explain"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>