From f0cd9b9c3280b6a907d8861f971ee3f6f73bcf1c Mon Sep 17 00:00:00 2001 From: fyf Date: Thu, 22 Feb 2024 13:34:55 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 6 + .../bpa/scalage/MenuSelectionActivity.java | 5 + .../java/com/bpa/scalage/app/ICSAppFood.java | 6 + .../main/java/com/bpa/scalage/app/Main.java | 20 + .../com/bpa/scalage/config/ConfigName.java | 27 +- .../com/bpa/scalage/control/FruitAdapter.java | 2 +- .../com/bpa/scalage/control/MyImageView.java | 35 +- .../com/bpa/scalage/helper/CrashHandler.java | 232 +++++++ .../java/com/bpa/scalage/helper/DateUtil.java | 374 +++++++++++ .../java/com/bpa/scalage/helper/FileUtil.java | 588 ++++++++++++++++++ .../com/bpa/scalage/helper/HttpUtils.java | 26 +- .../main/java/com/bpa/scalage/helper/T.java | 8 +- .../pagefragment/ParameterSetFragment.java | 37 +- app/src/main/res/drawable/spinner_border.xml | 42 +- .../res/layout/activity_menu_selection.xml | 2 +- .../controlview/layout/listview_item.xml | 4 +- .../layout/spinner_dropdown_item.xml | 12 + .../controlview/layout/spinner_text_item.xml | 17 + .../res/layout/page/layout/parameter_set.xml | 21 +- app/src/main/res/mipmap-hdpi/gli.png | Bin 0 -> 20157 bytes app/src/main/res/mipmap-hdpi/gli1.png | Bin 0 -> 45396 bytes app/src/main/res/mipmap-hdpi/loading2.png | Bin 0 -> 4553 bytes .../main/res/mipmap-xxhdpi/spinner_down_2.png | Bin 0 -> 425 bytes app/src/main/res/values/styles.xml | 13 + build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 6 +- 26 files changed, 1417 insertions(+), 68 deletions(-) create mode 100644 app/src/main/java/com/bpa/scalage/helper/CrashHandler.java create mode 100644 app/src/main/java/com/bpa/scalage/helper/DateUtil.java create mode 100644 app/src/main/java/com/bpa/scalage/helper/FileUtil.java create mode 100644 app/src/main/res/layout/controlview/layout/spinner_dropdown_item.xml create mode 100644 app/src/main/res/layout/controlview/layout/spinner_text_item.xml create mode 100644 app/src/main/res/mipmap-hdpi/gli.png create mode 100644 app/src/main/res/mipmap-hdpi/gli1.png create mode 100644 app/src/main/res/mipmap-hdpi/loading2.png create mode 100644 app/src/main/res/mipmap-xxhdpi/spinner_down_2.png diff --git a/app/build.gradle b/app/build.gradle index 689415b..3d23554 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -45,4 +45,10 @@ dependencies { androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' implementation files('libs\\sdkapi.jar') compileOnly files('libs/sdkapi.jar') + + implementation 'com.lzy.net:okgo:3.0.4' + + //图片加载 + implementation 'com.github.bumptech.glide:glide:4.11.0' + annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0' } diff --git a/app/src/main/java/com/bpa/scalage/MenuSelectionActivity.java b/app/src/main/java/com/bpa/scalage/MenuSelectionActivity.java index 6c6bf4a..1da1e16 100644 --- a/app/src/main/java/com/bpa/scalage/MenuSelectionActivity.java +++ b/app/src/main/java/com/bpa/scalage/MenuSelectionActivity.java @@ -176,6 +176,11 @@ public class MenuSelectionActivity extends AppCompatActivity{ { DataBus.getInstance().organize=model.data; ConfigName.getInstance().Shop_Id=DataBus.getInstance().organize.id; + if(!ConfigName.getInstance().Shop_Name.equals(model.data.store_Name)) + { + ConfigName.getInstance().Shop_Name=model.data.store_Name; + Main.getInstance().SavePZ(); + } //拉取菜菜品 Main.getInstance().GetCaiPin(); }else diff --git a/app/src/main/java/com/bpa/scalage/app/ICSAppFood.java b/app/src/main/java/com/bpa/scalage/app/ICSAppFood.java index aa88423..29be548 100644 --- a/app/src/main/java/com/bpa/scalage/app/ICSAppFood.java +++ b/app/src/main/java/com/bpa/scalage/app/ICSAppFood.java @@ -4,6 +4,9 @@ import android.app.Application; import android.content.Context; import android.os.Environment; +import com.bpa.scalage.helper.CrashHandler; +import com.lzy.okgo.OkGo; + import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; @@ -21,6 +24,9 @@ public class ICSAppFood extends Application { @Override public void onCreate() { super.onCreate(); + OkGo.getInstance().init(this); + //0.全局异常捕获,保存为SD卡本级目录 crash + CrashHandler.getInstance().init(this); initSD(); //ImageLoaderConfig.initImageLoader(this, Constants.BASE_IMAGE_CACHE); diff --git a/app/src/main/java/com/bpa/scalage/app/Main.java b/app/src/main/java/com/bpa/scalage/app/Main.java index 2a95d09..f5af0c3 100644 --- a/app/src/main/java/com/bpa/scalage/app/Main.java +++ b/app/src/main/java/com/bpa/scalage/app/Main.java @@ -36,14 +36,31 @@ public class Main { { //1.加载配置 LoadingPZ(); + //0.加载环境配置 + ToggleEnvironment(); //2.获取组织信息 GetOrganize(); } + + /** + * 切换环境 + */ + public void ToggleEnvironment() { + if (ConfigName.getInstance().Environment.equals("开发环境")) { + ConfigName.getInstance().SaasAddress = "https://bpa.black-pa.com:21527"; + } else if (ConfigName.getInstance().Environment.equals("测试环境")) { + ConfigName.getInstance().SaasAddress = "https://bpa.black-pa.com:21528"; + } else if (ConfigName.getInstance().Environment.equals("正式环境")) { + ConfigName.getInstance().SaasAddress = "https://witt.black-pa.com"; + } + } + /** * 加载配置 */ public void LoadingPZ() { + ConfigName.getInstance().Environment =ConfigUtil.read(DataBus.getInstance().dishesCon,"Environment", ConfigName.getInstance().Environment); //1.店铺配置 ConfigName.getInstance().Shop_Name =ConfigUtil.read(DataBus.getInstance().dishesCon,"Shop_Name", ConfigName.getInstance().Shop_Name); ConfigName.getInstance().AutKey =ConfigUtil.read(DataBus.getInstance().dishesCon,"AutKey", ConfigName.getInstance().AutKey); @@ -64,6 +81,7 @@ public class Main { */ public void SavePZ() { + ConfigUtil.write(DataBus.getInstance().dishesCon,"Environment", ConfigName.getInstance().Environment); //1.店铺配置 ConfigUtil.write(DataBus.getInstance().dishesCon,"Shop_Name", ConfigName.getInstance().Shop_Name); ConfigUtil.write(DataBus.getInstance().dishesCon,"AutKey", ConfigName.getInstance().AutKey); @@ -77,6 +95,8 @@ public class Main { ConfigUtil.write(DataBus.getInstance().dishesCon,"Plate_Com_Name", ConfigName.getInstance().Plate_Com_Name); ConfigUtil.write(DataBus.getInstance().dishesCon,"Plate_Com_Port", ConfigName.getInstance().Plate_Com_Port); ConfigUtil.write(DataBus.getInstance().dishesCon,"Plate_Com_Format", ConfigName.getInstance().Plate_Com_Format); + + ToggleEnvironment(); } /** diff --git a/app/src/main/java/com/bpa/scalage/config/ConfigName.java b/app/src/main/java/com/bpa/scalage/config/ConfigName.java index 2ff9be0..40f9e9d 100644 --- a/app/src/main/java/com/bpa/scalage/config/ConfigName.java +++ b/app/src/main/java/com/bpa/scalage/config/ConfigName.java @@ -26,7 +26,7 @@ public class ConfigName { /** * 店铺设备号 */ - public String AutKey="95"; + public String AutKey="79"; /** * 店铺ID */ @@ -36,22 +36,31 @@ public class ConfigName { */ public String Shop_DeviceId=java.util.UUID.randomUUID().toString(); + //region + + //region 环境配置 + /** + * 环境配置 + */ + public String Environment = "开发环境"; + //endregion + //region uRL //Sass地址 - public String SaasAddress="https://bpa.black-pa.com:21527"; - //public String SaasAddress="https://witt.black-pa.com"; + //public String SaasAddress="https://bpa.black-pa.com:21528"; + public String SaasAddress="https://witt.black-pa.com"; //获取店铺菜品接口 Get - public String GetFruitUrl=SaasAddress+"/kitchen/api/StoreHelper/StoreGoodsMenuByStoreId?storeId="; + public String GetFruitUrl="/kitchen/api/StoreHelper/StoreGoodsMenuByStoreId?storeId="; //获取店铺详细信息 Get - public String GetStore=SaasAddress+"/kitchen/api/StoreHelper/GetStoreInfoById?storeId="; + public String GetStore="/kitchen/api/StoreHelper/GetStoreInfoById?storeId="; //获取用户信息uRL - public String GetUserUrl=SaasAddress+"/kitchen/api/member-helper/memberinfobywechat/"; + public String GetUserUrl="/kitchen/api/member-helper/memberinfobywechat/"; //查询Vip用户信息 - public String GetVipUserUrl=SaasAddress+"/kitchen/api/member-helper/memberinfobymemberid_wechat/"; + public String GetVipUserUrl="/kitchen/api/member-helper/memberinfobymemberid_wechat/"; //获取用户与卡的订单的关联关系 https://bpa.black-pa.com:21528/order/order/orderantusericard/64F9D80311A204E0/d55b4e04-d17f-45df-bc0a-12e39734ff00 - public String GetUserOrCartGX=SaasAddress+"/order/order/orderantusericard/"; + public String GetUserOrCartGX="/order/order/orderantusericard/"; //创建子订单接口 - public String AddSuOrderUrl=SaasAddress+"/order/order/orderdetail"; + public String AddSuOrderUrl="/order/order/orderdetail"; //endregion //region 菜品放置区 diff --git a/app/src/main/java/com/bpa/scalage/control/FruitAdapter.java b/app/src/main/java/com/bpa/scalage/control/FruitAdapter.java index 76a4819..a5666df 100644 --- a/app/src/main/java/com/bpa/scalage/control/FruitAdapter.java +++ b/app/src/main/java/com/bpa/scalage/control/FruitAdapter.java @@ -62,7 +62,7 @@ public class FruitAdapter extends ArrayAdapter { }); } // 设置要显示的图片和文字 - fruitimage.setImageURL(fruit.cover); + fruitimage.glideAppLoadUrlImage(fruit.cover); fruitname.setText(fruit.name); fruitprice.setText("非会员 ¥"+new java.text.DecimalFormat("#.00").format(fruit.price)+"/50g"); fruitvipprice.setText("会员 ¥"+new java.text.DecimalFormat("#.00").format(fruit.vipPrice)+"/50g"); diff --git a/app/src/main/java/com/bpa/scalage/control/MyImageView.java b/app/src/main/java/com/bpa/scalage/control/MyImageView.java index 6af5c1e..8a8c33a 100644 --- a/app/src/main/java/com/bpa/scalage/control/MyImageView.java +++ b/app/src/main/java/com/bpa/scalage/control/MyImageView.java @@ -1,4 +1,5 @@ package com.bpa.scalage.control; + import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -7,12 +8,17 @@ import android.os.Message; import android.util.AttributeSet; import android.widget.ImageView; import android.widget.Toast; + +import com.bpa.scalage.R; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; + import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; -public class MyImageView extends ImageView { +public class MyImageView extends ImageView { public static final int GET_DATA_SUCCESS = 1; public static final int NETWORK_ERROR = 2; public static final int SERVER_ERROR = 3; @@ -20,16 +26,16 @@ public class MyImageView extends ImageView { private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { - switch (msg.what){ + switch (msg.what) { case GET_DATA_SUCCESS: Bitmap bitmap = (Bitmap) msg.obj; setImageBitmap(bitmap); break; case NETWORK_ERROR: - Toast.makeText(getContext(),"网络连接失败",Toast.LENGTH_SHORT).show(); + Toast.makeText(getContext(), "网络连接失败", Toast.LENGTH_SHORT).show(); break; case SERVER_ERROR: - Toast.makeText(getContext(),"服务器发生错误",Toast.LENGTH_SHORT).show(); + Toast.makeText(getContext(), "服务器发生错误", Toast.LENGTH_SHORT).show(); break; } } @@ -74,7 +80,7 @@ public class MyImageView extends ImageView { msg.what = GET_DATA_SUCCESS; handler.sendMessage(msg); inputStream.close(); - }else { + } else { //服务启发生错误 handler.sendEmptyMessage(SERVER_ERROR); } @@ -87,4 +93,23 @@ public class MyImageView extends ImageView { }.start(); } + /** + * 通过GlideApp加载网络图片 + * + * @param img + */ + public void glideAppLoadUrlImage(String img) { + Glide.with(getContext()).load(img) + //.override(width, height) +// .thumbnail(0.1f) // 加载原始图片的10%作为缩略图 + //.fitCenter() // 缩放图片以适应ImageView的尺寸 + .override(800, 400) // 设置目标图片的宽度和高度 + .placeholder(R.mipmap.gli) + .error(R.mipmap.gli1) + .skipMemoryCache(true) // 禁用内存缓存 + .diskCacheStrategy(DiskCacheStrategy.NONE) + //.diskCacheStrategy(DiskCacheStrategy.ALL) // 缓存所有版本的图片 + .into(this); + } + } \ No newline at end of file diff --git a/app/src/main/java/com/bpa/scalage/helper/CrashHandler.java b/app/src/main/java/com/bpa/scalage/helper/CrashHandler.java new file mode 100644 index 0000000..57f2e27 --- /dev/null +++ b/app/src/main/java/com/bpa/scalage/helper/CrashHandler.java @@ -0,0 +1,232 @@ +package com.bpa.scalage.helper; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.os.Build; +import android.os.Environment; +import android.os.Looper; +import android.os.SystemClock; +import android.util.Log; +import android.widget.Toast; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.FilenameFilter; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.io.Writer; +import java.lang.Thread.UncaughtExceptionHandler; +import java.lang.reflect.Field; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +@SuppressLint("SimpleDateFormat") +public class CrashHandler implements UncaughtExceptionHandler { + + public static String TAG = "MyCrash"; + // ϵͳĬ�ϵ�UncaughtException������ + private UncaughtExceptionHandler mDefaultHandler; + + private static CrashHandler instance = new CrashHandler(); + private Context mContext; + + // �����洢�豸��Ϣ���쳣��Ϣ + private Map infos = new HashMap(); + + // ���ڸ�ʽ������,��Ϊ��־�ļ�����һ���� + private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + /** ��ֻ֤��һ��CrashHandlerʵ�� */ + private CrashHandler() { + } + + /** ��ȡCrashHandlerʵ�� ,����ģʽ */ + public static CrashHandler getInstance() { + return instance; + } + + /** + * ��ʼ�� + * + * @param context + */ + public void init(Context context) { + mContext = context; + mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler(); + Thread.setDefaultUncaughtExceptionHandler(this); + autoClear(120); + } + + /** + * ��UncaughtException����ʱ��ת��ú��������� + */ + @Override + public void uncaughtException(Thread thread, Throwable ex) { + if (!handleException(ex) && mDefaultHandler != null) { + mDefaultHandler.uncaughtException(thread, ex); + } else { + SystemClock.sleep(3000); + android.os.Process.killProcess(android.os.Process.myPid()); + System.exit(1); + } + } + + /** + * �Զ��������,�ռ�������Ϣ ���ʹ��󱨸�Ȳ������ڴ����. + * + * @param ex + * @return true:��������˸��쳣��Ϣ; ���򷵻�false. + */ + private boolean handleException(Throwable ex) { + if (ex == null) + return false; + + try { + new Thread() { + + @Override + public void run() { + Looper.prepare(); + Toast.makeText(mContext, "大爷我崩溃了.自动修复中!!!", + Toast.LENGTH_LONG).show(); + Looper.loop(); + } + }.start(); + collectDeviceInfo(mContext); + saveCrashInfoFile(ex); + + Intent intent = mContext.getPackageManager().getLaunchIntentForPackage(mContext.getPackageName()); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + mContext.startActivity(intent); + SystemClock.sleep(3000); + } catch (Exception e) { + e.printStackTrace(); + } + + return true; + } + + /** + * �ռ��豸������Ϣ + * + * @param ctx + */ + public void collectDeviceInfo(Context ctx) { + try { + PackageManager pm = ctx.getPackageManager(); + PackageInfo pi = pm.getPackageInfo(ctx.getPackageName(), + PackageManager.GET_ACTIVITIES); + if (pi != null) { + String versionName = pi.versionName + ""; + String versionCode = pi.versionCode + ""; + infos.put("versionName", versionName); + infos.put("versionCode", versionCode); + } + } catch (NameNotFoundException e) { + Log.e(TAG, "an error occured when collect package info", e); + } + Field[] fields = Build.class.getDeclaredFields(); + for (Field field : fields) { + try { + field.setAccessible(true); + infos.put(field.getName(), field.get(null).toString()); + } catch (Exception e) { + Log.e(TAG, "an error occured when collect crash info", e); + } + } + } + + /** + * ���������Ϣ���ļ��� + * @param ex + * @return �����ļ�����,���ڽ��ļ����͵������� + * @throws Exception + */ + private String saveCrashInfoFile(Throwable ex) throws Exception { + StringBuffer sb = new StringBuffer(); + try { + SimpleDateFormat sDateFormat = new SimpleDateFormat( + "yyyy-MM-dd HH:mm:ss"); + String date = sDateFormat.format(new Date()); + sb.append("\r\n" + date + "\n"); + for (Map.Entry entry : infos.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + sb.append(key + "=" + value + "\n"); + } + + Writer writer = new StringWriter(); + PrintWriter printWriter = new PrintWriter(writer); + ex.printStackTrace(printWriter); + Throwable cause = ex.getCause(); + while (cause != null) { + cause.printStackTrace(printWriter); + cause = cause.getCause(); + } + printWriter.flush(); + printWriter.close(); + String result = writer.toString(); + sb.append(result); + + String fileName = writeFile(sb.toString()); + return fileName; + } catch (Exception e) { + Log.e(TAG, "an error occured while writing file...", e); + sb.append("an error occured while writing file...\r\n"); + writeFile(sb.toString()); + } + return null; + } + + private String writeFile(String sb) throws Exception { + String time = formatter.format(new Date()); + String fileName = "crash-" + time + ".log"; + if (FileUtil.hasSdcard()) { + String path = getGlobalpath(); + File dir = new File(path); + if (!dir.exists()) + dir.mkdirs(); + + FileOutputStream fos = new FileOutputStream(path + fileName, true); + fos.write(sb.getBytes()); + fos.flush(); + fos.close(); + } + return fileName; + } + + public static String getGlobalpath() { + return Environment.getExternalStorageDirectory().getAbsolutePath() + + File.separator + "crash" + File.separator; + } + + public static void setTag(String tag) { + TAG = tag; + } + + /** + * �ļ�ɾ�� + * @param �ļ��������� + */ + public void autoClear(final int autoClearDay) { + FileUtil.delete(getGlobalpath(), new FilenameFilter() { + + @Override + public boolean accept(File file, String filename) { + String s = FileUtil.getFileNameWithoutExtension(filename); + int day = autoClearDay < 0 ? autoClearDay : -1 * autoClearDay; + String date = "crash-" + DateUtil.getOtherDay(day); + return date.compareTo(s) >= 0; + } + }); + + } + +} diff --git a/app/src/main/java/com/bpa/scalage/helper/DateUtil.java b/app/src/main/java/com/bpa/scalage/helper/DateUtil.java new file mode 100644 index 0000000..c3e20df --- /dev/null +++ b/app/src/main/java/com/bpa/scalage/helper/DateUtil.java @@ -0,0 +1,374 @@ +package com.bpa.scalage.helper; + +import android.annotation.SuppressLint; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +@SuppressLint("SimpleDateFormat") +public final class DateUtil { + + /** yyyy-MM-dd HH:mm:ss�ַ��� */ + public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; + + /** yyyy-MM-dd�ַ��� */ + public static final String DEFAULT_FORMAT_DATE = "yyyy-MM-dd"; + + /** HH:mm:ss�ַ��� */ + public static final String DEFAULT_FORMAT_TIME = "HH:mm:ss"; + + /** yyyy-MM-dd HH:mm:ss��ʽ */ + public static final ThreadLocal defaultDateTimeFormat = new ThreadLocal() { + + @Override + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT); + } + + }; + + /** yyyy-MM-dd��ʽ */ + public static final ThreadLocal defaultDateFormat = new ThreadLocal() { + + @Override + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat(DEFAULT_FORMAT_DATE); + } + + }; + + /** HH:mm:ss��ʽ */ + public static final ThreadLocal defaultTimeFormat = new ThreadLocal() { + + @Override + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat(DEFAULT_FORMAT_TIME); + } + + }; + + private DateUtil() { + throw new RuntimeException("�� 3��"); + } + + /** + * ��longʱ��ת��yyyy-MM-dd HH:mm:ss�ַ���
+ * @param timeInMillis ʱ��longֵ + * @return yyyy-MM-dd HH:mm:ss + */ + public static String getDateTimeFromMillis(long timeInMillis) { + return getDateTimeFormat(new Date(timeInMillis)); + } + + /** + * ��longʱ��ת��yyyy-MM-dd�ַ���
+ * @param timeInMillis + * @return yyyy-MM-dd + */ + public static String getDateFromMillis(long timeInMillis) { + return getDateFormat(new Date(timeInMillis)); + } + + /** + * ��dateת��yyyy-MM-dd HH:mm:ss�ַ��� + *
+ * @param date Date���� + * @return yyyy-MM-dd HH:mm:ss + */ + public static String getDateTimeFormat(Date date) { + return dateSimpleFormat(date, defaultDateTimeFormat.get()); + } + + /** + * �������յ�intת��yyyy-MM-dd���ַ��� + * @param year �� + * @param month �� 1-12 + * @param day �� + * ע���±�ʾCalendar���£���ʵ��С1 + * ��������δ���ж� + */ + public static String getDateFormat(int year, int month, int day) { + return getDateFormat(getDate(year, month, day)); + } + + /** + * ��dateת��yyyy-MM-dd�ַ���
+ * @param date Date���� + * @return yyyy-MM-dd + */ + public static String getDateFormat(Date date) { + return dateSimpleFormat(date, defaultDateFormat.get()); + } + + /** + * ���HH:mm:ss��ʱ�� + * @param date + * @return + */ + public static String getTimeFormat(Date date) { + return dateSimpleFormat(date, defaultTimeFormat.get()); + } + + /** + * ��ʽ��������ʾ��ʽ + * @param sdate ԭʼ���ڸ�ʽ "yyyy-MM-dd" + * @param format ��ʽ�������ڸ�ʽ + * @return ��ʽ�����������ʾ + */ + public static String dateFormat(String sdate, String format) { + SimpleDateFormat formatter = new SimpleDateFormat(format); + java.sql.Date date = java.sql.Date.valueOf(sdate); + return dateSimpleFormat(date, formatter); + } + + /** + * ��ʽ��������ʾ��ʽ + * @param date Date���� + * @param format ��ʽ�������ڸ�ʽ + * @return ��ʽ�����������ʾ + */ + public static String dateFormat(Date date, String format) { + SimpleDateFormat formatter = new SimpleDateFormat(format); + return dateSimpleFormat(date, formatter); + } + + /** + * ��dateת���ַ��� + * @param date Date + * @param format SimpleDateFormat + *
+ * ע�� SimpleDateFormatΪ��ʱ������Ĭ�ϵ�yyyy-MM-dd HH:mm:ss��ʽ + * @return yyyy-MM-dd HH:mm:ss + */ + public static String dateSimpleFormat(Date date, SimpleDateFormat format) { + if (format == null) + format = defaultDateTimeFormat.get(); + return (date == null ? "" : format.format(date)); + } + + /** + * ��"yyyy-MM-dd HH:mm:ss" ��ʽ���ַ���ת��Date + * @param strDate ʱ���ַ��� + * @return Date + */ + public static Date getDateByDateTimeFormat(String strDate) { + return getDateByFormat(strDate, defaultDateTimeFormat.get()); + } + + /** + * ��"yyyy-MM-dd" ��ʽ���ַ���ת��Date + * @param strDate + * @return Date + */ + public static Date getDateByDateFormat(String strDate) { + return getDateByFormat(strDate, defaultDateFormat.get()); + } + + /** + * ��ָ����ʽ��ʱ���ַ���ת��Date���� + * @param strDate ʱ���ַ��� + * @param format ��ʽ���ַ��� + * @return Date + */ + public static Date getDateByFormat(String strDate, String format) { + return getDateByFormat(strDate, new SimpleDateFormat(format)); + } + + /** + * ��String�ַ�������һ����ʽת��Date
+ * ע�� SimpleDateFormatΪ��ʱ������Ĭ�ϵ�yyyy-MM-dd HH:mm:ss��ʽ + * @param strDate ʱ���ַ��� + * @param format SimpleDateFormat���� + * @exception ParseException ���ڸ�ʽת������ + */ + private static Date getDateByFormat(String strDate, SimpleDateFormat format) { + if (format == null) + format = defaultDateTimeFormat.get(); + try { + return format.parse(strDate); + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } + + /** + * �������յ�intת��date + * @param year �� + * @param month �� 1-12 + * @param day �� + * ע���±�ʾCalendar���£���ʵ��С1 + */ + public static Date getDate(int year, int month, int day) { + Calendar mCalendar = Calendar.getInstance(); + mCalendar.set(year, month - 1, day); + return mCalendar.getTime(); + } + + /** + * ����������������� + * + * @param strat ��ʼ���ڣ���ʽyyyy-MM-dd + * @param end ��ֹ���ڣ���ʽyyyy-MM-dd + * @return ��������������� + */ + public static long getIntervalDays(String strat, String end) { + return ((java.sql.Date.valueOf(end)).getTime() - (java.sql.Date + .valueOf(strat)).getTime()) / (3600 * 24 * 1000); + } + + /** + * ��õ�ǰ��� + * @return year(int) + */ + public static int getCurrentYear() { + Calendar mCalendar = Calendar.getInstance(); + return mCalendar.get(Calendar.YEAR); + } + + /** + * ��õ�ǰ�·� + * @return month(int) 1-12 + */ + public static int getCurrentMonth() { + Calendar mCalendar = Calendar.getInstance(); + return mCalendar.get(Calendar.MONTH) + 1; + } + + /** + * ��õ��¼��� + * @return day(int) + */ + public static int getDayOfMonth() { + Calendar mCalendar = Calendar.getInstance(); + return mCalendar.get(Calendar.DAY_OF_MONTH); + } + + /** + * ��ý��������(��ʽ��yyyy-MM-dd) + * @return yyyy-MM-dd + */ + public static String getToday() { + Calendar mCalendar = Calendar.getInstance(); + return getDateFormat(mCalendar.getTime()); + } + + /** + * ������������(��ʽ��yyyy-MM-dd) + * @return yyyy-MM-dd + */ + public static String getYesterday() { + Calendar mCalendar = Calendar.getInstance(); + mCalendar.add(Calendar.DATE, -1); + return getDateFormat(mCalendar.getTime()); + } + + /** + * ���ǰ�������(��ʽ��yyyy-MM-dd) + * @return yyyy-MM-dd + */ + public static String getBeforeYesterday() { + Calendar mCalendar = Calendar.getInstance(); + mCalendar.add(Calendar.DATE, -2); + return getDateFormat(mCalendar.getTime()); + } + + /** + * ��ü���֮ǰ���߼���֮������� + * @param diff ��ֵ�����������ƣ�������ǰ�� + * @return + */ + public static String getOtherDay(int diff) { + Calendar mCalendar = Calendar.getInstance(); + mCalendar.add(Calendar.DATE, diff); + return getDateFormat(mCalendar.getTime()); + } + + /** + * ȡ�ø������ڼ���һ������������ڶ���. + * + * @param date ���������ڶ��� + * @param amount ��Ҫ��ӵ��������������ǰ��������ʹ�ø����Ϳ���. + * @return Date ����һ�������Ժ��Date����. + */ + public static String getCalcDateFormat(String sDate, int amount) { + Date date = getCalcDate(getDateByDateFormat(sDate), amount); + return getDateFormat(date); + } + + /** + * ȡ�ø������ڼ���һ������������ڶ���. + * + * @param date ���������ڶ��� + * @param amount ��Ҫ��ӵ��������������ǰ��������ʹ�ø����Ϳ���. + * @return Date ����һ�������Ժ��Date����. + */ + public static Date getCalcDate(Date date, int amount) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + cal.add(Calendar.DATE, amount); + return cal.getTime(); + } + + /** + * ���һ������ʮ����֮������ڶ��� + * @param date + * @param hOffset ʱƫ��������Ϊ�� + * @param mOffset ��ƫ��������Ϊ�� + * @param sOffset ��ƫ��������Ϊ�� + * @return + */ + public static Date getCalcTime(Date date, int hOffset, int mOffset, int sOffset) { + Calendar cal = Calendar.getInstance(); + if (date != null) + cal.setTime(date); + cal.add(Calendar.HOUR_OF_DAY, hOffset); + cal.add(Calendar.MINUTE, mOffset); + cal.add(Calendar.SECOND, sOffset); + return cal.getTime(); + } + + /** + * ����ָ����������Сʱ���룬����һ��java.Util.Date���� + * + * @param year �� + * @param month �� 0-11 + * @param date �� + * @param hourOfDay Сʱ 0-23 + * @param minute �� 0-59 + * @param second �� 0-59 + * @return һ��Date���� + */ + public static Date getDate(int year, int month, int date, int hourOfDay, + int minute, int second) { + Calendar cal = Calendar.getInstance(); + cal.set(year, month, date, hourOfDay, minute, second); + return cal.getTime(); + } + + /** + * ������������� + * @param sDate yyyy-MM-dd��ʽ + * @return arr[0]:�꣬ arr[1]:�� 0-11 , arr[2]�� + */ + public static int[] getYearMonthAndDayFrom(String sDate) { + return getYearMonthAndDayFromDate(getDateByDateFormat(sDate)); + } + + /** + * ������������� + * @return arr[0]:�꣬ arr[1]:�� 0-11 , arr[2]�� + */ + public static int[] getYearMonthAndDayFromDate(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + int[] arr = new int[3]; + arr[0] = calendar.get(Calendar.YEAR); + arr[1] = calendar.get(Calendar.MONTH); + arr[2] = calendar.get(Calendar.DAY_OF_MONTH); + return arr; + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/bpa/scalage/helper/FileUtil.java b/app/src/main/java/com/bpa/scalage/helper/FileUtil.java new file mode 100644 index 0000000..eadf17c --- /dev/null +++ b/app/src/main/java/com/bpa/scalage/helper/FileUtil.java @@ -0,0 +1,588 @@ +package com.bpa.scalage.helper; + +import android.os.Environment; +import android.text.TextUtils; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileWriter; +import java.io.FilenameFilter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public final class FileUtil { + + private FileUtil() { + throw new Error("���n��"); + } + + /** �ָ���. */ + public final static String FILE_EXTENSION_SEPARATOR = "."; + + /**"/"*/ + public final static String SEP = File.separator; + + /** SD����Ŀ¼ */ + public static final String SDPATH = Environment + .getExternalStorageDirectory() + File.separator; + + /** + * �ж�SD���Ƿ���� + * @return SD�����÷���true + */ + public static boolean hasSdcard() { + String status = Environment.getExternalStorageState(); + return Environment.MEDIA_MOUNTED.equals(status); + } + + /** + * ��ȡ�ļ������� + *
+ * Ĭ��utf-8���� + * @param filePath �ļ�·�� + * @return �ַ��� + * @throws IOException + */ + public static String readFile(String filePath) throws IOException { + return readFile(filePath, "utf-8"); + } + + /** + * ��ȡ�ļ������� + * @param filePath �ļ�Ŀ¼ + * @param charsetName �ַ����� + * @return String�ַ��� + */ + public static String readFile(String filePath, String charsetName) + throws IOException { + if (TextUtils.isEmpty(filePath)) + return null; + if (TextUtils.isEmpty(charsetName)) + charsetName = "utf-8"; + File file = new File(filePath); + StringBuilder fileContent = new StringBuilder(""); + if (file == null || !file.isFile()) + return null; + BufferedReader reader = null; + try { + InputStreamReader is = new InputStreamReader(new FileInputStream( + file), charsetName); + reader = new BufferedReader(is); + String line = null; + while ((line = reader.readLine()) != null) { + if (!fileContent.toString().equals("")) { + fileContent.append("\r\n"); + } + fileContent.append(line); + } + return fileContent.toString(); + } finally { + if (reader != null) { + try { + reader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + /** + * ��ȡ�ı��ļ���List�ַ���������(Ĭ��utf-8����) + * @param filePath �ļ�Ŀ¼ + * @return �ļ������ڷ���null�����򷵻��ַ������� + * @throws IOException + */ + public static List readFileToList(String filePath) + throws IOException { + return readFileToList(filePath, "utf-8"); + } + + /** + * ��ȡ�ı��ļ���List�ַ��������� + * @param filePath �ļ�Ŀ¼ + * @param charsetName �ַ����� + * @return �ļ������ڷ���null�����򷵻��ַ������� + */ + public static List readFileToList(String filePath, + String charsetName) throws IOException { + if (TextUtils.isEmpty(filePath)) + return null; + if (TextUtils.isEmpty(charsetName)) + charsetName = "utf-8"; + File file = new File(filePath); + List fileContent = new ArrayList(); + if (file == null || !file.isFile()) { + return null; + } + BufferedReader reader = null; + try { + InputStreamReader is = new InputStreamReader(new FileInputStream( + file), charsetName); + reader = new BufferedReader(is); + String line = null; + while ((line = reader.readLine()) != null) { + fileContent.add(line); + } + return fileContent; + } finally { + if (reader != null) { + try { + reader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + /** + * ���ļ���д������ + * @param filePath �ļ�Ŀ¼ + * @param content Ҫд������� + * @param append ���Ϊ true��������д���ļ�ĩβ����������д���ļ���ʼ�� + * @return д��ɹ�����true�� д��ʧ�ܷ���false + * @throws IOException + */ + public static boolean writeFile(String filePath, String content, + boolean append) throws IOException { + if (TextUtils.isEmpty(filePath)) + return false; + if (TextUtils.isEmpty(content)) + return false; + FileWriter fileWriter = null; + try { + createFile(filePath); + fileWriter = new FileWriter(filePath, append); + fileWriter.write(content); + fileWriter.flush(); + return true; + } finally { + if (fileWriter != null) { + try { + fileWriter.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + + /** + * ���ļ���д������
+ * Ĭ�����ļ���ʼ������д������ + * @param filePath �ļ�Ŀ¼ + * @param stream �ֽ������� + * @return д��ɹ�����true�����򷵻�false + * @throws IOException + */ + public static boolean writeFile(String filePath, InputStream stream) + throws IOException { + return writeFile(filePath, stream, false); + } + + /** + * ���ļ���д������ + * @param filePath �ļ�Ŀ¼ + * @param stream �ֽ������� + * @param append ���Ϊ true��������д���ļ�ĩβ���� + * Ϊfalseʱ�����ԭ�������ݣ���ͷ��ʼд + * @return д��ɹ�����true�����򷵻�false + * @throws IOException + */ + public static boolean writeFile(String filePath, InputStream stream, + boolean append) throws IOException { + if (TextUtils.isEmpty(filePath)) + throw new NullPointerException("filePath is Empty"); + if (stream == null) + throw new NullPointerException("InputStream is null"); + return writeFile(new File(filePath), stream, + append); + } + + /** + * ���ļ���д������ + * Ĭ�����ļ���ʼ������д������ + * @param file ָ���ļ� + * @param stream �ֽ������� + * @return д��ɹ�����true�����򷵻�false + * @throws IOException + */ + public static boolean writeFile(File file, InputStream stream) + throws IOException { + return writeFile(file, stream, false); + } + + /** + * ���ļ���д������ + * @param file ָ���ļ� + * @param stream �ֽ������� + * @param append Ϊtrueʱ�����ļ���ʼ������д�����ݣ� + * Ϊfalseʱ�����ԭ�������ݣ���ͷ��ʼд + * @return д��ɹ�����true�����򷵻�false + * @throws IOException + */ + public static boolean writeFile(File file, InputStream stream, + boolean append) throws IOException { + if (file == null) + throw new NullPointerException("file = null"); + OutputStream out = null; + try { + createFile(file.getAbsolutePath()); + out = new FileOutputStream(file, append); + byte data[] = new byte[1024]; + int length = -1; + while ((length = stream.read(data)) != -1) { + out.write(data, 0, length); + } + out.flush(); + return true; + } finally { + if (out != null) { + try { + out.close(); + stream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + /** + * �����ļ� + * @param sourceFilePath Դ�ļ�Ŀ¼��Ҫ���Ƶ��ļ�Ŀ¼�� + * @param destFilePath Ŀ���ļ�Ŀ¼�����ƺ���ļ�Ŀ¼�� + * @return �����ļ��ɹ�����true�����򷵻�false + * @throws IOException + */ + public static boolean copyFile(String sourceFilePath, String destFilePath) + throws IOException { + InputStream inputStream = null; + inputStream = new FileInputStream(sourceFilePath); + return writeFile(destFilePath, inputStream); + } + + + /** + * ��ȡij��Ŀ¼�µ��ļ��� + * @param dirPath Ŀ¼ + * @param fileFilter ������ + * @return ij��Ŀ¼�µ������ļ��� + */ + public static List getFileNameList(String dirPath, + FilenameFilter fileFilter) { + if (fileFilter == null) + return getFileNameList(dirPath); + if (TextUtils.isEmpty(dirPath)) + return Collections.emptyList(); + File dir = new File(dirPath); + + File[] files = dir.listFiles(fileFilter); + if (files == null) + return Collections.emptyList(); + + List conList = new ArrayList(); + for (File file : files) { + if (file.isFile()) + conList.add(file.getName()); + } + return conList; + } + + /** + * ��ȡij��Ŀ¼�µ��ļ��� + * @param dirPath Ŀ¼ + * @return ij��Ŀ¼�µ������ļ��� + */ + public static List getFileNameList(String dirPath) { + if (TextUtils.isEmpty(dirPath)) + return Collections.emptyList(); + File dir = new File(dirPath); + File[] files = dir.listFiles(); + if (files == null) + return Collections.emptyList(); + List conList = new ArrayList(); + for (File file : files) { + if (file.isFile()) + conList.add(file.getName()); + } + return conList; + } + + /** + * ��ȡij��Ŀ¼�µ�ָ����չ�����ļ����� + * @param dirPath Ŀ¼ + * @return ij��Ŀ¼�µ������ļ��� + */ + public static List getFileNameList(String dirPath, + final String extension) { + if (TextUtils.isEmpty(dirPath)) + return Collections.emptyList(); + File dir = new File(dirPath); + File[] files = dir.listFiles(new FilenameFilter() { + + @Override + public boolean accept(File dir, String filename) { + if (filename.indexOf("." + extension) > 0) + return true; + return false; + } + }); + if (files == null) + return Collections.emptyList(); + List conList = new ArrayList(); + for (File file : files) { + if (file.isFile()) + conList.add(file.getName()); + } + return conList; + } + + /** + * ����ļ�����չ�� + * @param filePath �ļ�·�� + * @return ���û����չ��������"" + */ + public static String getFileExtension(String filePath) { + if (TextUtils.isEmpty(filePath)) { + return filePath; + } + int extenPosi = filePath.lastIndexOf(FILE_EXTENSION_SEPARATOR); + int filePosi = filePath.lastIndexOf(File.separator); + if (extenPosi == -1) { + return ""; + } + return (filePosi >= extenPosi) ? "" : filePath.substring(extenPosi + 1); + } + + /** + * �����ļ� + * @param path �ļ��ľ���·�� + * @return + */ + public static boolean createFile(String path) { + if (TextUtils.isEmpty(path)) + return false; + return createFile(new File(path)); + } + + /** + * �����ļ� + * @param file + * @return �����ɹ�����true + */ + public static boolean createFile(File file) { + if (file == null || !makeDirs(getFolderName(file.getAbsolutePath()))) + return false; + if (!file.exists()) + try { + return file.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + return false; + } + return false; + } + + /** + * ����Ŀ¼�������Ƕ���� + * @param filePath Ŀ¼·�� + * @return ���·��Ϊ��ʱ������false�����Ŀ¼�����ɹ����򷵻�true�����򷵻�false + */ + public static boolean makeDirs(String filePath) { + if (TextUtils.isEmpty(filePath)) { + return false; + } + File folder = new File(filePath); + return (folder.exists() && folder.isDirectory()) ? true : folder + .mkdirs(); + } + + /** + * ����Ŀ¼�������Ƕ���� + * @param dir Ŀ¼ + * @return ���Ŀ¼�����ɹ����򷵻�true�����򷵻�false + */ + public static boolean makeDirs(File dir) { + if (dir == null) + return false; + return (dir.exists() && dir.isDirectory()) ? true : dir.mkdirs(); + } + + /** + * �ж��ļ��Ƿ���� + * @param filePath �ļ�·�� + * @return ���·��Ϊ�ջ���Ϊ�հ��ַ������ͷ���false������ļ����ڣ������ļ��� + * �ͷ���true����������ļ����߲����ڣ��򷵻�false + */ + public static boolean isFileExist(String filePath) { + if (TextUtils.isEmpty(filePath)) { + return false; + } + File file = new File(filePath); + return (file.exists() && file.isFile()); + } + + /** + * ��ò�����չ�����ļ����� + * @param filePath �ļ�·�� + * @return + */ + public static String getFileNameWithoutExtension(String filePath) { + if (TextUtils.isEmpty(filePath)) { + return filePath; + } + int extenPosi = filePath.lastIndexOf(FILE_EXTENSION_SEPARATOR); + int filePosi = filePath.lastIndexOf(File.separator); + if (filePosi == -1) { + return (extenPosi == -1 ? filePath : filePath.substring(0, + extenPosi)); + } + if (extenPosi == -1) { + return filePath.substring(filePosi + 1); + } + return (filePosi < extenPosi ? filePath.substring(filePosi + 1, + extenPosi) : filePath.substring(filePosi + 1)); + } + + /** + * ����ļ��� + * @param filePath �ļ�·�� + * @return ���·��Ϊ�ջ�մ�������·��������Ϊ��ʱ�������ļ��� + */ + public static String getFileName(String filePath) { + if (TextUtils.isEmpty(filePath)) { + return filePath; + } + int filePosi = filePath.lastIndexOf(File.separator); + return (filePosi == -1) ? filePath : filePath.substring(filePosi + 1); + } + + /** + * �������Ŀ¼���� + * @param filePath �ļ��ľ���·�� + * @return ���·��Ϊ�ջ�մ�������·��������Ϊ��ʱ�����Ϊ��Ŀ¼������""; + * ������Ǹ�Ŀ¼����������Ŀ¼���ƣ���ʽ�磺C:/Windows/Boot + */ + public static String getFolderName(String filePath) { + if (TextUtils.isEmpty(filePath)) { + return filePath; + } + int filePosi = filePath.lastIndexOf(File.separator); + return (filePosi == -1) ? "" : filePath.substring(0, filePosi); + } + + /** + * �ж�Ŀ¼�Ƿ���� + * @param ¼·�� + * @return ���·��Ϊ�ջ�հ��ַ���������false�����Ŀ¼�����ң�ȷʵ��Ŀ¼�ļ��У� + * ����true����������ļ��л��߲����ڣ��򷵻�false + */ + public static boolean isFolderExist(String directoryPath) { + if (TextUtils.isEmpty(directoryPath)) { + return false; + } + File dire = new File(directoryPath); + return (dire.exists() && dire.isDirectory()); + } + + /** + * ɾ��ָ���ļ���ָ��Ŀ¼�ڵ������ļ� + * @param path �ļ���Ŀ¼�ľ���·�� + * @return ·��Ϊ�ջ�հ��ַ���������true���ļ������ڣ�����true���ļ�ɾ������true�� + * �ļ�ɾ���쳣����false + */ + public static boolean deleteFile(String path) { + if (TextUtils.isEmpty(path)) { + return true; + } + return deleteFile(new File(path)); + } + + /** + * ɾ��ָ���ļ���ָ��Ŀ¼�ڵ������ļ� + * @param file + * @return ·��Ϊ�ջ�հ��ַ���������true���ļ������ڣ�����true���ļ�ɾ������true�� + * �ļ�ɾ���쳣����false + */ + public static boolean deleteFile(File file) { + if (file == null) + throw new NullPointerException("file is null"); + if (!file.exists()) { + return true; + } + if (file.isFile()) { + return file.delete(); + } + if (!file.isDirectory()) { + return false; + } + + File[] files = file.listFiles(); + if (files == null) + return true; + for (File f : files) { + if (f.isFile()) { + f.delete(); + } else if (f.isDirectory()) { + deleteFile(f.getAbsolutePath()); + } + } + return file.delete(); + } + + /** + * ɾ��ָ��Ŀ¼���ض����ļ� + * @param dir + * @param filter + */ + public static void delete(String dir, FilenameFilter filter) { + if (TextUtils.isEmpty(dir)) + return; + File file = new File(dir); + if (!file.exists()) + return; + if (file.isFile()) + file.delete(); + if (!file.isDirectory()) + return; + + File[] lists = null; + if (filter != null) + lists = file.listFiles(filter); + else + lists = file.listFiles(); + + if (lists == null) + return; + for (File f : lists) { + if (f.isFile()) { + f.delete(); + } + } + } + + /** + * ����ļ����ļ��еĴ�С + * @param path �ļ���Ŀ¼�ľ���·�� + * @return ���ص�ǰĿ¼�Ĵ�С ��ע�����ļ������ڣ�Ϊ�գ�����Ϊ�հ��ַ��������� -1 + */ + public static long getFileSize(String path) { + if (TextUtils.isEmpty(path)) { + return -1; + } + File file = new File(path); + return (file.exists() && file.isFile() ? file.length() : -1); + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/bpa/scalage/helper/HttpUtils.java b/app/src/main/java/com/bpa/scalage/helper/HttpUtils.java index c4e117c..16bce09 100644 --- a/app/src/main/java/com/bpa/scalage/helper/HttpUtils.java +++ b/app/src/main/java/com/bpa/scalage/helper/HttpUtils.java @@ -18,11 +18,28 @@ import android.util.Log; import com.bpa.scalage.config.ConfigName; import com.bpa.scalage.config.MessageName; import com.bpa.scalage.message.MessageManager; +import com.lzy.okgo.OkGo; +import com.lzy.okgo.callback.StringCallback; +import com.lzy.okgo.model.Response; public class HttpUtils { public static int httpGet(final String name,final String urlPath) { +// OkGo.get(urlPath) +// .execute(new StringCallback() { +// @Override +// public void onSuccess(Response response) { +// // 请求成功回调 +// MessageManager.getInstance().sendMessage(name,response.body()); +// } +// +// @Override +// public void onError(Response response) { +// // 请求失败回调 +// } +// }); + String Url=ConfigName.getInstance().SaasAddress+urlPath; new Thread() { @Override @@ -31,7 +48,7 @@ public class HttpUtils { String content = ""; // ---------------------请求数据----------------------- try { - URL url = new URL(urlPath.trim()); + URL url = new URL(Url.trim()); Log.i("logB", "send url=" + url.toString()); //打开连接 HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); @@ -49,9 +66,11 @@ public class HttpUtils { } else { } } catch (MalformedURLException e) { + Log.e("错误", e.getMessage()); //e.printStackTrace(); } catch (IOException e) { //e.printStackTrace(); + Log.e("错误", e.getMessage()); } MessageManager.getInstance().sendMessage(name,content); } @@ -61,6 +80,8 @@ public class HttpUtils { public static void httpPost(final String name,final String urlPath,final String content) { + String Url=ConfigName.getInstance().SaasAddress+urlPath; + new Thread() { @Override @@ -69,7 +90,7 @@ public class HttpUtils { Looper.prepare(); URL url; try { - url = new URL(urlPath); + url = new URL(Url); Log.i("logB","content="+content); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(10000);//5 @@ -82,7 +103,6 @@ public class HttpUtils { conn.setRequestProperty("TenantId", ConfigName.getInstance().Shop_Id);//设置header - OutputStream os = conn.getOutputStream(); os.write(content.getBytes()); os.close(); diff --git a/app/src/main/java/com/bpa/scalage/helper/T.java b/app/src/main/java/com/bpa/scalage/helper/T.java index 943b784..3df92a2 100644 --- a/app/src/main/java/com/bpa/scalage/helper/T.java +++ b/app/src/main/java/com/bpa/scalage/helper/T.java @@ -1,14 +1,20 @@ package com.bpa.scalage.helper; import android.content.Context; import android.util.Log; +import android.widget.TextView; import android.widget.Toast; +import com.bpa.scalage.R; + /** * 自定义打印吐司函数 */ public class T { public static void show(Context context, String str){ - Toast.makeText(context, str, (int)0).show(); + Toast t= Toast.makeText(context, str, (int)0); + TextView tv = (TextView) t.getView().findViewById(android.R.id.message); + tv.setTextSize(50); + t.show(); Log.i(context.getPackageName(),str); } } diff --git a/app/src/main/java/com/bpa/scalage/pagefragment/ParameterSetFragment.java b/app/src/main/java/com/bpa/scalage/pagefragment/ParameterSetFragment.java index 8c88346..74f400a 100644 --- a/app/src/main/java/com/bpa/scalage/pagefragment/ParameterSetFragment.java +++ b/app/src/main/java/com/bpa/scalage/pagefragment/ParameterSetFragment.java @@ -4,6 +4,7 @@ import android.os.ParcelUuid; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.Spinner; import android.widget.SpinnerAdapter; @@ -16,6 +17,10 @@ import com.bpa.scalage.app.Main; import com.bpa.scalage.config.ConfigName; import com.bpa.scalage.helper.T; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.Map; + /** * 其他页面 */ @@ -31,15 +36,17 @@ public class ParameterSetFragment extends Fragment { //region 界面变量 //店铺信息 - private EditText Shop_Name,AutKey,Shop_DeviceId,SaasAddress; + private EditText Shop_Name,AutKey,Shop_DeviceId; //菜品放置区 - private Spinner Dishes_Com_Name,Dishes_Com_Port; + private Spinner Dishes_Com_Name,Dishes_Com_Port,environment; //菜品放置区 private Spinner Plate_Com_Name,Plate_Com_Port,Plate_Com_Format; //当前界面 private View MainView; //保存按钮 private TextView Save; + + Map material_map = new LinkedHashMap<>(); //endregion //region 界面函数 @@ -48,16 +55,24 @@ public class ParameterSetFragment extends Fragment { */ public void Init() { + material_map.put("开发环境", 0); + material_map.put("测试环境", 1); + material_map.put("正式环境", 2); + Shop_Name=MainView.findViewById(R.id.tv_dp_name); AutKey=MainView.findViewById(R.id.tv_dp_id); Shop_DeviceId=MainView.findViewById(R.id.tv_dp_devid); - SaasAddress=MainView.findViewById(R.id.tv_cp_url); + environment=MainView.findViewById(R.id.environment); Dishes_Com_Name=MainView.findViewById(R.id.tv_cp_com); Dishes_Com_Port=MainView.findViewById(R.id.tv_cp_port); Plate_Com_Name=MainView.findViewById(R.id.tv_cpgy_com); Plate_Com_Port=MainView.findViewById(R.id.tv_cpgy_port); Plate_Com_Format=MainView.findViewById(R.id.tv_cpgy_jy); Save=MainView.findViewById(R.id.parameter_save); + + + + SetShowText(); Save.setOnClickListener(new View.OnClickListener() { @Override @@ -75,7 +90,13 @@ public class ParameterSetFragment extends Fragment { Shop_Name.setText(ConfigName.getInstance().Shop_Name); AutKey.setText(ConfigName.getInstance().AutKey); Shop_DeviceId.setText(ConfigName.getInstance().Shop_DeviceId); - SaasAddress.setText(ConfigName.getInstance().SaasAddress); + + ArrayAdapter adapter = new ArrayAdapter<>(getContext(), R.layout.spinner_text_item, new ArrayList<>(material_map.keySet())); + adapter.setDropDownViewResource(R.layout.spinner_dropdown_item); + environment.setAdapter(adapter); + + + SelectText(environment,ConfigName.getInstance().Environment); SelectText(Dishes_Com_Name,ConfigName.getInstance().Dishes_Com_Name); SelectText(Dishes_Com_Port, Integer.toString(ConfigName.getInstance().Dishes_Com_Port)); SelectText(Plate_Com_Name,ConfigName.getInstance().Plate_Com_Name); @@ -103,11 +124,7 @@ public class ParameterSetFragment extends Fragment { T.show(MainView.getContext(),"设备ID不能为空!"); return; } - if (SaasAddress.getText().toString().isEmpty()) - { - T.show(MainView.getContext(),"Sass地址不能为空!"); - return; - } + if (Dishes_Com_Name.getSelectedItem().toString().isEmpty()) { T.show(MainView.getContext(),"菜品放置区串口号不能为空!"); @@ -133,10 +150,10 @@ public class ParameterSetFragment extends Fragment { T.show(MainView.getContext(),"餐盘感应区域数据位、校验位、停止位不能为空!"); return; } + ConfigName.getInstance().Environment = environment.getSelectedItem().toString(); ConfigName.getInstance().Shop_Name=Shop_Name.getText().toString(); ConfigName.getInstance().AutKey=AutKey.getText().toString(); ConfigName.getInstance().Shop_DeviceId=Shop_DeviceId.getText().toString(); - ConfigName.getInstance().SaasAddress=SaasAddress.getText().toString(); ConfigName.getInstance().Dishes_Com_Name=Dishes_Com_Name.getSelectedItem().toString(); ConfigName.getInstance().Dishes_Com_Port=Integer.valueOf(Dishes_Com_Port.getSelectedItem().toString()).intValue(); ConfigName.getInstance().Plate_Com_Name=Plate_Com_Name.getSelectedItem().toString(); diff --git a/app/src/main/res/drawable/spinner_border.xml b/app/src/main/res/drawable/spinner_border.xml index c5d7754..eccc375 100644 --- a/app/src/main/res/drawable/spinner_border.xml +++ b/app/src/main/res/drawable/spinner_border.xml @@ -1,34 +1,28 @@ - - + + - + android:width="1dp" + android:color="#B0B0B0"> - - + - - - - - - - - + + + + + + - - - - - - - - - + diff --git a/app/src/main/res/layout/activity_menu_selection.xml b/app/src/main/res/layout/activity_menu_selection.xml index 9f89bda..5eacedb 100644 --- a/app/src/main/res/layout/activity_menu_selection.xml +++ b/app/src/main/res/layout/activity_menu_selection.xml @@ -49,7 +49,7 @@ android:layout_width="0dp" android:layout_height="match_parent" android:scrollbars="none" - android:layout_weight="0.5" + android:layout_weight="0.8" android:background="#f4f4f4"> + android:textSize="28dp"/> \ No newline at end of file diff --git a/app/src/main/res/layout/controlview/layout/spinner_dropdown_item.xml b/app/src/main/res/layout/controlview/layout/spinner_dropdown_item.xml new file mode 100644 index 0000000..9a99144 --- /dev/null +++ b/app/src/main/res/layout/controlview/layout/spinner_dropdown_item.xml @@ -0,0 +1,12 @@ + + diff --git a/app/src/main/res/layout/controlview/layout/spinner_text_item.xml b/app/src/main/res/layout/controlview/layout/spinner_text_item.xml new file mode 100644 index 0000000..ff1c909 --- /dev/null +++ b/app/src/main/res/layout/controlview/layout/spinner_text_item.xml @@ -0,0 +1,17 @@ + + + + + + diff --git a/app/src/main/res/layout/page/layout/parameter_set.xml b/app/src/main/res/layout/page/layout/parameter_set.xml index f51a09a..942a17b 100644 --- a/app/src/main/res/layout/page/layout/parameter_set.xml +++ b/app/src/main/res/layout/page/layout/parameter_set.xml @@ -113,19 +113,24 @@ - + + + + + + + - - diff --git a/app/src/main/res/mipmap-hdpi/gli.png b/app/src/main/res/mipmap-hdpi/gli.png new file mode 100644 index 0000000000000000000000000000000000000000..676d8f757536f60342d9374b8f2ff6f4444960d2 GIT binary patch literal 20157 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

i)~HnTct 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 L)z4*}Q$iB}uLr}a literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/gli1.png b/app/src/main/res/mipmap-hdpi/gli1.png new file mode 100644 index 0000000000000000000000000000000000000000..173238057b8cfee74368e7d53d13e29749f7110b GIT binary patch literal 45396 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/loading2.png b/app/src/main/res/mipmap-hdpi/loading2.png new file mode 100644 index 0000000000000000000000000000000000000000..fe41fc835872a23968079b75bd746ceb334e7adb GIT binary patch literal 4553 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

(P`3YCz-t4yL0WWHj kyQ(agQBg}Deriv;L`IxfvQJo&{ci@C8Czp0=<5&u58|GYGXMYp literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/spinner_down_2.png b/app/src/main/res/mipmap-xxhdpi/spinner_down_2.png new file mode 100644 index 0000000000000000000000000000000000000000..2cff3ed0c666bc0b571cf21a5ba987a572dfa40f GIT binary patch literal 425 zcmV;a0apHrP)41?gF_Lq_i}Q#xCt(TpyQ#7aDs>q z>i;0prl+3&Lrp*sUJAX|)+s;upwQ&|-b)^_EQ7&dFc^xV5B8+sq#ki+y+|of<&E=F z34kpK&N_nAmtw^_${XjU613(j0_cta@}QgM6wrI&lWpaV^9JIRI}@@S9&+-enP-&p z2*KI!9ol0!CleoSXGWgVDGtc220QMTu6z zOA*j3Ei6SLXJ@LR*z<<4@1GG(XIU0?jYAU!>{*`7`I}ED_9>LeCo6Iu?z951fZnJE z@cvQ=xxJtrue + + diff --git a/build.gradle b/build.gradle index 82defb3..fff6509 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.5.2' + classpath 'com.android.tools.build:gradle:7.0.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ab259ac..676d7cc 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Feb 13 15:26:21 CST 2023 +#Thu Sep 14 11:43:52 CST 2023 distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip +zipStoreBase=GRADLE_USER_HOME