hanjing лет назад: 6
Родитель
Сommit
8635638fd3

+ 2 - 2
app/src/main/java/com/sheep/gamegroup/di/modules/NetModule.java

@@ -49,10 +49,10 @@ public class NetModule {
     public Retrofit provideRetrofit(OkHttpClient okhttpClient) {
         Retrofit retrofit = new Retrofit.Builder()
                 .client(okhttpClient)
-                .baseUrl(SheepApp.getInstance().getConnectAddress().getAppUrl()+"v1/")
+//                .baseUrl(SheepApp.getInstance().getConnectAddress().getAppUrl()+"v1/")
 //                .baseUrl("http://10.8.220.239:8080/v1/")
 //                .baseUrl("http://10.8.240.155:8080/v1/")
-//                .baseUrl("http://ss.17xmy.com/v1/")
+                .baseUrl("http://ss.17xmy.com/v1/")
                 .addConverterFactory(StringConverterFactory.create())
                 .addConverterFactory(FastJsonConverterFactory.create())
 //                .addConverterFactory(GsonConverterFactory.create(EntityUtils.gson))//

+ 9 - 0
app/src/main/java/com/sheep/gamegroup/model/api/ApiService.java

@@ -551,6 +551,9 @@ public interface ApiService {
     @GET("app/recharge/pay_way")
     Observable<BaseMessage> getRechargePayway(@Query("type") String page);
 
+    @GET("app/recharge/pay_way")
+    Observable<BaseMessage> getRechargePayway(@Header("Authorization") String token, @Query("type") String page);
+
     /**
      * 获取下发充值类型
      *
@@ -578,6 +581,9 @@ public interface ApiService {
     @POST("app/recharge/recharge_balance")
     Observable<BaseMessage> getRechargeBalance(@Body JSONObject jsonObject);
 
+    @POST("app/recharge/recharge_balance")
+    Observable<BaseMessage> getRechargeBalance(@Header("Authorization") String token, @Body JSONObject jsonObject);
+
 
     /**
      * 绵羊币充值
@@ -1896,4 +1902,7 @@ public interface ApiService {
     @GET("app/user/get_short_url")
     Observable<BaseMessage> getShortUrl(@Query("oldurl") String oldUrl);
 
+    @GET("app/user/check_authorization")
+    Observable<BaseMessage> checkAuth(@Query("Authorization") String token);
+
 }

+ 2 - 0
app/src/main/java/com/sheep/gamegroup/model/api/IWeb.java

@@ -29,4 +29,6 @@ public interface IWeb {
     void superFinish();
 
     void setNonTouchArea(float height);
+
+    String getWebUrl();
 }

+ 1 - 1
app/src/main/java/com/sheep/gamegroup/module/game/fragment/FgtGameCenter.java

@@ -109,7 +109,7 @@ public class FgtGameCenter extends BaseFragment {
         } else {
             gameMallFgt = FgtWebX5.newInstance(new WebParams(Config.getUrlByPath(Config.PATH_GAME_SHOP_HOME)));
         }
-        mAdapter.add(gameMallFgt, "游戏商城");
+//        mAdapter.add(gameMallFgt, "游戏商城");
         pager.setAdapter(mAdapter);
         indicator.setupWithViewPager(pager);
         CommonUtil.getInstance().reflex(indicator, getActivity(), false, G.WIDTH - G.getRealPix(144));

+ 6 - 1
app/src/main/java/com/sheep/gamegroup/module/webview/fragment/FgtWeb.java

@@ -251,7 +251,7 @@ public class FgtWeb extends BaseFgtWeb {
             @Override
             public void onReceivedTitle(WebView view, String title) {
                 super.onReceivedTitle(view, title);
-                if (webParams.isShowTitle()) {
+                if (webParams.isShowTitle() && getActivity() != null) {
                     if (!(getActivity() instanceof ActMain)) {
                         TitleBarUtils
                                 .getInstance()
@@ -616,6 +616,11 @@ public class FgtWeb extends BaseFgtWeb {
         });
     }
 
+    @Override
+    public String getWebUrl() {
+        return mWebView.getOriginalUrl();
+    }
+
     public void callTransparent(String callback, String data) {
         loadJs(callback + "(" + data + ")");
     }

+ 6 - 1
app/src/main/java/com/sheep/gamegroup/module/webview/fragment/FgtWebX5.java

@@ -256,7 +256,7 @@ public class FgtWebX5 extends BaseFgtWebX5 {
             @Override
             public void onReceivedTitle(WebView view, String title) {
                 super.onReceivedTitle(view, title);
-                if (webParams.isShowTitle()) {
+                if (webParams.isShowTitle() && getActivity() != null) {
                     if (!(getActivity() instanceof ActMain)) {
                         TitleBarUtils
                                 .getInstance()
@@ -621,6 +621,11 @@ public class FgtWebX5 extends BaseFgtWebX5 {
         });
     }
 
+    @Override
+    public String getWebUrl() {
+        return mWebView.getOriginalUrl();
+    }
+
     public void callTransparent(String callback, String data) {
         loadJs(callback + "(" + data + ")");
     }

+ 0 - 1
app/src/main/java/com/sheep/gamegroup/util/CertificationUtil.java

@@ -97,7 +97,6 @@ public class CertificationUtil {
                     public void onNext(BaseMessage baseMessage) {
                         ViewUtil.newInstance().hideProgress((Activity) activity);
                         if (baseMessage != null && baseMessage.getData() != null) {
-                            Log.e("data-------", "");
                             doCertification(activity, token, SheepApp.getInstance().getGamePackgeName(), baseMessage.getData() + "");
                         } else {
                             showCertificationErrorAndExitApp(activity, "请求授权错误 " + (baseMessage == null ? "无数据" : baseMessage.getMsg()), 1000);

+ 23 - 15
app/src/main/java/com/sheep/gamegroup/util/CommonUtil.java

@@ -598,21 +598,6 @@ public class CommonUtil {
      * 注销账户
      */
     public void loginOut(final BaseActivity activity) {
-        //登出
-        SheepApp.getInstance().getNetComponent().getApiService().logout(new JSONObject())
-                .subscribeOn(Schedulers.io())
-                .observeOn(AndroidSchedulers.mainThread())
-                .subscribe(new SheepSubscriber<BaseMessage>(activity) {
-                    @Override
-                    public void onNext(BaseMessage baseMessage) {
-
-                    }
-
-                    @Override
-                    public void onError(BaseMessage baseMessage) {
-
-                    }
-                });
         UMConfigUtils.onProfileSignOff();
         UMConfigUtils.onEvent(UMConfigUtils.Event.USER_LOGOUT);
         UMShareAPI api = UMShareAPI.get(activity);
@@ -1306,6 +1291,29 @@ public class CommonUtil {
                 });
     }
 
+    public void checkAuth(String token, final Action1<Boolean> action1) {
+        SheepApp.getInstance()
+                .getNetComponent()
+                .getApiService()
+                .checkAuth(token)
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribe(new SheepSubscriber<BaseMessage>(SheepApp.getInstance()) {
+                    @Override
+                    public void onError(BaseMessage baseMessage) {
+                        if (action1 != null)
+                            action1.call(false);
+
+                    }
+
+                    @Override
+                    public void onNext(BaseMessage baseMessage) {
+                        if (action1 != null)
+                            action1.call(baseMessage.getData(Boolean.class));
+                    }
+                });
+    }
+
     public void callActionWithUserInfo(final Action1<UserEntity> action1) {
         UserEntity userEntity = DataUtil.getInstance().getUserEntity();
         if (userEntity == null || DataUtil.getInstance().isChange()) {

+ 14 - 0
app/src/main/java/com/sheep/gamegroup/util/Jump2View.java

@@ -1133,6 +1133,20 @@ public class Jump2View {
         RECHARGE.onEvent("from", from);
     }
 
+    public void goRechargeAct(Context context, String from, String token) {
+        Intent intent = new Intent(context, RechargeAct.class);
+        intent.putExtra("fromToken", token);
+        context.startActivity(intent);
+        RECHARGE.onEvent("from", from);
+    }
+
+    public void goRechargeActForResult(Activity activity, String from, String token) {
+        Intent intent = new Intent(activity, RechargeAct.class);
+        intent.putExtra("fromToken", token);
+        activity.startActivityForResult(intent, Constant.INTENT_RECHARGE);
+        RECHARGE.onEvent("from", from);
+    }
+
     /**
      * 跳到绵羊币充值充值页面
      *

+ 6 - 2
app/src/main/java/com/sheep/gamegroup/util/js/KFZSJs.java

@@ -51,6 +51,7 @@ import com.sheep.jiuyan.samllsheep.utils.TitleBarUtils;
 
 import org.greenrobot.eventbus.EventBus;
 
+import java.net.URI;
 import java.util.Locale;
 
 import io.reactivex.android.schedulers.AndroidSchedulers;
@@ -147,10 +148,13 @@ public class KFZSJs {
 
     @JavascriptInterface
     public void gotoRecharge(boolean forResult) {
+        String url = iWeb.getWebUrl();
+        int start = url.indexOf("authorization=");
+        String token = url.substring(url.indexOf("=", start) + 1, url.indexOf("&", start));
         if (forResult) {
-            Jump2View.getInstance().goRechargeActForResult(activity, "内部H5");//进入充值绵羊币界面
+            Jump2View.getInstance().goRechargeActForResult(activity, "内部H5", token);//进入充值绵羊币界面
         } else {
-            Jump2View.getInstance().goRechargeAct(activity, "内部H5");//进入充值绵羊币界面
+            Jump2View.getInstance().goRechargeAct(activity, "内部H5", token);//进入充值绵羊币界面
         }
     }
 

+ 25 - 22
app/src/main/java/com/sheep/gamegroup/view/activity/ActPay.java

@@ -11,6 +11,8 @@ import com.ipaynow.plugin.api.IpaynowPlugin;
 import com.ipaynow.plugin.manager.route.dto.ResponseParams;
 import com.ipaynow.plugin.manager.route.impl.ReceivePayResult;
 import com.sheep.gamegroup.absBase.BaseActivity;
+import com.sheep.gamegroup.greendao.DDProviderHelper;
+import com.sheep.gamegroup.greendao.download.SdkLoginUser;
 import com.sheep.gamegroup.model.entity.BaseMessage;
 import com.sheep.gamegroup.model.entity.UserEntity;
 import com.sheep.gamegroup.model.entity.WebParams;
@@ -19,6 +21,7 @@ import com.sheep.gamegroup.util.CommonUtil;
 import com.sheep.gamegroup.util.Constant;
 import com.sheep.gamegroup.util.DataUtil;
 import com.sheep.gamegroup.util.Jump2View;
+import com.sheep.gamegroup.util.LogUtil;
 import com.sheep.gamegroup.util.QQUtil;
 import com.sheep.jiuyan.samllsheep.Config;
 import com.sheep.jiuyan.samllsheep.SheepApp;
@@ -28,6 +31,8 @@ import com.tencent.mm.opensdk.modelpay.PayResp;
 
 import org.greenrobot.eventbus.Subscribe;
 
+import java.util.List;
+
 import io.reactivex.android.schedulers.AndroidSchedulers;
 import io.reactivex.schedulers.Schedulers;
 
@@ -90,35 +95,33 @@ public class ActPay extends BaseActivity {
             pay_type = bundle.getString("pay_type");
             from_package = bundle.getString("from_package");
             token = bundle.getString("token");
-            UserEntity user = DataUtil.getInstance().getUserEntity();
-            if (user == null) {
-                Jump2View.getInstance().goRechargeResult(this, "9001", from_package, null, "请先登录");
-                finish();
-                return;
-            }
-            String tokenPrev = user.getId() + "@";
-            if (token.startsWith(tokenPrev)) {
-                token = SpUtils.getToken(this);
-                showProgress();
-                CommonUtil.getInstance().updateUserInfo(result -> {
-                    hideProgress();
-                    if (result == null) {
-                        Jump2View.getInstance().goRechargeResult(this, "9001", from_package, null, "用户认证已失效,请重新登录");
-                        finish();
-                    } else {
-                        doPay();
-                    }
-                });
-            } else {
-                Jump2View.getInstance().goRechargeResult(this, "9001", from_package, null, "用户信息不一致,请重新登录");
-                finish();
+            List<SdkLoginUser> sdkUsers = DDProviderHelper.getInstance().getSdkLoginUserList(SheepApp.getInstance().getConnectAddress().name());
+            String userId = token.substring(0, token.indexOf("@") + 1);
+            for (SdkLoginUser user : sdkUsers) {
+                if (user.getToken().startsWith(userId)) {
+                    token = user.getToken();
+                    showProgress();
+                    CommonUtil.getInstance().checkAuth(token, result -> {
+                        hideProgress();
+                        if (result) {
+                            doPay();
+                        } else {
+                            Jump2View.getInstance().goRechargeResult(this, "9001", from_package, null, "用户认证已失效,请重新登录");
+                            finish();
+                        }
+                    });
+                    return;
+                }
             }
+            Jump2View.getInstance().goRechargeResult(this, "9001", from_package, null, "用户认证已失效,请重新登录");
+            finish();
         }
     }
 
     private void doPay() {
         if (TextUtils.isEmpty(pay_type) || PAY_TYPE_COIN.equals(pay_type)) {
             String url = Config.getUrlByPath(Config.PATH_DIRECTIONAL_PAY + "?authorization=" + token + "&order=" + order_no + "&ssnocache=1");
+            LogUtil.logI("payurl: " + url);
             WebParams webParams = new WebParams(url, "支付").setShowTitle(false).setForResult(true).setAction(Constant.INTENT_PAY);
             Jump2View.getInstance().goWeb(this, webParams);
         } else if (PAY_TYPE_WX.equals(pay_type)) {

+ 25 - 11
app/src/main/java/com/sheep/gamegroup/view/activity/GameCertificationActivity.java

@@ -158,7 +158,6 @@ public class GameCertificationActivity extends BaseActivity {
                 CertificationUtil.newInstance().showCertificationErrorAndExitApp(this, "", 2000);
                 return;
             }
-            hasToken();
         } else {
             CertificationUtil.newInstance().showCertificationErrorAndExitApp(this, "", 2000);
         }
@@ -166,6 +165,24 @@ public class GameCertificationActivity extends BaseActivity {
         userList.addAll(DDProviderHelper.getInstance().getSdkLoginUserList(SheepApp.getInstance().getConnectAddress().name()));
         sdk_change_user_list.getAdapter().notifyDataSetChanged();
         ViewUtil.setVisibility2(sdk_arrow, !userList.isEmpty());
+        if (!TextUtils.isEmpty(gameToken) && !userList.isEmpty()) {
+            for (SdkLoginUser temp : userList) {
+                if (temp.getToken().startsWith(gameToken)) {
+                    CommonUtil.getInstance().checkAuth(gameToken, new Action1<Boolean>() {
+                        @Override
+                        public void call(Boolean ret) {
+                            if (ret) {
+                                CertificationUtil.newInstance().doCertification(GameCertificationActivity.this, gameToken, packageName, "validate");
+                            } else {
+                                hasToken();
+                            }
+                        }
+                    });
+                    return;
+                }
+            }
+        }
+        hasToken();
     }
 
     //是否展开登录用户列表
@@ -175,13 +192,13 @@ public class GameCertificationActivity extends BaseActivity {
     public void onViewClicked(View view) {
         switch (view.getId()) {
             case R.id.sdk_arrow:
-//                if (isUserListOpen) {//展开
-//                    sdk_arrow.setRotation(0);
-//                } else {
-//                    sdk_arrow.setRotation(180);
-//                }
-//                isUserListOpen = !isUserListOpen;
-//                ViewUtil.setVisibility(sdk_change_user_list, isUserListOpen);
+                if (isUserListOpen) {//展开
+                    sdk_arrow.setRotation(0);
+                } else {
+                    sdk_arrow.setRotation(180);
+                }
+                isUserListOpen = !isUserListOpen;
+                ViewUtil.setVisibility(sdk_change_user_list, isUserListOpen);
                 break;
             case R.id.icon_iv:
                 textProgressBar.setVisibility(View.GONE);
@@ -233,9 +250,6 @@ public class GameCertificationActivity extends BaseActivity {
                 } else {
                     userEntity = result;
                     initWidget();
-                    if (token.equals(gameToken)) {
-                        CertificationUtil.newInstance().doCertification(this, token, packageName, "validate");
-                    }
                 }
             });
 

+ 41 - 70
app/src/main/java/com/sheep/gamegroup/view/activity/RechargeAct.java

@@ -6,6 +6,7 @@ import android.os.Bundle;
 import android.support.v4.content.ContextCompat;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
+import android.text.TextUtils;
 import android.util.Log;
 import android.view.View;
 import android.widget.EditText;
@@ -20,6 +21,8 @@ import com.ipaynow.plugin.manager.route.dto.ResponseParams;
 import com.ipaynow.plugin.manager.route.impl.ReceivePayResult;
 import com.sheep.gamegroup.absBase.AbsObserver;
 import com.sheep.gamegroup.absBase.BaseActivity;
+import com.sheep.gamegroup.greendao.DDProviderHelper;
+import com.sheep.gamegroup.greendao.download.SdkLoginUser;
 import com.sheep.gamegroup.model.entity.BaseMessage;
 import com.sheep.gamegroup.model.entity.RechargeEntity;
 import com.sheep.gamegroup.model.entity.RechargePriceEntity;
@@ -127,13 +130,34 @@ public class RechargeAct extends BaseActivity {
     @Override
     public void initData() {
         UserEntity user = DataUtil.getInstance().getUserEntity();
-        if (user == null) {
+        if (fromToken == null && user == null) {
             Jump2View.getInstance().goRechargeResult(RechargeAct.this, "9002", fromPackage, null, "请登录");
             finish();
             return;
         }
-        sheep_no_view.append(user.getInvitation_code());
-        nickname_view.append(user.getNickname());
+        if (!TextUtils.isEmpty(fromToken)) {
+            List<SdkLoginUser> sdkUsers = DDProviderHelper.getInstance().getSdkLoginUserList(SheepApp.getInstance().getConnectAddress().name());
+            SdkLoginUser sdkUser = null;
+            String uid = fromToken.substring(0, fromToken.indexOf("@") + 1);
+            for (SdkLoginUser u : sdkUsers) {
+                if (u.getToken().startsWith(uid)) {
+                    sdkUser = u;
+                    break;
+                }
+            }
+            if (sdkUser != null) {
+                fromToken = sdkUser.getToken();
+                sheep_no_view.append(sdkUser.getInvitation_code());
+                nickname_view.append(sdkUser.getNickname());
+            } else {
+                Jump2View.getInstance().goRechargeResult(RechargeAct.this, "9002", fromPackage, null, "请登录");
+                finish();
+                return;
+            }
+        } else {
+            sheep_no_view.append(user.getInvitation_code());
+            nickname_view.append(user.getNickname());
+        }
         addDatas();
         /*
           支付金额选择
@@ -190,14 +214,16 @@ public class RechargeAct extends BaseActivity {
         rechargeAdapter.bindToRecyclerView(act_ral_pay_type_rv);
 
         if (fromToken != null) {
-            if (SpUtils.getToken(SheepApp.getInstance()).startsWith(fromToken.substring(0, fromToken.indexOf("@")))) {
-                showProgress();
-                getRechargePayway();
-            } else {
-                String result = "9001";
-                Jump2View.getInstance().goRechargeResult(RechargeAct.this, result, fromPackage, null, "用户信息不一致,请再次确认用户信息");
-                finish();
-            }
+            CommonUtil.getInstance().checkAuth(fromToken, result -> {
+                if (result) {
+                    showProgress();
+                    getRechargePayway();
+                } else {
+                    String resultCode = "9001";
+                    Jump2View.getInstance().goRechargeResult(RechargeAct.this, resultCode, fromPackage, null, "用户信息不一致,请再次确认用户信息");
+                    finish();
+                }
+            });
         } else {
             showProgress();
             getRechargePayway();
@@ -208,7 +234,8 @@ public class RechargeAct extends BaseActivity {
 
     private void getRechargePayway() {
         // 参数 1:没有绵羊币的,2:是全部
-        SheepApp.getInstance().getNetComponent().getApiService().getRechargePayway("1")
+        String t = (TextUtils.isEmpty(fromToken)) ? SpUtils.getToken(this) : fromToken;
+        SheepApp.getInstance().getNetComponent().getApiService().getRechargePayway(t, "1")
                 .subscribeOn(Schedulers.io())
                 .observeOn(AndroidSchedulers.mainThread())
                 .subscribe(new SheepSubscriber<BaseMessage>(RechargeAct.this) {
@@ -237,7 +264,8 @@ public class RechargeAct extends BaseActivity {
         JSONObject jsonObject = new JSONObject();
         jsonObject.put("Amount", Float.valueOf(mAmount));
         jsonObject.put("PayType", mPayType);
-        SheepApp.getInstance().getNetComponent().getApiService().getRechargeBalance(jsonObject)
+        String t = (TextUtils.isEmpty(fromToken)) ? SpUtils.getToken(this) : fromToken;
+        SheepApp.getInstance().getNetComponent().getApiService().getRechargeBalance(t, jsonObject)
                 .subscribeOn(Schedulers.io())
                 .observeOn(AndroidSchedulers.mainThread())
                 .subscribe(new SheepSubscriber<BaseMessage>(RechargeAct.this) {
@@ -358,63 +386,6 @@ public class RechargeAct extends BaseActivity {
                 LogUtil.println(ActVip.class.getSimpleName(), String.format(Locale.CHINA, "alipay onError('%s')", e.getMessage()));
             }
         });
-//        Runnable payRunnable = new Runnable() {
-//
-//            @Override
-//            public void run() {
-//                // 构造PayTask 对象
-//                PayTask alipay = new PayTask(RechargeAct.this);
-//                // 调用支付接口,获取支付结果
-//                final String result = alipay.tryAliPay(payInfo, true);
-//
-//                runOnUiThread(new Runnable() {
-//
-//                    @Override
-//                    public void run() {
-//
-//                        PayResult payResult = new PayResult(result);
-//                        /*
-//                          同步返回的结果必须放置到服务端进行验证(验证的规则请看https://doc.open.alipay.com/doc2/
-//                          detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
-//                          docType=1) 建议商户依赖异步通知
-//                         */
-////						String resultInfo = payResult.getResult();// 同步返回需要验证的信息
-//
-//                        String resultStatus = payResult.getResultStatus();
-//                        if ("9000".equals(resultStatus)) {
-//                            JSONObject json = new JSONObject();
-//                            json.put("act", 4);
-//                            SheepApp.getInstance().getNetComponent().getApiService()
-//                                    .missionExecute(json)
-//                                    .subscribeOn(Schedulers.io())
-//                                    .observeOn(AndroidSchedulers.mainThread())
-//                                    .subscribe(new SheepSubscriber<BaseMessage>(SheepApp.getInstance()) {
-//                                        @Override
-//                                        public void onError(BaseMessage baseMessage) {
-//                                            LogUtil.logE(baseMessage.getErrorMsg() + " " + baseMessage.getMsg());
-//                                        }
-//
-//                                        @Override
-//                                        public void onNext(BaseMessage baseMessage) {
-//                                        }
-//                                    });
-//                        }
-//                        if (forResult && "9000".equals(resultStatus)) {
-//                            Intent intent = new Intent();
-//                            intent.putExtra("amount", Integer.parseInt(mAmount));
-//                            setResult(777, intent);
-//                        } else {
-//                            Jump2View.getInstance().goRechargeResultAct(RechargeAct.this, resultStatus);
-//                        }
-//                        finish();
-//                    }
-//                });
-//            }
-//        };
-//
-//        // 必须异步调用
-//        Thread payThread = new Thread(payRunnable);
-//        payThread.start();
     }
 
     private void addDatas() {

+ 1 - 1
app/src/main/res/layout/act_game_certification.xml

@@ -71,7 +71,7 @@
                 android:paddingTop="22dp"
                 android:paddingEnd="35dp"
                 android:paddingBottom="22dp"
-                android:text="切换账号"
+                android:text="添加账号"
                 android:textColor="#36A5ED"
                 android:textSize="14sp"
                 app:layout_constraintStart_toStartOf="parent"

+ 0 - 1
app/src/main/res/layout/include_sdk_user.xml

@@ -10,7 +10,6 @@
         android:layout_height="match_parent"
         android:layout_alignParentEnd="true"
         android:layout_marginEnd="17dp"
-        android:rotation="-90"
         android:paddingStart="10dp"
         android:paddingEnd="10dp"
         android:scaleType="fitCenter"

BIN
app/src/main/res/mipmap-xhdpi/red_package_floatbtn.png


BIN
app/src/main/res/mipmap-xhdpi/red_package_floatbtn.webp