Просмотр исходного кода

安装游戏前检查包名与签名

zengjiebin лет назад: 7
Родитель
Сommit
76c7c069de

+ 162 - 16
app/src/main/java/com/kfzs/duanduan/utils/ApkUtils.java

@@ -11,8 +11,16 @@ import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.net.Uri;
 import android.text.TextUtils;
 import android.text.TextUtils;
 import android.util.Base64;
 import android.util.Base64;
-
+import android.view.View;
+
+import com.sheep.gamegroup.model.entity.ApkFileInfo;
+import com.sheep.gamegroup.model.entity.DialogConfig;
+import com.sheep.gamegroup.util.ActivityManager;
+import com.sheep.gamegroup.util.DataKey;
+import com.sheep.gamegroup.util.DataUtil;
+import com.sheep.gamegroup.util.ViewUtil;
 import com.sheep.jiuyan.samllsheep.SheepApp;
 import com.sheep.jiuyan.samllsheep.SheepApp;
+import com.sheep.jiuyan.samllsheep.utils.G;
 import com.sheep.jiuyan.samllsheep.utils.PackageUtil;
 import com.sheep.jiuyan.samllsheep.utils.PackageUtil;
 
 
 import java.security.MessageDigest;
 import java.security.MessageDigest;
@@ -22,6 +30,13 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map;
 import java.util.UUID;
 import java.util.UUID;
 
 
+import rx.Observable;
+import rx.Subscriber;
+import rx.android.schedulers.AndroidSchedulers;
+import rx.functions.Action1;
+import rx.functions.Func1;
+import rx.schedulers.Schedulers;
+
 /**
 /**
  * apk helper
  * apk helper
  * <p>
  * <p>
@@ -47,6 +62,7 @@ public class ApkUtils {
         installedApkContainer = null;
         installedApkContainer = null;
 
 
     }
     }
+
     private void setInstalledApkContainer() {
     private void setInstalledApkContainer() {
         installedApkContainer = getInstalledApks(SheepApp.getInstance());
         installedApkContainer = getInstalledApks(SheepApp.getInstance());
 
 
@@ -77,22 +93,153 @@ public class ApkUtils {
      * @param context Context
      * @param context Context
      * @param apkPath apkPath
      * @param apkPath apkPath
      */
      */
-    public static final void installApk(Context context, String apkPath) {
-        if(TextUtils.isEmpty(apkPath)){
-//            G.showToast(R.string.unknown_error);
-            return;
+    public static final void installApk(final Context context, final String apkPath) {
+        final ApkFileInfo apkFileInfo = new ApkFileInfo();
+        apkFileInfo.setPath(apkPath);
+        Observable.just(apkFileInfo)
+                .filter(new Func1<ApkFileInfo, Boolean>() {
+                    @Override
+                    public Boolean call(ApkFileInfo item) {
+                        return !TextUtils.isEmpty(item.getPath());
+                    }
+                })
+                .filter(new Func1<ApkFileInfo, Boolean>() {
+                    @Override
+                    public Boolean call(ApkFileInfo item) {
+                        return item.existsPath();
+                    }
+                })
+                .filter(new Func1<ApkFileInfo, Boolean>() {
+                    @Override
+                    public Boolean call(ApkFileInfo item) {
+                        return !TextUtils.isEmpty(item.initPackageNameFromPath(context).getPackageName());
+                    }
+                })
+                .filter(new Func1<ApkFileInfo, Boolean>() {
+                    @Override
+                    public Boolean call(ApkFileInfo item) {
+                        //已经安装且签名的md5相同,文件与安装应用的md5也相同,则过滤掉
+                        return !(item.checkInstall(context) && item.checkApkAndFileSignMd5() && item.checkApkAndFileMd5());
+                    }
+                })
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribe(new Subscriber<ApkFileInfo>() {
+                    private boolean doneNext;
+                    @Override
+                    public void onCompleted() {
+                        if(doneNext)
+                            return;
+                        if(apkFileInfo.isAppInstalled()){//在onNext中未处理且应用已经安装的情况下,直接打开应用
+                            PackageUtil.startApp(context, apkFileInfo.getPackageName());
+                            return;
+                        }
+                        G.showToast("无需安装");
+                    }
+
+                    @Override
+                    public void onError(Throwable e) {
+                        G.showToast(e.getMessage());
+                    }
+
+                    @Override
+                    public void onNext(final ApkFileInfo item) {
+                        doneNext = true;
+                        if (!item.isAppInstalled() || (item.isEqualsSignMd5() && item.isCanInstallVersion())) {
+                            PackageUtil.installApk(context, item.getPath());
+                            DataUtil.putAsString(DataKey.KEY_INSTALL_APK_PACKAGE_NAME, item.getPackageName());
+                        } else {//签名不同,则提示卸载
+                            ViewUtil.showMsgDialog(ActivityManager.getInstance().currentActivity(), new DialogConfig()
+                                    .setTitle("提示").setMsg("需要卸载当前应用才能继续安装,是否继续").setBtnLeftText("不用了")
+                                    .setBtnRightText("继续").setBtnRightOnClickListener(new View.OnClickListener() {
+                                        @Override
+                                        public void onClick(View view) {
+                                            //这里卸载后 没法继续,需要在接收卸载广播的地方进行安装操作
+                                            DataUtil.putAsString(DataKey.KEY_WILL_INSTALL_APK_PATH, item.getPath());
+                                            DataUtil.putAsString(DataKey.KEY_WILL_INSTALL_APK_PACKAGE_NAME, item.getPackageName());
+                                            uninstallApk(SheepApp.getInstance(), item.getPackageName());
+                                        }
+                                    }));
+                        }
+                    }
+                });
+    }
+
+    /**
+     * MD5加密
+     *
+     * @param byteStr 需要加密的内容
+     * @return 返回 byteStr的md5值
+     */
+    public static String encryptionMD5(byte[] byteStr) {
+        MessageDigest messageDigest;
+        StringBuilder md5Sb = new StringBuilder();
+        try {
+            messageDigest = MessageDigest.getInstance("MD5");
+            messageDigest.reset();
+            messageDigest.update(byteStr);
+            byte[] byteArray = messageDigest.digest();
+//            return Base64.encodeToString(byteArray,Base64.NO_WRAP);
+            for (int i = 0; i < byteArray.length; i++) {
+                if (Integer.toHexString(0xFF & byteArray[i]).length() == 1) {
+                    md5Sb.append("0").append(Integer.toHexString(0xFF & byteArray[i]));
+                } else {
+                    md5Sb.append(Integer.toHexString(0xFF & byteArray[i]));
+                }
+            }
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
         }
         }
+        return md5Sb.toString();
+    }
 
 
-        PackageUtil.installApk(context, apkPath);
+    /**
+     * 获取app签名md5值
+     */
+    public static String getApkSignMd5StrByPackageName(String packageName, Action1<PackageInfo> action1) {
+        try {
+            PackageInfo packageInfo = SheepApp.getInstance().getPackageManager().getPackageInfo(
+                    packageName, PackageManager.GET_ACTIVITIES | PackageManager.GET_SIGNATURES);
+            Signature[] signs = packageInfo.signatures;
+            Signature sign = signs[0];
+            String signStr = encryptionMD5(sign.toByteArray());
+            if (action1 != null)
+                action1.call(packageInfo);
+            return signStr;
+        } catch (PackageManager.NameNotFoundException e) {
+            e.printStackTrace();
+        } catch (Exception e2) {
+            e2.printStackTrace();
+        }
+        return "";
+    }
 
 
-        /*
-          设置包名
-         */
-        SheepApp.getInstance()
-                .setPackgeName(
-                        getUnInstallApkPackageName(context, apkPath));
+    /**
+     * 获取未安装app签名md5值
+     */
+    public static String getApkSignMd5StrByPath(String apkPath, Action1<PackageInfo> action1) {
+        try {
+            PackageInfo packageInfo = SheepApp.getInstance().getPackageManager().getPackageArchiveInfo(
+                    apkPath, PackageManager.GET_ACTIVITIES | PackageManager.GET_SIGNATURES);
+            Signature[] signs = packageInfo.signatures;
+            Signature sign = signs[0];
+            String signStr = encryptionMD5(sign.toByteArray());
+            if (action1 != null)
+                action1.call(packageInfo);
+            return signStr;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return "";
     }
     }
 
 
+    /* 卸载apk */
+    public static void uninstallApk(Context context, String packageName) {
+        Uri uri = Uri.parse("package:" + packageName);
+        Intent intent = new Intent(Intent.ACTION_DELETE, uri);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        context.startActivity(intent);
+    }
 
 
     /**
     /**
      * get alll installed apks
      * get alll installed apks
@@ -116,8 +263,6 @@ public class ApkUtils {
     }
     }
 
 
 
 
-
-
     /**
     /**
      * Open a application by packagename
      * Open a application by packagename
      *
      *
@@ -179,7 +324,7 @@ public class ApkUtils {
             setInstalledApkContainer();
             setInstalledApkContainer();
         }
         }
         PackageInfo pkg = installedApkContainer.get(packageName);
         PackageInfo pkg = installedApkContainer.get(packageName);
-        if(null == pkg){
+        if (null == pkg) {
             return EQUALS;
             return EQUALS;
         }
         }
         if (pkg.versionCode == versionCode) {
         if (pkg.versionCode == versionCode) {
@@ -286,6 +431,7 @@ public class ApkUtils {
             return "0.0.0";
             return "0.0.0";
         }
         }
     }
     }
+
     public static PackageInfo getPackageInfo(String packageName) {
     public static PackageInfo getPackageInfo(String packageName) {
         try {
         try {
             PackageManager pm = SheepApp.getInstance().getPackageManager();
             PackageManager pm = SheepApp.getInstance().getPackageManager();
@@ -308,7 +454,7 @@ public class ApkUtils {
     }
     }
 
 
 
 
-    public static void invokeBroswer(Context context ,String targetUrl){
+    public static void invokeBroswer(Context context, String targetUrl) {
         Uri uri = Uri.parse(targetUrl);
         Uri uri = Uri.parse(targetUrl);
         Intent intent = new Intent(Intent.ACTION_VIEW);
         Intent intent = new Intent(Intent.ACTION_VIEW);
         intent.setData(uri);
         intent.setData(uri);

+ 92 - 0
app/src/main/java/com/sheep/gamegroup/model/entity/ApkFileInfo.java

@@ -0,0 +1,92 @@
+package com.sheep.gamegroup.model.entity;
+
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.text.TextUtils;
+
+import com.kfzs.duanduan.utils.ApkUtils;
+import com.sheep.gamegroup.util.Md5Util;
+import com.sheep.jiuyan.samllsheep.utils.PackageUtil;
+
+import java.io.File;
+
+import rx.functions.Action1;
+
+/**
+ * Created by realicing on 2018/11/9.
+ * realicing@sina.com
+ * 根据安装包获取相关信息,以下方法顺序执行,否则可能会报各种空指针
+ */
+public class ApkFileInfo {
+    private String path;
+
+    public String getPath() {
+        return path;
+    }
+
+    public void setPath(String path) {
+        this.path = path;
+    }
+
+    private File file;
+    public boolean existsPath() {
+        file = new File(path);
+        return file.exists();
+    }
+
+    private String packageName;
+    public ApkFileInfo initPackageNameFromPath(Context context) {
+        packageName = ApkUtils.getUnInstallApkPackageName(context, path);
+        return this;
+    }
+
+    public String getPackageName() {
+        return packageName;
+    }
+
+    private boolean isAppInstalled;
+    public boolean checkInstall(Context context) {
+        isAppInstalled = PackageUtil.isAppInstalled(context, packageName);
+        return isAppInstalled;
+    }
+
+    public boolean isAppInstalled() {
+        return isAppInstalled;
+    }
+    //是否 文件与安装的应用是否m签名d5相同
+    private boolean isEqualsSignMd5;
+
+    public boolean isEqualsSignMd5() {
+        return isEqualsSignMd5;
+    }
+
+    private PackageInfo appPackageInfo;
+    private PackageInfo filePackageInfo;
+    //检查文件与安装的应用是否m签名d5相同
+    public boolean checkApkAndFileSignMd5() {
+        String appSignMd5 = ApkUtils.getApkSignMd5StrByPackageName(packageName, new Action1<PackageInfo>() {
+            @Override
+            public void call(PackageInfo packageInfo) {
+                appPackageInfo = packageInfo;
+            }
+        });
+
+        String fileSignMd5 = ApkUtils.getApkSignMd5StrByPath(path, new Action1<PackageInfo>() {
+            @Override
+            public void call(PackageInfo packageInfo) {
+                filePackageInfo = packageInfo;
+            }
+        });
+        isEqualsSignMd5 = TextUtils.equals(fileSignMd5, appSignMd5);
+        return isEqualsSignMd5;
+    }
+    //检查文件与安装的应用是否md5相同
+    public boolean checkApkAndFileMd5() {
+        return Md5Util.checkMD5(new File(appPackageInfo.applicationInfo.sourceDir), file);
+    }
+
+    //根据版本号判断是否可安装成功
+    public boolean isCanInstallVersion() {
+        return appPackageInfo.versionCode <= filePackageInfo.versionCode;
+    }
+}

+ 13 - 6
app/src/main/java/com/sheep/gamegroup/model/entity/HomePageSearch.java

@@ -7,18 +7,17 @@ import com.sheep.gamegroup.absBase.IHomePageSearch;
  * realicing@sina.com
  * realicing@sina.com
  * 搜索结果
  * 搜索结果
  * <p>
  * <p>
- * content:	string
- * 内容
- * link_id:	integer ($int64)
- * 关联id
- * link_type:	integer ($int64)
- * 关联类型 1任务 2游戏
+ * content:	string 内容
+ * link_id:	integer ($int64) 关联id
+ * link_type:	integer ($int64) 关联类型 1任务 2游戏
  * title:	string
  * title:	string
+ * bonus:	string 任务奖金
  * 标题
  * 标题
  */
  */
 public class HomePageSearch implements IHomePageSearch {
 public class HomePageSearch implements IHomePageSearch {
     private String content;
     private String content;
     private String title;
     private String title;
+    private String bonus;
     private int link_id;
     private int link_id;
     private int link_type;
     private int link_type;
 
 
@@ -53,4 +52,12 @@ public class HomePageSearch implements IHomePageSearch {
     public void setLink_type(int link_type) {
     public void setLink_type(int link_type) {
         this.link_type = link_type;
         this.link_type = link_type;
     }
     }
+
+    public String getBonus() {
+        return bonus;
+    }
+
+    public void setBonus(String bonus) {
+        this.bonus = bonus;
+    }
 }
 }

+ 32 - 8
app/src/main/java/com/sheep/gamegroup/receiver/AppAddOrDelReceiver.java

@@ -8,6 +8,8 @@ import android.os.Looper;
 import android.text.TextUtils;
 import android.text.TextUtils;
 
 
 import com.kfzs.duanduan.utils.ApkUtils;
 import com.kfzs.duanduan.utils.ApkUtils;
+import com.sheep.gamegroup.util.DataKey;
+import com.sheep.gamegroup.util.DataUtil;
 import com.sheep.jiuyan.samllsheep.SheepApp;
 import com.sheep.jiuyan.samllsheep.SheepApp;
 import com.sheep.jiuyan.samllsheep.utils.G;
 import com.sheep.jiuyan.samllsheep.utils.G;
 
 
@@ -21,7 +23,25 @@ import org.greenrobot.eventbus.EventBus;
 public class AppAddOrDelReceiver extends BroadcastReceiver {
 public class AppAddOrDelReceiver extends BroadcastReceiver {
     @Override
     @Override
     public void onReceive(final Context context, final Intent intent) {
     public void onReceive(final Context context, final Intent intent) {
-        if(Intent.ACTION_PACKAGE_ADDED.equals(intent.getAction()) || Intent.ACTION_PACKAGE_REMOVED.equals(intent.getAction()) || Intent.ACTION_PACKAGE_REPLACED.equals(intent.getAction())){
+        String action = intent.getAction();
+        if(action == null)
+            return;
+        switch (action){
+            case Intent.ACTION_PACKAGE_REMOVED://卸载的监听
+                String willInstallApkPackageName = DataUtil.getAsString(DataKey.KEY_WILL_INSTALL_APK_PACKAGE_NAME, null);
+                if(!TextUtils.isEmpty(willInstallApkPackageName) && TextUtils.equals(getPackageName(intent), willInstallApkPackageName)){
+                    String willInstallApkPath = DataUtil.getAsString(DataKey.KEY_WILL_INSTALL_APK_PATH, null);
+                    if(!TextUtils.isEmpty(willInstallApkPath)){
+                        //清除掉记录
+                        DataUtil.putAsString(DataKey.KEY_WILL_INSTALL_APK_PATH, "");
+                        DataUtil.putAsString(DataKey.KEY_WILL_INSTALL_APK_PACKAGE_NAME, "");
+                        //重新安装
+                        ApkUtils.installApk(SheepApp.getInstance(), willInstallApkPath);
+                    }
+                }
+                break;
+        }
+        if(Intent.ACTION_PACKAGE_ADDED.equals(action) || Intent.ACTION_PACKAGE_REMOVED.equals(action) || Intent.ACTION_PACKAGE_REPLACED.equals(action)){
             ApkUtils.getInstance().clear();
             ApkUtils.getInstance().clear();
             EventBus.getDefault().post(intent);
             EventBus.getDefault().post(intent);
         }
         }
@@ -29,17 +49,13 @@ public class AppAddOrDelReceiver extends BroadcastReceiver {
         /*
         /*
           安装失败
           安装失败
          */
          */
-        if(Intent.ACTION_INSTALL_FAILURE.equals(intent.getAction())){
+        if(Intent.ACTION_INSTALL_FAILURE.equals(action)){
             try {
             try {
                 new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
                 new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
                     @Override
                     @Override
                     public void run() {
                     public void run() {
-                        String dataString = intent.getDataString();
-                        if(TextUtils.isEmpty(dataString)){
-                            return;
-                        }
-                        String packages = dataString.replace("package:","");
-                        if(packages.equals(SheepApp.getInstance().getPackgeName()+"")){
+                        String cachePackageName = DataUtil.getAsString(DataKey.KEY_INSTALL_APK_PACKAGE_NAME, "");
+                        if(TextUtils.equals(getPackageName(intent), cachePackageName)){
                             G.showToast("安装失败,请检查是否空间不足或其他问题!");
                             G.showToast("安装失败,请检查是否空间不足或其他问题!");
                         }
                         }
                     }
                     }
@@ -50,4 +66,12 @@ public class AppAddOrDelReceiver extends BroadcastReceiver {
         }
         }
     }
     }
 
 
+    private String getPackageName(Intent intent) {
+        String dataString = intent.getDataString();
+        if(!TextUtils.isEmpty(dataString)){
+            return dataString.replace("package:","");
+        }
+        return dataString;
+    }
+
 }
 }

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

@@ -2568,7 +2568,7 @@ public class CommonUtil {
      * 抢任务
      * 抢任务
      */
      */
     public void robTask(final Action1<RobTask> action1) {
     public void robTask(final Action1<RobTask> action1) {
-        SheepApp.getInstance().getNetComponent().getApiService().getNewTask(SheepApp.getInstance().getOrder())
+        SheepApp.getInstance().getNetComponent().getApiService().getNewTask(DataUtil.getAsInt(DataKey.KEY_ORDER, 1))
                 .subscribeOn(Schedulers.io())
                 .subscribeOn(Schedulers.io())
                 .observeOn(AndroidSchedulers.mainThread())
                 .observeOn(AndroidSchedulers.mainThread())
                 .subscribe(new SheepSubscriber<BaseMessage>(SheepApp.getInstance()) {
                 .subscribe(new SheepSubscriber<BaseMessage>(SheepApp.getInstance()) {

+ 16 - 0
app/src/main/java/com/sheep/gamegroup/util/DataKey.java

@@ -0,0 +1,16 @@
+package com.sheep.gamegroup.util;
+
+/**
+ * Created by realicing on 2018/11/8.
+ * realicing@sina.com
+ */
+public class DataKey {
+    //安装应用时的包名
+    public static final String KEY_INSTALL_APK_PACKAGE_NAME = "installApk_packageName";
+    //抢任务时有个次序,从1开始
+    public static final String KEY_ORDER = "snatch_a_task_order";
+    //将要安装的应用的路径,在接收广播的地方进行监听
+    public static final String KEY_WILL_INSTALL_APK_PATH = "will_install_apk_path";
+    //将要安装的应用的包名,在接收广播的地方进行监听
+    public static final String KEY_WILL_INSTALL_APK_PACKAGE_NAME = "will_install_apk_package_name";
+}

+ 22 - 0
app/src/main/java/com/sheep/gamegroup/util/Md5Util.java

@@ -1,6 +1,7 @@
 package com.sheep.gamegroup.util;
 package com.sheep.gamegroup.util;
 
 
 import android.text.TextUtils;
 import android.text.TextUtils;
+import android.util.Log;
 
 
 import java.io.File;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileInputStream;
@@ -62,6 +63,27 @@ public class Md5Util {
     /**
     /**
      * 校验文件MD5码
      * 校验文件MD5码
      */
      */
+    public static boolean checkMD5(File firstFile, File updateFile) {
+        if (firstFile == null || updateFile == null) {
+            Log.e(TAG, "MD5 string empty or updateFile null");
+            return false;
+        }
+
+        String firstCalculatedDigest = getFileMD5(firstFile);
+        String calculatedDigest = getFileMD5(updateFile);
+        if (firstCalculatedDigest == null) {
+            Log.e(TAG, "firstCalculatedDigest null");
+            return false;
+        }
+        if (calculatedDigest == null) {
+            Log.e(TAG, "calculatedDigest null");
+            return false;
+        }
+        return calculatedDigest.equalsIgnoreCase(firstCalculatedDigest);
+    }
+    /**
+     * 校验文件MD5码
+     */
     public static boolean checkMD5(String md5, File updateFile) {
     public static boolean checkMD5(String md5, File updateFile) {
         if (TextUtils.isEmpty(md5) || updateFile == null) {
         if (TextUtils.isEmpty(md5) || updateFile == null) {
 //            ALog.e(TAG, "MD5 string empty or updateFile null");
 //            ALog.e(TAG, "MD5 string empty or updateFile null");

+ 13 - 2
app/src/main/java/com/sheep/gamegroup/util/TestUtil.java

@@ -6,7 +6,6 @@ import android.app.NotificationChannel;
 import android.app.NotificationManager;
 import android.app.NotificationManager;
 import android.content.DialogInterface;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.Intent;
-import android.net.Uri;
 import android.os.Build;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.Bundle;
 import android.support.v4.app.NotificationCompat;
 import android.support.v4.app.NotificationCompat;
@@ -21,6 +20,7 @@ import android.widget.TextView;
 
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSON;
 import com.bumptech.glide.Glide;
 import com.bumptech.glide.Glide;
+import com.kfzs.duanduan.utils.ApkUtils;
 import com.kfzs.duanduan.view.DialogStorageLow;
 import com.kfzs.duanduan.view.DialogStorageLow;
 import com.sheep.gamegroup.model.entity.BaseMessage;
 import com.sheep.gamegroup.model.entity.BaseMessage;
 import com.sheep.gamegroup.model.entity.CreditCard;
 import com.sheep.gamegroup.model.entity.CreditCard;
@@ -45,11 +45,11 @@ import com.sheep.gamegroup.view.dialog.DialogShare;
 import com.sheep.jiuyan.samllsheep.BuildConfig;
 import com.sheep.jiuyan.samllsheep.BuildConfig;
 import com.sheep.jiuyan.samllsheep.R;
 import com.sheep.jiuyan.samllsheep.R;
 import com.sheep.jiuyan.samllsheep.SheepApp;
 import com.sheep.jiuyan.samllsheep.SheepApp;
+import com.sheep.jiuyan.samllsheep.utils.ClassFileHelper;
 import com.sheep.jiuyan.samllsheep.utils.DeviceUtils;
 import com.sheep.jiuyan.samllsheep.utils.DeviceUtils;
 import com.sheep.jiuyan.samllsheep.utils.G;
 import com.sheep.jiuyan.samllsheep.utils.G;
 import com.sheep.jiuyan.samllsheep.utils.PackageUtil;
 import com.sheep.jiuyan.samllsheep.utils.PackageUtil;
 import com.sheep.jiuyan.samllsheep.utils.SpUtils;
 import com.sheep.jiuyan.samllsheep.utils.SpUtils;
-import com.umeng.commonsdk.debug.I;
 import com.umeng.socialize.ShareAction;
 import com.umeng.socialize.ShareAction;
 import com.umeng.socialize.UMShareListener;
 import com.umeng.socialize.UMShareListener;
 import com.umeng.socialize.bean.SHARE_MEDIA;
 import com.umeng.socialize.bean.SHARE_MEDIA;
@@ -225,6 +225,7 @@ public class TestUtil {
      */
      */
     public static void test(final Activity activity) {
     public static void test(final Activity activity) {
         final String[] items = {"复制token","复制打点数据","从jenkins下载小绵羊安装包","测试表情包",
         final String[] items = {"复制token","复制打点数据","从jenkins下载小绵羊安装包","测试表情包",
+                "测试签名1","测试签名2",
                 "跳转QQ1","跳转QQ2","跳转QQ3","跳转白白QQ","龙猫竞猜","龙猫竞猜-scheme",
                 "跳转QQ1","跳转QQ2","跳转QQ3","跳转白白QQ","龙猫竞猜","龙猫竞猜-scheme",
                 "有米科技测试","有米科技","手机型号测试","测试通知栏", "测试自定义通知栏","测试自定义通知栏2",
                 "有米科技测试","有米科技","手机型号测试","测试通知栏", "测试自定义通知栏","测试自定义通知栏2",
                 "开启通知栏权限0","开启通知栏权限1","开启通知栏权限2","开启通知栏权限3",
                 "开启通知栏权限0","开启通知栏权限1","开启通知栏权限2","开启通知栏权限3",
@@ -242,6 +243,12 @@ public class TestUtil {
                     @Override
                     @Override
                     public void onClick(DialogInterface dialog, int which) {
                     public void onClick(DialogInterface dialog, int which) {
                         switch (items[which]) {
                         switch (items[which]) {
+                            case "测试签名1":
+                                LogUtil.println("测试签名", ApkUtils.getApkSignMd5StrByPackageName("com.realicing.android.upgrade.sheep", null));
+                                break;
+                            case "测试签名2":
+                                testApkSign2();
+                                break;
                             case "跳转QQ1":
                             case "跳转QQ1":
                                 QQUtil.skip1(activity, "532588232");
                                 QQUtil.skip1(activity, "532588232");
                                 break;
                                 break;
@@ -547,6 +554,10 @@ public class TestUtil {
         dialog.show();
         dialog.show();
     }
     }
 
 
+    private static void testApkSign2() {
+        LogUtil.println("测试签名", ApkUtils.getApkSignMd5StrByPath(new File(ClassFileHelper.DIR, "559E2C4A81182E2674570B4AE3C9C440.apk").getAbsolutePath(), null));
+    }
+
     //测试表情包
     //测试表情包
     private static void testExpression(Activity activity) {
     private static void testExpression(Activity activity) {
         activity.startActivity(new Intent(activity, ActTestExpression.class));
         activity.startActivity(new Intent(activity, ActTestExpression.class));

+ 6 - 8
app/src/main/java/com/sheep/gamegroup/util/ViewUtil.java

@@ -243,8 +243,7 @@ public class ViewUtil {
                 if (robTask != null) {
                 if (robTask != null) {
                     try {
                     try {
                         mRobTask = robTask;
                         mRobTask = robTask;
-                        SpUtils.saveOrder("order", mRobTask.getOrder());
-                        SheepApp.getInstance().setOrder(mRobTask.getOrder());
+                        DataUtil.putAsInt(DataKey.KEY_ORDER, robTask.getOrder());
                         tvDutyMoney.setText("+" + mRobTask.getM().getBonus() + "元");//设置任务奖励金额
                         tvDutyMoney.setText("+" + mRobTask.getM().getBonus() + "元");//设置任务奖励金额
                         tvTitel.setText(mRobTask.getM().getName() + "");//设置任务名字--getTask().getTask_name()
                         tvTitel.setText(mRobTask.getM().getName() + "");//设置任务名字--getTask().getTask_name()
                         GlideImageLoader.setImage(ivIcon, mRobTask.getM().getTask().getIcon());//设置任务图标
                         GlideImageLoader.setImage(ivIcon, mRobTask.getM().getTask().getIcon());//设置任务图标
@@ -277,12 +276,11 @@ public class ViewUtil {
         final TextView dialog_amount_tv = view.findViewById(R.id.dialog_amount_tv);
         final TextView dialog_amount_tv = view.findViewById(R.id.dialog_amount_tv);
         ViewUtil.setDefaultText(dialog_name_tv);
         ViewUtil.setDefaultText(dialog_name_tv);
         ViewUtil.setDefaultText(dialog_amount_tv);
         ViewUtil.setDefaultText(dialog_amount_tv);
-        if (robTask != null) {
+        if (robTask != null && mRobTask.getM() != null) {
             mRobTask = robTask;
             mRobTask = robTask;
-            SpUtils.saveOrder("order", mRobTask.getOrder());
-            SheepApp.getInstance().setOrder(mRobTask.getOrder());
-            dialog_amount_tv.setText("+" + mRobTask.getM().getBonus() + "元");//设置任务奖励金额
-            dialog_name_tv.setText(mRobTask.getM().getName() + "");//设置任务名字--getTask().getTask_name()
+            DataUtil.putAsInt(DataKey.KEY_ORDER, robTask.getOrder());
+            ViewUtil.setText(dialog_amount_tv, String.format(Locale.CHINA, "+%s元", mRobTask.getM().getBonus()));//设置任务奖励金额
+            ViewUtil.setText(dialog_name_tv, mRobTask.getM().getName());//设置任务名字--getTask().getTask_name()
             GlideImageLoader.setImage(dialog_iv, mRobTask.getM().getTask().getIcon());//设置任务图标
             GlideImageLoader.setImage(dialog_iv, mRobTask.getM().getTask().getIcon());//设置任务图标
         } else {
         } else {
             mRobTask = getTask(dialog_iv, dialog_name_tv, dialog_amount_tv);
             mRobTask = getTask(dialog_iv, dialog_name_tv, dialog_amount_tv);
@@ -323,7 +321,7 @@ public class ViewUtil {
         mAlertDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
         mAlertDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
             @Override
             @Override
             public void onDismiss(DialogInterface dialogInterface) {
             public void onDismiss(DialogInterface dialogInterface) {
-                SheepApp.getInstance().setOrder(1);
+                DataUtil.putAsInt(DataKey.KEY_ORDER, 1);
                 if (mActivity instanceof ActMain && DataUtil.getAsBoolean("tryShowHalfScreenAd", false)) {
                 if (mActivity instanceof ActMain && DataUtil.getAsBoolean("tryShowHalfScreenAd", false)) {
                     DataUtil.putAsBoolean("tryShowHalfScreenAd", false);
                     DataUtil.putAsBoolean("tryShowHalfScreenAd", false);
                     Jump2View.getInstance().tryShowHalfScreenAd(mActivity, ((ActMain) mActivity).getContainer());
                     Jump2View.getInstance().tryShowHalfScreenAd(mActivity, ((ActMain) mActivity).getContainer());

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

@@ -9,6 +9,8 @@ import com.kfzs.duanduan.utils.ApkUtils;
 import com.sheep.gamegroup.absBase.BaseActivity;
 import com.sheep.gamegroup.absBase.BaseActivity;
 import com.sheep.gamegroup.model.entity.DialogConfig;
 import com.sheep.gamegroup.model.entity.DialogConfig;
 import com.sheep.gamegroup.util.CommonUtil;
 import com.sheep.gamegroup.util.CommonUtil;
+import com.sheep.gamegroup.util.DataKey;
+import com.sheep.gamegroup.util.DataUtil;
 import com.sheep.gamegroup.util.Jump2View;
 import com.sheep.gamegroup.util.Jump2View;
 import com.sheep.gamegroup.util.SysAppUtil;
 import com.sheep.gamegroup.util.SysAppUtil;
 import com.sheep.gamegroup.util.ViewUtil;
 import com.sheep.gamegroup.util.ViewUtil;
@@ -73,7 +75,7 @@ public class ActSetting extends BaseActivity {
                                 SysAppUtil.clearCache(new Action1<Object>() {
                                 SysAppUtil.clearCache(new Action1<Object>() {
                                     @Override
                                     @Override
                                     public void call(Object o) {
                                     public void call(Object o) {
-                                        SheepApp.getInstance().setOrder(1);
+                                        DataUtil.putAsInt(DataKey.KEY_ORDER, 1);
                                         G.showToast("清理缓存完成");
                                         G.showToast("清理缓存完成");
                                         initCacheSize();
                                         initCacheSize();
                                     }
                                     }

+ 19 - 0
app/src/main/java/com/sheep/gamegroup/view/adapter/PlayGameItemAdapter.java

@@ -7,13 +7,18 @@ import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 import android.widget.TextView;
 
 
+import com.sheep.gamegroup.greendao.download.DownLoadInfo;
+import com.sheep.gamegroup.model.api.IDownload;
 import com.sheep.gamegroup.model.entity.GameEntity;
 import com.sheep.gamegroup.model.entity.GameEntity;
 import com.sheep.gamegroup.util.CommonUtil;
 import com.sheep.gamegroup.util.CommonUtil;
+import com.sheep.gamegroup.util.DownloadUtil;
 import com.sheep.gamegroup.util.GlideImageLoader;
 import com.sheep.gamegroup.util.GlideImageLoader;
 import com.sheep.gamegroup.util.Jump2View;
 import com.sheep.gamegroup.util.Jump2View;
+import com.sheep.gamegroup.util.TestUtil;
 import com.sheep.gamegroup.util.ViewHolder;
 import com.sheep.gamegroup.util.ViewHolder;
 import com.sheep.gamegroup.util.ViewUtil;
 import com.sheep.gamegroup.util.ViewUtil;
 import com.sheep.jiuyan.samllsheep.R;
 import com.sheep.jiuyan.samllsheep.R;
+import com.sheep.jiuyan.samllsheep.utils.G;
 
 
 import java.util.List;
 import java.util.List;
 
 
@@ -41,6 +46,20 @@ public class PlayGameItemAdapter extends AdbCommonRecycler<GameEntity>{
                 Jump2View.getInstance().goPlayGameDetail((Activity) activity, gameEntity.getApp().getId());
                 Jump2View.getInstance().goPlayGameDetail((Activity) activity, gameEntity.getApp().getId());
             }
             }
         });
         });
+        if(TestUtil.isDev())
+            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
+                @Override
+                public boolean onLongClick(View view) {
+                    IDownload download = gameEntity.getDownload();
+                    DownloadUtil downloadUtil = new DownloadUtil(activity);
+                    final DownLoadInfo downLoadInfo = downloadUtil.getDownloadTaskByUrl(download);
+                    downloadUtil.delete(downLoadInfo);
+                    downloadUtil.start(downloadUtil.getDownloadTaskByUrl(download));
+                    downloadUtil.setDownloadTaskStatus(download.getDownload_link(), DownloadUtil.STATUS_INIT);
+                    G.showToast("游戏下载开始");
+                    return true;
+                }
+            });
         View item_download_welfare_line = holder.itemView.findViewById(R.id.line_tv);
         View item_download_welfare_line = holder.itemView.findViewById(R.id.line_tv);
         TextView detail_task_tv_center = holder.itemView.findViewById(R.id.detail_task_tv_center);
         TextView detail_task_tv_center = holder.itemView.findViewById(R.id.detail_task_tv_center);
         TextView item_name_tv = holder.itemView.findViewById(R.id.item_name_tv);
         TextView item_name_tv = holder.itemView.findViewById(R.id.item_name_tv);

+ 2 - 1
app/src/main/java/com/sheep/gamegroup/view/dialog/DialogGameOrTaskOrGift.java

@@ -17,6 +17,7 @@ import com.sheep.gamegroup.model.entity.GiftBagApp;
 import com.sheep.gamegroup.model.entity.RobTask;
 import com.sheep.gamegroup.model.entity.RobTask;
 import com.sheep.gamegroup.model.util.SheepSubscriber;
 import com.sheep.gamegroup.model.util.SheepSubscriber;
 import com.sheep.gamegroup.util.CommonUtil;
 import com.sheep.gamegroup.util.CommonUtil;
+import com.sheep.gamegroup.util.DataKey;
 import com.sheep.gamegroup.util.DataUtil;
 import com.sheep.gamegroup.util.DataUtil;
 import com.sheep.gamegroup.util.GlideImageLoader;
 import com.sheep.gamegroup.util.GlideImageLoader;
 import com.sheep.gamegroup.util.Jump2View;
 import com.sheep.gamegroup.util.Jump2View;
@@ -321,7 +322,7 @@ public class DialogGameOrTaskOrGift {
             @Override
             @Override
             public void call(RobTask robTask) {
             public void call(RobTask robTask) {
                 if (robTask != null) {
                 if (robTask != null) {
-                    SheepApp.getInstance().setOrder(robTask.getOrder());
+                    DataUtil.putAsInt(DataKey.KEY_ORDER, robTask.getOrder());
                     ViewUtil.newInstance().showRobDutyDialog(activity, robTask);
                     ViewUtil.newInstance().showRobDutyDialog(activity, robTask);
                 } else {
                 } else {
                     G.showToast("任务已被抢光!请实时关注任务发布!");
                     G.showToast("任务已被抢光!请实时关注任务发布!");

+ 2 - 1
app/src/main/java/com/sheep/gamegroup/view/fragment/FgtSmallSheep.java

@@ -72,6 +72,7 @@ import com.sheep.gamegroup.presenter.TryMakeMoneyContract;
 import com.sheep.gamegroup.presenter.TryMakeMoneyPresenter;
 import com.sheep.gamegroup.presenter.TryMakeMoneyPresenter;
 import com.sheep.gamegroup.util.CommonUtil;
 import com.sheep.gamegroup.util.CommonUtil;
 import com.sheep.gamegroup.util.ConfigUtil;
 import com.sheep.gamegroup.util.ConfigUtil;
+import com.sheep.gamegroup.util.DataKey;
 import com.sheep.gamegroup.util.DataUtil;
 import com.sheep.gamegroup.util.DataUtil;
 import com.sheep.gamegroup.util.GlideImageLoader;
 import com.sheep.gamegroup.util.GlideImageLoader;
 import com.sheep.gamegroup.util.Jump2View;
 import com.sheep.gamegroup.util.Jump2View;
@@ -1055,7 +1056,7 @@ public class FgtSmallSheep extends BaseFragment implements SmallSheepContract.Vi
                     @Override
                     @Override
                     public void call(RobTask robTask) {
                     public void call(RobTask robTask) {
                         if (robTask != null) {
                         if (robTask != null) {
-                            SheepApp.getInstance().setOrder(robTask.getOrder());
+                            DataUtil.putAsInt(DataKey.KEY_ORDER, robTask.getOrder());
                             try {
                             try {
                                 ViewUtil.newInstance().showRobDutyDialog(activity, robTask);
                                 ViewUtil.newInstance().showRobDutyDialog(activity, robTask);
                             } catch (Exception e) {
                             } catch (Exception e) {

+ 2 - 19
app/src/main/java/com/sheep/jiuyan/samllsheep/SheepApp.java

@@ -32,6 +32,7 @@ import com.sheep.gamegroup.util.CertificationUtil;
 import com.sheep.gamegroup.util.ChannelContent;
 import com.sheep.gamegroup.util.ChannelContent;
 import com.sheep.gamegroup.util.ConfigUtil;
 import com.sheep.gamegroup.util.ConfigUtil;
 import com.sheep.gamegroup.util.ConnectAddress;
 import com.sheep.gamegroup.util.ConnectAddress;
+import com.sheep.gamegroup.util.DataKey;
 import com.sheep.gamegroup.util.DataUtil;
 import com.sheep.gamegroup.util.DataUtil;
 import com.sheep.gamegroup.util.Jump2View;
 import com.sheep.gamegroup.util.Jump2View;
 import com.sheep.gamegroup.util.LogUtil;
 import com.sheep.gamegroup.util.LogUtil;
@@ -70,22 +71,12 @@ public class SheepApp extends MultiDexApplication {
 
 
     private NetComponent netComponent;
     private NetComponent netComponent;
     private boolean isShowQB;
     private boolean isShowQB;
-    private String packgeName;
     private boolean isInitMidong = false;
     private boolean isInitMidong = false;
     private boolean isShowMidong = false;
     private boolean isShowMidong = false;
     private int midongTimeCount = 1;
     private int midongTimeCount = 1;
     private String gameCode;//游戏code
     private String gameCode;//游戏code
     private String gamePackgeName;
     private String gamePackgeName;
     private boolean gameFlag;
     private boolean gameFlag;
-    private int order = 1;
-
-    public int getOrder() {
-        return order;
-    }
-
-    public void setOrder(int order) {
-        this.order = order;
-    }
 
 
     public boolean isGameFlag() {
     public boolean isGameFlag() {
         return gameFlag;
         return gameFlag;
@@ -135,14 +126,6 @@ public class SheepApp extends MultiDexApplication {
         isInitMidong = initMidong;
         isInitMidong = initMidong;
     }
     }
 
 
-    public String getPackgeName() {
-        return packgeName;
-    }
-
-    public void setPackgeName(String packgeName) {
-        this.packgeName = packgeName;
-    }
-
     public boolean isShowQB() {
     public boolean isShowQB() {
         return isShowQB;
         return isShowQB;
     }
     }
@@ -469,7 +452,7 @@ public class SheepApp extends MultiDexApplication {
                 stopService(new Intent(SheepApp.this, AutoCheckService.class));
                 stopService(new Intent(SheepApp.this, AutoCheckService.class));
                 if (DataUtil.IS_USE_SCREEN_SHOT)
                 if (DataUtil.IS_USE_SCREEN_SHOT)
                     stopService(new Intent(SheepApp.this, FloatShotScreenService.class));
                     stopService(new Intent(SheepApp.this, FloatShotScreenService.class));
-                SpUtils.saveOrder("order", 1);
+                DataUtil.putAsInt(DataKey.KEY_ORDER, 1);
                 if (!UMConfigUtils.isNotNeedAct(activity))
                 if (!UMConfigUtils.isNotNeedAct(activity))
                     UMConfigUtils.Event.SHEEP_DESTROYED.onEvent();
                     UMConfigUtils.Event.SHEEP_DESTROYED.onEvent();
             }
             }