瀏覽代碼

红包相关代码

jixionghui 4 年之前
父節點
當前提交
d29473bf28
共有 23 個文件被更改,包括 1256 次插入447 次删除
  1. 4 1
      jixin/build.gradle
  2. 364 375
      jixin/src/main/AndroidManifest.xml
  3. 14 0
      jixin/src/main/java/com/jixin/im/bean/ChatType.java
  4. 10 0
      jixin/src/main/java/com/jixin/im/bean/RoomMember.java
  5. 9 0
      jixin/src/main/java/com/jixin/im/bean/redpacket/RedPacketType.java
  6. 229 4
      jixin/src/main/java/com/jixin/im/fragment/BaseRedPacketFragment.java
  7. 121 0
      jixin/src/main/java/com/jixin/im/fragment/ExclusiveRedPacketFragment.java
  8. 3 1
      jixin/src/main/java/com/jixin/im/fragment/MucChatFragment.java
  9. 167 3
      jixin/src/main/java/com/jixin/im/fragment/NormalRedPacketFragment.java
  10. 129 2
      jixin/src/main/java/com/jixin/im/fragment/PasswordRedPacketFragment.java
  11. 28 0
      jixin/src/main/java/com/jixin/im/ui/TestActivity.java
  12. 63 29
      jixin/src/main/java/com/jixin/im/ui/me/redpacket/SendRedPacketActivity.java
  13. 10 0
      jixin/src/main/res/drawable/selector_send_red_packet.xml
  14. 6 0
      jixin/src/main/res/drawable/shape_send_red_packet_unclickable.xml
  15. 11 3
      jixin/src/main/res/layout/activity_test.xml
  16. 16 0
      jixin/src/main/res/layout/activity_test2.xml
  17. 50 18
      jixin/src/main/res/layout/fragment_password_red_packet.xml
  18. 13 6
      jixin/src/main/res/layout/view_stub_exclusive_red_packet_part.xml
  19. 6 5
      jixin/src/main/res/layout/view_stub_red_packet_count_part.xml
  20. 二進制
      jixin/src/main/res/mipmap-xhdpi/icn_pin.png
  21. 二進制
      jixin/src/main/res/mipmap-xxhdpi/icon_pin.png
  22. 二進制
      jixin/src/main/res/mipmap-xxxhdpi/icon_pin.png
  23. 3 0
      jixin/src/main/res/values/strings.xml

+ 4 - 1
jixin/build.gradle

@@ -43,6 +43,9 @@ android {
         abortOnError false
         checkReleaseBuilds false
     }
+    packagingOptions {
+        exclude 'META-INF/*.kotlin_module'
+    }
 
     compileSdkVersion compile_version
 
@@ -358,7 +361,7 @@ dependencies {
 
     implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.10.0'
 
-
+    implementation 'com.klinkerapps:link_builder:2.0.5'
     implementation 'com.zzhoujay.richtext:richtext:3.0.7'
     implementation 'com.zzhoujay:html:1.0.1'
     implementation project(':wheelsruflibrary') //转盘

File diff suppressed because it is too large
+ 364 - 375
jixin/src/main/AndroidManifest.xml


+ 14 - 0
jixin/src/main/java/com/jixin/im/bean/ChatType.java

@@ -0,0 +1,14 @@
+package com.jixin.im.bean;
+
+//聊天类型
+public final class ChatType {
+    public static final String INTENT_CHAT_TYPE ="ChatType";
+    public static final String CHAT_PRIVATE ="chat_private";   //私聊
+    public static final String CHAT_GROUP="chat_group";    //群聊
+    public static boolean isGroupChatType(String chatType){
+        if (CHAT_GROUP.equals(chatType)){
+            return true;
+        }
+        return false;
+    }
+}

+ 10 - 0
jixin/src/main/java/com/jixin/im/bean/RoomMember.java

@@ -59,6 +59,16 @@ public class RoomMember  implements Serializable {
     @DatabaseField(defaultValue = "0")
     private int gradeIndex;
 
+    private boolean isSelected;
+
+    public boolean isSelected() {
+        return isSelected;
+    }
+
+    public void setSelected(boolean selected) {
+        isSelected = selected;
+    }
+
     public String getBubbleFontId() {
         return bubbleFontId;
     }

+ 9 - 0
jixin/src/main/java/com/jixin/im/bean/redpacket/RedPacketType.java

@@ -0,0 +1,9 @@
+package com.jixin.im.bean.redpacket;
+
+// 红包类型
+public class RedPacketType{
+    public static final int NORMAL =1108;    //普通红包
+    public static final int PASSWORD =1107;       //口令红包
+    public static final int EXCLUSIVE =1106; //专属红包
+}
+

+ 229 - 4
jixin/src/main/java/com/jixin/im/fragment/BaseRedPacketFragment.java

@@ -1,15 +1,240 @@
 package com.jixin.im.fragment;
 
+import android.content.Intent;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.text.Editable;
+import android.text.TextUtils;
+import android.text.TextWatcher;
+import android.util.ArrayMap;
+import android.view.View;
+import android.view.ViewStub;
 import android.widget.EditText;
+import android.widget.ImageView;
 import android.widget.TextView;
 
+import com.jixin.im.AppConstant;
+import com.jixin.im.R;
+import com.jixin.im.bean.ChatType;
+import com.jixin.im.bean.message.ChatMessage;
+import com.jixin.im.bean.message.XmppMessage;
+import com.jixin.im.bean.redpacket.RedPacket;
+import com.jixin.im.helper.DialogHelper;
+import com.jixin.im.helper.PaySecureHelper;
 import com.jixin.im.ui.base.EasyFragment;
+import com.jixin.im.ui.message.ChatActivity;
+import com.jixin.im.util.ToastUtil;
+import com.jixin.im.util.secure.Money;
+import com.klinker.android.link_builder.Link;
+import com.klinker.android.link_builder.LinkBuilder;
+import com.xuan.xuanhttplibrary.okhttp.HttpUtils;
+import com.xuan.xuanhttplibrary.okhttp.callback.BaseCallback;
+import com.xuan.xuanhttplibrary.okhttp.result.ObjectResult;
+import com.xuan.xuanhttplibrary.okhttp.result.Result;
 
+import okhttp3.Call;
 
 
 public abstract class BaseRedPacketFragment extends EasyFragment {
-    private int mRedPacketType;
-    EditText mEdtPacketMoney;
-    EditText mEdtRemark;
-    TextView mSendRedPacket;
+
+
+    private String mChatType;
+    protected int mRedPacketType = 2;
+    protected EditText mEdtPacketMoney;
+    protected EditText mEdtRemark;
+    protected TextView tvSendRedPacket ;
+    protected TextView tvRedPacketType;
+    private ImageView ivIconPin;
+    private String mRoomId;
+
+    public BaseRedPacketFragment(String roomId){
+        this.mRoomId = roomId;
+        if (TextUtils.isEmpty(roomId)){
+            this.mChatType = ChatType.CHAT_PRIVATE;
+        }else {
+            this.mChatType= ChatType.CHAT_GROUP;
+        }
+
+    }
+
+    public String getRoomId(){
+        return mRoomId;
+    }
+
+    @Override
+    protected int inflateLayoutId() {
+        return R.layout.fragment_password_red_packet;
+    }
+
+    @Override
+    protected void onActivityCreated(Bundle savedInstanceState, boolean createView) {
+        if (createView) {
+            initView();
+        }
+    }
+
+
+    private void initView(){
+        mEdtPacketMoney = findViewById(R.id.edt_input_money);
+        tvRedPacketType = findViewById(R.id.tv_red_packet_type);
+        ivIconPin = findViewById(R.id.iv_icon_pin);
+
+        mEdtRemark = findViewById(R.id.edt_input_remark);
+        tvSendRedPacket = findViewById(R.id.tv_send_red_packet);
+        tvSendRedPacket.setOnClickListener(v -> {
+
+        });
+        ViewStub mStubRedPacketCount = findViewById(R.id.view_stub_red_packet_count);
+        ViewStub mStubRedPacketType = findViewById(R.id.view_stub_red_packet_type);
+        boolean isShowSpellLuck= isShowSpellLuckViews()&& isGroupChatType();
+        showSpellLuckViews(isShowSpellLuck);
+        setSendRedPacketText();
+
+        int countLayoutId = inflateLayoutIdByRedPacketCount();
+        if (countLayoutId>0){
+            mStubRedPacketCount.setLayoutResource(countLayoutId);
+            View rootView = mStubRedPacketCount.inflate();
+            convertRedPacketCountViews(rootView);
+        }
+        int typeLayoutId = inflateLayoutIdByRedPacketType();
+        if (typeLayoutId>0){
+            mStubRedPacketType.setLayoutResource(typeLayoutId);
+            View rootView = mStubRedPacketType.inflate();
+            convertRedPacketTypeViews(rootView);
+
+        }
+
+        mEdtPacketMoney.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
+
+            }
+
+            @Override
+            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
+
+            }
+
+            @Override
+            public void afterTextChanged(Editable editable) {
+                changeSendRedPacketButtonStyle();
+
+            }
+        });
+//        PaySecureHelper.inputPayPassword(this, getString(R.string.chat_redpacket), money, password -> {
+//            sendRed(item == 0 ? "1" : "3", finalMoney, String.valueOf(1), finalWords, password);
+//        });
+
+    }
+
+    protected boolean isGroupChatType(){
+        if (ChatType.CHAT_GROUP.equals(mChatType)){
+            return true;
+        }
+        return false;
+    }
+    protected abstract int inflateLayoutIdByRedPacketCount();
+    protected abstract int inflateLayoutIdByRedPacketType();
+    protected abstract void convertRedPacketTypeViews(View rootView);
+    protected abstract void convertRedPacketCountViews(View rootView);
+    protected abstract void changeSendRedPacketButtonStyle();
+
+    private void setSendRedPacketText(){
+        int textId = R.string.send_red_packet_1;
+        if (isGroupChatType()){
+            textId = R.string.send_group_red_packet;
+        }
+        tvSendRedPacket.setText(textId);
+
+    }
+
+    protected abstract Link.OnClickListener getLinkOnClickListener();
+
+    //是否显示拼手气按钮
+    protected boolean isShowSpellLuckViews(){
+        return false;
+    }
+
+
+
+    //是否显示切换手气红包和普通红包
+    private void showSpellLuckViews(boolean show){
+        if (show){
+            ivIconPin.setVisibility(View.VISIBLE);
+            tvRedPacketType.setVisibility(View.VISIBLE);
+        }else {
+            ivIconPin.setVisibility(View.GONE);
+            tvRedPacketType.setVisibility(View.GONE);
+        }
+    }
+
+    protected void showPinIcon(boolean show){
+        if (show){
+            ivIconPin.setVisibility(View.VISIBLE);
+        }else {
+            ivIconPin.setVisibility(View.GONE);
+        }
+
+    }
+
+    protected void setSendRedPacketButtonStatus(boolean isNormal) {
+        tvSendRedPacket.setSelected(isNormal);
+        tvSendRedPacket.setClickable(isNormal);
+
+    }
+    protected abstract ArrayMap<String,String> getSendRedPacketParameters();
+
+
+    private void sendRedPacket(final String type, String pMoney, String count, final String words, String payPassword) {
+        if (!coreManager.isLogin()) {
+            return;
+        }
+        DialogHelper.showDefaulteMessageProgressDialog(getActivity());
+        ArrayMap<String,String> params = getSendRedPacketParameters();
+        params.put("moneyStr",pMoney);
+        params.put("greetings", words);
+
+        String toUserId = "";
+        PaySecureHelper.generateParam(
+                getActivity(), payPassword, params,
+                "" + type + pMoney + count + words + toUserId,
+                t -> {
+                    DialogHelper.dismissProgressDialog();
+                    ToastUtil.showToast(getContext(), getActivity().getString(R.string.tip_pay_secure_place_holder, t.getMessage()));
+                }, (p, code) -> {
+                    HttpUtils.get().url(coreManager.getConfig().REDPACKET_SEND)
+                            .params(p)
+                            .build()
+                            .execute(new BaseCallback<RedPacket>(RedPacket.class) {
+
+                                @Override
+                                public void onResponse(ObjectResult<RedPacket> result) {
+                                    DialogHelper.dismissProgressDialog();
+                                    if (Result.checkSuccess(getContext(), result)) {
+                                        RedPacket redPacket = result.getData();
+                                        String objectId = redPacket.getId();
+                                        ChatMessage message = new ChatMessage();
+                                        message.setType(XmppMessage.TYPE_RED);
+                                        message.setFromUserId(coreManager.getSelf().getUserId());
+                                        message.setFromUserName(coreManager.getSelf().getNickName());
+                                        message.setContent(words); // 祝福语
+                                        message.setFilePath(type); // 用FilePath来储存红包类型
+                                        message.setFileSize(redPacket.getStatus()); //用filesize来储存红包状态
+                                        message.setObjectId(objectId); // 红包id
+                                        Intent intent = new Intent();
+                                        intent.putExtra(AppConstant.EXTRA_CHAT_MESSAGE, message.toJsonString());
+//                                        getActivity().setResult(viewPager.getCurrentItem() == 0 ? ChatActivity.REQUEST_CODE_SEND_RED_PT : ChatActivity.REQUEST_CODE_SEND_RED_KL, intent);
+                                       getActivity(). finish();
+                                    }
+                                }
+
+                                @Override
+                                public void onError(Call call, Exception e) {
+                                    DialogHelper.dismissProgressDialog();
+                                }
+                            });
+                }
+        );
+    }
+
 }

+ 121 - 0
jixin/src/main/java/com/jixin/im/fragment/ExclusiveRedPacketFragment.java

@@ -0,0 +1,121 @@
+package com.jixin.im.fragment;
+
+import android.content.Intent;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+
+import com.jixin.im.R;
+import com.jixin.im.bean.RoomMember;
+import com.jixin.im.ui.message.multi.GroupMoreFeaturesActivity;
+import com.klinker.android.link_builder.Link;
+
+import java.util.Objects;
+
+import static android.app.Activity.RESULT_OK;
+
+/**
+ * Created by Harvey on 2020/09/17
+ */
+public class ExclusiveRedPacketFragment extends BaseRedPacketFragment {
+    public static final String TAG = ExclusiveRedPacketFragment.class.getSimpleName();
+    public static final int CODE_REQUEST_SELECT_RECEIVER = 1108;
+    private String mReceiverId, mToUserName;
+    TextView tvSelectExclusiveMember;
+
+    public ExclusiveRedPacketFragment(String chatType) {
+        super(chatType);
+    }
+
+    @Override
+    protected int inflateLayoutIdByRedPacketCount() {
+        return 0;
+    }
+
+    @Override
+    protected int inflateLayoutIdByRedPacketType() {
+        return R.layout.view_stub_exclusive_red_packet_part;
+    }
+
+    @Override
+    protected void convertRedPacketTypeViews(View rootView) {
+        tvSelectExclusiveMember = rootView.findViewById(R.id.tv_select_exclusive_member);
+        tvSelectExclusiveMember.setOnClickListener(v -> {
+            Intent intent = new Intent(getContext(), GroupMoreFeaturesActivity.class);
+            intent.putExtra("roomId", getRoomId());
+            intent.putExtra("isSelectReceiver", true);
+            startActivityForResult(intent, CODE_REQUEST_SELECT_RECEIVER);
+        });
+    }
+
+    @Override
+    protected void convertRedPacketCountViews(View RootView) {
+
+    }
+
+
+    @Override
+    protected void changeSendRedPacketButtonStyle() {
+        String money = mEdtPacketMoney.getText().toString();
+        if (isGroupChatType()) {
+
+            checkMoney(money, mReceiverId);
+        } else {
+
+        }
+
+
+    }
+
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (requestCode == CODE_REQUEST_SELECT_RECEIVER) {
+            if (resultCode == RESULT_OK) {
+                RoomMember roomMember = (RoomMember) data.getSerializableExtra("selectReceiver");
+                tvSelectExclusiveMember.setText(roomMember.getUserName());
+                mReceiverId = roomMember.getUserId();
+                mToUserName = roomMember.getUserName();
+                changeSendRedPacketButtonStyle();
+
+
+            }
+        }
+    }
+
+    @Override
+    protected void onClickSendRedPacket(String redPacketMoney, String remark) {
+
+        Intent intent = new Intent();
+
+
+    }
+
+    @Override
+    protected Link.OnClickListener getLinkOnClickListener() {
+        return null;
+    }
+
+
+    private void checkMoney(String moneyAmount, String receiverId) {
+        double money = 0.00f;
+        try {
+            if (!TextUtils.isEmpty(moneyAmount)) {
+                money = Double.parseDouble(moneyAmount);
+            }
+
+        } catch (NumberFormatException e) {
+            Log.i(TAG, Objects.requireNonNull(e.getMessage()));
+
+        }
+        if (money < 0.01 || TextUtils.isEmpty(receiverId)) {
+            setSendRedPacketButtonStatus(false);
+        } else {
+            setSendRedPacketButtonStatus(true);
+        }
+
+    }
+}

+ 3 - 1
jixin/src/main/java/com/jixin/im/fragment/MucChatFragment.java

@@ -125,6 +125,7 @@ import com.jixin.im.ui.me.bubble.SidaiCenterActivity;
 import com.jixin.im.ui.me.emot.EmotBean;
 import com.jixin.im.ui.me.redpacket.MucSendRedPacketActivity;
 import com.jixin.im.ui.me.redpacket.RedDetailsActivity;
+import com.jixin.im.ui.me.redpacket.SendRedPacketActivity;
 import com.jixin.im.ui.message.ChatActivity;
 import com.jixin.im.ui.message.EventMoreSelected;
 import com.jixin.im.ui.message.MucChatActivityTest;
@@ -2406,7 +2407,8 @@ public class MucChatFragment extends EasyFragment implements
 
     @Override
     public void clickRedpacket() {
-        Intent intent = new Intent(getContext(), MucSendRedPacketActivity.class);
+//        Intent intent = new Intent(getContext(), MucSendRedPacketActivity.class);
+        Intent intent = new Intent(getContext(), SendRedPacketActivity.class);
         intent.putExtra("roomId",roomId);
         startActivityForResult(intent, ChatActivity.REQUEST_CODE_SEND_RED);
 

+ 167 - 3
jixin/src/main/java/com/jixin/im/fragment/NormalRedPacketFragment.java

@@ -1,17 +1,181 @@
 package com.jixin.im.fragment;
 
+import android.graphics.Color;
 import android.os.Bundle;
+import android.text.Editable;
+import android.text.TextUtils;
+import android.text.TextWatcher;
+import android.util.ArrayMap;
+import android.util.Log;
+import android.view.View;
+import android.widget.EditText;
 
 import com.jixin.im.R;
+import com.klinker.android.link_builder.Link;
+import com.klinker.android.link_builder.LinkBuilder;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Objects;
+import java.util.regex.Pattern;
 
 public class NormalRedPacketFragment extends BaseRedPacketFragment{
-    @Override
-    protected int inflateLayoutId() {
-        return R.layout.fragment_normal_sed_red_packet;
+    public static final String TAG = NormalRedPacketFragment.class.getSimpleName();
+    private EditText edtRedPacketCount;
+
+
+
+    public NormalRedPacketFragment(String chatType) {
+        super(chatType);
     }
 
+
     @Override
     protected void onActivityCreated(Bundle savedInstanceState, boolean createView) {
+        //必须先调用 super.onActivityCreated
+        super.onActivityCreated(savedInstanceState,createView);
+        if (createView){
+            setSpellLuckViewLink();
+        }
 
     }
+
+    @Override
+    protected int inflateLayoutIdByRedPacketCount() {
+        if (isGroupChatType()){
+            return R.layout.view_stub_red_packet_count_part;
+        }
+        return 0;
+    }
+
+    @Override
+    protected Link.OnClickListener getLinkOnClickListener() {
+
+        return mLinkOnClickListener;
+    }
+    Link.OnClickListener mLinkOnClickListener = text -> {
+        if ("改为拼手气红包".equals(text)){
+            mRedPacketType =2;
+            showPinIcon(true);
+            tvRedPacketType.setText("当前为拼手气红包,改为普通红包");
+        }else {
+            showPinIcon(false);
+            tvRedPacketType.setText("当前为普通红包,改为拼手气红包");
+            mRedPacketType =1;
+        }
+        setSpellLuckViewLink();
+
+    };
+
+
+    @Override
+    protected int inflateLayoutIdByRedPacketType() {
+        return 0;
+    }
+
+    @Override
+    protected void convertRedPacketTypeViews(View rootView) {
+
+
+    }
+
+    @Override
+    protected void convertRedPacketCountViews(View rootView) {
+        edtRedPacketCount = rootView.findViewById(R.id.edt_red_packet_count);
+        edtRedPacketCount.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+            }
+
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {
+
+            }
+
+            @Override
+            public void afterTextChanged(Editable s) {
+                changeSendRedPacketButtonStyle();
+            }
+        });
+
+    }
+
+    private void checkMoney(String moneyAmount, String memberCount) {
+        double money = 0.00f;
+        int count = -1;
+        try {
+            if (!TextUtils.isEmpty(moneyAmount)) {
+                money = Double.parseDouble(moneyAmount);
+            }
+            if (!TextUtils.isEmpty(memberCount)) {
+                count = Integer.parseInt(memberCount);
+            }
+
+        } catch (NumberFormatException e) {
+            Log.i(TAG, Objects.requireNonNull(e.getMessage()));
+
+        }
+        if (isGroupChatType()){
+            if (count <= 0 || money / count < 0.01) {
+                setSendRedPacketButtonStatus(false);
+            } else {
+                setSendRedPacketButtonStatus(true);
+            }
+        }else {
+            if (money < 0.01) {
+                setSendRedPacketButtonStatus(false);
+            } else {
+                setSendRedPacketButtonStatus(true);
+            }
+        }
+
+    }
+
+
+    @Override
+    protected boolean isShowSpellLuckViews() {
+        return true;
+    }
+
+    @Override
+    protected void changeSendRedPacketButtonStyle() {
+        String money = mEdtPacketMoney.getText().toString();
+        if (isGroupChatType()){
+            String redPacketCount = edtRedPacketCount.getText().toString();
+            checkMoney(money,redPacketCount);
+        }else {
+            checkMoney(money,null);
+        }
+
+
+    }
+
+    @Override
+    protected ArrayMap<String, String> getSendRedPacketParameters() {
+        return null;
+    }
+
+    //设置拼手气/普通红包切换Link事件
+    private void setSpellLuckViewLink(){
+        Link link = new Link(Pattern.compile("改为普通红包|改为拼手气红包"))
+
+                .setTextColor(Color.parseColor("#DFBF93"))                  // optional, defaults to holo blue
+                .setTextColorOfHighlightedLink(Color.parseColor("#00000000")) // optional, defaults to holo blue
+                .setHighlightAlpha(.4f)                                     // optional, defaults to .15f
+                .setUnderlined(false)                                       // optional, defaults to true
+                .setBold(true);
+
+        Link.OnClickListener listener = getLinkOnClickListener();
+        if (listener!=null){
+            link.setOnClickListener(listener);
+        }
+        LinkBuilder.on(tvRedPacketType)
+                .addLink(link)
+
+                .build();
+
+    }
+
+
 }

+ 129 - 2
jixin/src/main/java/com/jixin/im/fragment/PasswordRedPacketFragment.java

@@ -1,15 +1,142 @@
 package com.jixin.im.fragment;
 
 import android.os.Bundle;
+import android.text.Editable;
+import android.text.TextUtils;
+import android.text.TextWatcher;
+import android.util.Log;
+import android.view.View;
+import android.widget.EditText;
+
+import com.jixin.im.R;
+import com.klinker.android.link_builder.Link;
+
+import java.util.Objects;
 
 public class PasswordRedPacketFragment extends BaseRedPacketFragment {
+    private final static String TAG = PasswordRedPacketFragment.class.getSimpleName();
+    private EditText edtRedPacketCount;
+    private EditText edtPassword;
+
+    public PasswordRedPacketFragment(String chatType) {
+        super(chatType);
+    }
+
     @Override
-    protected int inflateLayoutId() {
+    protected void onActivityCreated(Bundle savedInstanceState, boolean createView) {
+        super.onActivityCreated(savedInstanceState,createView);
+    }
+
+    @Override
+    protected int inflateLayoutIdByRedPacketCount() {
+        if (isGroupChatType()){
+            return R.layout.view_stub_red_packet_count_part;
+        }
         return 0;
     }
 
     @Override
-    protected void onActivityCreated(Bundle savedInstanceState, boolean createView) {
+    protected int inflateLayoutIdByRedPacketType() {
+        return R.layout.view_stub_pwd_red_packet_part;
+    }
+
+    @Override
+    protected void convertRedPacketTypeViews(View rootView) {
+        edtPassword = findViewById(R.id.edt_input_red_packet_pwd);
+        edtPassword.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+            }
+
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {
+
+            }
+
+            @Override
+            public void afterTextChanged(Editable s) {
+                changeSendRedPacketButtonStyle();
+            }
+        });
+    }
+
+    @Override
+    protected void convertRedPacketCountViews(View rootView) {
+        edtRedPacketCount = rootView.findViewById(R.id.edt_red_packet_count);
+        if (true)return;
+        edtRedPacketCount.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+            }
 
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {
+
+            }
+
+            @Override
+            public void afterTextChanged(Editable s) {
+                changeSendRedPacketButtonStyle();
+            }
+        });
+    }
+
+    @Override
+    protected void changeSendRedPacketButtonStyle() {
+        String money = mEdtPacketMoney.getText().toString();
+        String redPacketPwd = edtPassword.getText().toString();
+        if (isGroupChatType()){
+            String redPacketCount = edtRedPacketCount.getText().toString();
+            checkMoney(money,redPacketCount,redPacketPwd);
+        }else {
+            checkMoney(money,null,redPacketPwd);
+        }
     }
+
+    @Override
+    protected void onClickSendRedPacket(String redPacketMoney, String remark) {
+
+    }
+
+    @Override
+    protected Link.OnClickListener getLinkOnClickListener() {
+        return null;
+    }
+
+
+
+    private void checkMoney(String moneyAmount, String memberCount,String password) {
+        double money = 0.00f;
+        int count = -1;
+        try {
+            if (!TextUtils.isEmpty(moneyAmount)) {
+                money = Double.parseDouble(moneyAmount);
+            }
+            if (!TextUtils.isEmpty(memberCount)) {
+                count = Integer.parseInt(memberCount);
+            }
+
+        } catch (NumberFormatException e) {
+            Log.i(TAG, Objects.requireNonNull(e.getMessage()));
+
+        }
+        if (isGroupChatType()){
+            if (count <= 0 || money / count < 0.01 ||TextUtils.isEmpty(password)) {
+                setSendRedPacketButtonStatus(false);
+            } else {
+                setSendRedPacketButtonStatus(true);
+            }
+        }else {
+            if (money < 0.01 ||TextUtils.isEmpty(password)) {
+                setSendRedPacketButtonStatus(false);
+            } else {
+                setSendRedPacketButtonStatus(true);
+            }
+        }
+
+    }
+
+
 }

+ 28 - 0
jixin/src/main/java/com/jixin/im/ui/TestActivity.java

@@ -0,0 +1,28 @@
+package com.jixin.im.ui;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.content.Intent;
+import android.os.Bundle;
+
+import com.jixin.im.R;
+import com.jixin.im.bean.ChatType;
+import com.jixin.im.ui.me.redpacket.SendRedPacketActivity;
+
+import java.util.Random;
+
+public class TestActivity extends AppCompatActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_test2);
+        findViewById(R.id.tv_test).setOnClickListener(v -> {
+            Intent intent = new Intent(this, SendRedPacketActivity.class);
+
+            intent.putExtra(ChatType.INTENT_CHAT_TYPE,ChatType.CHAT_PRIVATE);
+            intent.putExtra(ChatType.INTENT_CHAT_TYPE,ChatType.CHAT_GROUP);
+            startActivity(intent);
+        });
+    }
+}

+ 63 - 29
jixin/src/main/java/com/jixin/im/ui/me/redpacket/SendRedPacketActivity.java

@@ -17,6 +17,7 @@ import android.widget.Button;
 import android.widget.EditText;
 import android.widget.TextView;
 
+import androidx.appcompat.app.AppCompatActivity;
 import androidx.fragment.app.FragmentManager;
 import androidx.fragment.app.FragmentPagerAdapter;
 import androidx.viewpager.widget.ViewPager;
@@ -24,11 +25,16 @@ import androidx.viewpager.widget.ViewPager;
 import com.google.android.material.tabs.TabLayout;
 import com.jixin.im.AppConstant;
 import com.jixin.im.R;
+import com.jixin.im.bean.ChatType;
 import com.jixin.im.bean.message.ChatMessage;
 import com.jixin.im.bean.message.XmppMessage;
 import com.jixin.im.bean.redpacket.RedPacket;
 import com.jixin.im.db.InternationalizationHelper;
+import com.jixin.im.fragment.BaseRedPacketFragment;
+import com.jixin.im.fragment.ExclusiveRedPacketFragment;
 import com.jixin.im.fragment.MucSendPacketFragment;
+import com.jixin.im.fragment.NormalRedPacketFragment;
+import com.jixin.im.fragment.PasswordRedPacketFragment;
 import com.jixin.im.helper.DialogHelper;
 import com.jixin.im.helper.PaySecureHelper;
 import com.jixin.im.ui.base.BaseActivity;
@@ -54,15 +60,17 @@ import okhttp3.Call;
 
 /**
  * Created by 魏正旺 on 2016/9/9.
+ * Modify by Harvey on 2020/09/17
  */
-public class SendRedPacketActivity extends BaseActivity  {
+public class SendRedPacketActivity extends BaseActivity {
+    private String mChatType;
 
     private TabLayout mTabRedPacket;
     private ViewPager viewPager;
     private String roomId;
 
 
-    private List<EasyFragment> mFragmentList;
+    private List<BaseRedPacketFragment> mFragmentList;
     private TabFragmentPagerAdapter mPagerAdapter;
 
 
@@ -71,20 +79,50 @@ public class SendRedPacketActivity extends BaseActivity  {
         super.onCreate(savedInstanceState);
 
         setContentView(R.layout.activity_redpacket);
-        roomId = getIntent().getStringExtra("roomId");
+        initData();
+
         initView();
 
         checkHasPayPassword();
     }
 
-    private void checkHasPayPassword() {
-        boolean hasPayPassword = PreferenceUtils.getBoolean(this, Constants.IS_PAY_PASSWORD_SET + coreManager.getSelf().getUserId(), true);
-        if (!hasPayPassword) {
-            ToastUtil.showToast(this, R.string.tip_no_pay_password);
-            Intent intent = new Intent(this, ChangePayPasswordActivity.class);
-            startActivity(intent);
-            finish();
+    private void initData() {
+        Intent intent = getIntent();
+        if (intent != null) {
+            roomId = getIntent().getStringExtra("roomId");
+            mChatType = intent.getStringExtra(ChatType.INTENT_CHAT_TYPE);
+            if (!TextUtils.isEmpty(roomId)) {
+                mChatType = ChatType.CHAT_GROUP;
+            }else {
+                mChatType = ChatType.CHAT_PRIVATE;
+            }
         }
+        mFragmentList = new ArrayList<>();
+        BaseRedPacketFragment normalFragment = new NormalRedPacketFragment(roomId);
+        mFragmentList.add(normalFragment);
+        BaseRedPacketFragment passwordFragment = new PasswordRedPacketFragment(roomId);
+        mFragmentList.add(passwordFragment);
+        if (isGroupChatType()) {
+            BaseRedPacketFragment exclusiveFragment = new ExclusiveRedPacketFragment(roomId);
+            mFragmentList.add(exclusiveFragment);
+
+        }
+
+
+    }
+
+    private boolean isGroupChatType() {
+        return ChatType.isGroupChatType(mChatType);
+    }
+
+    private void checkHasPayPassword() {
+//        boolean hasPayPassword = PreferenceUtils.getBoolean(this, Constants.IS_PAY_PASSWORD_SET + coreManager.getSelf().getUserId(), true);
+//        if (!hasPayPassword) {
+//            ToastUtil.showToast(this, R.string.tip_no_pay_password);
+//            Intent intent = new Intent(this, ChangePayPasswordActivity.class);
+//            startActivity(intent);
+//            finish();
+//        }
     }
 
     private void initView() {
@@ -94,37 +132,33 @@ public class SendRedPacketActivity extends BaseActivity  {
         TextView tvTitle = (TextView) findViewById(R.id.tv_title_center);
         tvTitle.setText(InternationalizationHelper.getString("JX_SendGift"));
         tvTitle.setTextColor(getResources().getColor(R.color.white));
-        mFragmentList = new ArrayList<>();
         mTabRedPacket = findViewById(R.id.tab_red_packet);
-        viewPager =  findViewById(R.id.muc_viewpager);
+        viewPager = findViewById(R.id.muc_viewpager);
+        mPagerAdapter =new TabFragmentPagerAdapter(getSupportFragmentManager(),mFragmentList);
         initTabLayout();
 
     }
 
-    private void initFragment(){
-        MucSendPacketFragment luckFragment = new MucSendPacketFragment();
-        luckFragment.setRedPacketType(2);
-        luckFragment.setRoomId(roomId);
-        mFragmentList.add(luckFragment);
-        MucSendPacketFragment normalFragment = new MucSendPacketFragment();
-        normalFragment.setRedPacketType(1);
-        normalFragment.setRoomId(roomId);
-        mFragmentList.add(normalFragment);
-        mPagerAdapter = new TabFragmentPagerAdapter(getSupportFragmentManager(),mFragmentList);
+    private void initFragment() {
         viewPager.setAdapter(mPagerAdapter);
         viewPager.setOffscreenPageLimit(mFragmentList.size());
 
     }
 
-    private void initTabLayout(){
+    private void initTabLayout() {
         initFragment();
 
         mTabRedPacket.setupWithViewPager(viewPager);
         mTabRedPacket.removeAllTabs();
+
+
 //        TabLayout.Tab tab =  mTabRedPacket.newTab().setText("普通红包");
 
-        mTabRedPacket.addTab(  mTabRedPacket.newTab().setText(InternationalizationHelper.getString("JX_LuckGift")));//手气红包
-        mTabRedPacket.addTab(  mTabRedPacket.newTab().setText(InternationalizationHelper.getString("JX_UsualGift")));//普通红包
+        mTabRedPacket.addTab(mTabRedPacket.newTab().setText("普通"));//普通红包
+        mTabRedPacket.addTab(mTabRedPacket.newTab().setText("口令"));//口令红包
+        if (isGroupChatType()){
+            mTabRedPacket.addTab(mTabRedPacket.newTab().setText("专属"));//专属红包
+        }
         mTabRedPacket.setTabIndicatorFullWidth(false);
         mTabRedPacket.setInlineLabel(true);
         mTabRedPacket.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@@ -147,11 +181,11 @@ public class SendRedPacketActivity extends BaseActivity  {
     }
 
 
-
     private class TabFragmentPagerAdapter extends FragmentPagerAdapter {
 
-        private List<EasyFragment> mFragmentList;
-        public TabFragmentPagerAdapter(FragmentManager fm, List<EasyFragment> list) {
+        private List<BaseRedPacketFragment> mFragmentList;
+
+        public TabFragmentPagerAdapter(FragmentManager fm, List<BaseRedPacketFragment> list) {
             super(fm);
             this.mFragmentList = list;
         }
@@ -162,7 +196,7 @@ public class SendRedPacketActivity extends BaseActivity  {
         }
 
         @Override
-        public EasyFragment getItem(int position) {
+        public BaseRedPacketFragment getItem(int position) {
             return mFragmentList.get(position);//显示第几个页面
         }
 

+ 10 - 0
jixin/src/main/res/drawable/selector_send_red_packet.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item android:drawable="@drawable/shape_send_red_packet" android:state_selected="true"/>
+
+    <item android:drawable="@drawable/shape_send_red_packet_unclickable" android:state_checkable="false"/>
+
+    <item android:drawable="@drawable/shape_send_red_packet"/>
+
+</selector>

+ 6 - 0
jixin/src/main/res/drawable/shape_send_red_packet_unclickable.xml

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

+ 11 - 3
jixin/src/main/res/layout/activity_test.xml

@@ -1,5 +1,13 @@
 <?xml version="1.0" encoding="utf-8"?>
-<com.jixin.im.view.window.CustomCancelView xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/at_cancel_view"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content" />
+    android:layout_width="match_parent"
+    android:orientation="vertical"
+    android:gravity="center"
+    android:layout_height="match_parent" >
+    <TextView
+        android:textSize="22sp"
+        android:text="@string/test_listen_voice"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+</LinearLayout>

+ 16 - 0
jixin/src/main/res/layout/activity_test2.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:gravity="center"
+    tools:context=".ui.TestActivity">
+    <TextView
+        android:id="@+id/tv_test"
+        android:text="测试"
+        android:textSize="22sp"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+</LinearLayout>

+ 50 - 18
jixin/src/main/res/layout/fragment_password_red_packet.xml

@@ -1,8 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:padding="15dp">
+    android:layout_height="match_parent">
 
     <LinearLayout
         android:layout_width="match_parent"
@@ -15,16 +14,32 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content">
 
-            <TextView
-                android:id="@+id/tv_amount"
+            <LinearLayout
+                android:id="@+id/ll_amount"
                 android:layout_width="wrap_content"
+
                 android:layout_height="wrap_content"
                 android:layout_alignBottom="@+id/edt_input_money"
-                android:layout_alignParentStart="true"
-                android:text="金额"
-                android:layout_marginBottom="3dp"
-                android:textColor="#333333"
-                android:textSize="@dimen/sp_14_text_size" />
+                android:orientation="horizontal">
+
+                <ImageView
+                    android:id="@+id/iv_icon_pin"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginEnd="4dp"
+                    android:src="@mipmap/icon_pin" />
+
+                <TextView
+                    android:id="@+id/tv_amount"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_alignParentStart="true"
+                    android:layout_marginBottom="3dp"
+                    android:text="金额"
+                    android:textColor="#333333"
+                    android:textSize="@dimen/sp_14_text_size" />
+            </LinearLayout>
+
 
             <EditText
                 android:id="@+id/edt_input_money"
@@ -32,12 +47,13 @@
                 android:layout_height="wrap_content"
                 android:layout_marginStart="2dp"
                 android:layout_marginEnd="2dp"
-                android:layout_toLeftOf="@+id/tv_yuan"
-                android:layout_toRightOf="@+id/tv_amount"
+                android:layout_toStartOf="@+id/tv_yuan"
+                android:layout_toEndOf="@+id/ll_amount"
                 android:background="@color/transparent"
-                android:gravity="center_vertical|end"
+                android:gravity="bottom|end"
                 android:hint="0.01"
                 android:inputType="numberDecimal"
+                android:maxLength="10"
 
                 android:textColor="#ff462f"
                 android:textColorHint="#999999"
@@ -46,10 +62,10 @@
             <TextView
                 android:id="@+id/tv_yuan"
                 android:layout_width="wrap_content"
-                android:layout_marginBottom="3dp"
                 android:layout_height="wrap_content"
                 android:layout_alignBottom="@+id/edt_input_money"
                 android:layout_alignParentEnd="true"
+                android:layout_marginBottom="3dp"
                 android:text="元"
                 android:textColor="#333333"
                 android:textSize="@dimen/sp_14_text_size" />
@@ -60,12 +76,16 @@
             android:layout_height="1px"
             android:layout_marginTop="16dp"
             android:background="#dddddd" />
+
         <ViewStub
             android:id="@+id/view_stub_red_packet_count"
             android:layout_width="match_parent"
-            android:layout_height="wrap_content"/>
-
+            android:layout_height="wrap_content" />
 
+        <ViewStub
+            android:id="@+id/view_stub_red_packet_type"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
 
 
         <RelativeLayout
@@ -79,9 +99,9 @@
                 android:layout_height="wrap_content"
                 android:layout_alignBottom="@+id/edt_input_remark"
                 android:layout_alignParentStart="true"
+                android:layout_marginBottom="3dp"
                 android:hint="0.01"
                 android:text="备注:"
-                android:layout_marginBottom="3dp"
                 android:textColor="#333333"
                 android:textColorHint="#999999"
                 android:textSize="@dimen/sp_14_text_size" />
@@ -109,13 +129,25 @@
             android:background="#dddddd" />
 
         <TextView
+            android:id="@+id/tv_red_packet_type"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="16dp"
+            android:gravity="center"
+            android:text="当前为拼手气红包,改为普通红包"
+            android:textColor="#333333"
+            android:textSize="12sp" />
+
+        <TextView
             android:id="@+id/tv_send_red_packet"
-            android:layout_width="286dp"
+            android:layout_width="match_parent"
             android:layout_height="50dp"
             android:layout_gravity="center_horizontal"
+            android:layout_marginStart="10dp"
             android:layout_marginTop="85dp"
+            android:layout_marginEnd="10dp"
             android:layout_marginBottom="35dp"
-            android:background="@drawable/shape_send_red_packet"
+            android:background="@drawable/selector_send_red_packet"
             android:gravity="center"
             android:text="发送群红包"
             android:textColor="@color/white"

+ 13 - 6
jixin/src/main/res/layout/view_stub_exclusive_red_packet_part.xml

@@ -10,30 +10,37 @@
         android:layout_marginTop="36dp">
 
         <TextView
-            android:id="@+id/tv_remark"
+            android:id="@+id/tv_exclusive"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_alignBottom="@+id/edt_input_remark"
+            android:layout_alignBottom="@+id/tv_select_exclusive_member"
+            android:layout_alignTop="@+id/tv_select_exclusive_member"
             android:layout_alignParentStart="true"
             android:text="专属:"
+            android:gravity="center_vertical"
             android:layout_marginBottom="3dp"
             android:textColor="#333333"
             android:textColorHint="#999999"
             android:textSize="@dimen/sp_14_text_size" />
 
-        <EditText
-            android:id="@+id/edt_input_red_packet_pwd"
+        <TextView
+            android:id="@+id/tv_select_exclusive_member"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_marginStart="2dp"
-            android:layout_toRightOf="@+id/tv_remark"
+            android:layout_centerVertical="true"
+
+            android:layout_toEndOf="@+id/tv_exclusive"
             android:background="@color/transparent"
             android:gravity="center_vertical|end"
-            android:hint="恭喜发财,大吉大利!"
+            android:hint="任何人"
             android:singleLine="true"
+            android:drawablePadding="6dp"
+            android:drawableEnd="@drawable/me_chevron_right"
             android:textColor="#333333"
             android:textSize="18dp" />
 
+
     </RelativeLayout>
 
     <View

+ 6 - 5
jixin/src/main/res/layout/view_stub_red_packet_count_part.xml

@@ -13,14 +13,14 @@
             android:id="@+id/tv_red_packet_num"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_alignBottom="@+id/edit_red_packet_count"
+            android:layout_alignBottom="@+id/edt_red_packet_count"
             android:layout_alignParentStart="true"
             android:text="红包个数"
             android:textColor="#333333"
             android:textSize="@dimen/sp_14_text_size" />
 
         <EditText
-            android:id="@+id/edit_red_packet_count"
+            android:id="@+id/edt_red_packet_count"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_marginStart="2dp"
@@ -29,8 +29,9 @@
             android:layout_toEndOf="@+id/tv_red_packet_num"
             android:background="@color/transparent"
             android:gravity="center_vertical|end"
-            android:hint="0.01"
-            android:inputType="numberDecimal"
+
+            android:inputType="number"
+            android:maxLength="5"
 
             android:textColor="#ff462f"
             android:textColorHint="#999999"
@@ -41,7 +42,7 @@
             android:layout_width="wrap_content"
             android:layout_marginBottom="3dp"
             android:layout_height="wrap_content"
-            android:layout_alignBottom="@+id/edit_red_packet_count"
+            android:layout_alignBottom="@+id/edt_red_packet_count"
             android:layout_alignParentEnd="true"
             android:text="个"
             android:textColor="#333333"

二進制
jixin/src/main/res/mipmap-xhdpi/icn_pin.png


二進制
jixin/src/main/res/mipmap-xxhdpi/icon_pin.png


二進制
jixin/src/main/res/mipmap-xxxhdpi/icon_pin.png


+ 3 - 0
jixin/src/main/res/values/strings.xml

@@ -2348,6 +2348,9 @@
     <string name="share_content">&#160;&#160;一款赚钱的聊天软件,邀请朋友加入,享受三级分佣,下级用户所消费金额,您将获得七级相应的分润。快邀请朋友们加入吧!!!</string>
     <string name="my_invite_code">我的邀请码</string>
     <string name="register_code">注册时输入此邀请码</string>
+
+    <string name="send_red_packet_1">发送红包</string>
+    <string name="send_group_red_packet">发送群红包</string>
     <string-array name="icons">
         <item>iphone</item>
         <item>iphone</item>