From dec84d107d05c596307c59fc41a0a4d65df58643 Mon Sep 17 00:00:00 2001 From: 陶汉栋 <2821744554@qq.com> Date: Wed, 2 May 2018 17:37:17 +0800 Subject: [PATCH] no message --- .idea/caches/build_file_checksums.ser | Bin 0 -> 590 bytes .idea/codeStyles/Project.xml | 29 +++++++++++++++++++++++++++++ app/build.gradle | 13 +++++++++++-- app/release/express.apk | Bin 0 -> 3698711 bytes app/release/output.json | 1 + app/src/main/AndroidManifest.xml | 6 ++++-- app/src/main/java/com/shunzhi/expressscanner/AppConfig.java | 9 +++++---- app/src/main/java/com/shunzhi/expressscanner/AppContext.java | 1 - app/src/main/java/com/shunzhi/expressscanner/api/MainApi.java | 3 +++ app/src/main/java/com/shunzhi/expressscanner/bean/Version.java | 14 ++++++++++++++ app/src/main/java/com/shunzhi/expressscanner/contract/MainContract.java | 2 ++ app/src/main/java/com/shunzhi/expressscanner/fragment/MainFragment.java | 14 ++++++++++++++ app/src/main/java/com/shunzhi/expressscanner/manager/CloseUtils.java | 33 +++++++++++++++++++++++++++++++++ app/src/main/java/com/shunzhi/expressscanner/manager/SystemHelper.java | 435 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/src/main/java/com/shunzhi/expressscanner/manager/UpdateManager.java | 374 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/src/main/java/com/shunzhi/expressscanner/present/MainPresenter.java | 15 ++++++++++----- app/src/main/java/com/shunzhi/expressscanner/view/MyVersionDialog.java | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/src/main/res/drawable-mdpi/logo.png | Bin 0 -> 1238 bytes app/src/main/res/drawable-v24/ic_launcher_foreground.xml | 34 ---------------------------------- app/src/main/res/drawable-xhdpi/logo.png | Bin 0 -> 1746 bytes app/src/main/res/drawable-xxhdpi/logo.png | Bin 0 -> 2412 bytes app/src/main/res/drawable/shape_radius8_whit.xml | 7 +++++++ app/src/main/res/layout/fragment_main.xml | 12 ++++++++++-- app/src/main/res/layout/myversiondialog.xml | 180 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/src/main/res/layout/progress_dialog.xml | 28 ++++++++++++++++++++++++++++ app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml | 5 ----- app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml | 5 ----- app/src/main/res/mipmap-mdpi/logo.png | Bin 0 -> 1238 bytes app/src/main/res/mipmap-xhdpi/logo.png | Bin 0 -> 1746 bytes app/src/main/res/mipmap-xxhdpi/logo.png | Bin 0 -> 2412 bytes app/src/main/res/values/colors.xml | 25 +++++++++++++++++++++++++ app/src/main/res/values/dimens.xml | 3 +++ app/src/main/res/values/strings.xml | 2 +- app/src/main/res/values/styles.xml | 18 ++++++++++++++++++ build.gradle | 2 +- expressscanner.jks | Bin 0 -> 2062 bytes gradle/wrapper/gradle-wrapper.properties | 4 ++-- mvpsdk/build.gradle | 1 - 38 files changed, 1304 insertions(+), 65 deletions(-) create mode 100644 .idea/caches/build_file_checksums.ser create mode 100644 .idea/codeStyles/Project.xml create mode 100644 app/release/express.apk create mode 100644 app/release/output.json create mode 100644 app/src/main/java/com/shunzhi/expressscanner/bean/Version.java create mode 100644 app/src/main/java/com/shunzhi/expressscanner/manager/CloseUtils.java create mode 100644 app/src/main/java/com/shunzhi/expressscanner/manager/SystemHelper.java create mode 100644 app/src/main/java/com/shunzhi/expressscanner/manager/UpdateManager.java create mode 100644 app/src/main/java/com/shunzhi/expressscanner/view/MyVersionDialog.java create mode 100644 app/src/main/res/drawable-mdpi/logo.png delete mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable-xhdpi/logo.png create mode 100644 app/src/main/res/drawable-xxhdpi/logo.png create mode 100644 app/src/main/res/drawable/shape_radius8_whit.xml create mode 100644 app/src/main/res/layout/myversiondialog.xml create mode 100644 app/src/main/res/layout/progress_dialog.xml delete mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml delete mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-mdpi/logo.png create mode 100644 app/src/main/res/mipmap-xhdpi/logo.png create mode 100644 app/src/main/res/mipmap-xxhdpi/logo.png create mode 100644 expressscanner.jks diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser new file mode 100644 index 0000000..8db90f2 Binary files /dev/null and b/.idea/caches/build_file_checksums.ser differ diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..30aa626 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 78e0613..9f5e4a9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,19 +1,28 @@ apply plugin: 'com.android.application' android { + signingConfigs { + config { + keyAlias 'key0' + keyPassword '123456' + storeFile file('../expressscanner.jks') + storePassword '123456' + } + } compileSdkVersion 26 defaultConfig { applicationId "com.shunzhi.expressscanner" minSdkVersion 16 targetSdkVersion 26 - versionCode 1 - versionName "1.0" + versionCode 101 + versionName "1.0.1" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + signingConfig signingConfigs.config } } } diff --git a/app/release/express.apk b/app/release/express.apk new file mode 100644 index 0000000..5138924 Binary files /dev/null and b/app/release/express.apk differ diff --git a/app/release/output.json b/app/release/output.json new file mode 100644 index 0000000..2bdc853 --- /dev/null +++ b/app/release/output.json @@ -0,0 +1 @@ +[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":102,"versionName":"1.0.2","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}] \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3b94079..0fa05cd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,13 +3,15 @@ package="com.shunzhi.expressscanner"> + + UpdateIsReceive(@Query("ExpressNumber") String ExpressNumber,@Query("schoolId") String schoolId); + @GET("api/Common/AppVersion?appType=5") + Observable isUpdateVersion(); + } diff --git a/app/src/main/java/com/shunzhi/expressscanner/bean/Version.java b/app/src/main/java/com/shunzhi/expressscanner/bean/Version.java new file mode 100644 index 0000000..a2b6691 --- /dev/null +++ b/app/src/main/java/com/shunzhi/expressscanner/bean/Version.java @@ -0,0 +1,14 @@ +package com.shunzhi.expressscanner.bean; + +import java.io.Serializable; + +/** + * Created by xf on 2015/9/23. + */ +public class Version implements Serializable { + public String verNo; + public String content; + public String inTime; + +} + diff --git a/app/src/main/java/com/shunzhi/expressscanner/contract/MainContract.java b/app/src/main/java/com/shunzhi/expressscanner/contract/MainContract.java index 49ee722..e4cec2b 100644 --- a/app/src/main/java/com/shunzhi/expressscanner/contract/MainContract.java +++ b/app/src/main/java/com/shunzhi/expressscanner/contract/MainContract.java @@ -64,6 +64,8 @@ public interface MainContract { void showSearchModel(List stringList); void showUpdateIsReceive(boolean isUpdate); + + void showUserInfo(); } diff --git a/app/src/main/java/com/shunzhi/expressscanner/fragment/MainFragment.java b/app/src/main/java/com/shunzhi/expressscanner/fragment/MainFragment.java index 088ea33..dab89da 100644 --- a/app/src/main/java/com/shunzhi/expressscanner/fragment/MainFragment.java +++ b/app/src/main/java/com/shunzhi/expressscanner/fragment/MainFragment.java @@ -34,9 +34,11 @@ import com.share.mvpsdk.utils.NetworkConnectionUtils; import com.share.mvpsdk.utils.StringUtils; import com.share.mvpsdk.utils.ToastUtils; import com.shunzhi.expressscanner.AppConfig; +import com.shunzhi.expressscanner.AppContext; import com.shunzhi.expressscanner.R; import com.shunzhi.expressscanner.bean.ExpressBean; import com.shunzhi.expressscanner.contract.MainContract; +import com.shunzhi.expressscanner.manager.UpdateManager; import com.shunzhi.expressscanner.present.MainPresenter; import com.smartdevice.aidl.ICallBack; import com.smartdevice.aidl.IZKCService; @@ -226,6 +228,18 @@ public class MainFragment extends BaseMVPCompatFragment 0) { + try { + for (Closeable c : closeable) { + if (c != null) c.close(); + } + } catch (IOException e) { + e.printStackTrace(); + return false; + } + } + return true; + } +} diff --git a/app/src/main/java/com/shunzhi/expressscanner/manager/SystemHelper.java b/app/src/main/java/com/shunzhi/expressscanner/manager/SystemHelper.java new file mode 100644 index 0000000..7c8e76e --- /dev/null +++ b/app/src/main/java/com/shunzhi/expressscanner/manager/SystemHelper.java @@ -0,0 +1,435 @@ +/** + * ClassName: MyApp.java + * created on 2013-1-24 + * Copyrights 2013-1-24 hjgang All rights reserved. + * site: http://t.qq.com/hjgang2012 + * email: hjgang@yahoo.cn + */ +package com.shunzhi.expressscanner.manager; + +import android.Manifest; +import android.annotation.TargetApi; +import android.app.Activity; +import android.content.ContentResolver; +import android.content.Context; +import android.content.Intent; +import android.content.Intent.ShortcutIconResource; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.net.NetworkInfo.State; +import android.net.Uri; +import android.os.Build; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.FileProvider; +import android.telephony.TelephonyManager; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.Window; +import android.view.WindowManager; + + +import com.shunzhi.expressscanner.R; + +import java.io.File; +import java.sql.Timestamp; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +import timber.log.Timber; + + +/** + * 获取系统信息的工具类 + * + * @author hjgang + */ +public class SystemHelper { + private SystemHelper() { + } + + /** + * 创建本应用的桌面快捷方式
+ * 注意:需要添加权限<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/> + * + * @param + */ + public static void createShortcut(Context context, Class clazz) { + Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT"); + + //快捷方式的名称 + shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, context.getString(R.string.app_name)); + shortcut.putExtra("duplicate", false); //不允许重复创建 + + Intent localIntent2 = new Intent(context, clazz); + localIntent2.setAction(Intent.ACTION_MAIN); + localIntent2.addCategory(Intent.CATEGORY_LAUNCHER); + + shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, localIntent2);//指定快捷方式要启动的Activity类型 + + //快捷方式的图标 + ShortcutIconResource iconResource = ShortcutIconResource.fromContext(context, R.drawable.logo); + shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource); + + context.sendBroadcast(shortcut); + } + + /** + * 字符串转换成date + * + * @param time + * @return + */ + public static Date getDateTime1(String time) { + Date newtime = null; + SimpleDateFormat sdfDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + try { + if (time != null && !time.equals("0")) { + newtime = sdfDateFormat.parse(time); + } + } catch (Exception err) { + + } + return newtime; + } + + /** + * 将字符串转为 时间戳 + * + * @param time + * @return + */ + public static String getTimestamp(String time) { + Date newtime = null; + SimpleDateFormat sdfDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + try { + if (time != null && !time.equals("0")) { + newtime = sdfDateFormat.parse(time); + } + } catch (Exception err) { + + } + return newtime.getTime() + ""; + } + + /** + * 将时间戳转为 字符串 + * yyyy-MM-dd HH:mm + */ + public static String getTimeStr(String time) { + + String newtime = null; + SimpleDateFormat sdfDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + if (time != null && !time.equals("0")) { + newtime = sdfDateFormat.format(new Timestamp(Long.parseLong(time))); + } + return newtime; + } + + /** + * 将时间戳转为 字符串 + * yyyy-MM-dd + */ + public static String getTimeStr3(String time) { + String newtime = null; + SimpleDateFormat sdfDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + if (time != null && !time.equals("0")) { + newtime = sdfDateFormat.format(new Date(Long.parseLong(time) * 1000)); + } + return newtime; + } + + // 将字符串转为时间戳 + public static String getTime(String time) { + SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日hh时mm分"); + Date date = null; + if (time == null || "".equals(time) || "null".equals(time)) { + return "0"; + } + if (time.contains("年")) { + int year = Integer.parseInt(time.substring(0, time.indexOf("年"))); + if (year <= 1970) { + return "0"; + } + } + try { + date = format.parse(time); + } catch (ParseException e) { + e.printStackTrace(); + return null; + } + return date.getTime() / 1000 + ""; + } + + // 将字符串转为时间戳 + public static String getTime2(String time) { + SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日"); + Date date = null; + if (time == null || "".equals(time) || "null".equals(time)) { + return "0"; + } + int year = Integer.parseInt(time.substring(0, time.indexOf("年"))); + if (year <= 1970) { + return "0"; + } + try { + date = format.parse(time); + } catch (ParseException e) { + e.printStackTrace(); + } + return date.getTime() / 1000 + ""; + } + + /** + * @param oldTime 较小的时间 + * @param newTime 较大的时间 (如果为空 默认当前时间 ,表示和当前时间相比) + * @return -1 :同一天. 0:昨天 . 1 :至少是前天. + * @throws ParseException 转换异常 + * @author LuoB. + */ + public static int isYeaterday(Date oldTime, Date newTime) throws ParseException { + if (newTime == null) { + newTime = new Date(); + } + //将下面的 理解成 yyyy-MM-dd 00:00:00 更好理解点 + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + String todayStr = format.format(newTime); + Date today = format.parse(todayStr); + //昨天 86400000=24*60*60*1000 一天 + if ((today.getTime() - oldTime.getTime()) > 0 && (today.getTime() - oldTime.getTime()) <= 86400000) { + return 0; + } else if ((today.getTime() - oldTime.getTime()) <= 0) { //至少是今天 + return -1; + } else { //至少是前天 + return 1; + } + } + + /** + * 检查是否已经创建了桌面快捷方式
+ * 注意:需要添加权限<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS"/> + * + * @param context + * @return + */ + public static boolean hasShortCut(Context context) { + String url = ""; + if (Build.VERSION.SDK_INT < 8) { + url = "content://com.android.launcher.settings/favorites?notify=true"; + } else { + url = "content://com.android.launcher2.settings/favorites?notify=true"; + } + ContentResolver resolver = context.getContentResolver(); + Cursor cursor = resolver.query(Uri.parse(url), null, "title=?", + new String[]{context.getString(R.string.app_name)}, null); + + if (cursor != null && cursor.moveToFirst()) { + cursor.close(); + return true; + } + + return false; + } + + /** + * 获取当前机器的屏幕信息对象
+ * 另外:通过android.os.Build类可以获取当前系统的相关信息 + * + * @param context + * @return + */ + public static DisplayMetrics getScreenInfo(Context context) { + WindowManager windowManager = (WindowManager) context + .getSystemService(Context.WINDOW_SERVICE); + DisplayMetrics dm = new DisplayMetrics(); + windowManager.getDefaultDisplay().getMetrics(dm); + // dm.widthPixels;//寬度 + // dm.heightPixels; //高度 + // dm.density; //密度 + return dm; + } + + public static int dip2px(Context context, double dipValue) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (dipValue * scale + 0.5f); + } + + public static int px2dip(Context context, double pxValue) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (pxValue / scale + 0.5f); + } + + /** + * 获取手机号
+ * 注意:需要添加权限<uses-permission + * android:name="android.permission.READ_PHONE_STATE"/>。另外很多手机不能获取到当前手机号 + * + * @param context + * @return + */ + public static String getMobileNumber(Context context) { + TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { + // TODO: Consider calling + // ActivityCompat#requestPermissions + // here to request the missing permissions, and then overriding + // public void onRequestPermissionsResult(int requestCode, String[] permissions, + // int[] grantResults) + // to handle the case where the user grants the permission. See the documentation + // for ActivityCompat#requestPermissions for more details. + } + String deviceid = tm.getDeviceId();//获取智能设备唯一编号 + String te1 = tm.getLine1Number();//获取本机号码 + String imei = tm.getSimSerialNumber();//获得SIM卡的序号 + String imsi = tm.getSubscriberId();//得到用户Id + return tm.getLine1Number(); + } + + /** + * 检测当前的网络连接是否可用
+ * 注意:需要添加权限<uses-permission + * android:name="android.permission.ACCESS_NETWORK_STATE"/> + * + * @param context + * @return + */ + public static boolean isConnected(Context context) { + boolean flag = false; + try { + ConnectivityManager connManager = (ConnectivityManager) context + .getSystemService(Context.CONNECTIVITY_SERVICE); + if (null != connManager) { + NetworkInfo info = connManager.getActiveNetworkInfo(); + if (null != info && info.isAvailable()) { + flag = true; + } + } + } catch (Exception e) { + Timber.d(e + ""); + } + return flag; + } + + /** + * 检测当前网络连接的类型
+ * 注意:需要添加权限<uses-permission + * android:name="android.permission.ACCESS_NETWORK_STATE"/> + * + * @param context + * @return 返回0代表GPRS网络;返回1,代表WIFI网络;返回-1代表网络不可用 + */ + public static int getNetworkType(Context context) { + int code = -1; + try { + ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + if (null != connManager) { + State state = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState(); + if (State.CONNECTED == state) { + code = ConnectivityManager.TYPE_WIFI; + } else { + state = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState(); + if (State.CONNECTED == state) { + code = ConnectivityManager.TYPE_MOBILE; + } + } + } + } catch (Exception e) { + Timber.d(e + ""); + } + return code; + } + + /** + * 返回当前程序版本代码,如:1 + * + * @param context + * @return 当前程序版本代码 + */ + public static int getAppVersionCode(Context context) { + int versionCode = -1; + try { + PackageManager pm = context.getApplicationContext().getPackageManager(); + PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0); + versionCode = pi.versionCode; + + } catch (Exception e) { + Timber.d("66666%s", e.toString() + ""); + } + return versionCode; + } + + /** + * 返回当前程序版本名,如:1.0.1 + * + * @param context + * @return 当前程序版本名 + */ + public static String getAppVersionName(Context context) { + String versionName = ""; + try { + PackageManager pm = context.getPackageManager(); + PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0); + versionName = pi.versionName; + + } catch (Exception e) { + e.printStackTrace(); + } + return versionName; + } + + /** + * 安装指定的APK文件,主要用于本应用程序的更新 + * + * @param context + * @param apk apk文件的全路径名 + */ + public static void installAPK(Context context, String apk) { + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + Uri data; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + data = FileProvider.getUriForFile(context, "com.shunzhi.parent.fileprovider", new File(apk)); +// 给目标应用一个临时授权 + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + } else data = Uri.fromFile(new File(apk)); + intent.setDataAndType(data, "application/vnd.android.package-archive"); + context.startActivity(intent); + android.os.Process.killProcess(android.os.Process.myPid()); + } + + public static void remoteAPK(Context context) { + Uri packageURI = Uri.parse("package:net.shunzhi"); + Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI); + context.startActivity(uninstallIntent); + } + +// public static void setSystemBar(Context context, boolean on, int color) { +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { +// SystemHelper.setTranslucentStatus(context, on); +// SystemBarTintManager mTintManager = new SystemBarTintManager((Activity) context); +// mTintManager.setStatusBarTintEnabled(true); +// //mTintManager.setNavigationBarTintEnabled(true); +// mTintManager.setStatusBarTintResource(color); +// +// //SystemBarTintManager.SystemBarConfig config = mTintManager.getConfig(); +// //listViewDrawer.setPadding(0, config.getPixelInsetTop(true), 0, config.getPixelInsetBottom()); +// } +// } + + @TargetApi(19) + public static void setTranslucentStatus(Context context, boolean on) { + Window win = ((Activity) context).getWindow(); + WindowManager.LayoutParams winParams = win.getAttributes(); + final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS; + if (on) { + winParams.flags |= bits; + } else { + winParams.flags &= ~bits; + } + win.setAttributes(winParams); + } +} diff --git a/app/src/main/java/com/shunzhi/expressscanner/manager/UpdateManager.java b/app/src/main/java/com/shunzhi/expressscanner/manager/UpdateManager.java new file mode 100644 index 0000000..52c2a96 --- /dev/null +++ b/app/src/main/java/com/shunzhi/expressscanner/manager/UpdateManager.java @@ -0,0 +1,374 @@ +package com.shunzhi.expressscanner.manager; + +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; +import android.os.Environment; +import android.os.Handler; +import android.os.Message; +import android.support.v7.app.AlertDialog; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ProgressBar; +import android.widget.TextView; +import android.widget.Toast; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.share.mvpsdk.RxManager; +import com.share.mvpsdk.helper.RetrofitCreateHelper; +import com.share.mvpsdk.helper.RxHelper; +import com.share.mvpsdk.utils.ToastUtils; +import com.shunzhi.expressscanner.AppConfig; +import com.shunzhi.expressscanner.R; +import com.shunzhi.expressscanner.api.MainApi; +import com.shunzhi.expressscanner.bean.Version; +import com.shunzhi.expressscanner.view.MyVersionDialog; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.text.SimpleDateFormat; +import java.util.HashMap; + +import io.reactivex.functions.Consumer; +import timber.log.Timber; + +public class UpdateManager { + + AlertDialog dialogShowCheckingDialog; + /** + * 是否正在检查更新 + */ + public boolean ischeckingForUpdate = false; + /* 下载中 */ + private static final int DOWNLOAD = 1; + /* 下载结束 */ + private static final int DOWNLOAD_FINISH = 2; + /** + * 是否人为打断检查更新状态 + */ + private boolean isChechingInterrupted = false; + /** + * 结束正在获取更新 + */ + /* 保存解析的XML信息 */ + static HashMap mHashMap; + /* 下载保存路径 */ + private String mSavePath; + /* 记录进度条数量 */ + private int progress; + /* 是否取消更新 */ + private static boolean cancelUpdate = false; + + private static Context mContext; + /* 更新进度条 */ + private ProgressBar mProgress; + private TextView mProgressText; + private Dialog mDownloadDialog; + double serviceCode = 1; + int versionCode = 1; + + //mHandler +//region + private Handler mHandler = new Handler() { + public void handleMessage(Message msg) { + switch (msg.what) { + // 正在下载 + case DOWNLOAD: + // 设置进度条位置 + mProgress.setProgress(progress); + mProgressText.setText(progress + "%"); + break; + case DOWNLOAD_FINISH: + mDownloadDialog.dismiss(); + File apkfile = new File(mSavePath, mHashMap.get("name")); + SystemHelper.installAPK(mContext, apkfile.toString()); + break; + default: + break; + } + } + }; + + //endregion + private UpdateManager() { + mHashMap = new HashMap(); + mHashMap.put("url", AppConfig.url_apk); + mHashMap.put("name", "XSTApp.apk"); + + } + + public UpdateManager(Context context) { + this.mContext = null; + this.mContext = context; + //获取更新版本和url + mHashMap = new HashMap(); + mHashMap.put("url", AppConfig.url_apk); + mHashMap.put("name", "XSTApp.apk"); + + } + + /** + * 检查软件是否有更新版本 + * + * @return + */ + String date = ""; + + /** + * @param shouldInterruptDialogShow 是否显示打断检查更新的对话框 + */ + RxManager rxManager=new RxManager(); + public void isUpdate(final boolean shouldInterruptDialogShow) { + date = new SimpleDateFormat("yyyyMMddHHmmss").format(new java.util.Date()); + // 获取当前软件版本 + if (!ischeckingForUpdate) { + isChechingInterrupted = false; + if (shouldInterruptDialogShow) showCheckingDialog(mContext); + ischeckingForUpdate = true; + versionCode = SystemHelper.getAppVersionCode(mContext); + rxManager.register( RetrofitCreateHelper.getInstance().createApi(MainApi.class,AppConfig.BASE_URL) + .isUpdateVersion().compose(RxHelper.rxSchedulerHelper()).subscribe(new Consumer() { + @Override + public void accept(JsonObject jsonObject) throws Exception { + try { + Gson gson=new Gson(); + Version version=gson.fromJson(jsonObject.get("data").getAsJsonObject().toString(),Version.class); + serviceCode = Double.parseDouble(version.verNo); + double currentVersion = serviceCode / 100; + Timber.d("66666%s","currentVersion="+currentVersion+"serviceCode="+serviceCode+"versionCode="+versionCode); + if ((serviceCode > versionCode) && ischeckingForUpdate && !isChechingInterrupted) { + showNoticeDialog(currentVersion, version.content, isChechingInterrupted); + } else if (!(serviceCode > versionCode) && !isChechingInterrupted) { + Toast.makeText(mContext, "已经是最新版本啦!", Toast.LENGTH_SHORT).show(); + mContext = null; + } + + }catch (Exception e){ + e.printStackTrace(); + }finally { + ischeckingForUpdate = false; + } + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + ToastUtils.showToast("更新失败:"+throwable.toString()); + } + })); + +// Timber.d("sign:%s", Utils.getSignStr()); + /*Ion.with(mContext) + .load(Constants.url_version) + .setHeader("sign", Utils.getSignStr()) + .setTimeout(5000) + .asJsonObject() + .setCallback(new FutureCallback() { + @Override + public void onCompleted(Exception e, JsonObject result) { + try { + Timber.i("exception : %s",e); + Timber.i("result : %s", result); + if (dialogShowCheckingDialog != null) + dialogShowCheckingDialog.dismiss(); + Gson gson = new Gson(); + String s = gson.toJson(result.getAsJsonObject("data")); + Version serverVersion = gson.fromJson(s, new TypeToken() { + }.getType()); + serviceCode = Double.parseDouble(serverVersion.verNo); + double currentVersion = serviceCode / 100; + if ((serviceCode > versionCode) && ischeckingForUpdate && !isChechingInterrupted) { + showNoticeDialog(currentVersion, serverVersion.content, isChechingInterrupted); + } else if (!(serviceCode > versionCode) && shouldInterruptDialogShow && !isChechingInterrupted) { + Toast.makeText(mContext, "已经是最新版本啦!", Toast.LENGTH_SHORT).show(); + mContext = null; + } + } catch (Exception ee) { + ee.printStackTrace(); + if (shouldInterruptDialogShow) + Toast.makeText(mContext, "版本检测失败", Toast.LENGTH_LONG).show(); + mContext = null; + } finally { + ischeckingForUpdate = false; + } + } + });*/ + } + } + + + public UpdateManager setContext(Context ctx) { + mContext = ctx; + return this; + } + + public static UpdateManager getInstance() { + + return SingletonHolder.sInstance; + } + + private static class SingletonHolder { + private static final UpdateManager sInstance = new UpdateManager(); + } + + /** + * 显示软件更新对话框 + */ + public void showNoticeDialog(double serviceCode, String content, Boolean isInterrupted) { + final MyVersionDialog dialog = new MyVersionDialog(mContext, "V" + serviceCode, "10.1M", + content, R.style.dialog, new MyVersionDialog.OnCustomDialogListener() { + @Override + public void clickSure() { + showDownloadDialog(); + } + + @Override + public void clickCancel() { + mContext = null; + } + }); + dialog.setCanceledOnTouchOutside(false); + if (!dialog.isShowing()) + dialog.show(); + ischeckingForUpdate = false; + } + + private void showCheckingDialog(Context ctx) { + dialogShowCheckingDialog = styleDialogBuilder(ctx) + .setMessage("正在检查更新...") + .setTitle("提示") + .setNegativeButton("取消", new OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + isChechingInterrupted = true; + mContext = null; + dialog.dismiss(); + } + }).create(); + dialogShowCheckingDialog.setCanceledOnTouchOutside(false); + if (!dialogShowCheckingDialog.isShowing()) { + dialogShowCheckingDialog.show(); + } + } + + /** + * 显示软件下载对话框 + */ + private void showDownloadDialog() { + // 构造软件下载对话框 + AlertDialog.Builder builder = styleDialogBuilder(mContext); + builder.setTitle("更新中"); + // 给下载对话框增加进度条 + final LayoutInflater inflater = LayoutInflater.from(mContext); + View v = inflater.inflate(R.layout.progress_dialog, null); + mProgress = (ProgressBar) v.findViewById(R.id.pbar); + mProgressText = (TextView) v.findViewById(R.id.txt_wait); + builder.setView(v); + // 取消更新 + builder.setNegativeButton("取消", new OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + // 设置取消状态 + File APKfile = new File(mSavePath); + //FileUtil.deleteFile(APKfile, APKfile + "/" + mHashMap.get("name")); + cancelUpdate = true; + } + }); + mDownloadDialog = builder.create(); + mDownloadDialog.setCanceledOnTouchOutside(false); + mDownloadDialog.show(); + // 现在文件 + downloadApk(); + } + public AlertDialog.Builder styleDialogBuilder(Context context) { + return new AlertDialog.Builder(context, R.style.AlertDialogCustom); + } + /** + * 下载apk文件 + */ + private void downloadApk() { + // 启动新线程下载软件 + cancelUpdate = false; + downloadApkThread downloadThread = new downloadApkThread(); + downloadThread.start(); + } + + /** + * 下载文件线程 + * + * @author coolszy + * @date 2012-4-26 + * @blog http://blog.92coding.com + */ + private class downloadApkThread extends Thread { + HttpURLConnection conn = null; + InputStream is = null; + FileOutputStream fos = null; + + @Override + public void run() { + //cancelUpdate = false; + try { + // 判断SD卡是否存在,并且是否具有读写权限 + if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { + // 获得存储卡的路径 + String sdpath = Environment.getExternalStorageDirectory() + "/"; + mSavePath = sdpath + "download"; + URL url = new URL(mHashMap.get("url")); + // 创建连接 + conn = (HttpURLConnection) url.openConnection(); + conn.connect(); + // 获取文件大小 + int length = conn.getContentLength();//服务端要设置 content length属性 + // 创建输入流 + is = conn.getInputStream(); + + File file = new File(mSavePath); + // 判断文件目录是否存在 + if (!file.exists()) { + if (!file.mkdir()) file.mkdirs();//创建文件失败,则创建文件夹 + } + File apkFile = new File(mSavePath, mHashMap.get("name")); + fos = new FileOutputStream(apkFile); + int count = 0; + // 缓存 + byte buf[] = new byte[1024]; + // 写入到文件中 + while (!cancelUpdate) { + int numread = is.read(buf); + count += numread; + progress = (int) (((float) count / length) * 100);// 计算进度条位置 + mHandler.sendEmptyMessage(DOWNLOAD);// 更新进度 + if (numread <= 0) { + // 下载完成 + mHandler.sendEmptyMessage(DOWNLOAD_FINISH); + break; + } + // 写入文件 + fos.write(buf, 0, numread); + } // 点击取消就停止下载. + + } + } catch (MalformedURLException e) { + Timber.d("MalformedURLException=%s"+e + ""); + e.printStackTrace(); + } catch (IOException e) { + Timber.d("MalformedURLException=%s"+e + ""); + e.printStackTrace(); + } finally { + conn.disconnect(); + CloseUtils.closeQuietly(fos, is); + } + // 取消下载对话框显示 + Thread.currentThread().interrupt(); + rxManager.unSubscribe(); + } + } +} diff --git a/app/src/main/java/com/shunzhi/expressscanner/present/MainPresenter.java b/app/src/main/java/com/shunzhi/expressscanner/present/MainPresenter.java index c1bd071..f438c78 100644 --- a/app/src/main/java/com/shunzhi/expressscanner/present/MainPresenter.java +++ b/app/src/main/java/com/shunzhi/expressscanner/present/MainPresenter.java @@ -5,11 +5,14 @@ import android.util.Log; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.share.mvpsdk.RxManager; +import com.share.mvpsdk.helper.RetrofitCreateHelper; import com.share.mvpsdk.utils.OkHttpExceptionUtil; import com.share.mvpsdk.utils.ToastUtils; import com.shunzhi.expressscanner.AppConfig; +import com.shunzhi.expressscanner.AppContext; import com.shunzhi.expressscanner.bean.ExpressBean; import com.shunzhi.expressscanner.contract.MainContract; +import com.shunzhi.expressscanner.manager.UpdateManager; import com.shunzhi.expressscanner.model.MainModel; import org.json.JSONObject; @@ -44,6 +47,7 @@ public class MainPresenter extends MainContract.MainPresenter { public void accept(JsonObject jsonObject) throws Exception { String access_token = jsonObject.get("access_token").getAsString(); AppConfig.getAppConfig().set(AppConfig.ACCESS_TOKEN, access_token); + RetrofitCreateHelper.getInstance().setAuthorization(access_token); getCurrentInfo(); } }, new Consumer() { @@ -71,6 +75,7 @@ public class MainPresenter extends MainContract.MainPresenter { if (teachClass.size() > 0) { JsonObject jsonObject1 = teachClass.get(0).getAsJsonObject(); AppConfig.getAppConfig().set(AppConfig.SCHOOL_ID, jsonObject1.get("schoolId").getAsString()); + mIView.showUserInfo(); } } } @@ -90,6 +95,7 @@ public class MainPresenter extends MainContract.MainPresenter { mRxManager.register(mIModel.getExpressInfo(expressCode, scholId).subscribe(new Consumer() { @Override public void accept(JsonObject jsonObject) throws Exception { + Log.d("55555","getExpressInfo="+jsonObject.toString()); if (jsonObject.get("status").getAsInt() == 1) { JsonArray jsonArray = jsonObject.getAsJsonArray("data"); ExpressBean expressBean = new ExpressBean(); @@ -104,12 +110,11 @@ public class MainPresenter extends MainContract.MainPresenter { } mIView.showExpressInfo(expressBean); } - Log.d("55555", "getExpressInfo=" + jsonObject.toString()); } }, new Consumer() { @Override public void accept(Throwable throwable) throws Exception { - Log.d("55555", "getExpressInfo=" + throwable.toString()); + ToastUtils.showToast(throwable.toString()); } })); @@ -134,7 +139,7 @@ public class MainPresenter extends MainContract.MainPresenter { }, new Consumer() { @Override public void accept(Throwable throwable) throws Exception { - + ToastUtils.showToast(throwable.toString()); } })); } @@ -156,6 +161,7 @@ public class MainPresenter extends MainContract.MainPresenter { }, new Consumer() { @Override public void accept(Throwable throwable) throws Exception { + ToastUtils.showToast(throwable.toString()); // Log.d("55555","upExpressInfo="+throwable.toString()); } })); @@ -167,7 +173,6 @@ public class MainPresenter extends MainContract.MainPresenter { @Override public void accept(JsonObject jsonObject) throws Exception { try { - Log.d("55555","SearchExpressPhone="+jsonObject.toString()); if (jsonObject.get("status").getAsInt() == 1) { List list = new ArrayList<>(); JsonArray data = jsonObject.getAsJsonArray("data"); @@ -184,7 +189,7 @@ public class MainPresenter extends MainContract.MainPresenter { }, new Consumer() { @Override public void accept(Throwable throwable) throws Exception { - Log.d("55555","SearchExpressPhone="+throwable.toString()); + ToastUtils.showToast(throwable.toString()); } })); } diff --git a/app/src/main/java/com/shunzhi/expressscanner/view/MyVersionDialog.java b/app/src/main/java/com/shunzhi/expressscanner/view/MyVersionDialog.java new file mode 100644 index 0000000..992ab2f --- /dev/null +++ b/app/src/main/java/com/shunzhi/expressscanner/view/MyVersionDialog.java @@ -0,0 +1,94 @@ +package com.shunzhi.expressscanner.view; +import android.app.Dialog; +import android.content.Context; +import android.content.res.Resources; +import android.os.Bundle; +import android.text.method.ScrollingMovementMethod; +import android.util.DisplayMetrics; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.TextView; + +import com.shunzhi.expressscanner.R; + + +/** + * 自定义dialog + * @author Mr.Xu + * + */ +public class MyVersionDialog extends Dialog { + //定义回调事件,用于dialog的点击事件 + public interface OnCustomDialogListener{ + public void clickSure(); + public void clickCancel(); + } + + private OnCustomDialogListener customDialogListener; + String version = "",size="",content =""; + public MyVersionDialog(Context context, String pVerion, String pSize, String pContent, int style, OnCustomDialogListener customDialogListener) { + super(context, style); + this.customDialogListener = customDialogListener; + version = pVerion; + size = pSize; + content = pContent; + Window window = getWindow(); + WindowManager.LayoutParams params = window.getAttributes(); + //set width,height by density and gravity + float density = getDensity(context); + params.width = (int) (300*density); + params.height = (int) (90*density); + params.gravity = Gravity.CENTER; + + + //WindowManager.LayoutParams p = getWindow().getAttributes(); //获取对话框当前的参数值 + //Display d = window.getDefaultDisplay(); //为获取屏幕宽、高 + //p.height = (int) (d.getHeight() * 0.6); //高度设置为屏幕的0.6 + //p.width = (int) (d.getWidth() * 0.95); //宽度设置为屏幕的0.95 + + window.setAttributes(params); + + } + private float getDensity(Context context) { + Resources resources = context.getResources(); + DisplayMetrics dm = resources.getDisplayMetrics(); + return dm.density; + } + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.myversiondialog); + Button clickBtn = (Button) findViewById(R.id.btnSure); + clickBtn.setOnClickListener(clickListener); + Button clearBtn = (Button) findViewById(R.id.btnCancel); + clearBtn.setOnClickListener(clearListener); + + TextView txtVersionNum = (TextView) findViewById(R.id.txtVersionNum); + txtVersionNum.setText(version); + + TextView txtSizeNum = (TextView) findViewById(R.id.txtSizeNum); + txtSizeNum.setText(size); + + TextView txtContent = (TextView) findViewById(R.id.txtContent); + txtContent.setText(content); + txtContent.setMovementMethod(ScrollingMovementMethod.getInstance()) ; + } + + private View.OnClickListener clickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + customDialogListener.clickSure(); + MyVersionDialog.this.dismiss(); + } + }; + private View.OnClickListener clearListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + customDialogListener.clickCancel(); + MyVersionDialog.this.dismiss(); + } + }; +} diff --git a/app/src/main/res/drawable-mdpi/logo.png b/app/src/main/res/drawable-mdpi/logo.png new file mode 100644 index 0000000..68ceb61 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/logo.png differ diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index c7bd21d..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - diff --git a/app/src/main/res/drawable-xhdpi/logo.png b/app/src/main/res/drawable-xhdpi/logo.png new file mode 100644 index 0000000..bf0832f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/logo.png differ diff --git a/app/src/main/res/drawable-xxhdpi/logo.png b/app/src/main/res/drawable-xxhdpi/logo.png new file mode 100644 index 0000000..f24f9de Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/logo.png differ diff --git a/app/src/main/res/drawable/shape_radius8_whit.xml b/app/src/main/res/drawable/shape_radius8_whit.xml new file mode 100644 index 0000000..f84a0a8 --- /dev/null +++ b/app/src/main/res/drawable/shape_radius8_whit.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml index 63535ee..03f4a58 100644 --- a/app/src/main/res/layout/fragment_main.xml +++ b/app/src/main/res/layout/fragment_main.xml @@ -10,7 +10,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" - android:layout_marginBottom="@dimen/dp_60" + android:layout_marginBottom="20dp" android:orientation="vertical"> + + + diff --git a/app/src/main/res/layout/myversiondialog.xml b/app/src/main/res/layout/myversiondialog.xml new file mode 100644 index 0000000..63818dc --- /dev/null +++ b/app/src/main/res/layout/myversiondialog.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +