admin
2021-06-08 cca287441f277a3049cc280ae0d1e622d99d22ef
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
package com.tejia.lijin.app.updateApp;
 
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.text.Html;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
 
import com.wpc.library.DeviceUuidFactory;
import com.wpc.library.util.NetUtils;
import com.tejia.lijin.app.BasicTextHttpResponseHandler;
import com.tejia.lijin.app.R;
import com.tejia.lijin.app.ShoppingApi;
import com.tejia.lijin.app.util.TimeJudge;
 
import org.apache.http.Header;
import org.json.JSONObject;
 
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
 
/**
 * 更新app
 * 直接跳转至该手机对应的默认手机应用市场(跳转的链接和跳转的方式由小辉提供),
 * 当该安卓手机上没有安装手机默认的应用市场,则跳转是应用宝。
 * 当该安卓手机没有安装默认的应用市场,也没有安装应用宝,则跳转至我们的官方更新链接)。
 */
public class UpdateApp {
    private Activity mActivity;
    private String mKey;
    private String link = "";//安装包链接
    private String introduction;//更新介绍
    private boolean lastTime = true;
 
    public UpdateApp(Activity mActivity, String key) {
        this.mActivity = mActivity;
        if (key != null && key.length() > 0) {
            mKey = key;
        }
    }
 
//    private updateJudge mupdateJudge;//更新状态返回接口
 
    /**
     * 更新状态返回接口
     */
    public interface UpdateJudgeCallback {
        void onSuccess(boolean show);
 
        //是否关闭弹窗
        void closeUpdate(boolean close);
 
        void onFinish();
    }
 
    /**
     * 查询版本
     *
     * @param mupdateJudge 更新状态接口返回
     * @param firm         true是强制检测更新
     */
    public void getUpdateInfo(final UpdateJudgeCallback mupdateJudge, final boolean firm) {
        SharedPreferences threeday = mActivity.getSharedPreferences("threeday", Context.MODE_PRIVATE);// 三天不提示记录
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = null;
        try {
            date = sdf.parse(threeday.getString("localtime", ""));//localtime
        } catch (ParseException e) {
            e.printStackTrace();
        }
        //未点击三天不弹出,则需每次都弹出
        int day = threeday.getInt("day", 0);
        if (day == 1)
            day = 0;
 
        //强制检测 本地记录为空 或者 记录时间与当前时间大于等于3天/1天 有网络
        if ((firm || threeday.getString("localtime", "").equals("") || TimeJudge.getday(date, "yyyy-MM-dd HH:mm:ss") >= day)
                && lastTime && NetUtils.isNetConnected(mActivity)) {
            String deviceId = new DeviceUuidFactory(mActivity).getDeviceUuid() + "";// 获取deviceId
            long cTime = System.currentTimeMillis();// 获取系统当前时间
            int versionCode = 1;// 版本号
            try {
                versionCode = mActivity.getPackageManager().getPackageInfo(
                        mActivity.getPackageName(),
                        PackageManager.GET_CONFIGURATIONS).versionCode;
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
            lastTime = false;
            ShoppingApi.getAppUpdateInfo(mActivity, deviceId, "Android", cTime
                    + "", mKey, versionCode + "", new BasicTextHttpResponseHandler() {
                @Override
                public void onSuccessPerfect(int statusCode, Header[] headers, JSONObject jsonObject) throws Exception {
                    if (jsonObject.optInt("code") == 0) {
                        mupdateJudge.onSuccess(true);
                        JSONObject data = jsonObject.optJSONObject("data");
                        link = data.optString("link");//更新链接
                        introduction = data.optString("introduction");//更新介绍
                        updateDialog(mupdateJudge, firm);// 弹出更新提示框
                    } else {
                        mupdateJudge.onSuccess(false);//不弹窗
                        if (firm) {//强制检测
                            Toast.makeText(mActivity, "已经是最新版本", Toast.LENGTH_LONG).show();
                        }
                        mupdateJudge.onFinish();
                    }
                    lastTime = true;
                }
 
                @Override
                public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
                    super.onFailure(statusCode, headers, responseString, throwable);
                    mupdateJudge.onFinish();//不弹窗
                    lastTime = true;
                    if (firm) {//强制检测
                        Toast.makeText(mActivity, "已经是最新版本", Toast.LENGTH_LONG).show();
                    }
                }
 
                @Override
                public void onFinish() {
                    super.onFinish();
                    lastTime = true;
                }
            });
        } else {
            //本地时间 小于一天/三天或者没有网络
            mupdateJudge.onSuccess(false);
            mupdateJudge.onFinish();
            lastTime = true;
        }
    }
 
    /**
     * 弹出更新提示框
     *
     * @param mupdateJudge
     * @param firm         强制检测
     */
    private void updateDialog(final UpdateJudgeCallback mupdateJudge, final boolean firm) {
        LayoutInflater inflater = (LayoutInflater) mActivity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        // instantiate the dialog with the custom Theme
        final AlertDialog.Builder dialog = new AlertDialog.Builder(mActivity, R.style.dialog_activationinvitecode2);
        View layout = inflater.inflate(R.layout.item_update, null);
        ImageButton item_update_down = layout.findViewById(R.id.item_update_down);
        TextView item_update_Radio = layout.findViewById(R.id.item_update_Radiotxt);//三天不提示布局
        final CheckBox item_update_Radiobu = layout.findViewById(R.id.item_update_Radiobu);
        TextView item_update_introduction = layout.findViewById(R.id.item_update_introduction);
        Button item_update_up = layout.findViewById(R.id.item_update_up);
        item_update_introduction.setText(Html.fromHtml(introduction));
        dialog.setView(layout);
        final AlertDialog Alertlog = dialog.create();
        item_update_down.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Alertlog.dismiss();
                mupdateJudge.closeUpdate(true);
                setdown(item_update_Radiobu.isChecked(), firm);//关闭弹窗
                mupdateJudge.onFinish();
            }
        });
        item_update_up.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Alertlog.dismiss();
                setApplicationmarket(mActivity, v.getContext().getPackageName());//跳转应用市场
                mupdateJudge.onFinish();
//                getInstalledMarketPkgs(mActivity);//获取当前手机上的应用商店数量
            }
        });
        if (firm) {
            item_update_Radio.setVisibility(View.GONE);
            item_update_Radiobu.setVisibility(View.GONE);
        }
        Alertlog.setCanceledOnTouchOutside(false);//点击外面不消失
        Alertlog.show();
    }
 
    /**
     * 跳转应用市场更新
     */
    private void setApplicationmarket(Context context, String packageName) {
        Uri uri = Uri.parse("market://details?id=" + packageName);
        Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri);
        try {
            context.startActivity(goToMarket);
        } catch (Exception e) { //找不到activity
            // 打开应用商店失败 可能是没有手机没有安装应用市场
            e.printStackTrace();
            goToTxMarket(context, packageName);//跳转到应用宝
        }
    }
 
 
    /**
     * 跳转到应用宝
     *
     * @param context
     * @param packageName
     */
    private void goToTxMarket(Context context, String packageName) {
        if (isMobile_spExist()) {//检测是否安装了应用宝
            Uri uri = Uri.parse("market://details?id=" + packageName);
            Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri);
            try {
                goToMarket.setClassName("com.tencent.android.qqdownloader", "com.tencent.pangu.link.LinkProxyActivity");
                context.startActivity(goToMarket);
            } catch (Exception e) {//找不到activity
                // 打开应用宝失败
                e.printStackTrace();
                openBrowser();//浏览器打开
            }
        } else {
            openBrowser();//浏览器打开
        }
    }
 
    /**
     * 浏览器打开 app链接 下载
     */
    private void openBrowser() {
        try {
            if (link != null && !link.equals("")) {
                Intent intent = new Intent();
                intent.setAction("android.intent.action.VIEW");
                Uri content_url = Uri.parse(link);
                intent.setData(content_url);
                mActivity.startActivity(intent);
            } else {
                Toast.makeText(mActivity, "请到官网下载", Toast.LENGTH_SHORT).show();
            }
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(mActivity, "请安装浏览器", Toast.LENGTH_SHORT).show();
        }
 
    }
 
    //检测是否安装了应用宝
    private boolean isMobile_spExist() {
        PackageManager manager = mActivity.getPackageManager();
        List<PackageInfo> pkgList = manager.getInstalledPackages(0);
        for (int i = 0; i < pkgList.size(); i++) {
            PackageInfo pI = pkgList.get(i);
            if (pI.packageName.equalsIgnoreCase("com.tencent.android.qqdownloader"))
                return true;
        }
        return false;
    }
 
    /**
     * 获取当前手机上的应用商店数量
     *
     * @param context
     * @return
     */
    private ArrayList<String> getInstalledMarketPkgs(Context context) {
        ArrayList<String> pkgs = new ArrayList<>();
        if (context == null)
            return pkgs;
        Intent intent = new Intent();
        intent.setAction("android.intent.action.VIEW");
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        intent.setData(Uri.parse("market://details?id="));
        PackageManager pm = context.getPackageManager();
        // 通过queryIntentActivities获取ResolveInfo对象
        List<ResolveInfo> infos = pm.queryIntentActivities(intent,
                0);
        if (infos == null || infos.size() == 0)
            return pkgs;
        int size = infos.size();
        for (int i = 0; i < size; i++) {
            String pkgName = "";
            try {
                ActivityInfo activityInfo = infos.get(i).activityInfo;
                pkgName = activityInfo.packageName;
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (!TextUtils.isEmpty(pkgName))
                pkgs.add(pkgName);
        }
        return pkgs;
    }
 
    /**
     * 关闭窗口
     *
     * @param firm    强制检测
     * @param checked 是否勾选 三天不提醒
     */
    private void setdown(boolean checked, boolean firm) {
        //不是强制检测 记录提示时间
        if (!firm) {
            SharedPreferences threeday = mActivity.getSharedPreferences("threeday", Context.MODE_PRIVATE);// 三天不提示记录
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
            String time = df.format(new Date());
            SharedPreferences.Editor editor = threeday.edit();
            if (checked) {//勾选三天不提醒
                editor.putInt("day", 3);//三天
            } else {
                editor.putInt("day", 1);//一天
            }
            // 设置  记录时间
            editor.putString("localtime", time);//记录时间
            editor.commit();
        }
    }
}