Przeglądaj źródła

积分界面添加一个按钮;
支付界面与功能

zengjiebin 7 lat temu
rodzic
commit
6be0774aba

+ 2 - 1
app/src/main/AndroidManifest.xml

@@ -694,7 +694,8 @@
             android:exported="true"
             android:screenOrientation="portrait" />
         <activity android:name="com.sheep.gamegroup.view.activity.ActPay"
-            android:screenOrientation="portrait" />
+            android:exported="true"
+            android:screenOrientation="user" />
 
         <service
             android:name="com.mdad.sdk.mdsdk.monitor.MonitorService"

+ 11 - 1
app/src/main/java/com/sheep/gamegroup/model/api/ApiService.java

@@ -12,6 +12,7 @@ import retrofit2.http.DELETE;
 import retrofit2.http.FieldMap;
 import retrofit2.http.FormUrlEncoded;
 import retrofit2.http.GET;
+import retrofit2.http.Header;
 import retrofit2.http.POST;
 import retrofit2.http.PUT;
 import retrofit2.http.Path;
@@ -1062,5 +1063,14 @@ public interface ApiService {
      */
     @POST("app/mobile_point/recharge")
     Observable<BaseMessage> rechargeCMCC(@Body JSONObject jsonObject);
-
+    /**
+     * 绵羊币支付订单查询接口
+     */
+    @GET("app/sdk/find/order")
+    Observable<BaseMessage> sdkFindOrder(@Header("Authorization") String token, @Query("order_no") String order_no);
+    /**
+     * 绵羊币支付sdk订单
+     */
+    @POST("app/sdk/pay/order")
+    Observable<BaseMessage> sdkPayOrder(@Header("Authorization") String token, @Query("order_no") String out_trade_no);
 }

+ 240 - 0
app/src/main/java/com/sheep/gamegroup/model/entity/PayOrder.java

@@ -0,0 +1,240 @@
+package com.sheep.gamegroup.model.entity;
+
+/**
+ * Created by realicing on 2018/10/18.
+ * realicing@sina.com
+ */
+public class PayOrder {
+    /**
+     * number ($double)
+     * 代金券(定向货币)抵扣金额
+     */
+    private float CouponMoney;
+    /**
+     * integer ($int64)
+     * 创建时间
+     */
+    private int CreatedAt;
+    /**
+     * integer ($int64)
+     * 关联game_id
+     */
+    private int GameId;
+    /**
+     * integer ($int64)
+     * 主键ID
+     */
+    private int Id;
+    /**
+     *	integer ($int64)
+     * 关联商户ID
+     */
+    private int MerchantId;
+    /**
+     * number ($double)
+     * 订单金额
+     */
+    private float Money;
+    /**
+     * 	string
+     * 订单名称
+     */
+    private String Name;
+    /**
+     * integer ($int64)
+     * 回调次数
+     */
+    private int NotifyNum;
+    /**
+     * integer ($int32)
+     * 1:回调成功 2:未回调 3:回调失败
+     */
+    private int NotifyStatus;
+    /**
+     * integer ($int64)
+     * 回调时间
+     */
+    private int NotifyTime;
+    /**
+     * string
+     * 回调地址url
+     */
+    private String NotifyUrl;
+    /**
+     * string
+     * 订单号
+     */
+    private String OrderNo;
+    /**
+     * string
+     * 商户系统订单号
+     */
+    private String OutTradeNo;
+    /**
+     * number ($double)
+     * 实际支付金额
+     */
+    private float PayMoney;
+    /**
+     * integer ($int64)
+     * 支付时间
+     */
+    private int PayTime;
+    /**
+     * integer ($int64)
+     * 1:绵羊币
+     */
+    private int PayType;
+    /**
+     * string
+     * 备注
+     */
+    private String Remarks;
+    /**
+     * string
+     * 返回地址url
+     */
+    private String ReturnUrl;
+    /**
+     * integer ($int64)
+     * 更新时间
+     */
+    private int UpdateAt;
+    /**
+     * integer ($int64)
+     * 状态 1:已支付 2:未支付
+     */
+    private int status;
+    /**
+     * integer ($int64)
+     * 支付用户id
+     */
+    private int user_id;
+
+    public void setCouponMoney(float CouponMoney){
+        this.CouponMoney = CouponMoney;
+    }
+    public float getCouponMoney(){
+        return this.CouponMoney;
+    }
+    public void setCreatedAt(int CreatedAt){
+        this.CreatedAt = CreatedAt;
+    }
+    public int getCreatedAt(){
+        return this.CreatedAt;
+    }
+    public void setGameId(int GameId){
+        this.GameId = GameId;
+    }
+    public int getGameId(){
+        return this.GameId;
+    }
+    public void setId(int Id){
+        this.Id = Id;
+    }
+    public int getId(){
+        return this.Id;
+    }
+    public void setMerchantId(int MerchantId){
+        this.MerchantId = MerchantId;
+    }
+    public int getMerchantId(){
+        return this.MerchantId;
+    }
+    public void setMoney(float Money){
+        this.Money = Money;
+    }
+    public float getMoney(){
+        return this.Money;
+    }
+    public void setName(String Name){
+        this.Name = Name;
+    }
+    public String getName(){
+        return this.Name;
+    }
+    public void setNotifyNum(int NotifyNum){
+        this.NotifyNum = NotifyNum;
+    }
+    public int getNotifyNum(){
+        return this.NotifyNum;
+    }
+    public void setNotifyStatus(int NotifyStatus){
+        this.NotifyStatus = NotifyStatus;
+    }
+    public int getNotifyStatus(){
+        return this.NotifyStatus;
+    }
+    public void setNotifyTime(int NotifyTime){
+        this.NotifyTime = NotifyTime;
+    }
+    public int getNotifyTime(){
+        return this.NotifyTime;
+    }
+    public void setNotifyUrl(String NotifyUrl){
+        this.NotifyUrl = NotifyUrl;
+    }
+    public String getNotifyUrl(){
+        return this.NotifyUrl;
+    }
+    public void setOrderNo(String OrderNo){
+        this.OrderNo = OrderNo;
+    }
+    public String getOrderNo(){
+        return this.OrderNo;
+    }
+    public void setOutTradeNo(String OutTradeNo){
+        this.OutTradeNo = OutTradeNo;
+    }
+    public String getOutTradeNo(){
+        return this.OutTradeNo;
+    }
+    public void setPayMoney(float PayMoney){
+        this.PayMoney = PayMoney;
+    }
+    public float getPayMoney(){
+        return this.PayMoney;
+    }
+    public void setPayTime(int PayTime){
+        this.PayTime = PayTime;
+    }
+    public int getPayTime(){
+        return this.PayTime;
+    }
+    public void setPayType(int PayType){
+        this.PayType = PayType;
+    }
+    public int getPayType(){
+        return this.PayType;
+    }
+    public void setRemarks(String Remarks){
+        this.Remarks = Remarks;
+    }
+    public String getRemarks(){
+        return this.Remarks;
+    }
+    public void setReturnUrl(String ReturnUrl){
+        this.ReturnUrl = ReturnUrl;
+    }
+    public String getReturnUrl(){
+        return this.ReturnUrl;
+    }
+    public void setUpdateAt(int UpdateAt){
+        this.UpdateAt = UpdateAt;
+    }
+    public int getUpdateAt(){
+        return this.UpdateAt;
+    }
+    public void setStatus(int status){
+        this.status = status;
+    }
+    public int getStatus(){
+        return this.status;
+    }
+    public void setUser_id(int user_id){
+        this.user_id = user_id;
+    }
+    public int getUser_id(){
+        return this.user_id;
+    }
+}

+ 5 - 1
app/src/main/java/com/sheep/gamegroup/model/util/SheepSubscriber.java

@@ -1,5 +1,6 @@
 package com.sheep.gamegroup.model.util;
 
+import android.app.Activity;
 import android.content.Context;
 import android.text.TextUtils;
 import android.util.Log;
@@ -12,7 +13,9 @@ import com.sheep.gamegroup.util.ActivityManager;
 import com.sheep.gamegroup.util.Jump2View;
 import com.sheep.gamegroup.util.LogUtil;
 import com.sheep.gamegroup.util.NetUtil;
+import com.sheep.gamegroup.util.UMConfigUtils;
 import com.sheep.gamegroup.util.ViewUtil;
+import com.sheep.gamegroup.view.activity.ActPay;
 import com.sheep.gamegroup.view.activity.LoginAct;
 import com.sheep.jiuyan.samllsheep.SheepApp;
 import com.sheep.jiuyan.samllsheep.utils.SpUtils;
@@ -71,7 +74,8 @@ public abstract class SheepSubscriber<T> extends Subscriber<T> {
                 }
                 //token 过期
                 if(throwable.code == 401){
-                    if(ActivityManager.getInstance().currentActivity() instanceof LoginAct){//本身就是登录界面
+                    Activity curAct = ActivityManager.getInstance().currentActivity();
+                    if(curAct instanceof LoginAct || UMConfigUtils.isNotNeedAct(curAct)){//本身就是登录界面 或者可以不用登录就存在的界面,如:支付界面
                     } else {
                         SpUtils.saveToken(SheepApp.getInstance(), "");
                         Jump2View.getInstance().gotoLoginAgain(baseMessage.getMsg());

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

@@ -13,6 +13,7 @@ import com.sheep.gamegroup.model.util.SheepSubscriber;
 import com.sheep.jiuyan.samllsheep.R;
 import com.sheep.jiuyan.samllsheep.SheepApp;
 import com.sheep.jiuyan.samllsheep.utils.G;
+import com.sheep.jiuyan.samllsheep.utils.SpUtils;
 
 import rx.android.schedulers.AndroidSchedulers;
 import rx.schedulers.Schedulers;
@@ -64,10 +65,12 @@ public class CertificationUtil {
 
             if (TextUtils.isEmpty(ext)) {
                 intent.putExtra(context.getString(R.string.kfzs_duanduan_datashare_package_extras), "");
+                intent.putExtra(context.getString(R.string.kfzs_duanduan_datashare_certification_token), SpUtils.getToken(context));
             } else if("cancel".equals(ext)){
                 intent.putExtra(context.getString(R.string.kfzs_duanduan_datashare_certification_cancel), "cancel");
             }else  {
                 intent.putExtra(context.getString(R.string.kfzs_duanduan_datashare_package_extras), ext);
+                intent.putExtra(context.getString(R.string.kfzs_duanduan_datashare_certification_token), SpUtils.getToken(context));
             }
             context.startActivity(intent);
             showCertificationErrorAndExitApp("", 100);
@@ -92,7 +95,7 @@ public class CertificationUtil {
                             Log.e("data-------","");
                             doCertification(context, SheepApp.getInstance().getGamePackgeName(), baseMessage.getData()+"");
                         }else {
-                            CertificationUtil.newInstance().showCertificationErrorAndExitApp("请求授权错误 " + baseMessage.getMsg(),1000);
+                            CertificationUtil.newInstance().showCertificationErrorAndExitApp("请求授权错误 " + (baseMessage == null ? "无数据" : baseMessage.getMsg()),1000);
                         }
 
                     }

+ 2 - 1
app/src/main/java/com/sheep/gamegroup/util/ConnectAddress.java

@@ -37,7 +37,8 @@ public enum ConnectAddress {
 
         @Override
         public String getAppUrl() {
-            return "http://10.8.220.245:8080/";
+            return "http://10.8.220.239:8080/";
+//            return "http://10.8.220.245:8080/";
 //            return "http://10.8.220.229:8080/";
         }
         @Override

+ 59 - 31
app/src/main/java/com/sheep/gamegroup/util/Jump2View.java

@@ -63,6 +63,7 @@ import com.sheep.gamegroup.view.activity.ActMyWelfare;
 import com.sheep.gamegroup.view.activity.ActNewAboutUs;
 import com.sheep.gamegroup.view.activity.ActNewbieTaskList;
 import com.sheep.gamegroup.view.activity.ActNotice;
+import com.sheep.gamegroup.view.activity.ActPay;
 import com.sheep.gamegroup.view.activity.ActPlayGameDetail;
 import com.sheep.gamegroup.view.activity.ActReservation;
 import com.sheep.gamegroup.view.activity.ActSearchApp;
@@ -858,7 +859,7 @@ public class Jump2View {
         }
         //检查url是否是http或者https开头并添加
         if (!url.startsWith("http") && !url.startsWith("https") && !url.contains("://")) {
-            url = "http://"+url;
+            url = "http://" + url;
         }
         try {
             Uri uri = Uri.parse(url);
@@ -883,7 +884,7 @@ public class Jump2View {
         }
         //检查url是否是http或者https开头并添加
         if (!url.startsWith("http") && !url.startsWith("https") && !url.contains("://")) {
-            url = "http://"+url;
+            url = "http://" + url;
         }
         Intent intent = new Intent(context, ActWeb.class);
         intent.putExtra("url", url);
@@ -1088,6 +1089,7 @@ public class Jump2View {
 //        intent.putExtra("isShow", isShow);
 //        context.startService(intent);
 //    }
+
     /**
      * 启动小绵羊悬浮窗
      *
@@ -1095,10 +1097,10 @@ public class Jump2View {
      */
     public void startAutoCheckService(Context context, ArrayList<String> taskList) {
         String userId = DataUtil.getInstance().getUserId();
-        if(TextUtils.isEmpty(userId)){
+        if (TextUtils.isEmpty(userId)) {
             return;
         }
-        if(AutoCheckService.IS_USE_THIS_SERVICE) {
+        if (AutoCheckService.IS_USE_THIS_SERVICE) {
             Intent intent = new Intent(context, AutoCheckService.class);
             intent.putStringArrayListExtra(AutoCheckService.EXTRA_KEY_TASK_LIST, taskList);
             intent.putExtra(AutoCheckService.EXTRA_KEY_USER_ID, userId);
@@ -1125,6 +1127,7 @@ public class Jump2View {
             }
         }
     }
+
     /**
      * 启动小绵羊悬浮窗
      *
@@ -1132,7 +1135,7 @@ public class Jump2View {
      */
     public void startListenerShotService(Context context) {
         if (DataUtil.IS_LISTEN_SCREEN_SHOT && (!IS_RECORD_PATH || !TextUtils.isEmpty(DataUtil.getInstance().getUserId()))) {
-            if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                 Intent intent = new Intent(context, ListenerShotNewService.class);
                 intent.putExtra(AutoCheckService.EXTRA_KEY_USER_ID, DataUtil.getInstance().getUserId());//记录用户截图方案需要记录当前用户id
                 context.startForegroundService(intent);
@@ -1141,7 +1144,7 @@ public class Jump2View {
                 intent.putExtra(AutoCheckService.EXTRA_KEY_USER_ID, DataUtil.getInstance().getUserId());//记录用户截图方案需要记录当前用户id
                 context.startService(intent);
             }
-    }
+        }
     }
 
 
@@ -1323,7 +1326,7 @@ public class Jump2View {
     public void gotoLoginAgain(String o) {
         SpUtils.saveToken(SheepApp.getInstance(), "");
         DataUtil.getInstance().clearData();
-        G.showToast(TextUtils.isEmpty(o)?"请重新登录":o);
+        G.showToast(TextUtils.isEmpty(o) ? "请重新登录" : o);
         ActivityManager.getInstance().finishAllActivity();
         Jump2View.getInstance().goLoginView(SheepApp.getInstance(), o);
     }
@@ -1528,6 +1531,7 @@ public class Jump2View {
         intent.putExtra("id", item.getApplication_id());
         activity.startActivity(intent);
     }
+
     /**
      * 发现模块--游戏详情界面
      *
@@ -1539,6 +1543,7 @@ public class Jump2View {
         intent.putExtra("id", findApp.getId());
         activity.startActivity(intent);
     }
+
     /**
      * 发现模块--游戏详情界面
      *
@@ -1564,6 +1569,7 @@ public class Jump2View {
         activity.startActivity(intent);
         USER_FIND_APP_ORDER.onEvent();
     }
+
     /**
      * 发现模块--资讯详情界面
      *
@@ -1694,7 +1700,7 @@ public class Jump2View {
      */
     public void goAuditTastList(Activity activity, Object object) {
         Intent intent = new Intent(activity, ActAudit.class);
-        if(object instanceof Integer){
+        if (object instanceof Integer) {
             DataUtil.putObject(intent, object);
         }
         activity.startActivity(intent);
@@ -1792,6 +1798,7 @@ public class Jump2View {
         ASK_MAKE_MONEY_INVITATION.onEvent();
         activity.startActivity(new Intent(activity, ActInvitation.class));
     }
+
     /**
      * 跳到积分兑换界面
      *
@@ -1802,6 +1809,7 @@ public class Jump2View {
         context.startActivity(intent);
         UMConfigUtils.Event.EXCHANGE_CMCC.onEvent();
     }
+
     /**
      * 点击看点
      *
@@ -1816,12 +1824,13 @@ public class Jump2View {
             CommonUtil.getInstance().awakenDetail(entity);
         } catch (Exception e) {
             e.printStackTrace();
-            if(TestUtil.isTest())
+            if (TestUtil.isTest())
                 G.showToast(e.getMessage());
             else
                 G.showToast(activity.getString(R.string.not_install, entity.getApp_name()));
         }
     }
+
     /**
      * 通过id尝试打开一个看点
      *
@@ -1829,24 +1838,24 @@ public class Jump2View {
      */
     public void goWatchFocus(final Activity activity, int id) {
         SheepApp.getInstance().getNetComponent().getApiService().awakenAppArticle(id)
-                        .subscribeOn(Schedulers.io())
-                        .observeOn(AndroidSchedulers.mainThread())
-                        .subscribe(new SheepSubscriber<BaseMessage>(SheepApp.getInstance()) {
-                            @Override
-                            public void onNext(BaseMessage baseMessage) {
-                                RouserArticlesEntity item = baseMessage.getData(RouserArticlesEntity.class);
-                                if(item == null){
-                                    G.showToast(R.string.error_data);
-                                    return;
-                                }
-                                goWatchFocus(activity, item);
-                            }
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribe(new SheepSubscriber<BaseMessage>(SheepApp.getInstance()) {
+                    @Override
+                    public void onNext(BaseMessage baseMessage) {
+                        RouserArticlesEntity item = baseMessage.getData(RouserArticlesEntity.class);
+                        if (item == null) {
+                            G.showToast(R.string.error_data);
+                            return;
+                        }
+                        goWatchFocus(activity, item);
+                    }
 
-                            @Override
-                            public void onError(BaseMessage baseMessage) {
-                                G.showToast(baseMessage);
-                            }
-                        });
+                    @Override
+                    public void onError(BaseMessage baseMessage) {
+                        G.showToast(baseMessage);
+                    }
+                });
     }
 
     //通过查询发现打开一个发现
@@ -1858,7 +1867,7 @@ public class Jump2View {
                     @Override
                     public void onNext(BaseMessage baseMessage) {
                         FindItem item = baseMessage.getData(FindItem.class);
-                        if(item == null){
+                        if (item == null) {
                             G.showToast(R.string.error_data);
                             return;
                         }
@@ -1871,9 +1880,10 @@ public class Jump2View {
                     }
                 });
     }
+
     //打开一个发现
     public void goFindItem(Activity activity, FindItem item) {
-        switch (item.getType()){//类型 1:游戏 2:咨询 3:转跳 4:任务 5:栏目
+        switch (item.getType()) {//类型 1:游戏 2:咨询 3:转跳 4:任务 5:栏目
             case 1:
                 Jump2View.getInstance().goFindGame(activity, item);
                 break;
@@ -1891,8 +1901,10 @@ public class Jump2View {
                 break;
         }
     }
+
     /**
      * 打开一个homelist项
+     *
      * @param item
      */
     private void openHomeListItem(final Activity activity, FindItem item) {
@@ -1903,7 +1915,7 @@ public class Jump2View {
                     @Override
                     public void onNext(BaseMessage baseMessage) {
                         HomeListEntity homeListEntity = baseMessage.getData(HomeListEntity.class);
-                        if(homeListEntity == null){
+                        if (homeListEntity == null) {
                             G.showToast(R.string.error_data);
                             return;
                         }
@@ -1916,16 +1928,18 @@ public class Jump2View {
                     }
                 });
     }
+
     /**
      * 打开一个链接
+     *
      * @param item
      */
     private void openLink(Activity activity, FindItem item) {
-        if(TextUtils.isEmpty(item.getUrl())){
+        if (TextUtils.isEmpty(item.getUrl())) {
             G.showToast(R.string.error_link);
             return;
         }
-        switch (item.getIs_in_url()){//是否外部链接 1:是 0:不是
+        switch (item.getIs_in_url()) {//是否外部链接 1:是 0:不是
             case 1:
                 Jump2View.getInstance().goWeb(activity, item.getUrl());
                 break;
@@ -1934,4 +1948,18 @@ public class Jump2View {
                 break;
         }
     }
+
+    /**
+     * 跳转支付界面
+     *
+     * @param activity
+     * @param order_no 订单编号
+     * @param token    登录token
+     */
+    public void goActPay(Activity activity, String order_no, String token) {
+        activity.startActivityForResult(new Intent(activity, ActPay.class)
+                .putExtra("order_no", order_no)
+                .putExtra("token", token),
+                ActPay.RESULT_CODE);
+    }
 }

+ 5 - 1
app/src/main/java/com/sheep/gamegroup/util/TestUtil.java

@@ -208,7 +208,8 @@ public class TestUtil {
      * @param activity
      */
     public static void test(final Activity activity) {
-        final String[] items = {"复制token","复制打点数据","从jenkins下载小绵羊安装包","龙猫竞猜","龙猫竞猜-scheme", "测试内部h5", "测试外部h5",
+        final String[] items = {"复制token","复制打点数据","从jenkins下载小绵羊安装包","龙猫竞猜","龙猫竞猜-scheme",
+                "测试支付","测试内部h5", "测试外部h5",
                 "会长推广游戏","移动积分兑换","审核中心","检查正版","crc32","loading","progress","查看截图",
                 "复制IMEI","小米游戏","测试可用金额","测试定位信息","测试apk的渠道","幂动科技","游戏搜索",
                 "游戏帐号","游戏代充","尝试开启第三方应用使用情况","测试代理页面","第三方应用使用情况",
@@ -222,6 +223,9 @@ public class TestUtil {
                     @Override
                     public void onClick(DialogInterface dialog, int which) {
                         switch (items[which]) {
+                            case "测试支付":
+                                Jump2View.getInstance().goActPay(activity, "6458603943269240832", SpUtils.getToken(activity));
+                                break;
                             case "测试内部h5":
                                 Jump2View.getInstance().goWeb(activity, "www.17xmy.com/", "小绵羊官网");
                                 break;

+ 6 - 0
app/src/main/java/com/sheep/gamegroup/util/UMConfigUtils.java

@@ -1,6 +1,7 @@
 package com.sheep.gamegroup.util;
 
 
+import android.app.Activity;
 import android.content.Context;
 
 import com.alibaba.fastjson.JSON;
@@ -9,6 +10,7 @@ import com.sheep.gamegroup.model.entity.BaseMessage;
 import com.sheep.gamegroup.model.util.SheepSubscriber;
 import com.sheep.gamegroup.statistics.AppStatistics;
 import com.sheep.gamegroup.statistics.AppStatisticsConfig;
+import com.sheep.gamegroup.view.activity.ActPay;
 import com.sheep.gamegroup.view.activity.ChangeTelAct;
 import com.sheep.jiuyan.samllsheep.SheepApp;
 
@@ -28,6 +30,10 @@ import rx.schedulers.Schedulers;
 public class UMConfigUtils {
 
     public static final String LOGIN_TYPE = "sheep_login_type";
+    //判断act是不是不需要统计的act
+    public static boolean isNotNeedAct(Activity activity) {
+        return activity instanceof ActPay;
+    }
 
     //统计点击次数需要的子subtype
     public enum Event {

+ 246 - 0
app/src/main/java/com/sheep/gamegroup/view/activity/ActPay.java

@@ -0,0 +1,246 @@
+package com.sheep.gamegroup.view.activity;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.kfzs.duanduan.utils.NumberFormatUtils;
+import com.sheep.gamegroup.absBase.BaseActivity;
+import com.sheep.gamegroup.model.entity.BaseMessage;
+import com.sheep.gamegroup.model.entity.DialogConfig;
+import com.sheep.gamegroup.model.entity.PayOrder;
+import com.sheep.gamegroup.model.util.SheepSubscriber;
+import com.sheep.gamegroup.util.ListUtil;
+import com.sheep.gamegroup.util.ViewUtil;
+import com.sheep.jiuyan.samllsheep.BuildConfig;
+import com.sheep.jiuyan.samllsheep.R;
+import com.sheep.jiuyan.samllsheep.SheepApp;
+import com.sheep.jiuyan.samllsheep.utils.G;
+
+import java.util.List;
+import java.util.Locale;
+
+import rx.android.schedulers.AndroidSchedulers;
+import rx.schedulers.Schedulers;
+
+/**
+ * Created by realicing on 2018/10/18.
+ * realicing@sina.com
+ * 支付界面
+ */
+public class ActPay extends BaseActivity{
+
+
+    @Override
+    protected boolean needButterKnife() {
+        return false;
+    }
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.act_pay;
+    }
+
+    private TextView pay_commit;
+    private TextView pay_msg_tv;
+    private TextView pay_info;
+    private TextView pay_amount;
+    private TextView pay_amount2;
+
+    private List<View> payOrderViewList = ListUtil.emptyList();
+    private List<View> successViewList = ListUtil.emptyList();
+    private List<View> failedViewList = ListUtil.emptyList();
+    @Override
+    public void initView() {
+        ImageView title_img_back = findViewById(R.id.title_img_back);
+        pay_commit = findViewById(R.id.pay_commit);
+        TextView title_cancel = findViewById(R.id.title_cancel);
+        pay_msg_tv = findViewById(R.id.pay_msg_tv);
+        View pay_line = findViewById(R.id.pay_line);
+        ImageView pay_sheep_iv = findViewById(R.id.pay_sheep_iv);
+        pay_info = findViewById(R.id.pay_info);
+        pay_amount = findViewById(R.id.pay_amount);
+        pay_amount2 = findViewById(R.id.pay_amount2);
+        TextView pay_success = findViewById(R.id.pay_success);
+        TextView pay_failed = findViewById(R.id.pay_failed);
+        TextView pay_failed_reason = findViewById(R.id.pay_failed_reason);
+        payOrderViewList.add(title_img_back);
+        payOrderViewList.add(title_cancel);
+        payOrderViewList.add(pay_msg_tv);
+        payOrderViewList.add(pay_amount);
+        payOrderViewList.add(pay_line);
+
+        successViewList.add(pay_sheep_iv);
+        successViewList.add(pay_info);
+        successViewList.add(pay_amount2);
+        successViewList.add(pay_success);
+
+        failedViewList.add(pay_sheep_iv);
+        failedViewList.add(pay_info);
+        failedViewList.add(pay_amount2);
+        failedViewList.add(pay_failed);
+        failedViewList.add(pay_failed_reason);
+        setViewListVisible(successViewList, View.INVISIBLE);
+        setViewListVisible(failedViewList, View.INVISIBLE);
+        resetView();
+    }
+    //设置viewList中的view是否可见
+    private void setViewListVisible(List<View> viewList, int visible) {
+        for (View view : viewList) {
+            view.setVisibility(visible);
+        }
+    }
+
+    private void resetView() {
+        ViewUtil.setDefaultText(pay_msg_tv);
+        ViewUtil.setDefaultText(pay_amount);
+    }
+
+    @Override
+    public void initListener() {
+        pay_commit.setEnabled(false);
+    }
+
+    private PayOrder payOrder;
+    private String token;
+
+    @Override
+    public void initData() {
+        Intent intent = getIntent();
+        Bundle bundle = intent.getExtras();
+        String order_no = null;
+        if(bundle != null) {
+            order_no = bundle.getString("order_no");
+            token = bundle.getString("token");
+        }
+        if(TextUtils.isEmpty(token) || TextUtils.isEmpty(order_no)){//传过来的数据有问题
+            status = STATUS_INIT_ERROR;
+            G.showToast(R.string.error_data);
+            return;
+        }
+        if(BuildConfig.DEBUG)
+            G.showToast(String.format(Locale.CHINA, "%s\t%s", order_no, token));
+        //初始化PayOrder
+        SheepApp.getInstance().getNetComponent().getApiService().sdkFindOrder(token, order_no)
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribe(new SheepSubscriber<BaseMessage>(SheepApp.getInstance()) {
+                    @Override
+                    public void onNext(BaseMessage baseMessage) {
+                        payOrder = baseMessage.getData(PayOrder.class);
+                        if (payOrder != null) {
+                            status = STATUS_GET_ORDER_SUCCESS;
+                            pay_commit.setEnabled(true);
+                            loadPayOrder();
+                        } else {
+                            status = STATUS_GET_ORDER_SUCCESS_ERROR;
+                        }
+                    }
+
+                    @Override
+                    public void onError(BaseMessage baseMessage) {
+                        status = STATUS_GET_ORDER_ERROR;
+                        G.showToast(baseMessage);
+                    }
+                });
+    }
+    //加载PayOrder
+    private void loadPayOrder() {
+        ViewUtil.setText(pay_msg_tv, payOrder.getName());
+        String amountText = getString(R.string.x_yuan, NumberFormatUtils.retainMost2(payOrder.getPayMoney()));
+        ViewUtil.setColorMapText(pay_amount, amountText, "元", "#FFFFFF");
+        ViewUtil.setColorMapText(pay_amount2, amountText, "元", "#FFFFFF");
+        ViewUtil.setText(pay_info, getString(R.string.sheep_order_no, payOrder.getName(), payOrder.getOrderNo()));
+    }
+    //点击底部按钮
+    public void onClickBottomBtn(View view) {
+        switch (status) {
+            case STATUS_GET_ORDER_SUCCESS://立即支付
+                SheepApp.getInstance().getNetComponent().getApiService().sdkPayOrder(token, payOrder.getOrderNo())
+                        .subscribeOn(Schedulers.io())
+                        .observeOn(AndroidSchedulers.mainThread())
+                        .subscribe(new SheepSubscriber<BaseMessage>(SheepApp.getInstance()) {
+                            @Override
+                            public void onNext(BaseMessage baseMessage) {
+                                status = STATUS_PAY_ORDER_SUCCESS;
+                                G.showToast(baseMessage);
+                                showPaySuccess();
+                            }
+
+                            @Override
+                            public void onError(BaseMessage baseMessage) {
+                                status = STATUS_PAY_ORDER_ERROR;
+                                G.showToast(baseMessage);
+                                showPayFailed();
+                                failedReason = baseMessage.getMsg();
+                            }
+                        });
+                break;
+            case STATUS_PAY_ORDER_SUCCESS:
+            case STATUS_PAY_ORDER_ERROR://返回商家
+                setStatusResult();
+                finish();
+                break;
+        }
+    }
+    private String failedReason;
+    //点击查看失败原因
+    public void onClickFailedReason(View view) {
+        G.showToast(failedReason);
+    }
+
+    @Override
+    public void onBackPressed() {
+        onClickCancel(null);
+    }
+    private int status = STATUS_INIT;//状态 正常状态大于0 错误状态小于0
+    public static final int STATUS_INIT = 0;//初始状态
+    public static final int STATUS_GET_ORDER_SUCCESS = 1;//获取order成功
+    public static final int STATUS_PAY_ORDER_SUCCESS = 2;//支付order成功
+    public static final int STATUS_GET_ORDER_ERROR = -1;//获取order错误
+    public static final int STATUS_PAY_ORDER_ERROR = -2;//支付order错误
+    public static final int STATUS_INIT_ERROR = -3;//初始化时获取到的order_no或token为空
+    public static final int STATUS_GET_ORDER_SUCCESS_ERROR = -4;//获取order接口成功,但是无数据
+    //点击返回
+    public void onClickBackImg(View view) {
+        onClickCancel(null);
+    }
+
+    //取消订单
+    public void onClickCancel(View view) {
+        if(status == STATUS_PAY_ORDER_SUCCESS || status < STATUS_INIT){//支付成功或者各种失败的情况下直接退出界面
+            setStatusResult();
+            finish();
+            return;
+        }
+        ViewUtil.showMsgDialog(this, new DialogConfig().setTitle("提示").setMsg("您要取消订单吗?")
+                .setBtnRightText("取消").setBtnLeftText("确认").setBtnLeftOnClickListener(new View.OnClickListener() {
+                    @Override
+                    public void onClick(View view) {
+                        setStatusResult();
+                        finish();
+                    }
+                }));
+    }
+    public static final int RESULT_CODE = 666;
+    public static final String EXTRA_NAME_STATUS = "status";
+    //返回结果给sdk
+    private void setStatusResult(){
+        setResult(RESULT_CODE, new Intent().putExtra(EXTRA_NAME_STATUS, status));
+    }
+    //展示支付失败界面
+    private void showPayFailed() {
+        setViewListVisible(payOrderViewList, View.INVISIBLE);
+        setViewListVisible(failedViewList, View.VISIBLE);
+        pay_commit.setText("返回商家");
+    }
+    //展示支付成功界面
+    private void showPaySuccess() {
+        setViewListVisible(payOrderViewList, View.INVISIBLE);
+        setViewListVisible(successViewList, View.VISIBLE);
+        pay_commit.setText("返回商家");
+    }
+}

+ 1 - 1
app/src/main/java/com/sheep/gamegroup/view/activity/SignCardAct.java

@@ -311,7 +311,7 @@ public class SignCardAct extends BaseActivity implements SignCardContract.View {
 
     @RequiresApi(api = Build.VERSION_CODES.ECLAIR)
     private SpannableString getSpannableString(String price) {
-        String text = String.format(getString(R.string.sign_record_money), price);
+        String text = String.format(getString(R.string.x_yuan), price);
         SpannableString spannableString = new SpannableString(text);
         spannableString.setSpan(new AbsoluteSizeSpan(14, true), text.length() - 1, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
         return spannableString;

+ 1 - 1
app/src/main/java/com/sheep/gamegroup/view/activity/SignRecordAct.java

@@ -163,7 +163,7 @@ public class SignRecordAct extends BaseActivity implements SignRecordContract.Vi
 
 
     private SpannableString getSpannableString(String price) {
-        String text = String.format(getString(R.string.sign_record_money),price);
+        String text = String.format(getString(R.string.x_yuan),price);
         SpannableString spannableString = new SpannableString(text);
         spannableString.setSpan(new AbsoluteSizeSpan(14, true), text.length() - 1, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
         return spannableString;

+ 7 - 1
app/src/main/java/com/sheep/gamegroup/view/fragment/FgtExchangeCMCC.java

@@ -76,6 +76,10 @@ public class FgtExchangeCMCC extends BaseFragment implements View.OnClickListene
      */
     private TextView exchange_cmcc_info;
     /**
+     * 积分兑换结果
+     */
+    private TextView exchange_cmcc_result;
+    /**
      * 兑换说明
      */
     private TextView exchange_cmcc_tip;
@@ -127,6 +131,7 @@ public class FgtExchangeCMCC extends BaseFragment implements View.OnClickListene
         setLayoutParamsTop(exchange_cmcc_my_core, 160 / 375.0F);
         setLayoutParamsTop(exchange_cmcc_look, 170 / 375.0F);
         setLayoutParamsTop(exchange_cmcc_num, 180 / 375.0F);
+        exchange_cmcc_result.setOnClickListener(this);
         exchange_cmcc_look.setOnClickListener(this);
         GridLayoutManager layoutManager = new GridLayoutManager(activity, 2);
         exchange_cmcc_list.setLayoutManager(layoutManager);
@@ -179,6 +184,7 @@ public class FgtExchangeCMCC extends BaseFragment implements View.OnClickListene
         exchange_cmcc_list = view.findViewById(R.id.exchange_cmcc_list);
         exchange_cmcc_info = (TextView) view.findViewById(R.id.exchange_cmcc_info);
         exchange_cmcc_tip = (TextView) view.findViewById(R.id.exchange_cmcc_tip);
+        exchange_cmcc_result = (TextView) view.findViewById(R.id.exchange_cmcc_result);
     }
 
     @Override
@@ -190,7 +196,7 @@ public class FgtExchangeCMCC extends BaseFragment implements View.OnClickListene
                 showCMCCLookDialog(activity, new DialogConfig().setParentLayoutId(R.layout.dialog_parent_cmcc).setLayoutId(R.layout.x_msg_dialog_cmcc_look)
                         .setTitle("查询积分"));
                 break;
-            case R.id.exchange_cmcc_info:
+            case R.id.exchange_cmcc_result://查询积分兑换结果
                 ViewUtil.showMsgDialog(activity, new DialogConfig().setParentLayoutId(R.layout.dialog_parent_cmcc).setLayoutId(R.layout.x_msg_dialog_cmcc)
                         .setTitle("确认兑换").setMsg("\n确认是进行兑换吗\n").setBtnLeftText("取消").setBtnRightText("兑换")
                         .setBtnRightOnClickListener(new View.OnClickListener() {

+ 4 - 2
app/src/main/java/com/sheep/gamegroup/view/fragment/FgtPlayGame.java

@@ -339,8 +339,10 @@ public class FgtPlayGame extends BaseFragment {
 
     private boolean isFirst = true;
     private void notifyDataSetChanged() {
-        refresh.finishRefresh();
-        refresh.finishLoadMore();
+        if(refresh != null) {
+            refresh.finishRefresh();
+            refresh.finishLoadMore();
+        }
     }
 
     /**

+ 12 - 6
app/src/main/java/com/sheep/jiuyan/samllsheep/SheepApp.java

@@ -343,19 +343,22 @@ public class SheepApp extends MultiDexApplication {
                 }
                 AppUsageManager.getInstance().needOpenLookAppUsageStatsPermission(true);//尝试保存应用使用情况的数据
                 LogUtil.println("SheepApp onActivityCreated", activity.getClass().getSimpleName(), mActivityCount);
-                UMConfigUtils.Event.SHEEP_CREATED.onEvent();
+                if(!UMConfigUtils.isNotNeedAct(activity))
+                    UMConfigUtils.Event.SHEEP_CREATED.onEvent();
             }
         }
 
         @Override
         public void onActivityStarted(Activity activity) {
             mActivityCount++;
-            UMConfigUtils.onPageStart(activity);
+            if(!UMConfigUtils.isNotNeedAct(activity))
+                UMConfigUtils.onPageStart(activity);
             if (mActivityCount > 0) {
                 if (!notStop) {
                     notStop = true;
                     LogUtil.println("SheepApp onActivityStarted", activity.getClass().getSimpleName(), mActivityCount);
-                    UMConfigUtils.Event.SHEEP_STARTED.onEvent();
+                    if(!UMConfigUtils.isNotNeedAct(activity))
+                        UMConfigUtils.Event.SHEEP_STARTED.onEvent();
                     startService(new Intent(activity, DownloadService.class));
                     Jump2View.getInstance().startListenerShotService(activity);
                     Jump2View.getInstance().startShotScreenFloat(activity, false);
@@ -374,12 +377,14 @@ public class SheepApp extends MultiDexApplication {
         @Override
         public void onActivityStopped(Activity activity) {
             mActivityCount--;
-            UMConfigUtils.onPageEnd(activity);
+            if(!UMConfigUtils.isNotNeedAct(activity))
+                UMConfigUtils.onPageEnd(activity);
             if (mActivityCount <= 0) {
                 if (notStop) {
                     notStop = false;
                     LogUtil.println("SheepApp onActivityStopped", activity.getClass().getSimpleName(), mActivityCount);
-                    UMConfigUtils.Event.SHEEP_STOPPED.onEvent();
+                    if(!UMConfigUtils.isNotNeedAct(activity))
+                        UMConfigUtils.Event.SHEEP_STOPPED.onEvent();
                     Jump2View.getInstance().startShotScreenFloat(activity, true);
                 }
             }
@@ -405,7 +410,8 @@ public class SheepApp extends MultiDexApplication {
                 if (DataUtil.IS_USE_SCREEN_SHOT)
                     stopService(new Intent(SheepApp.this, FloatShotScreenService.class));
                 SpUtils.saveOrder("order", 1);
-                UMConfigUtils.Event.SHEEP_DESTROYED.onEvent();
+                if(!UMConfigUtils.isNotNeedAct(activity))
+                    UMConfigUtils.Event.SHEEP_DESTROYED.onEvent();
             }
             ActivityManager.getInstance().endActivity(activity);
         }

+ 6 - 0
app/src/main/res/drawable/shape_394456_solid_rectangle_10.xml

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

+ 6 - 0
app/src/main/res/drawable/shape_blue_solid_rectangle_18.xml

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

+ 172 - 0
app/src/main/res/layout/act_pay.xml

@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#2A3342"
+    tools:context="com.sheep.gamegroup.view.activity.ActPay">
+
+    <ImageView
+        android:id="@+id/title_img_back"
+        android:layout_width="?attr/actionBarSize"
+        android:layout_height="?attr/actionBarSize"
+        android:onClick="onClickBackImg"
+        android:scaleType="centerInside"
+        android:src="@drawable/narrow_back_white" />
+
+    <TextView
+        android:id="@+id/title_name_tv"
+        android:layout_width="match_parent"
+        android:layout_height="?attr/actionBarSize"
+        android:layout_marginStart="?attr/actionBarSize"
+        android:layout_marginEnd="?attr/actionBarSize"
+        android:gravity="center"
+        android:text="订单确认"
+        android:textColor="#ffffffff"
+        android:textSize="17sp" />
+
+    <TextView
+        android:id="@+id/title_cancel"
+        android:layout_width="?attr/actionBarSize"
+        android:layout_height="?attr/actionBarSize"
+        android:layout_alignParentEnd="true"
+        android:gravity="center"
+        android:onClick="onClickCancel"
+        android:text="取消"
+        android:textColor="#ffffffff"
+        android:textSize="17sp" />
+
+    <View
+        android:id="@+id/title_bottom_line"
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:layout_below="@+id/title_name_tv"
+        android:background="#212936" />
+
+
+    <!--支付页面-->
+    <TextView
+        android:id="@+id/pay_msg_tv"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_below="@+id/title_bottom_line"
+        android:layout_marginStart="12dp"
+        android:layout_marginTop="40dp"
+        android:layout_marginEnd="12dp"
+        android:text="王者荣耀水晶生命药水王者荣耀水晶生命药水王者荣耀水晶生命药水王者荣耀水晶生命药水"
+        android:textColor="#ffffffff"
+        android:textSize="14sp" />
+
+    <View
+        android:id="@+id/pay_line"
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:layout_below="@+id/pay_msg_tv"
+        android:layout_marginTop="40dp"
+        android:background="#212936" />
+
+    <TextView
+        android:id="@+id/pay_amount"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_below="@+id/pay_line"
+        android:layout_marginTop="40dp"
+        android:gravity="center"
+        android:text="@string/x_yuan"
+        android:textColor="#ffffe63c"
+        android:textSize="18sp" />
+    <!--支付页面-->
+
+
+    <!--支付完成-->
+    <ImageView
+        android:id="@+id/pay_sheep_iv"
+        android:layout_width="56dp"
+        android:layout_height="56dp"
+        android:layout_below="@+id/title_bottom_line"
+        android:layout_centerHorizontal="true"
+        android:layout_marginTop="56dp"
+        android:src="@drawable/icon" />
+
+    <TextView
+        android:id="@+id/pay_info"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_below="@+id/pay_sheep_iv"
+        android:layout_marginTop="20dp"
+        android:gravity="center"
+        android:text="@string/sheep_order_no"
+        android:textColor="#ffffffff"
+        android:textSize="14sp" />
+
+    <TextView
+        android:id="@+id/pay_amount2"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_below="@+id/pay_info"
+        android:layout_marginTop="10dp"
+        android:gravity="center"
+        android:text="@string/x_yuan"
+        android:textColor="#ffffe63c"
+        android:textSize="18sp" />
+    <TextView
+        android:id="@+id/pay_success"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_below="@+id/pay_info"
+        android:layout_centerHorizontal="true"
+        android:layout_marginTop="40dp"
+        android:text="支付成功"
+        android:textColor="#ffffffff"
+        android:textSize="18sp" />
+
+    <TextView
+        android:id="@+id/pay_failed"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_below="@+id/pay_info"
+        android:layout_centerHorizontal="true"
+        android:layout_marginTop="40dp"
+        android:text="支付失败"
+        android:textColor="#fff54a43"
+        android:textSize="18sp" />
+
+    <TextView
+        android:id="@+id/pay_failed_reason"
+        android:layout_width="wrap_content"
+        android:layout_height="20dp"
+        android:layout_below="@+id/pay_failed"
+        android:layout_centerHorizontal="true"
+        android:layout_marginTop="7dp"
+        android:background="@drawable/shape_394456_solid_rectangle_10"
+        android:gravity="center"
+        android:paddingStart="10dp"
+        android:paddingEnd="10dp"
+        android:text="查看原因"
+        android:onClick="onClickFailedReason"
+        android:textColor="#ffffffff"
+        android:textSize="12sp" />
+
+
+    <TextView
+        android:id="@+id/pay_commit"
+        android:layout_width="match_parent"
+        android:layout_height="36dp"
+        android:layout_alignParentBottom="true"
+        android:layout_margin="12dp"
+        android:background="@drawable/shape_blue_solid_rectangle_18"
+        android:gravity="center"
+        android:text="立即支付"
+        android:onClick="onClickBottomBtn"
+        android:textColor="#ffffffff"
+        android:textSize="18sp" />
+
+    <View
+        android:id="@+id/pay_line_2"
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:layout_above="@+id/pay_commit"
+        android:layout_marginTop="40dp"
+        android:background="#212936" />
+    <!--<include layout=""-->
+</RelativeLayout>

+ 15 - 3
app/src/main/res/layout/fgt_exchange_cmcc.xml

@@ -18,8 +18,8 @@
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:orientation="vertical"
-            android:background="#fffcd46c">
+            android:background="#fffcd46c"
+            android:orientation="vertical">
 
             <RelativeLayout
                 android:layout_width="match_parent"
@@ -75,11 +75,23 @@
                 android:paddingTop="10dp" />
 
             <TextView
+                android:id="@+id/exchange_cmcc_result"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_horizontal"
+                android:layout_marginTop="20dp"
+                android:background="@mipmap/btn_orange_ww"
+                android:gravity="center"
+                android:text="积分兑换结果"
+                android:textColor="#ffffffff"
+                android:textSize="18sp" />
+
+            <TextView
                 android:id="@+id/exchange_cmcc_tip"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginStart="12dp"
-                android:layout_marginTop="26dp"
+                android:layout_marginTop="12dp"
                 android:text="兑换说明"
                 android:textColor="#ffd38b0e"
                 android:textSize="13sp" />

BIN
app/src/main/res/mipmap-xxhdpi/btn_orange_ww.png


Plik diff jest za duży
+ 2 - 1
app/src/main/res/values/strings.xml