Commit 6c375e65 by Wyh

Merge branch 'supplier' into dev

# Conflicts:
#	base-module/src/main/java/com/gingersoft/gsa/cloud/app/GsaCloudApplication.java
#	base-module/src/main/java/com/gingersoft/gsa/cloud/common/config/expandconfig/FunctionExtendedConfiguration.java
#	base-module/src/main/java/com/gingersoft/gsa/cloud/common/service/GetInfoUpdateService.kt
#	base-module/src/main/java/com/gingersoft/gsa/cloud/common/ui/adapter/multi/InfoMultiAdapter.java
#	base-module/src/main/java/com/gingersoft/gsa/cloud/common/ui/adapter/multi/InputProvider.java
#	base-module/src/main/java/com/gingersoft/gsa/cloud/common/utils/glide/GlideUtils.java
#	base-module/src/main/java/com/gingersoft/gsa/cloud/common/utils/inputFilter/InputFilterUtils.java
#	base-module/src/main/java/com/gingersoft/gsa/cloud/config/globalconfig/applyOptions/MyRetrofitConfiguration.java
#	base-module/src/main/res/layout/print_kitchen.xml
#	delivery_pick_module/src/main/java/com/gingersoft/gsa/delivery_pick_mode/service/GetInfoUpdateService.kt
#	login-module/src/main/java/com/gingersoft/gsa/cloud/login/mvp/ui/activity/mvp/ui/activity/ChooseRestaurantActivity.java
#	print-module/src/main/java/com/joe/print/mvp/print/PrintPrjKitchen.java
#	print-module/src/main/java/com/joe/print/mvp/print/PrintSlip.java
#	supply-chain-module/src/main/java/com/gingersoft/supply_chain/mvp/contract/NewSupplierContract.java
#	supply-chain-module/src/main/java/com/gingersoft/supply_chain/mvp/presenter/NewSupplierPresenter.java
#	supply-chain-module/src/main/java/com/gingersoft/supply_chain/mvp/server/SupplierServer.java
#	supply-chain-module/src/main/java/com/gingersoft/supply_chain/mvp/ui/fragment/NewFoodUnitFragment.java
#	supply-chain-module/src/main/java/com/gingersoft/supply_chain/mvp/ui/fragment/NewSupplierFragment.java
parents e84ec885 128c9696
...@@ -15,8 +15,6 @@ ...@@ -15,8 +15,6 @@
*/ */
package com.jess.arms.utils; package com.jess.arms.utils;
import android.text.InputFilter;
import android.text.Spanned;
import android.text.TextUtils; import android.text.TextUtils;
import org.json.JSONArray; import org.json.JSONArray;
...@@ -25,8 +23,6 @@ import org.json.JSONObject; ...@@ -25,8 +23,6 @@ import org.json.JSONObject;
import java.io.StringReader; import java.io.StringReader;
import java.io.StringWriter; import java.io.StringWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.xml.transform.OutputKeys; import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source; import javax.xml.transform.Source;
...@@ -51,33 +47,12 @@ public class CharacterHandler { ...@@ -51,33 +47,12 @@ public class CharacterHandler {
throw new IllegalStateException("you can't instantiate me!"); throw new IllegalStateException("you can't instantiate me!");
} }
public static final InputFilter emojiFilter = new InputFilter() {//emoji过滤器
Pattern emoji = Pattern.compile(
"[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]",
Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart,
int dend) {
Matcher emojiMatcher = emoji.matcher(source);
if (emojiMatcher.find()) {
return "";
}
return null;
}
};
/** /**
* 字符串转换成十六进制字符串 * 字符串转换成十六进制字符串
* *
* @return String 每个Byte之间空格分隔,如: [61 6C 6B] * @return String 每个Byte之间空格分隔,如: [61 6C 6B]
*/ */
public static String str2HexStr(String str) { public static String str2HexStr(String str) {
char[] chars = "0123456789ABCDEF".toCharArray(); char[] chars = "0123456789ABCDEF".toCharArray();
StringBuilder sb = new StringBuilder(""); StringBuilder sb = new StringBuilder("");
byte[] bs = str.getBytes(); byte[] bs = str.getBytes();
...@@ -146,4 +121,5 @@ public class CharacterHandler { ...@@ -146,4 +121,5 @@ public class CharacterHandler {
} }
return message; return message;
} }
} }
package com.jess.arms.utils;
import android.text.InputFilter;
import android.text.Spanned;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author 宇航.
* User: admin
* Date: 2020/11/25
* Time: 16:00
* Use: 只能輸入英文字母、數字、-
*/
public class EnAndNumInputFilter implements InputFilter {
/**
* 只能輸入英文和數字
*/
public static final Pattern ChAndEn = Pattern.compile("[-a-zA-Z0-9]+");
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
Matcher m = ChAndEn.matcher(source.toString());
if (dest.toString().contains("-") && source.toString().equals("-")) {
return "";
}
if (!m.matches()) {
return "";
}
return null;
}
}
package com.jess.arms.utils;
import android.text.InputFilter;
import android.text.Spanned;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author 宇航.
* User: admin
* Date: 2020/11/25
* Time: 15:02
* Use: 限制edittext最大長度,根據中文和英文區分
*/
public class LengthFilterWithTextAndLetter implements InputFilter {
private int mMaxLength;
private int onlyLetterLength;
private int normalLength;
private boolean hasChinese;
Pattern p = Pattern.compile("[\u4e00-\u9fa5]+");
Matcher m;
public LengthFilterWithTextAndLetter(int onlyLetterLength, int normalLength) {
this.normalLength = normalLength;
this.onlyLetterLength = onlyLetterLength;
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
if (!hasChinese && dest.length() <= normalLength) {
if (dest.length() >= normalLength) {
m = p.matcher(dest.toString());
} else {
String tmp = source.toString() + dest.toString();
if (tmp.length() >= normalLength) {
tmp = tmp.substring(0, normalLength);
}
m = p.matcher(tmp);
}
hasChinese = m.find();
mMaxLength = hasChinese ? normalLength : onlyLetterLength;
}
if (mMaxLength == onlyLetterLength) {
m = p.matcher(source);
if (m.find()) {
return "";
}
}
int keep = mMaxLength - (dest.length() - (dend - dstart));
if (keep <= 0) {
return "";
} else if (keep >= end - start) {
return null;
} else {
keep += start;
if (Character.isHighSurrogate(source.charAt(keep - 1))) {
--keep;
if (keep == start) {
return "";
}
}
return source.subSequence(start, keep);
}
}
}
package com.jess.arms.utils;
import android.text.TextUtils;
import java.math.BigDecimal;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MatchUtils {
/**
* CJYFIXME搜集号段时间:2017-11-28(这个之后的请自行添加)
* 手机号:目前全国有27种手机号段。
* 移动有19个号段:134(0-8)、135、136、137、138、139、147(147(数据卡))、148(物联网)、150、151、152、157、158、159、178、182、183、184、187、188、198。
* 联通有11种号段:130、131、132、--145(数据卡)--、146(物联网)、155、156、166、171、175、176、185、186。
* 电信有7个号段:133、--1349--、149、153、173、177、180、181、189、199。
* 虚拟运营商:
* (1).移动:1703、1705、1706
* (2).联通:1704、1707、1708、1709、171
* (3).电信:1700、1701、1702
* 卫星通信:1349
* <p>
* 工业和信息化部公示了2017年第10批“电信网码号资源使用证书”颁发结果,批准同意部分单位提出的电信网码号资源有关申请,
* 其中三大运营商均获得相关物联网号段。
* 移动:
* (1).198(0-9)号段(公众移动通信网号)
* (2).148(0-9)号段(物联网业务专用号段)
* (3).1440(0-9)号段(物联网网号)
* (4).(460)13(移动网络识别码)
* 联通:
* (1).166(0-9)号段(公众移动通信网号)
* (2).146(0-9)号段(物联网业务专用号段)
* 电信:
* (1).1740(0-5)号段(卫星移动通信业务号)、
* (2).199(0-9)号段(公众移动通信网号)、
* (3).1410(0-9)号段(物联网网号)、
* (4).(460)59(移动网络识别码)
* 由于物联网号段一般用在家用家具上,所以这里不考虑物联网号段,物联网号码的总位数是13或者14还没搞清楚
* ===============================================================================================
* 总结一下:虚拟运营商、数据卡、物联网、卫星通信、移动网络识别码都不作为正常使用的电话号码,所以需要验证的手机号如下:
* 130、131、132、133、134(0-8)、135、136、137、138、139
* 149
* 150、151、152、153、155、156、157、158、159
* 166、
* 173、175、176、177、178、
* 180、181、182、183、184、185、186、187、188、189
* 198、199
*/
private static final String REGEX_MOBILE = "(134[0-8]\\d{7})" +
"|(" +
"((13([0-3]|[5-9]))" +
"|149" +
"|15([0-3]|[5-9])" +
"|166" +
"|17(3|[5-8])" +
"|18[0-9]" +
"|19[8-9]" +
")" +
"\\d{8}" +
")";
public static boolean checkMobile(String phone) {
if (phone.length() != 11) {
return false;
} else {
Pattern p = Pattern.compile(REGEX_MOBILE);
Matcher m = p.matcher(phone);
boolean isMatch = m.matches();
if (!isMatch) {
}
return isMatch;
}
}
/**
* 校验是否为邮箱
*
* @param email
* @return
*/
public static boolean isEmail(String email) {
if (TextUtils.isEmpty(email)) {
return false;
}
Pattern p = Pattern.compile("^([a-zA-Z0-9]*[-_]?[a-zA-Z0-9]+)*@([a-zA-Z0-9]*[-_]?[a-zA-Z0-9]+)+[\\.][A-Za-z]{2,3}([\\.][A-Za-z]{2})?$");
Matcher m = p.matcher(email);
return m.matches();
}
/**
* 检验是否为银行卡号
*
* @param bankNum
* @return
*/
public static boolean isBankNum(String bankNum) {
char bit = checkCode(bankNum.substring(0, bankNum.length() - 1));
if (bit == 'N') {
return false;
}
return bankNum.charAt(bankNum.length() - 1) == bit;
}
public static char checkCode(String noCheckCode) {
if (noCheckCode == null || noCheckCode.trim().length() == 0
|| !noCheckCode.matches("\\d+")) {
// 如果传的不是数据返回N
return 'N';
}
char[] chs = noCheckCode.trim().toCharArray();
int luhmSum = 0;
for (int i = chs.length - 1, j = 0; i >= 0; i--, j++) {
int k = chs[i] - '0';
if (j % 2 == 0) {
k *= 2;
k = k / 10 + k % 10;
}
luhmSum += k;
}
return (luhmSum % 10 == 0) ? '0' : (char) ((10 - luhmSum % 10) + '0');
}
/**
* 保留小数点后几位
*
* @param sum 原值
* @param digit 位数
* @return
*/
public static BigDecimal getscale(double sum, int digit) {
BigDecimal bg = new BigDecimal(sum);
BigDecimal f = bg.setScale(digit, BigDecimal.ROUND_HALF_UP);
return f;
}
/**
* 随机数
*
* @param digit
* @return
*/
public static String getRandom(int digit) {
if (digit <= 0) {
digit = 10;
}
String strRand = "";
for (int i = 0; i < digit; i++) {
strRand += String.valueOf((int) (Math.random() * 10));
}
return strRand;
}
}
...@@ -244,6 +244,10 @@ public class GsaCloudApplication extends BaseApplication { ...@@ -244,6 +244,10 @@ public class GsaCloudApplication extends BaseApplication {
RetrofitUrlManager.getInstance().putDomain("ricepon_member", HttpsConstans.RICEPON_MEMBER_61177); RetrofitUrlManager.getInstance().putDomain("ricepon_member", HttpsConstans.RICEPON_MEMBER_61177);
//餐廳模塊請求地址 //餐廳模塊請求地址
RetrofitUrlManager.getInstance().putDomain("ricepon_restaurant", HttpsConstans.ROOT_SERVER_ADDRESS_FORMAL_RESTAURANT); RetrofitUrlManager.getInstance().putDomain("ricepon_restaurant", HttpsConstans.ROOT_SERVER_ADDRESS_FORMAL_RESTAURANT);
//供應商模塊請求地址
RetrofitUrlManager.getInstance().putDomain("ricepon-purchase", HttpsConstans.ROOT_SERVER_ADDRESS_RICEPON_PURCHASE);
//服務器地址為64377的ricepon-member/api/
RetrofitUrlManager.getInstance().putDomain("ricepon_hk_member", HttpsConstans.HK_TEST_RICEPON_MEMBER);
} }
private void initPrint() { private void initPrint() {
......
package com.gingersoft.gsa.cloud.bean;
import android.text.InputFilter;
import lombok.Data;
import me.yokeyword.fragmentation.ISupportFragment;
/**
* @author 宇航.
* User: admin
* Date: 2020/11/25
* Time: 14:15
* Use: 多類型輸入
*/
@Data
public class MultiInputBean extends InfoMultiBean {
private InputFilter[] inputFilters;
private int inputType = -1;
private int maxLength = 0;
private MultiInputBean() {
}
public MultiInputBean(int itemType, String showTitle, boolean isRequired, String hintText) {
super(itemType, showTitle, isRequired, hintText);
}
public MultiInputBean(int itemType, String showTitle, boolean isRequired, String hintText, InputFilter[] inputFilters) {
super(itemType, showTitle, isRequired, hintText);
this.inputFilters = inputFilters;
}
public MultiInputBean(int itemType, String showTitle, boolean isRequired, String hintText, int type) {
super(itemType, showTitle, isRequired, hintText);
this.inputType = type;
}
public MultiInputBean(int itemType, String showTitle, boolean isRequired, String hintText, String showValue) {
super(itemType, showTitle, isRequired, hintText, showValue);
}
public MultiInputBean(int itemType, String showTitle, boolean isRequired, String hintText, InputFilter[] inputFilters, int type) {
super(itemType, showTitle, isRequired, hintText);
this.inputFilters = inputFilters;
this.inputType = type;
}
public MultiInputBean(int itemType, String showTitle, String hintText, String hintTextSecond, String hintTextThird, ISupportFragment supportFragment) {
super(itemType, showTitle, hintText, hintTextSecond, hintTextThird, supportFragment);
}
}
package com.gingersoft.gsa.cloud.bean;
import android.text.InputFilter;
import lombok.Data;
import me.yokeyword.fragmentation.ISupportFragment;
/**
* @author 宇航.
* User: admin
* Date: 2020/11/25
* Time: 14:15
* Use: 多類型輸入帶選擇
*/
@Data
public class MultiInputSelectBean extends MultiInputBean {
private int requestCode;
public MultiInputSelectBean(int itemType, String showTitle, String hintText, String hintTextSecond, String hintTextThird, int requestCode, ISupportFragment supportFragment) {
super(itemType, showTitle, hintText, hintTextSecond, hintTextThird, supportFragment);
this.requestCode = requestCode;
}
public MultiInputSelectBean(int itemType, String showTitle, String hintText, String hintTextSecond, String hintTextThird, int requestCode, ISupportFragment supportFragment, InputFilter[] inputFilters, int type) {
super(itemType, showTitle, hintText, hintTextSecond, hintTextThird, supportFragment);
this.requestCode = requestCode;
this.setInputFilters(inputFilters);
this.setInputType(type);
}
}
package com.gingersoft.gsa.cloud.bean;
import lombok.Data;
import me.yokeyword.fragmentation.ISupportFragment;
/**
* @author 宇航.
* User: admin
* Date: 2020/11/25
* Time: 14:15
* Use: 選擇類型對象
*/
@Data
public class MultiSelectBean extends InfoMultiBean {
private int requestCode;
public MultiSelectBean(int itemType, String showTitle, boolean isRequired, String hintText, int requestCode, ISupportFragment fragment) {
super(itemType, showTitle, isRequired, hintText, fragment);
this.requestCode = requestCode;
}
}
package com.gingersoft.gsa.cloud.bean;
import java.util.List;
import lombok.Data;
/**
* @author 宇航.
* User: admin
* Date: 2020/11/20
* Time: 10:45
* Use: 多功能列表item實體類,多功能adapter使用
*/
@Data
public class UploadPicMultiBean extends InfoMultiBean {
private List<String> picUrl;
private int drawableId;
public UploadPicMultiBean(int itemType, String showTitle) {
super(itemType, showTitle);
}
public UploadPicMultiBean(int itemType, String showTitle, int drawableId) {
super(itemType, showTitle);
this.drawableId = drawableId;
}
}
...@@ -113,6 +113,10 @@ public class FunctionExtendedConfiguration { ...@@ -113,6 +113,10 @@ public class FunctionExtendedConfiguration {
.remark("餐檯模式開檯自動彈出輸入人數彈窗") .remark("餐檯模式開檯自動彈出輸入人數彈窗")
.build(); .build();
private ExpandInfoSetting DelayedPrinting = ExpandInfoSetting.builder()
.valueInt(3)
.remark("延遲打印間隔")
.build();
/** /**
* skyorder相關 * skyorder相關
*/ */
...@@ -139,91 +143,91 @@ public class FunctionExtendedConfiguration { ...@@ -139,91 +143,91 @@ public class FunctionExtendedConfiguration {
public <T> T getRoundingVaule() { public <T> T getRoundingValue() {
return Rounding.getValue(); return Rounding.getValue();
} }
public <T> T getRoundingDecimalVaule() { public <T> T getRoundingDecimalValue() {
return RoundingDecimal.getValue(); return RoundingDecimal.getValue();
} }
public <T> T getItemDecimalsVaule() { public <T> T getItemDecimalsValue() {
return ItemDecimals.getValue(); return ItemDecimals.getValue();
} }
public <T> T getDeliveryPrintCountVaule() { public <T> T getDeliveryPrintCountValue() {
return DeliveryPrintCount.getValue(); return DeliveryPrintCount.getValue();
} }
public <T> T getDeliveryClosingPCVaule() { public <T> T getDeliveryClosingPCValue() {
return DeliveryClosingPC.getValue(); return DeliveryClosingPC.getValue();
} }
public <T> T getTableModePrintCountVaule() { public <T> T getTableModePrintCountValue() {
return TableModePrintCount.getValue(); return TableModePrintCount.getValue();
} }
public <T> T getTableModeClosingPCVaule() { public <T> T getTableModeClosingPCValue() {
return TableModeClosingPC.getValue(); return TableModeClosingPC.getValue();
} }
public <T> T getOrderReceivingTimeoutVaule() { public <T> T getOrderReceivingTimeoutValue() {
return OrderReceivingTimeout.getValue(); return OrderReceivingTimeout.getValue();
} }
public <T> T getPrintMemberInfoVaule() { public <T> T getPrintMemberInfoValue() {
return PrintMemberInfo.getValue(); return PrintMemberInfo.getValue();
} }
public <T> T getPrintPageVaule() { public <T> T getPrintPageValue() {
return PrintPage.getValue(); return PrintPage.getValue();
} }
public <T> T getPrintMergerFoodVaule() { public <T> T getPrintMergerFoodValue() {
return PrintMergerFood.getValue(); return PrintMergerFood.getValue();
} }
public <T> T getPrintStatisticsAmountVaule() { public <T> T getPrintStatisticsAmountValue() {
return PrintStatisticsAmount.getValue(); return PrintStatisticsAmount.getValue();
} }
public <T> T getPrintFirstOrderVaule() { public <T> T getPrintFirstOrderValue() {
return PrintFirstOrder.getValue(); return PrintFirstOrder.getValue();
} }
public <T> T getFrozenChainAutoOrderVaule() { public <T> T getFrozenChainAutoOrderValue() {
return FrozenChainAutoOrder.getValue(); return FrozenChainAutoOrder.getValue();
} }
public <T> T getMergeSendFoodVaule() { public <T> T getMergeSendFoodValue() {
return MergeSendFood.getValue(); return MergeSendFood.getValue();
} }
public <T> T getAutoPrinterPaperVaule() { public <T> T getAutoPrinterPaperValue() {
return AutoPrinterPaper.getValue(); return AutoPrinterPaper.getValue();
} }
public <T> T getToPrintQRCodeVaule() { public <T> T getToPrintQRCodeValue() {
return ToPrintQRCode.getValue(); return ToPrintQRCode.getValue();
} }
public <T> T getAutoQuitTimeVaule() { public <T> T getAutoQuitTimeValue() {
return AutoQuitTime.getValue(); return AutoQuitTime.getValue();
} }
public <T> T getQRCodeTimeSliceVaule() { public <T> T getQRCodeTimeSliceValue() {
return QRCodeTimeSlice.getValue(); return QRCodeTimeSlice.getValue();
} }
public <T> T getSkyQRCodeTableFlagTextVaule() { public <T> T getSkyQRCodeTableFlagTextValue() {
return SkyQRCodeTableFlagText.getValue(); return SkyQRCodeTableFlagText.getValue();
} }
public <T> T getSkyQRCodePrintTopInfoVaule() { public <T> T getSkyQRCodePrintTopInfoValue() {
return SkyQRCodePrintTopInfo.getValue(); return SkyQRCodePrintTopInfo.getValue();
} }
public <T> T getSkyQRCodePrintBottomInfoVaule() { public <T> T getSkyQRCodePrintBottomInfoValue() {
return SkyQRCodePrintBottomInfo.getValue(); return SkyQRCodePrintBottomInfo.getValue();
} }
...@@ -235,4 +239,9 @@ public class FunctionExtendedConfiguration { ...@@ -235,4 +239,9 @@ public class FunctionExtendedConfiguration {
return OpenTableAutoShowKeyboard.getValue(); return OpenTableAutoShowKeyboard.getValue();
} }
public <T> T geDelayedPrintingValue() {
return DelayedPrinting.getValue();
}
} }
...@@ -43,7 +43,6 @@ public class HeadersInterceptor implements Interceptor { ...@@ -43,7 +43,6 @@ public class HeadersInterceptor implements Interceptor {
Request requestWithUserAgent = originalRequest.newBuilder() Request requestWithUserAgent = originalRequest.newBuilder()
.headers(builder.build()) .headers(builder.build())
.build(); .build();
return chain.proceed(requestWithUserAgent); return chain.proceed(requestWithUserAgent);
} }
......
...@@ -33,4 +33,11 @@ public class AppConstans { ...@@ -33,4 +33,11 @@ public class AppConstans {
* 語言下標 * 語言下標
*/ */
public static final String LANGUAGE_INDEX = "language_index"; public static final String LANGUAGE_INDEX = "language_index";
/**
* 香港,大陸電話號碼長度
*/
public static final int MOBILE_TYPE_HK_LENGTH = 8;
public static final int MOBILE_TYPE_CH_LENGTH = 11;
} }
...@@ -134,6 +134,11 @@ public class HttpsConstans { ...@@ -134,6 +134,11 @@ public class HttpsConstans {
public static String RICEPON_MEMBER_61177; public static String RICEPON_MEMBER_61177;
public static final String UPLOAD_PIC_ADDRESS = "/ricepon-member/api/admin/member/fileUploadBase64";
public static String UPLOAD_PIC_URL;
public static String HK_TEST_RICEPON_MEMBER;
public static void init(Context context) { public static void init(Context context) {
isFormal = (int) SPUtils.get("isFormal", -1); isFormal = (int) SPUtils.get("isFormal", -1);
if (isFormal == -1 && BuildConfig.DEBUG) { if (isFormal == -1 && BuildConfig.DEBUG) {
...@@ -157,6 +162,8 @@ public class HttpsConstans { ...@@ -157,6 +162,8 @@ public class HttpsConstans {
SYSTEM_URL = HTTP_ADDRESS_URL_FORMAL + SYSTEM_PATH; SYSTEM_URL = HTTP_ADDRESS_URL_FORMAL + SYSTEM_PATH;
ROOT_SERVER = HTTP_ADDRESS_URL_FORMAL; ROOT_SERVER = HTTP_ADDRESS_URL_FORMAL;
PRINT_QRCODE_ADDRESS = PRINT_QRCODE_ADDRESS_URL_FORMAL + PRINT_QRCODE_SUFFIX; PRINT_QRCODE_ADDRESS = PRINT_QRCODE_ADDRESS_URL_FORMAL + PRINT_QRCODE_SUFFIX;
UPLOAD_PIC_URL = HTTP_ADDRESS_URL_FORMAL + UPLOAD_PIC_ADDRESS;
HK_TEST_RICEPON_MEMBER = HTTP_ADDRESS_URL_FORMAL + API_RICEPON_MEMBER;
break; break;
case 1: case 1:
RICEPON_MEMBER_61177 = WECHAR_REPORT_TEST_ADDRESS + API_RICEPON_MEMBER; RICEPON_MEMBER_61177 = WECHAR_REPORT_TEST_ADDRESS + API_RICEPON_MEMBER;
...@@ -171,6 +178,8 @@ public class HttpsConstans { ...@@ -171,6 +178,8 @@ public class HttpsConstans {
SYSTEM_URL = ROOT_HK_TEST_URL + SYSTEM_PATH; SYSTEM_URL = ROOT_HK_TEST_URL + SYSTEM_PATH;
ROOT_SERVER = HTTP_ADDRESS_URL_HK; ROOT_SERVER = HTTP_ADDRESS_URL_HK;
PRINT_QRCODE_ADDRESS = PRINT_QRCODE_ADDRESS_URL_HK + PRINT_QRCODE_SUFFIX; PRINT_QRCODE_ADDRESS = PRINT_QRCODE_ADDRESS_URL_HK + PRINT_QRCODE_SUFFIX;
UPLOAD_PIC_URL = ROOT_HK_TEST_URL + UPLOAD_PIC_ADDRESS;
HK_TEST_RICEPON_MEMBER = ROOT_HK_TEST_URL + API_RICEPON_MEMBER;
break; break;
case 2: case 2:
//預發佈 //預發佈
...@@ -186,6 +195,8 @@ public class HttpsConstans { ...@@ -186,6 +195,8 @@ public class HttpsConstans {
SYSTEM_URL = HTTP_ADDRESS_URL_PRE + SYSTEM_PATH; SYSTEM_URL = HTTP_ADDRESS_URL_PRE + SYSTEM_PATH;
ROOT_SERVER = HTTP_ADDRESS_URL_PRE; ROOT_SERVER = HTTP_ADDRESS_URL_PRE;
PRINT_QRCODE_ADDRESS = PRINT_QRCODE_ADDRESS_URL_FORMAL + PRINT_QRCODE_SUFFIX; PRINT_QRCODE_ADDRESS = PRINT_QRCODE_ADDRESS_URL_FORMAL + PRINT_QRCODE_SUFFIX;
UPLOAD_PIC_URL = HTTP_ADDRESS_URL_PRE + UPLOAD_PIC_ADDRESS;
HK_TEST_RICEPON_MEMBER = HTTP_ADDRESS_URL_PRE + API_RICEPON_MEMBER;
break; break;
case 3: case 3:
RICEPON_MEMBER_61177 = WECHAR_REPORT_TEST_ADDRESS + API_RICEPON_MEMBER; RICEPON_MEMBER_61177 = WECHAR_REPORT_TEST_ADDRESS + API_RICEPON_MEMBER;
......
...@@ -16,7 +16,7 @@ public class ServiceChargeItem extends BillItem { ...@@ -16,7 +16,7 @@ public class ServiceChargeItem extends BillItem {
} }
public double updateBillItem(double wholeAmount, int serviceCharge) { public double updateBillItem(double wholeAmount, int serviceCharge) {
int itemDecimals = GsaCloudApplication.functionConfiguration.getItemDecimalsVaule(); int itemDecimals = GsaCloudApplication.functionConfiguration.getItemDecimalsValue();
double serviceAmount = MoneyUtil.divide(MoneyUtil.multiply(wholeAmount, serviceCharge).doubleValue(), 100, itemDecimals); double serviceAmount = MoneyUtil.divide(MoneyUtil.multiply(wholeAmount, serviceCharge).doubleValue(), 100, itemDecimals);
if (serviceAmount > 0) { if (serviceAmount > 0) {
setMoney(MoneyUtil.get_ItemDecimals_money(serviceAmount)); setMoney(MoneyUtil.get_ItemDecimals_money(serviceAmount));
......
...@@ -41,7 +41,9 @@ public class LoganManager { ...@@ -41,7 +41,9 @@ public class LoganManager {
Logan.w(log, LoganConfig.NETWORK_LEVLE); Logan.w(log, LoganConfig.NETWORK_LEVLE);
//網絡日誌比較重要立即寫入本地 //網絡日誌比較重要立即寫入本地
// Logan.f(); // Logan.f();
// printLog("Network", log); if (BuildConfig.DEBUG) {
printLog("Network", log);
}
} }
public static void w_crash(String log) { public static void w_crash(String log) {
......
...@@ -204,7 +204,6 @@ class GetInfoUpdateService : Service() { ...@@ -204,7 +204,6 @@ class GetInfoUpdateService : Service() {
if (!this@GetInfoUpdateService.isDestroy) { if (!this@GetInfoUpdateService.isDestroy) {
mWebSocket = webSocket mWebSocket = webSocket
val token = "weixin_" + restaurantId + "_" + getRandomString(24) val token = "weixin_" + restaurantId + "_" + getRandomString(24)
Log.e(TAG, "token:$token")
webSocket.send(Gson().toJson(MsgBean(1, token))) webSocket.send(Gson().toJson(MsgBean(1, token)))
putTimeLog("連接成功") putTimeLog("連接成功")
cancelTimerDisposable() cancelTimerDisposable()
......
...@@ -31,9 +31,6 @@ public class ListSelectAdapter extends BaseQuickAdapter<String, BaseViewHolder> ...@@ -31,9 +31,6 @@ public class ListSelectAdapter extends BaseQuickAdapter<String, BaseViewHolder>
private int paddingRight = 0; private int paddingRight = 0;
private int paddingBottom = 0; private int paddingBottom = 0;
private Context mContext; private Context mContext;
// public ListSelectAdapter(List<String> data) {
// super(layoutResId, data);
// }
public ListSelectAdapter(Context context, int layoutResId, @Nullable List<String> data) { public ListSelectAdapter(Context context, int layoutResId, @Nullable List<String> data) {
super(layoutResId, data); super(layoutResId, data);
...@@ -44,6 +41,15 @@ public class ListSelectAdapter extends BaseQuickAdapter<String, BaseViewHolder> ...@@ -44,6 +41,15 @@ public class ListSelectAdapter extends BaseQuickAdapter<String, BaseViewHolder>
normalTextColor = ContextCompat.getColor(context, R.color.color_c9); normalTextColor = ContextCompat.getColor(context, R.color.color_c9);
} }
public ListSelectAdapter(Context context, @Nullable List<String> data) {
super(R.layout.item_list_string_select, data);
this.mContext = context;
textSize = 16;
selectBg = ContextCompat.getDrawable(context, R.drawable.s_tran_twenty_blue);
selectTextColor = ContextCompat.getColor(context, R.color.other_order_details_sure_btn_color);
normalTextColor = ContextCompat.getColor(context, R.color.color_c9);
}
@Override @Override
protected void convert(@NotNull BaseViewHolder baseViewHolder, String s) { protected void convert(@NotNull BaseViewHolder baseViewHolder, String s) {
TextView title = baseViewHolder.getView(R.id.cb_select_title); TextView title = baseViewHolder.getView(R.id.cb_select_title);
...@@ -110,4 +116,9 @@ public class ListSelectAdapter extends BaseQuickAdapter<String, BaseViewHolder> ...@@ -110,4 +116,9 @@ public class ListSelectAdapter extends BaseQuickAdapter<String, BaseViewHolder>
notifyDataSetChanged(); notifyDataSetChanged();
return this; return this;
} }
public void setSelectIndex(int selectIndex) {
this.selectIndex = selectIndex;
notifyAdapter();
}
} }
...@@ -4,6 +4,8 @@ import android.content.Context; ...@@ -4,6 +4,8 @@ import android.content.Context;
import com.chad.library.adapter.base.BaseProviderMultiAdapter; import com.chad.library.adapter.base.BaseProviderMultiAdapter;
import com.gingersoft.gsa.cloud.common.ui.bean.InfoMultiBean; import com.gingersoft.gsa.cloud.common.ui.bean.InfoMultiBean;
import com.gingersoft.gsa.cloud.base.R;
import com.gingersoft.gsa.cloud.bean.InfoMultiBean;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
...@@ -25,11 +27,16 @@ public class InfoMultiAdapter extends BaseProviderMultiAdapter<InfoMultiBean> { ...@@ -25,11 +27,16 @@ public class InfoMultiAdapter extends BaseProviderMultiAdapter<InfoMultiBean> {
public InfoMultiAdapter(Context context, List<InfoMultiBean> infoMultiBeans) { public InfoMultiAdapter(Context context, List<InfoMultiBean> infoMultiBeans) {
super(infoMultiBeans); super(infoMultiBeans);
addItemProvider(new InputProvider()); addItemProvider(new InputProvider<>());
addItemProvider(new ThickLineProvider()); addItemProvider(new RemarkProvider<>());
addItemProvider(new TitleProvider()); addItemProvider(new ThickLineProvider<>());
addItemProvider(new RadioProvider(context)); addItemProvider(new TitleProvider<>());
addItemProvider(new SelectDialogProvider(context)); addItemProvider(new RadioProvider<>(context));
addItemProvider(new SelectDialogProvider<>(context));
addItemProvider(new MultiUploadPicProvider<>(context));
addItemProvider(new SelectItemProvider<>(context));
addItemProvider(new MultipleInputProvider<>(context));
addChildClickViewIds(R.id.iv_multi_upload_pic);
} }
......
...@@ -3,11 +3,14 @@ package com.gingersoft.gsa.cloud.common.ui.adapter.multi; ...@@ -3,11 +3,14 @@ package com.gingersoft.gsa.cloud.common.ui.adapter.multi;
import android.text.Editable; import android.text.Editable;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageView;
import com.chad.library.adapter.base.provider.BaseItemProvider;
import com.chad.library.adapter.base.viewholder.BaseViewHolder; import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.gingersoft.gsa.cloud.common.R; import com.gingersoft.gsa.cloud.base.R;
import com.gingersoft.gsa.cloud.common.utils.other.TextUtil; import com.gingersoft.gsa.cloud.base.utils.other.TextUtil;
import com.gingersoft.gsa.cloud.common.ui.bean.InfoMultiBean; import com.gingersoft.gsa.cloud.bean.InfoMultiBean;
import com.gingersoft.gsa.cloud.bean.MultiInputBean;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
...@@ -20,7 +23,7 @@ import java.util.List; ...@@ -20,7 +23,7 @@ import java.util.List;
* Time: 15:58 * Time: 15:58
* Use: * Use:
*/ */
public class InputProvider extends MyBaseItemProvider { public class InputProvider<T extends InfoMultiBean> extends BaseItemProvider<T> {
@Override @Override
public int getItemViewType() { public int getItemViewType() {
...@@ -33,15 +36,26 @@ public class InputProvider extends MyBaseItemProvider { ...@@ -33,15 +36,26 @@ public class InputProvider extends MyBaseItemProvider {
} }
@Override @Override
public void convert(@NotNull BaseViewHolder baseViewHolder, InfoMultiBean infoMultiBean) { public void convert(@NotNull BaseViewHolder baseViewHolder, T t) {
super.convert(baseViewHolder, infoMultiBean); MultiInputBean infoMultiBean = (MultiInputBean) t;
EditText editText = baseViewHolder.getView(R.id.ed_food_menu_value); //是否顯示必選
baseViewHolder.setGone(R.id.multi_required, !infoMultiBean.isRequired());
//設置標題
if (TextUtil.isNotEmptyOrNullOrUndefined(infoMultiBean.getShowTitle())) {
baseViewHolder.setText(R.id.tv_multi_title, infoMultiBean.getShowTitle());
} else {
baseViewHolder.setText(R.id.tv_multi_title, "");
}
EditText editText = baseViewHolder.getView(R.id.ed_multi_value);
if (TextUtil.isNotEmptyOrNullOrUndefined(infoMultiBean.getShowValue())) { if (TextUtil.isNotEmptyOrNullOrUndefined(infoMultiBean.getShowValue())) {
editText.setText(infoMultiBean.getShowValue()); editText.setText(infoMultiBean.getShowValue());
} else { } else {
editText.setHint(infoMultiBean.getHintText()); editText.setHint(infoMultiBean.getHintText());
editText.setText(""); editText.setText("");
} }
ImageView ivClear = baseViewHolder.getView(R.id.iv_clear_multi_content);
ivClear.setOnClickListener(v -> editText.setText(""));
editText.addTextChangedListener(new TextWatcher() { editText.addTextChangedListener(new TextWatcher() {
@Override @Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { public void beforeTextChanged(CharSequence s, int start, int count, int after) {
...@@ -55,10 +69,26 @@ public class InputProvider extends MyBaseItemProvider { ...@@ -55,10 +69,26 @@ public class InputProvider extends MyBaseItemProvider {
@Override @Override
public void afterTextChanged(Editable s) { public void afterTextChanged(Editable s) {
List<InfoMultiBean> data = getAdapter().getData(); List<T> data = getAdapter().getData();
data.get(baseViewHolder.getAdapterPosition()).setShowValue(s + ""); data.get(baseViewHolder.getAdapterPosition()).setShowValue(s + "");
if (s != null && TextUtil.isNotEmptyOrNullOrUndefined(s.toString())) {
} else {
editText.setHint(data.get(baseViewHolder.getAdapterPosition()).getHintText());
}
baseViewHolder.setGone(R.id.iv_clear_multi_content, s.length() <= 0);
} }
}); });
editText.setInputType(infoMultiBean.getInputType());
if (infoMultiBean.getInputFilters() != null) {
editText.setFilters(infoMultiBean.getInputFilters());
} else {
editText.setFilters(editText.getFilters());
}
if (infoMultiBean.getInputType() != -1) {
editText.setInputType(infoMultiBean.getInputType());
} else {
editText.setInputType(editText.getInputType());
}
} }
} }
...@@ -15,7 +15,7 @@ import org.jetbrains.annotations.NotNull; ...@@ -15,7 +15,7 @@ import org.jetbrains.annotations.NotNull;
* Time: 11:07 * Time: 11:07
* Use: * Use:
*/ */
public abstract class MyBaseItemProvider extends BaseItemProvider<InfoMultiBean> { public abstract class MyBaseItemProvider<T extends InfoMultiBean> extends BaseItemProvider<T> {
@Override @Override
public void convert(@NotNull BaseViewHolder baseViewHolder, InfoMultiBean infoMultiBean) { public void convert(@NotNull BaseViewHolder baseViewHolder, InfoMultiBean infoMultiBean) {
......
...@@ -22,7 +22,7 @@ import static com.gingersoft.gsa.cloud.common.ui.recylcler.decorator.DividerItem ...@@ -22,7 +22,7 @@ import static com.gingersoft.gsa.cloud.common.ui.recylcler.decorator.DividerItem
* Time: 15:58 * Time: 15:58
* Use: * Use:
*/ */
public class RadioProvider extends MyBaseItemProvider { public class RadioProvider<T extends InfoMultiBean> extends MyBaseItemProvider<T> {
private Context context; private Context context;
......
...@@ -21,7 +21,7 @@ import java.util.List; ...@@ -21,7 +21,7 @@ import java.util.List;
* Time: 15:58 * Time: 15:58
* Use: * Use:
*/ */
public class SelectDialogProvider extends MyBaseItemProvider { public class SelectDialogProvider<T extends InfoMultiBean> extends MyBaseItemProvider<T> {
private Context context; private Context context;
private List<InfoMultiBean> infoMultiBeans; private List<InfoMultiBean> infoMultiBeans;
......
...@@ -13,7 +13,7 @@ import org.jetbrains.annotations.NotNull; ...@@ -13,7 +13,7 @@ import org.jetbrains.annotations.NotNull;
* Time: 15:58 * Time: 15:58
* Use: * Use:
*/ */
public class ThickLineProvider extends MyBaseItemProvider { public class ThickLineProvider<T extends InfoMultiBean> extends MyBaseItemProvider<T> {
@Override @Override
public int getItemViewType() { public int getItemViewType() {
......
package com.gingersoft.gsa.cloud.common.ui.adapter.multi; package com.gingersoft.gsa.cloud.common.ui.adapter.multi;
import com.chad.library.adapter.base.provider.BaseItemProvider;
import com.chad.library.adapter.base.viewholder.BaseViewHolder; import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.gingersoft.gsa.cloud.common.R; import com.gingersoft.gsa.cloud.common.R;
import com.gingersoft.gsa.cloud.common.ui.bean.InfoMultiBean; import com.gingersoft.gsa.cloud.common.ui.bean.InfoMultiBean;
...@@ -13,7 +14,7 @@ import org.jetbrains.annotations.NotNull; ...@@ -13,7 +14,7 @@ import org.jetbrains.annotations.NotNull;
* Time: 15:58 * Time: 15:58
* Use: * Use:
*/ */
public class TitleProvider extends MyBaseItemProvider { public class TitleProvider<T extends InfoMultiBean> extends BaseItemProvider<T> {
@Override @Override
public int getItemViewType() { public int getItemViewType() {
......
package com.gingersoft.gsa.cloud.common.ui.bean; package com.gingersoft.gsa.cloud.common.ui.bean;
import android.app.Activity;
import android.view.inputmethod.EditorInfo; import android.view.inputmethod.EditorInfo;
import java.util.List; import java.util.List;
import lombok.Data; import lombok.Data;
import me.yokeyword.fragmentation.ISupportFragment;
/** /**
* @author 宇航. * @author 宇航.
...@@ -28,18 +30,34 @@ public class InfoMultiBean { ...@@ -28,18 +30,34 @@ public class InfoMultiBean {
/** /**
* 顯示輸入框 * 顯示輸入框
*/ */
public static final int ITEM_TYPE_INPUT = 2; public static final int ITEM_TYPE_INPUT = 7;
/** /**
* 選中時顯示列表,如果不添加列表數據,則是單選按鈕 * 選中時顯示列表,如果不添加列表數據,則是單選按鈕
*/ */
public static final int ITEM_TYPE_SHOW_LIST = 4; public static final int ITEM_TYPE_SHOW_LIST = 4;
/** /**
* 上傳圖片
*/
public final static int EDIT_FOOD_ITEM_UPLOAD_PIC = 5;
/**
* 選中時顯示彈窗 * 選中時顯示彈窗
*/ */
public static final int ITEM_TYPE_SHOW_DIALOG = 5; public static final int ITEM_TYPE_SHOW_DIALOG = 6;
/**
* 進入下一頁面的選擇類型,有輸入框
*/
public final static int EDIT_FOOD_ITEM_SELECT = 2;
/**
* 多輸入框,並且可選擇
*/
public final static int ITEM_MULTIPLE_INPUT_SELECT = 8;
/** /**
* 備註輸入框樣式
*/
public final static int ITEM_MULTIPLE_INPUT_REMARK = 9;
/**
* item類型 * item類型
*/ */
public int itemType; public int itemType;
...@@ -56,10 +74,16 @@ public class InfoMultiBean { ...@@ -56,10 +74,16 @@ public class InfoMultiBean {
* 提示文字 * 提示文字
*/ */
private String hintText; private String hintText;
private String hintTextSecond;
private String hintTextThird;
/** /**
* 顯示的值 * 顯示的值
*/ */
private String showValue; private String showValue;
private String showValueSecond;
private String showValueThird;
/** /**
* 選中狀態 * 選中狀態
*/ */
...@@ -68,11 +92,18 @@ public class InfoMultiBean { ...@@ -68,11 +92,18 @@ public class InfoMultiBean {
* 當類型為輸入框時,限制輸入的內容格式 * 當類型為輸入框時,限制輸入的內容格式
*/ */
private int inputType = EditorInfo.TYPE_CLASS_TEXT; private int inputType = EditorInfo.TYPE_CLASS_TEXT;
private int maxLength = 50;
/** /**
* 點擊展開有其他item * 點擊展開有其他item
*/ */
private List<InfoMultiBean> infoMultiBeans; private List<InfoMultiBean> infoMultiBeans;
private ISupportFragment fragment;
private Activity activity;
public InfoMultiBean(){}
public InfoMultiBean(int itemType) { public InfoMultiBean(int itemType) {
this.itemType = itemType; this.itemType = itemType;
} }
...@@ -97,6 +128,29 @@ public class InfoMultiBean { ...@@ -97,6 +128,29 @@ public class InfoMultiBean {
this.hintText = hintText; this.hintText = hintText;
} }
public InfoMultiBean(int itemType, String showTitle, String hintText, String hintTextSecond, String hintTextThird, ISupportFragment supportFragment) {
this.itemType = itemType;
this.showTitle = showTitle;
this.hintText = hintText;
this.hintTextSecond = hintTextSecond;
this.hintTextThird = hintTextThird;
this.fragment = supportFragment;
}
public InfoMultiBean(int itemType, String showTitle, boolean isRequired, String hintText, ISupportFragment fragment) {
this.itemType = itemType;
this.showTitle = showTitle;
this.isRequired = isRequired;
this.hintText = hintText;
this.fragment = fragment;
}
public InfoMultiBean(int itemType, String showTitle, boolean isRequired) {
this.itemType = itemType;
this.showTitle = showTitle;
this.isRequired = isRequired;
}
// public String getShowValue() { // public String getShowValue() {
// if(showValue == null){ // if(showValue == null){
// return ""; // return "";
......
...@@ -46,7 +46,10 @@ public abstract class DialogUtils implements LifecycleObserver { ...@@ -46,7 +46,10 @@ public abstract class DialogUtils implements LifecycleObserver {
view = LayoutInflater.from(mContext).inflate(xmlLayout, null); view = LayoutInflater.from(mContext).inflate(xmlLayout, null);
init(mContext); init(mContext);
} }
public DialogUtils(Context mContext, View view) {
this.view = view;
init(mContext);
}
private void init(Context context) { private void init(Context context) {
dialog = new Dialog(context); dialog = new Dialog(context);
viewHepler = getViewHepler(context); viewHepler = getViewHepler(context);
......
package com.gingersoft.gsa.cloud.common.utils; package com.gingersoft.gsa.cloud.common.utils;
import android.annotation.SuppressLint;
import android.content.ContentUris;
import android.content.Context; import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Environment; import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.text.TextUtils; import android.text.TextUtils;
import com.elvishew.xlog.XLog; import com.elvishew.xlog.XLog;
import com.gingersoft.gsa.cloud.base.utils.encryption.BASE64Encoder;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
...@@ -276,4 +284,158 @@ public class FileUtils { ...@@ -276,4 +284,158 @@ public class FileUtils {
} }
return filename; return filename;
} }
/**
* 根据URI获取文件真实路径(兼容多张机型)
*
* @param context
* @param uri
* @return
*/
public static String getFilePathByUri(Context context, Uri uri) {
if ("content".equalsIgnoreCase(uri.getScheme())) {
int sdkVersion = Build.VERSION.SDK_INT;
if (sdkVersion >= 19) { // api >= 19
return getRealPathFromUriAboveApi19(context, uri);
} else { // api < 19
return getRealPathFromUriBelowAPI19(context, uri);
}
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
/**
* 适配api19及以上,根据uri获取图片的绝对路径
*
* @param context 上下文对象
* @param uri 图片的Uri
* @return 如果Uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回null
*/
@SuppressLint("NewApi")
private static String getRealPathFromUriAboveApi19(Context context, Uri uri) {
String filePath = null;
if (DocumentsContract.isDocumentUri(context, uri)) {
// 如果是document类型的 uri, 则通过document id来进行处理
String documentId = DocumentsContract.getDocumentId(uri);
if (isMediaDocument(uri)) { // MediaProvider
// 使用':'分割
String type = documentId.split(":")[0];
String id = documentId.split(":")[1];
String selection = MediaStore.Images.Media._ID + "=?";
String[] selectionArgs = {id};
//
Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
filePath = getDataColumn(context, contentUri, selection, selectionArgs);
} else if (isDownloadsDocument(uri)) { // DownloadsProvider
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(documentId));
filePath = getDataColumn(context, contentUri, null, null);
} else if (isExternalStorageDocument(uri)) {
// ExternalStorageProvider
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
filePath = Environment.getExternalStorageDirectory() + "/" + split[1];
}
} else {
//Log.e("路径错误");
}
} else if ("content".equalsIgnoreCase(uri.getScheme())) {
// 如果是 content 类型的 Uri
filePath = getDataColumn(context, uri, null, null);
} else if ("file".equals(uri.getScheme())) {
// 如果是 file 类型的 Uri,直接获取图片对应的路径
filePath = uri.getPath();
}
return filePath;
}
/**
* 适配api19以下(不包括api19),根据uri获取图片的绝对路径
*
* @param context 上下文对象
* @param uri 图片的Uri
* @return 如果Uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回null
*/
private static String getRealPathFromUriBelowAPI19(Context context, Uri uri) {
return getDataColumn(context, uri, null, null);
}
/**
* 获取数据库表中的 _data 列,即返回Uri对应的文件路径
*
* @return
*/
private static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
String path = null;
String[] projection = new String[]{MediaStore.Images.Media.DATA};
Cursor cursor = null;
try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
if (cursor != null && cursor.moveToFirst()) {
int columnIndex = cursor.getColumnIndexOrThrow(projection[0]);
path = cursor.getString(columnIndex);
}
} catch (Exception e) {
if (cursor != null) {
cursor.close();
}
}
return path;
}
/**
* @param uri the Uri to check
* @return Whether the Uri authority is MediaProvider
*/
private static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}
private static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri.getAuthority());
}
/**
* @param uri the Uri to check
* @return Whether the Uri authority is DownloadsProvider
*/
private static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}
/**
* 将图片编码成 Base64字符串
*/
public static String Encode_To_Base64(String IMAGE_URL) {
File file = new File(IMAGE_URL);
FileInputStream inputStream;
try {
inputStream = new FileInputStream(IMAGE_URL);
byte[] buffer = new byte[(int) file.length()];
inputStream.read(buffer);
inputStream.close();
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(buffer);
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
} }
package com.gingersoft.gsa.cloud.common.utils.glide; package com.gingersoft.gsa.cloud.base.utils.glide;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.widget.ImageView; import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.bumptech.glide.Glide; import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.Request; import com.bumptech.glide.request.Request;
...@@ -11,7 +15,7 @@ import com.bumptech.glide.request.RequestOptions; ...@@ -11,7 +15,7 @@ import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.SizeReadyCallback; import com.bumptech.glide.request.target.SizeReadyCallback;
import com.bumptech.glide.request.target.Target; import com.bumptech.glide.request.target.Target;
import com.bumptech.glide.request.transition.Transition; import com.bumptech.glide.request.transition.Transition;
import com.gingersoft.gsa.cloud.common.utils.log.LogUtil; import com.gingersoft.gsa.cloud.base.utils.log.LogUtil;
import com.jess.arms.di.component.AppComponent; import com.jess.arms.di.component.AppComponent;
import com.jess.arms.http.imageloader.ImageLoader; import com.jess.arms.http.imageloader.ImageLoader;
import com.jess.arms.http.imageloader.glide.GlideArms; import com.jess.arms.http.imageloader.glide.GlideArms;
...@@ -19,15 +23,31 @@ import com.jess.arms.http.imageloader.glide.GlideRequest; ...@@ -19,15 +23,31 @@ import com.jess.arms.http.imageloader.glide.GlideRequest;
import com.jess.arms.http.imageloader.glide.GlideRequests; import com.jess.arms.http.imageloader.glide.GlideRequests;
import com.jess.arms.http.imageloader.glide.ImageConfigImpl; import com.jess.arms.http.imageloader.glide.ImageConfigImpl;
import com.jess.arms.utils.ArmsUtils; import com.jess.arms.utils.ArmsUtils;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
/** /**
* Description : 图片加载工具类 使用glide框架封装 * Description : 图片加载工具类 使用glide框架封装
*/ */
public class GlideUtils { public class GlideUtils {
public static void display(Context context, ImageView imageView, String url) {
if (imageView == null) {
throw new IllegalArgumentException("argument error");
}
//可以在任何可以拿到 Context 的地方,拿到 AppComponent,从而得到用 Dagger 管理的单例对象
AppComponent mAppComponent = ArmsUtils.obtainAppComponentFromContext(context);
ImageLoader mImageLoader = mAppComponent.imageLoader();//用于加载图片的管理类,默认使用 Glide,使用策略模式,可替换框架
mImageLoader.loadImage(context,
ImageConfigImpl
.builder()
.url(url)
.imageView(imageView)
.build());
}
public static void display(Context context, ImageView imageView, String url, int placeholder, int error, int fallback) { public static void display(Context context, ImageView imageView, String url, int placeholder, int error, int fallback) {
......
package com.gingersoft.gsa.cloud.base.utils.inputFilter;
import android.content.Context;
import android.text.InputFilter;
import android.util.Log;
import com.gingersoft.gsa.cloud.base.utils.other.TextUtil;
import com.gingersoft.gsa.cloud.base.utils.toast.ToastUtils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author 宇航.
* User: admin
* Date: 2020/11/25
* Time: 17:30
* Use:
*/
public class InputFilterUtils {
/**
* 只能輸入中英文和數字
*/
public static final Pattern ChAndEnAndNum = Pattern.compile("[-a-zA-Z0-9\u4E00-\u9FA5]+");
/**
* 只能輸入英文和數字
*/
public static final Pattern EnAndNum = Pattern.compile("[-a-zA-Z0-9]+");
/**
* emoji过滤器
*/
public static final Pattern emoji = Pattern.compile(
"[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]",
Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);
public static InputFilter getChAndEnAndNumInputFilter(Context mContext) {
return InputFilterUtils.getTypeFilter(mContext, "請輸入中英文和數字", InputFilterUtils.ChAndEnAndNum);
}
public static InputFilter getLengthFilter(Context mContext, int maxLength) {
return InputFilterUtils.getMaxLengthFilter(mContext, "最多" + maxLength + "個字哦~", maxLength);
}
/**
* source 新输入的字符串
* start 新输入的字符串起始下标,一般为0
* end 新输入的字符串终点下标,一般为source长度-1
* dest 输入之前文本框内容
* dstart 原内容起始坐标,一般为0
* dend 原内容终点坐标,一般为dest长度-1
*
* @param p
* @return
*/
public static InputFilter getTypeFilter(Context context, String tipString, Pattern p) {
return (source, start, end, dest, dstart, dend) -> {
Matcher m = p.matcher(source.toString());
Log.e("eee", "內容:" + source.toString());
if (!m.matches()) {
if (TextUtil.isNotEmptyOrNullOrUndefined(tipString)) {
ToastUtils.show(context, tipString);
}
return "";
}
return null;
};
}
public static InputFilter getMaxLengthFilter(Context context, String tipString, int maxLength) {
return (source, start, end, dest, dstart, dend) -> {
int keep = maxLength - (dest.length() - (dend - dstart));
if (keep <= 0) {
if (TextUtil.isNotEmptyOrNullOrUndefined(tipString)) {
ToastUtils.show(context, tipString);
}
return "";
} else if (keep >= end - start) {
return null; // keep original
} else {
keep += start;
if (Character.isHighSurrogate(source.charAt(keep - 1))) {
--keep;
if (keep == start) {
if (TextUtil.isNotEmptyOrNullOrUndefined(tipString)) {
ToastUtils.show(context, tipString);
}
return "";
}
}
return source.subSequence(start, keep);
}
};
}
public static InputFilter getMaxLengthFilterDisChAndEn(int maxLength) {
return (source, start, end, dest, dstart, dend) -> {
if (dest != null) {
int beforeLength = TextUtil.getStringLength(dest.toString());
int sourceLength = TextUtil.getStringLength(source.toString());
int keep = maxLength - beforeLength;
if (keep <= 0) {
return "";
} else if (keep >= sourceLength) {
return null; // keep original
} else {
keep += sourceLength;
if (Character.isHighSurrogate(source.charAt(keep - 1))) {
--keep;
if (keep == sourceLength) {
return "";
}
}
return source.subSequence(start, keep);
}
}
return null;
};
}
}
...@@ -182,6 +182,7 @@ public class OkHttp3Utils { ...@@ -182,6 +182,7 @@ public class OkHttp3Utils {
multipartBodyBuilder.addFormDataPart(key, params.get(key)); multipartBodyBuilder.addFormDataPart(key, params.get(key));
} }
} }
//遍历paths中所有图片绝对路径到builder,并约定key如“upload”作为后台接受多张图片的key //遍历paths中所有图片绝对路径到builder,并约定key如“upload”作为后台接受多张图片的key
if (files != null) { if (files != null) {
for (int i = 0; i < files.size(); i++) { for (int i = 0; i < files.size(); i++) {
...@@ -195,11 +196,13 @@ public class OkHttp3Utils { ...@@ -195,11 +196,13 @@ public class OkHttp3Utils {
RequestBuilder.url(reqUrl);// 添加URL地址 RequestBuilder.url(reqUrl);// 添加URL地址
RequestBuilder.post(requestBody); RequestBuilder.post(requestBody);
Request request = RequestBuilder.build(); Request request = RequestBuilder.build();
mOkHttpClient.newCall(request).enqueue(new Callback() { mOkHttpClient.newCall(request).enqueue(new Callback() {
@Override @Override
public void onFailure(Call call, IOException e) { public void onFailure(Call call, IOException e) {
// emitter.onError(e); // emitter.onError(e);
e.printStackTrace();
emitter.onComplete(); emitter.onComplete();
call.cancel(); call.cancel();
} }
......
...@@ -78,11 +78,48 @@ public class TextUtil { ...@@ -78,11 +78,48 @@ public class TextUtil {
* @return * @return
*/ */
public static String stringFilter(String str) { public static String stringFilter(String str) {
// 替换中文标号
str = str.replaceAll("【", "[").replaceAll("】", "]") str = str.replaceAll("【", "[").replaceAll("】", "]")
.replaceAll("!", "!").replaceAll(":", ":");// 替换中文标号 .replaceAll("!", "!").replaceAll(":", ":");
String regEx = "[『』]"; // 清除掉特殊字符 // 清除掉特殊字符
String regEx = "[『』]";
Pattern p = Pattern.compile(regEx); Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str); Matcher m = p.matcher(str);
return m.replaceAll("").trim(); return m.replaceAll("").trim();
} }
/**
* 判断是否中文
* GENERAL_PUNCTUATION 判断中文的“号
* CJK_SYMBOLS_AND_PUNCTUATION 判断中文的。号
* HALFWIDTH_AND_FULLWIDTH_FORMS 判断中文的,号
*
* @param c 字符
* @return 是否中文
*/
public static boolean isChinese(char c) {
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
return ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B
|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS
|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION;
}
/**
* @return 獲取字符串長度,區分中英文
*/
public static int getStringLength(String str) {
if (isEmptyOrNullOrUndefined(str)) {
return 0;
}
int length = 0;
for (int i = 0; i < str.length(); i++) {
length += isChinese(str.charAt(i)) ? 2 : 1;
}
return length;
}
} }
...@@ -2,6 +2,7 @@ package com.gingersoft.gsa.cloud.common.utils.time; ...@@ -2,6 +2,7 @@ package com.gingersoft.gsa.cloud.common.utils.time;
import android.content.Context; import android.content.Context;
import android.graphics.Color; import android.graphics.Color;
import android.view.View;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
...@@ -122,6 +123,30 @@ public class TimePickerUtils { ...@@ -122,6 +123,30 @@ public class TimePickerUtils {
return pvTime; return pvTime;
} }
public static TimePickerView showDatePicker(Context mContext, View view, OnTimeSelectListener onTimeSelectListener) {
//獲取今年第一天的日期
//打開時間選擇器
TimePickerView pvTime = new TimePickerBuilder(mContext, onTimeSelectListener)
.setType(new boolean[]{true, true, true, false, false, false})//默认全部显示
.setCancelText("取消")//取消按钮文字
.setSubmitText("確認")//确认按钮文字
.setContentTextSize(20)//滚轮文字大小
.setTitleSize(20)//标题文字大小
.setOutSideCancelable(true)//点击屏幕,点在控件外部范围时,是否取消显示
.isCyclic(false)//是否循环滚动
.setTextColorCenter(Color.BLACK)//设置选中项的颜色
.setTitleColor(Color.BLACK)//标题文字颜色
.setSubmitColor(Color.BLUE)//确定按钮文字颜色
.setCancelColor(Color.BLUE)//取消按钮文字颜色
.setLabel("", "", "", "", "", "")
.isCenterLabel(false) //是否只显示中间选中项的label文字,false则每项item全部都带有label。
.build();
//設置默認選中時間
pvTime.setDate(Calendar.getInstance());//注:根据需求来决定是否使用该方法(一般是精确到秒的情况),此项可以在弹出选择器的时候重新设置当前时间,避免在初始化之后由于时间已经设定,导致选中时间与当前时间不匹配的问题。
pvTime.show(view);
return pvTime;
}
/** /**
* 顯示報表頁面時間選擇樣式 * 顯示報表頁面時間選擇樣式
* *
......
package com.gingersoft.gsa.cloud.ui.adapter;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.core.content.ContextCompat;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.gingersoft.gsa.cloud.base.R;
import com.gingersoft.gsa.cloud.ui.bean.view.CategoryBean;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
/**
* @author 宇航.
* User: admin
* Date: 2020/11/28
* Time: 11:45
* Use:
*/
public class BaseCategoryAdapter extends BaseQuickAdapter<CategoryBean, BaseViewHolder> {
private int selectedIndex = 0;
private Drawable selectedBg;
private Drawable unSelectedBg;
private int selectColor = -1;
private int unSelectColor = -1;
public BaseCategoryAdapter(@Nullable List<CategoryBean> data, Context context) {
super(R.layout.item_category, data);
selectedBg = ContextCompat.getDrawable(context, R.drawable.shape_left_radio_shadow);
unSelectedBg = ContextCompat.getDrawable(context, R.color.trans);
}
@Override
protected void convert(@NotNull BaseViewHolder viewHolder, CategoryBean categoryBean) {
TextView tvCategoryName = viewHolder.getView(R.id.tv_category_name);
tvCategoryName.setText(categoryBean.getCategoryName());
LinearLayout view = viewHolder.getView(R.id.layout_category);
if (viewHolder.getAdapterPosition() == selectedIndex) {
if (selectedBg != null) {
view.setBackground(selectedBg);
}
if (selectColor != -1) {
viewHolder.setTextColor(R.id.tv_category_name, selectColor);
}
tvCategoryName.setSelected(true);
} else {
tvCategoryName.setSelected(false);
if (unSelectedBg != null) {
view.setBackground(unSelectedBg);
}
if (unSelectColor != -1) {
viewHolder.setTextColor(R.id.tv_category_name, unSelectColor);
}
}
}
public BaseCategoryAdapter setSelectedBg(Drawable selectedBg) {
this.selectedBg = selectedBg;
return this;
}
public BaseCategoryAdapter setUnSelectedBg(Drawable unSelectedBg) {
this.unSelectedBg = unSelectedBg;
return this;
}
public BaseCategoryAdapter setSelectColor(int selectColor) {
this.selectColor = selectColor;
return this;
}
public BaseCategoryAdapter setUnSelectColor(int unSelectColor) {
this.unSelectColor = unSelectColor;
return this;
}
public void setSelectedIndex(int selectedIndex) {
this.selectedIndex = selectedIndex;
notifyDataSetChanged();
}
public int getSelectedIndex() {
return selectedIndex;
}
}
package com.gingersoft.gsa.cloud.ui.adapter.multi;
import android.content.Context;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import com.chad.library.adapter.base.provider.BaseItemProvider;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.gingersoft.gsa.cloud.base.R;
import com.gingersoft.gsa.cloud.base.utils.other.TextUtil;
import com.gingersoft.gsa.cloud.bean.InfoMultiBean;
import com.gingersoft.gsa.cloud.bean.UploadPicMultiBean;
import org.jetbrains.annotations.NotNull;
import java.util.List;
/**
* @author 宇航.
* User: admin
* Date: 2020/10/29
* Time: 15:52
* Use:
*/
public class MultiUploadPicProvider<T extends InfoMultiBean> extends BaseItemProvider<T> {
public static final int CHOOSE_PHOTO = 101;
public MultiUploadPicProvider(Context context) {
this.context = context;
}
@Override
public int getItemViewType() {
return InfoMultiBean.EDIT_FOOD_ITEM_UPLOAD_PIC;
}
@Override
public int getLayoutId() {
return R.layout.item_multi_upload_pic;
}
@Override
public void convert(@NotNull BaseViewHolder baseViewHolder, T infoMultiBean) {
ImageView pic = baseViewHolder.getView(R.id.iv_multi_upload_pic);
//是否顯示必選
baseViewHolder.setGone(R.id.multi_required, !infoMultiBean.isRequired());
//設置標題
if (TextUtil.isNotEmptyOrNullOrUndefined(infoMultiBean.getShowTitle())) {
baseViewHolder.setText(R.id.tv_multi_title, infoMultiBean.getShowTitle());
} else {
baseViewHolder.setText(R.id.tv_multi_title, "");
}
if (infoMultiBean instanceof UploadPicMultiBean) {
UploadPicMultiBean uploadPicMultiBean = (UploadPicMultiBean) infoMultiBean;
List<String> picUrl = uploadPicMultiBean.getPicUrl();
if (picUrl != null && picUrl.size() > 0) {
Glide.with(context).load(picUrl.get(0)).into(pic);
} else if(uploadPicMultiBean.getDrawableId() != 0){
Glide.with(context).load(uploadPicMultiBean.getDrawableId()).into(pic);
}
}
}
}
package com.gingersoft.gsa.cloud.ui.adapter.multi;
import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import com.chad.library.adapter.base.provider.BaseItemProvider;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.gingersoft.gsa.cloud.base.R;
import com.gingersoft.gsa.cloud.base.utils.other.TextUtil;
import com.gingersoft.gsa.cloud.bean.InfoMultiBean;
import com.gingersoft.gsa.cloud.bean.MultiInputSelectBean;
import org.jetbrains.annotations.NotNull;
/**
* @author 宇航.
* User: admin
* Date: 2020/11/25
* Time: 10:02
* Use: 多個輸入框, 例如:供應鏈選擇包裝規格
*/
public class MultipleInputProvider<T extends InfoMultiBean> extends BaseItemProvider<T> {
private Context context;
public MultipleInputProvider(Context context) {
this.context = context;
}
@Override
public int getItemViewType() {
return InfoMultiBean.ITEM_MULTIPLE_INPUT_SELECT;
}
@Override
public int getLayoutId() {
return R.layout.item_multi_input_select;
}
@Override
public void convert(@NotNull BaseViewHolder baseViewHolder, T t) {
if (t instanceof MultiInputSelectBean) {
MultiInputSelectBean multiInputSelectBean = (MultiInputSelectBean) t;
//是否顯示必選
baseViewHolder.setGone(R.id.multi_required, !multiInputSelectBean.isRequired());
//設置標題
if (TextUtil.isNotEmptyOrNullOrUndefined(multiInputSelectBean.getShowTitle())) {
baseViewHolder.setText(R.id.tv_multi_title, multiInputSelectBean.getShowTitle());
} else {
baseViewHolder.setText(R.id.tv_multi_title, "");
}
EditText edFirst = baseViewHolder.getView(R.id.ed_multi_value_first);
initEditText(edFirst, multiInputSelectBean.getShowValue(), multiInputSelectBean.getHintText());
edFirst.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
multiInputSelectBean.setShowValue(s + "");
}
});
EditText edSecond = baseViewHolder.getView(R.id.ed_multi_value_second);
initEditText(edSecond, multiInputSelectBean.getShowValueSecond(), multiInputSelectBean.getHintTextSecond());
edFirst.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
multiInputSelectBean.setShowValueSecond(s + "");
}
});
EditText edThird = baseViewHolder.getView(R.id.ed_multi_value_third);
initEditText(edThird, multiInputSelectBean.getShowValueThird(), multiInputSelectBean.getHintTextThird());
edThird.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
multiInputSelectBean.setShowValueThird(s + "");
}
});
setFilters(edFirst, multiInputSelectBean);
setFilters(edSecond, multiInputSelectBean);
setFilters(edThird, multiInputSelectBean);
}
}
private void initEditText(EditText tvThird, String showValue, String hintText) {
if (TextUtil.isNotEmptyOrNullOrUndefined(showValue)) {
tvThird.setText(showValue);
} else if (TextUtil.isNotEmptyOrNullOrUndefined(hintText)) {
tvThird.setHint(hintText);
} else {
tvThird.setText("");
}
}
private void setFilters(EditText editText, MultiInputSelectBean multiInputSelectBean){
if (multiInputSelectBean.getInputFilters() != null) {
editText.setFilters(multiInputSelectBean.getInputFilters());
} else {
editText.setFilters(editText.getFilters());
}
if (multiInputSelectBean.getInputType() != -1) {
editText.setInputType(multiInputSelectBean.getInputType());
} else {
editText.setInputType(editText.getInputType());
}
}
}
\ No newline at end of file
package com.gingersoft.gsa.cloud.ui.adapter.multi;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import android.widget.TextView;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.gingersoft.gsa.cloud.base.R;
import com.gingersoft.gsa.cloud.base.utils.other.TextUtil;
import com.gingersoft.gsa.cloud.bean.InfoMultiBean;
import com.gingersoft.gsa.cloud.bean.MultiInputBean;
import org.jetbrains.annotations.NotNull;
/**
* @author 宇航.
* User: admin
* Date: 2020/10/29
* Time: 15:58
* Use: 備註輸入框樣式
*/
public class RemarkProvider<T extends InfoMultiBean> extends InputProvider<T> {
public final static int REMARK_TEXT_LENGTH = 100;
@Override
public int getItemViewType() {
return InfoMultiBean.ITEM_MULTIPLE_INPUT_REMARK;
}
@Override
public int getLayoutId() {
return R.layout.multi_input_remark;
}
@Override
public void convert(@NotNull BaseViewHolder baseViewHolder, T t) {
MultiInputBean infoMultiBean = (MultiInputBean) t;
EditText editText = baseViewHolder.getView(R.id.ed_multi_value);
baseViewHolder.setGone(R.id.tv_edit_text_length, infoMultiBean.getMaxLength() <= 0);
TextView tvEditLength = baseViewHolder.getView(R.id.tv_edit_text_length);
if (infoMultiBean.getMaxLength() > 0) {
tvEditLength.setText(editText.getText().length() + "/" + infoMultiBean.getMaxLength());
}
if (TextUtil.isNotEmptyOrNullOrUndefined(infoMultiBean.getShowValue())) {
editText.setText(infoMultiBean.getShowValue());
} else {
editText.setHint(infoMultiBean.getHintText());
editText.setText("");
}
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (s != null) {
int textLength = TextUtil.getStringLength(s.toString());
tvEditLength.setText(textLength + "/" + infoMultiBean.getMaxLength());
}
}
});
}
}
package com.gingersoft.gsa.cloud.ui.adapter.multi;
import android.content.Context;
import android.widget.TextView;
import com.chad.library.adapter.base.provider.BaseItemProvider;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.gingersoft.gsa.cloud.base.R;
import com.gingersoft.gsa.cloud.base.utils.other.TextUtil;
import com.gingersoft.gsa.cloud.bean.InfoMultiBean;
import org.jetbrains.annotations.NotNull;
/**
* @author admin
*/
public class SelectItemProvider<T extends InfoMultiBean> extends BaseItemProvider<T> {
private Context context;
public SelectItemProvider(Context context) {
this.context = context;
}
@Override
public int getItemViewType() {
return InfoMultiBean.EDIT_FOOD_ITEM_SELECT;
}
@Override
public int getLayoutId() {
return R.layout.item_multi_select;
}
@Override
public void convert(@NotNull BaseViewHolder baseViewHolder, T infoMultiBean) {
//是否顯示必選
baseViewHolder.setGone(R.id.multi_required, !infoMultiBean.isRequired());
//設置標題
if (TextUtil.isNotEmptyOrNullOrUndefined(infoMultiBean.getShowTitle())) {
baseViewHolder.setText(R.id.tv_multi_title, infoMultiBean.getShowTitle());
} else {
baseViewHolder.setText(R.id.tv_multi_title, "");
}
TextView textView = baseViewHolder.getView(R.id.ed_multi_value);
if (TextUtil.isNotEmptyOrNullOrUndefined(infoMultiBean.getShowValue())) {
textView.setText(infoMultiBean.getShowValue());
} else if (TextUtil.isNotEmptyOrNullOrUndefined(infoMultiBean.getHintText())) {
textView.setHint(infoMultiBean.getHintText());
}
}
}
package com.gingersoft.gsa.cloud.ui.bean.view;
import lombok.Data;
/**
* @author 宇航.
* User: admin
* Date: 2020/11/28
* Time: 11:45
* Use: 共用的分類型左側分類數據
*/
@Data
public class CategoryBean {
private int id;
private String categoryName;
public CategoryBean() {
}
public CategoryBean(int id, String categoryName) {
this.id = id;
this.categoryName = categoryName;
}
}
package com.gingersoft.gsa.cloud.ui.bean.view;
import com.qmuiteam.qmui.widget.section.QMUISection.Model;
import java.io.Serializable;
import java.util.List;
import java.util.Objects;
import lombok.Data;
/**
* 選中
*/
@Data
public class SectionCheckItem implements Model<SectionCheckItem>, Serializable {
private static final long serialVersionUID = 5714222336447667903L;
private int id;
private boolean isChecked = false;
private String text;
/**
* 子類
*/
private List<SectionCheckItem> sectionCheckItems;
/**
* 子類被選中的下標
*/
private int checkIndex = -1;
private int sort;
public SectionCheckItem(int id, String text, int sort) {
this.id = id;
this.text = text;
this.sort = sort;
}
public SectionCheckItem() {
}
public SectionCheckItem(int id, boolean isChecked, String text) {
this.id = id;
this.isChecked = isChecked;
this.text = text;
}
@Override
public SectionCheckItem cloneForDiff() {
return new SectionCheckItem(getId(), getText(), getSort());
}
@Override
public boolean isSameItem(SectionCheckItem other) {
return Objects.equals(text, other.text);
}
@Override
public boolean isSameContent(SectionCheckItem other) {
return true;
}
}
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/white" android:state_checked="true"/>
<item android:color="@color/white" android:state_pressed="true"/>
<item android:color="@color/color_3c"/>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/theme_color" android:state_enabled="true" />
<item android:color="@color/theme_color" android:state_pressed="true" />
<item android:color="@color/theme_color" android:state_checked="true" />
<item android:color="@color/color_3c" />
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/shape_app_btn_small_radius" android:state_checked="true" />
<item android:drawable="@drawable/shape_app_btn_small_radius" android:state_pressed="true" />
<item android:drawable="@drawable/shape_five_radius_gray_stroke" />
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_checked" android:state_checked="true" />
<item android:drawable="@drawable/ic_unchecked" />
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/shape_left_radio_shadow" android:state_checked="true" />
<item android:drawable="@drawable/shape_left_radio_shadow" android:state_enabled="true" />
<item android:drawable="@color/trans" />
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="@dimen/dp_14" />
<stroke
android:width="@dimen/dp_1"
android:color="@color/theme_color" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="@dimen/dp_8" />
<stroke
android:width="@dimen/dp_1"
android:color="@color/theme_color" />
<solid android:color="@color/white" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="@dimen/dp_8" />
<solid android:color="@color/purchase_buy_again_color" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="@dimen/dp_14" />
<stroke
android:width="@dimen/dp_1"
android:color="@color/color_da" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="@dimen/dp_1"
android:color="@color/color_bf" />
<corners android:radius="@dimen/dp_5" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/white" />
<corners
android:bottomLeftRadius="@dimen/dp_8"
android:topLeftRadius="@dimen/dp_8"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="@dimen/dp_4" />
<solid android:color="@color/other_order_details_print_btn_color" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/order_state0_color" />
<corners android:radius="@dimen/dp_8" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<com.qmuiteam.qmui.widget.QMUITopBar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/topbar"
android:layout_width="match_parent"
android:layout_height="@dimen/head_height"
android:background="@color/theme_color"
android:fitsSystemWindows="true"
app:qmui_topbar_title_color="@color/theme_white_color" />
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout_category"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/dp_5"
android:layout_marginTop="@dimen/dp_15"
android:elevation="@dimen/dp_5"
android:orientation="horizontal"
android:paddingTop="@dimen/dp_10"
android:paddingBottom="@dimen/dp_10"
app:cardElevation="@dimen/dp_10">
<TextView
android:id="@+id/tv_category_name"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:button="@null"
android:ellipsize="marquee"
android:gravity="center_vertical"
android:paddingLeft="@dimen/dp_5"
android:paddingRight="@dimen/dp_2"
android:singleLine="true"
android:textColor="@color/s_btn_blue_3c_text"
android:textSize="@dimen/dp_14"
android:textStyle="bold"
tools:text="果蔬類" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tool="http://schemas.android.com/tools"
android:id="@+id/layout_food_menu_select"
style="@style/Multi_Layout_Style"
android:layout_width="match_parent"
android:gravity="center_vertical">
<include
layout="@layout/item_multi_title_layout"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
<EditText
android:id="@+id/ed_multi_value_first"
style="@style/Multi_Input_editStyle"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="@dimen/dp_5"
android:minWidth="@dimen/dp_50"
tool:hint="最小數量" />
<TextView
style="@style/Multi_Input_titleStyle"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="—" />
<EditText
android:id="@+id/ed_multi_value_second"
style="@style/Multi_Input_editStyle"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="@dimen/dp_5"
android:minWidth="@dimen/dp_50"
tool:hint="最大數量" />
<TextView
style="@style/Multi_Input_titleStyle"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:minWidth="@dimen/dp_10"
android:text="/" />
<EditText
android:id="@+id/ed_multi_value_third"
style="@style/Multi_Input_editStyle"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:minWidth="@dimen/dp_40"
tool:hint="單位" />
<ImageView
android:layout_width="@dimen/dp_25"
android:layout_height="match_parent"
android:paddingLeft="@dimen/dp_6"
android:paddingTop="@dimen/dp_6"
android:paddingBottom="@dimen/dp_6"
android:src="@drawable/ic_black_next_arrow" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tool="http://schemas.android.com/tools"
android:id="@+id/layout_food_menu_select"
style="@style/Multi_Layout_Style"
android:layout_width="match_parent"
android:gravity="center_vertical">
<include layout="@layout/item_multi_title_layout" />
<EditText
android:id="@+id/ed_multi_value"
style="@style/Multi_Input_editStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/dp_5"
android:layout_weight="1"
tool:hint="默認為全時段" />
<ImageView
android:layout_width="@dimen/dp_25"
android:layout_height="match_parent"
android:paddingLeft="@dimen/dp_6"
android:paddingTop="@dimen/dp_6"
android:paddingBottom="@dimen/dp_6"
android:src="@drawable/ic_black_next_arrow" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:gravity="center_vertical"
android:layout_height="match_parent">
<TextView
android:id="@+id/multi_required"
style="@style/Multi_RequiredStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="*" />
<TextView
android:id="@+id/tv_multi_title"
style="@style/Multi_Input_titleStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="圖片上傳" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
style="@style/Multi_Layout_Style"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:descendantFocusability="afterDescendants"
android:paddingTop="@dimen/dp_20"
android:paddingBottom="@dimen/dp_20">
<include layout="@layout/item_multi_title_layout" />
<ImageView
android:id="@+id/iv_multi_upload_pic"
android:layout_width="@dimen/dp_96"
android:layout_height="@dimen/dp_96"
android:layout_marginLeft="@dimen/dp_38"
android:src="@drawable/png_upload_pic" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="@dimen/dp_55"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingLeft="@dimen/dp_18"
android:paddingRight="@dimen/dp_18">
<TextView
android:id="@+id/tv_radio_section_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textColor="@color/color_3c"
android:textSize="@dimen/dp_16"
tools:text="生鮮類" />
<CheckBox
android:id="@+id/cb_radio_section"
android:layout_width="@dimen/dp_24"
android:layout_height="@dimen/dp_24"
android:button="@drawable/selector_radio_circle_bg" />
</LinearLayout>
</FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<com.qmuiteam.qmui.widget.section.QMUIStickySectionLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/item_radio_section_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants"
android:gravity="center_vertical"
android:orientation="horizontal" />
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
style="@style/Multi_Layout_Style"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="@dimen/dp_55" android:layout_height="@dimen/multi_height"
android:paddingLeft="@dimen/multi_marginLeft" android:gravity="center_vertical">
android:paddingRight="@dimen/multi_marginLeft"
xmlns:tools="http://schemas.android.com/tools">
<TextView <include layout="@layout/item_multi_title_layout" />
android:id="@+id/multi_required"
style="@style/Multi_RequiredStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="*" />
<TextView
android:id="@+id/tv_multi_title"
style="@style/Multi_Input_titleStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="供應商編號" />
<EditText <EditText
android:id="@+id/ed_food_menu_value" android:id="@+id/ed_multi_value"
style="@style/Multi_Input_editStyle" style="@style/Multi_Input_editStyle"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_marginLeft="@dimen/dp_5"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginLeft="@dimen/dp_5"
android:layout_weight="1" android:layout_weight="1"
android:background="@null" android:background="@null"
tools:hint="請輸入食品組名稱" /> tools:hint="請輸入食品組名稱" />
<ImageView
android:id="@+id/iv_clear_multi_content"
android:layout_width="@dimen/dp_30"
android:layout_height="@dimen/dp_30"
android:layout_marginLeft="@dimen/dp_5"
android:padding="@dimen/dp_5"
android:src="@drawable/ic_clear_text"
android:visibility="gone" />
</LinearLayout> </LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
style="@style/Multi_Layout_Style"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="@dimen/dp_75">
<RelativeLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginLeft="@dimen/dp_5"
android:layout_weight="1">
<EditText
android:id="@+id/ed_multi_value"
style="@style/Multi_Input_editStyle"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_toLeftOf="@id/iv_clear_multi_content"
android:background="@null"
android:gravity="left"
android:paddingTop="@dimen/dp_10"
android:scrollbars="vertical"
tools:hint="請輸入食品組名稱" />
<ImageView
android:id="@+id/iv_clear_multi_content"
android:layout_width="@dimen/dp_30"
android:layout_height="@dimen/dp_30"
android:layout_alignParentRight="true"
android:layout_marginLeft="@dimen/dp_5"
android:padding="@dimen/dp_8"
android:src="@drawable/ic_clear_text"
android:visibility="gone" />
<TextView
android:id="@+id/tv_edit_text_length"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/hint_color"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_margin="@dimen/dp_5"
android:textSize="@dimen/dp_12"
tools:text="0/50" />
</RelativeLayout>
</LinearLayout>
\ No newline at end of file
...@@ -7,34 +7,23 @@ ...@@ -7,34 +7,23 @@
android:orientation="vertical"> android:orientation="vertical">
<LinearLayout <LinearLayout
style="@style/Multi_Layout_Style"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="@dimen/dp_55"
android:gravity="center_vertical" android:gravity="center_vertical"
android:orientation="horizontal" android:orientation="horizontal">
android:paddingLeft="@dimen/multi_marginLeft"
android:paddingRight="@dimen/multi_marginLeft">
<TextView <include
android:id="@+id/multi_required" layout="@layout/item_multi_title_layout"
style="@style/Multi_RequiredStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="*" />
<TextView
android:id="@+id/tv_multi_title"
style="@style/Multi_Input_titleStyle"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1" />
tools:text="供應商編號" />
<CheckBox <CheckBox
android:id="@+id/rb_multi" android:id="@+id/rb_multi"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:button="@color/trans" android:button="@color/trans"
android:drawableLeft="@drawable/selector_radio_bg" android:drawableLeft="@drawable/selector_radio_hook_bg"
android:drawablePadding="@dimen/dp_5" android:drawablePadding="@dimen/dp_5"
android:text="選擇" android:text="選擇"
android:textColor="@color/color_3c" android:textColor="@color/color_3c"
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent" style="@style/Multi_Layout_Style"
android:layout_height="@dimen/dp_55" >
android:paddingLeft="@dimen/multi_marginLeft"
android:paddingRight="@dimen/multi_marginLeft">
<TextView
android:id="@+id/multi_required"
style="@style/Multi_RequiredStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="*" />
<TextView <include layout="@layout/item_multi_title_layout" />
android:id="@+id/tv_multi_title"
style="@style/Multi_Input_titleStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="供應商編號" />
<TextView <TextView
android:id="@+id/tv_provider_select_text" android:id="@+id/tv_provider_select_text"
......
...@@ -22,15 +22,8 @@ ...@@ -22,15 +22,8 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:textSize="@dimen/dp_40"/> android:textSize="@dimen/dp_40" />
<TextView
android:id="@+id/tv_kitchen_print_quantity"
style="@style/Print_kitchen_table_number_text_style"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/dp_30"
tools:text="統計數量" />
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
...@@ -206,14 +199,32 @@ ...@@ -206,14 +199,32 @@
android:textSize="@dimen/dp_48" android:textSize="@dimen/dp_48"
android:textStyle="bold" /> android:textStyle="bold" />
<TextView <RelativeLayout
android:id="@+id/tv_prj_page_index" android:layout_width="match_parent"
style="@style/Print_kitchen_table_number_text_style"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="@dimen/dp_20" android:layout_marginTop="@dimen/dp_20"
android:textSize="@dimen/dp_28" android:orientation="horizontal">
tools:text="1/2" />
<TextView
android:id="@+id/tv_prj_page_index"
style="@style/Print_kitchen_table_number_text_style"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_gravity="center_horizontal"
android:textSize="@dimen/dp_28"
tools:text="1/2" />
<TextView
android:id="@+id/tv_kitchen_print_quantity"
style="@style/Print_kitchen_table_number_text_style"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:textSize="@dimen/dp_30"
tools:text="統計數量" />
</RelativeLayout>
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
\ No newline at end of file
...@@ -470,7 +470,10 @@ ...@@ -470,7 +470,10 @@
<color name="color_ea">#EAEAEA</color> <color name="color_ea">#EAEAEA</color>
<color name="color_4c">#4c4c4c</color> <color name="color_4c">#4c4c4c</color>
<color name="color_f3">#F3F3F3</color> <color name="color_f3">#F3F3F3</color>
<color name="color_bf">#BFBFBF</color>
<color name="color_da">#DADADA</color>
<color name="color_68">#686868</color>
<color name="color_222">#222222</color>
<color name="tran_twenty_send_order_btn_bg_color">#331196DB</color> <color name="tran_twenty_send_order_btn_bg_color">#331196DB</color>
<color name="tran_fifty_order_state0_color">#7F009788</color> <color name="tran_fifty_order_state0_color">#7F009788</color>
<!-- 待確認背景色--> <!-- 待確認背景色-->
...@@ -518,4 +521,10 @@ ...@@ -518,4 +521,10 @@
<color name="supply_function_color">#94918F</color> <color name="supply_function_color">#94918F</color>
<!-- 供應鏈頁面背景色--> <!-- 供應鏈頁面背景色-->
<color name="supply_chain_bg_color">#EEF2F5</color> <color name="supply_chain_bg_color">#EEF2F5</color>
<color name="supply_chain_category_title_bg">#2CA0EA</color>
<color name="purchase_total_price_text_color">#EC2D2D</color>
<color name="purchase_buy_again_color">#6EC581</color>
</resources> </resources>
...@@ -485,6 +485,9 @@ ...@@ -485,6 +485,9 @@
<dimen name="settlement_report_text_size">@dimen/sp_18</dimen> <dimen name="settlement_report_text_size">@dimen/sp_18</dimen>
<dimen name="switcher_elevation">4dp</dimen> <dimen name="switcher_elevation">4dp</dimen>
<!-- 多類型adapter marginLeft -->
<dimen name="multi_marginLeft">@dimen/dp_18</dimen> <dimen name="multi_marginLeft">@dimen/dp_18</dimen>
<!-- 多類型adapter 高度:輸入item,選擇item -->
<dimen name="multi_height">@dimen/dp_55</dimen>
</resources> </resources>
\ No newline at end of file
...@@ -440,5 +440,27 @@ ...@@ -440,5 +440,27 @@
<item name="android:textSize">@dimen/dp_16</item> <item name="android:textSize">@dimen/dp_16</item>
<item name="android:gravity">center_vertical|right</item> <item name="android:gravity">center_vertical|right</item>
<item name="android:textColor">@color/color_3c</item> <item name="android:textColor">@color/color_3c</item>
<item name="android:background">@null</item>
</style>
<style name="Multi_Layout_Style">
<item name="android:layout_height">@dimen/multi_height</item>
<item name="android:paddingLeft">@dimen/multi_marginLeft</item>
<item name="android:paddingRight">@dimen/multi_marginLeft</item>
</style>
<style name="Save_Btn_Style">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:background">@drawable/shape_app_btn_small_radius</item>
<item name="android:gravity">center</item>
<item name="android:textColor">@color/white</item>
<item name="android:textSize">@dimen/dp_16</item>
</style> </style>
<style name="Cancel_Btn_Style" parent="Save_Btn_Style">
<item name="android:background">@drawable/shape_black_border_small_radius</item>
<item name="android:textColor">@color/color_3c</item>
</style>
</resources> </resources>
<?xml version="1.0" encoding="utf-8"?>
<!-- <root-path/> :代表设备的根目录new File("/")
<files-path/> : 代表context.getFilesDir()
<cache-path/> : 代表context.getCacheDir()
<external-path/> : 代表Environment.getExternalStorageDirectory()
<external-files-path/> : 代表context.getExternalFilesDirs()
<external-cache-path/> : 代表getExternalCacheDirs() -->
<!--
path节点支持name和path两个属性,配置了path属性就相当于在相应路径下子目录,例如:
<external-path
name="external"
path="phototest" />
这样配置就代表应用可以使用Environment.getExternalStorageDirectory()/phototest 目录以及其子目录的文件
-->
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<root-path
name="root"
path="" />
<files-path
name="files"
path="" />
<cache-path
name="cache"
path="" />
<external-path
name="external"
path="image" />
<external-files-path
name="external_file_path"
path="" />
<external-cache-path
name="external_cache_path"
path="" />
</paths>
\ No newline at end of file
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
android:networkSecurityConfig="@xml/network_android" android:networkSecurityConfig="@xml/network_android"
android:resizeableActivity="true" android:resizeableActivity="true"
android:roundIcon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher"
android:requestLegacyExternalStorage="true"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/AppTheme" android:theme="@style/AppTheme"
tools:replace="android:label"> tools:replace="android:label">
...@@ -70,6 +71,17 @@ ...@@ -70,6 +71,17 @@
<meta-data <meta-data
android:name="notch.config" android:name="notch.config"
android:value="portrait|landscape" /> android:value="portrait|landscape" />
<!--适配android 7.0文件访问 -->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.gingersoft.gsa.cloud.login"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application> </application>
</manifest> </manifest>
...@@ -15,17 +15,13 @@ import androidx.recyclerview.widget.LinearLayoutManager; ...@@ -15,17 +15,13 @@ import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.billy.cc.core.component.CC; import com.billy.cc.core.component.CC;
import com.gingersoft.gsa.cloud.common.core.restaurant.BrandInfo; import com.gingersoft.gsa.cloud.app.GsaCloudApplication;
import com.gingersoft.gsa.cloud.common.core.restaurant.RestaurantInfo; import com.gingersoft.gsa.cloud.base.utils.JsonUtils;
import com.gingersoft.gsa.cloud.common.core.restaurant.ResturantInfoManager; import com.gingersoft.gsa.cloud.base.utils.RestaurantInfoUtils;
import com.gingersoft.gsa.cloud.common.core.user.UserContext; import com.gingersoft.gsa.cloud.base.utils.log.LogUtil;
import com.gingersoft.gsa.cloud.common.utils.JsonUtils; import com.gingersoft.gsa.cloud.base.utils.other.TextUtil;
import com.gingersoft.gsa.cloud.common.core.restaurant.utils.RestaurantInfoUtils; import com.gingersoft.gsa.cloud.base.widget.DialogUtils;
import com.gingersoft.gsa.cloud.common.utils.log.LogUtil; import com.gingersoft.gsa.cloud.constans.AppConstans;
import com.gingersoft.gsa.cloud.common.utils.other.TextUtil;
import com.gingersoft.gsa.cloud.common.ui.widget.dialog.DialogUtils;
import com.gingersoft.gsa.cloud.component.ComponentName;
import com.gingersoft.gsa.cloud.common.constans.AppConstans;
import com.gingersoft.gsa.cloud.login.R; import com.gingersoft.gsa.cloud.login.R;
import com.gingersoft.gsa.cloud.login.R2; import com.gingersoft.gsa.cloud.login.R2;
import com.gingersoft.gsa.cloud.login.mvp.bean.LoginLimitBean; import com.gingersoft.gsa.cloud.login.mvp.bean.LoginLimitBean;
...@@ -34,11 +30,11 @@ import com.gingersoft.gsa.cloud.login.mvp.ui.activity.di.module.ChooseRestaurant ...@@ -34,11 +30,11 @@ import com.gingersoft.gsa.cloud.login.mvp.ui.activity.di.module.ChooseRestaurant
import com.gingersoft.gsa.cloud.login.mvp.ui.activity.mvp.contract.ChooseRestaurantContract; import com.gingersoft.gsa.cloud.login.mvp.ui.activity.mvp.contract.ChooseRestaurantContract;
import com.gingersoft.gsa.cloud.login.mvp.ui.activity.mvp.presenter.ChooseRestaurantPresenter; import com.gingersoft.gsa.cloud.login.mvp.ui.activity.mvp.presenter.ChooseRestaurantPresenter;
import com.gingersoft.gsa.cloud.login.mvp.ui.adapter.LoginLimitAdapter; import com.gingersoft.gsa.cloud.login.mvp.ui.adapter.LoginLimitAdapter;
import com.gingersoft.gsa.cloud.common.ui.adapter.BasTextSectiontAdapter; import com.gingersoft.gsa.cloud.ui.adapter.BasTextSectiontAdapter;
import com.gingersoft.gsa.cloud.common.ui.bean.mode.BrandsBean; import com.gingersoft.gsa.cloud.ui.bean.mode.BrandsBean;
import com.gingersoft.gsa.cloud.common.ui.bean.view.SectionHeader; import com.gingersoft.gsa.cloud.ui.bean.view.SectionHeader;
import com.gingersoft.gsa.cloud.common.ui.bean.view.SectionRestaurantItem; import com.gingersoft.gsa.cloud.ui.bean.view.SectionRestaurantItem;
import com.gingersoft.gsa.cloud.common.ui.widget.dialog.LoadingDialog; import com.gingersoft.gsa.cloud.ui.widget.dialog.LoadingDialog;
import com.jess.arms.base.BaseActivity; import com.jess.arms.base.BaseActivity;
import com.jess.arms.di.component.AppComponent; import com.jess.arms.di.component.AppComponent;
import com.jess.arms.integration.AppManager; import com.jess.arms.integration.AppManager;
...@@ -118,7 +114,7 @@ public class ChooseRestaurantActivity extends BaseActivity<ChooseRestaurantPrese ...@@ -118,7 +114,7 @@ public class ChooseRestaurantActivity extends BaseActivity<ChooseRestaurantPrese
@Override @Override
public void initTopBar() { public void initTopBar() {
mTopBar.setBackgroundColor(ContextCompat.getColor(mContext, mTopBar.setBackgroundColor(ContextCompat.getColor(mContext,
com.gingersoft.gsa.cloud.common.R.color.theme_color)); com.gingersoft.gsa.cloud.base.R.color.theme_color));
mTopBar.addLeftBackImageButton().setOnClickListener(v -> { mTopBar.addLeftBackImageButton().setOnClickListener(v -> {
if (TextUtil.isNotEmptyOrNullOrUndefined(form) && form.equals(WelcomeActivity.class.getName())) { if (TextUtil.isNotEmptyOrNullOrUndefined(form) && form.equals(WelcomeActivity.class.getName())) {
launchActivity(new Intent(mContext, LoginActivity.class)); launchActivity(new Intent(mContext, LoginActivity.class));
...@@ -170,48 +166,22 @@ public class ChooseRestaurantActivity extends BaseActivity<ChooseRestaurantPrese ...@@ -170,48 +166,22 @@ public class ChooseRestaurantActivity extends BaseActivity<ChooseRestaurantPrese
@Override @Override
public void saveRestaurantListInfo(List<BrandsBean.BrandsData> brands) { public void saveRestaurantListInfo(List<BrandsBean.BrandsData> brands) {
// int restaurantSize = 0;
List<BrandsBean.BrandsData> brandsBeans = new ArrayList<>(); List<BrandsBean.BrandsData> brandsBeans = new ArrayList<>();
if (brands != null) { if (brands != null) {
// String brandRestaurantInfos = JsonUtils.toJson(brands); String brandRestaurantInfos = JsonUtils.toJson(brands);
// GsaCloudApplication.setBrandRestaurantInfos(mContext, brandRestaurantInfos); GsaCloudApplication.setBrandRestaurantInfos(mContext, brandRestaurantInfos);
ResturantInfoManager.putBrandRestaurantInfos(JsonUtils.toJson(brands));
brandsBeans.addAll(brands); brandsBeans.addAll(brands);
// restaurantSize = RestaurantInfoUtils.getRestaurantSize(brands);
} }
// boolean autoLogin = (boolean) SPUtils.get(mContext, UserConstans.AUTO_LOGIN, false);
// if (autoLogin) {
// int restaurantId = ResturantInfoManager.newInstance().getRestaurantId();
// if (restaurantId != 0) {
// //上一次進入app有選擇餐廳,通過餐廳ID獲取允許的最大登陸數
//// mPresenter.getLoginLimit(restaurantId, false);
// jumpMainActivity();
// return;
// }
// }
// if (restaurantSize == 1) {
// //只有一個品牌是直接進下載頁面
// BrandsBean.BrandsData brandsBean = RestaurantInfoUtils.getOnlyBrand(brands);
// BrandsBean.BrandsData.RestaurantsBean restaurantsBean = RestaurantInfoUtils.getOnlyRestaurant(brands);
// if (brandsBean != null) {
// saveBrandAndRestaurantInfo(brandsBean.getBrandId(), brandsBean.getBrandName(), restaurantsBean);
// //通過餐廳ID獲取允許的最大登陸數
//// mPresenter.getLoginLimit(restaurantsBean.getRestaurantId(), true);
// }
// jumpDownloadActivity();
// } else {
showChooseRestaurantDialog(brandsBeans, brands); showChooseRestaurantDialog(brandsBeans, brands);
// }
} }
protected void saveBrandAndRestaurantInfo(int brandId, String brandName, BrandsBean.BrandsData.RestaurantsBean restaurantsBean) { protected void saveBrandAndRestaurantInfo(int brandId, String brandName, BrandsBean.BrandsData.RestaurantsBean restaurantsBean) {
ResturantInfoManager.newInstance().setBrandInfo(new BrandInfo(brandId, brandName)); GsaCloudApplication.setBrandId(mContext, brandId);
GsaCloudApplication.setBrandName(mContext, brandName);
if (restaurantsBean != null) { if (restaurantsBean != null) {
ResturantInfoManager.newInstance().setResturantInfo(new RestaurantInfo(restaurantsBean.getRestaurantId(),restaurantsBean.getRestaurantName() GsaCloudApplication.setRestaurantId(mContext, restaurantsBean.getRestaurantId());
,restaurantsBean.getGsPosShopId())); GsaCloudApplication.setRestaurantName(mContext, restaurantsBean.getRestaurantName());
GsaCloudApplication.setGsPosShopId(mContext, restaurantsBean.getGsPosShopId());
} }
} }
...@@ -249,7 +219,6 @@ public class ChooseRestaurantActivity extends BaseActivity<ChooseRestaurantPrese ...@@ -249,7 +219,6 @@ public class ChooseRestaurantActivity extends BaseActivity<ChooseRestaurantPrese
return false; return false;
} }
}); });
mSectionLayout.setAdapter(mAdapter, true); mSectionLayout.setAdapter(mAdapter, true);
mQmuiSections = restaurantsTransformToSection(brandsBean); mQmuiSections = restaurantsTransformToSection(brandsBean);
...@@ -260,7 +229,7 @@ public class ChooseRestaurantActivity extends BaseActivity<ChooseRestaurantPrese ...@@ -260,7 +229,7 @@ public class ChooseRestaurantActivity extends BaseActivity<ChooseRestaurantPrese
//切換餐廳,發送關閉接單的廣播,並清除心跳 //切換餐廳,發送關閉接單的廣播,並清除心跳
sendBroadcast(new Intent(AppConstans.CLEAR_ORDER_RECEIVING_HEART)); sendBroadcast(new Intent(AppConstans.CLEAR_ORDER_RECEIVING_HEART));
//关闭Prj打印服務 //关闭Prj打印服務
CC.obtainBuilder(ComponentName.COMPONENT_PRINT) CC.obtainBuilder("Component.Print")
.setActionName("stopPrintService") .setActionName("stopPrintService")
.build() .build()
.call(); .call();
...@@ -269,7 +238,6 @@ public class ChooseRestaurantActivity extends BaseActivity<ChooseRestaurantPrese ...@@ -269,7 +238,6 @@ public class ChooseRestaurantActivity extends BaseActivity<ChooseRestaurantPrese
saveBrandAndRestaurantInfo(brandsBean.getBrandId(), brandsBean.getBrandName(), item); saveBrandAndRestaurantInfo(brandsBean.getBrandId(), brandsBean.getBrandName(), item);
mPresenter.getLoginLimit(item.getRestaurantId(), true); mPresenter.getLoginLimit(item.getRestaurantId(), true);
} }
// jumpDownloadActivity();
} }
@Override @Override
...@@ -281,7 +249,7 @@ public class ChooseRestaurantActivity extends BaseActivity<ChooseRestaurantPrese ...@@ -281,7 +249,7 @@ public class ChooseRestaurantActivity extends BaseActivity<ChooseRestaurantPrese
@Override @Override
public void jumpDownloadActivity() { public void jumpDownloadActivity() {
killBeforeActivity(); killBeforeActivity();
CC.obtainBuilder(ComponentName.COMPONENT_DOWNLOAD) CC.obtainBuilder("Component.Download")
.setActionName("showDownloadActivity") .setActionName("showDownloadActivity")
.addParam("fromPage", 1) .addParam("fromPage", 1)
.build() .build()
...@@ -301,6 +269,7 @@ public class ChooseRestaurantActivity extends BaseActivity<ChooseRestaurantPrese ...@@ -301,6 +269,7 @@ public class ChooseRestaurantActivity extends BaseActivity<ChooseRestaurantPrese
} }
} }
} }
@Override @Override
public void jumpActivity(Class activity) { public void jumpActivity(Class activity) {
startActivity(new Intent(this, activity)); startActivity(new Intent(this, activity));
...@@ -308,7 +277,7 @@ public class ChooseRestaurantActivity extends BaseActivity<ChooseRestaurantPrese ...@@ -308,7 +277,7 @@ public class ChooseRestaurantActivity extends BaseActivity<ChooseRestaurantPrese
@Override @Override
public void jumpMainActivity() { public void jumpMainActivity() {
CC.obtainBuilder(ComponentName.COMPONENT_MAIN) CC.obtainBuilder("Component.Main")
.setActionName("showMainActivity") .setActionName("showMainActivity")
.build() .build()
.call(); .call();
...@@ -322,7 +291,6 @@ public class ChooseRestaurantActivity extends BaseActivity<ChooseRestaurantPrese ...@@ -322,7 +291,6 @@ public class ChooseRestaurantActivity extends BaseActivity<ChooseRestaurantPrese
private DialogUtils dialogUtils; private DialogUtils dialogUtils;
private int loginNum = 0; private int loginNum = 0;
@Override
public void showLoginLimit(List<LoginLimitBean> loginLimitBeans) { public void showLoginLimit(List<LoginLimitBean> loginLimitBeans) {
if (loginLimitBeans != null) { if (loginLimitBeans != null) {
dialogUtils = new DialogUtils(mContext, R.layout.login_limit_dialog_layout) { dialogUtils = new DialogUtils(mContext, R.layout.login_limit_dialog_layout) {
......
...@@ -65,12 +65,6 @@ public class FoodMenuMangerRightAdapter extends BaseDelegateMultiAdapter<Food, B ...@@ -65,12 +65,6 @@ public class FoodMenuMangerRightAdapter extends BaseDelegateMultiAdapter<Food, B
@Override @Override
public int getSectionForPosition(int position) { public int getSectionForPosition(int position) {
// int i1 = foodGroups.indexOf(foods.get(position));
// for (int i = 0; i < foodGroups.size(); i++) {
// if (foods.get(position).getId().equals(foodGroups.get(i).getId())) {
// return i;
// }
// }
return foodGroups.indexOf(foods.get(position)); return foodGroups.indexOf(foods.get(position));
} }
......
...@@ -25,6 +25,6 @@ public class PicUploadPicProvider extends FoodMenuItemProvider { ...@@ -25,6 +25,6 @@ public class PicUploadPicProvider extends FoodMenuItemProvider {
@Override @Override
public int getLayoutId() { public int getLayoutId() {
return R.layout.item_upload_pic; return R.layout.item_multi_upload_pic;
} }
} }
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:drawableLeft="@drawable/selector_radio_bg" android:drawableLeft="@drawable/selector_radio_hook_bg"
android:button="@null" android:button="@null"
android:background="@null" android:background="@null"
android:drawablePadding="@dimen/dp_6" android:drawablePadding="@dimen/dp_6"
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:button="@drawable/selector_radio_bg" android:button="@drawable/selector_radio_hook_bg"
android:background="@null" android:background="@null"
android:drawablePadding="@dimen/dp_6"/> android:drawablePadding="@dimen/dp_6"/>
......
...@@ -14,10 +14,11 @@ import com.gingersoft.gsa.cloud.common.utils.other.TextUtil; ...@@ -14,10 +14,11 @@ import com.gingersoft.gsa.cloud.common.utils.other.TextUtil;
import com.gingersoft.gsa.cloud.common.utils.time.TimeUtils; import com.gingersoft.gsa.cloud.common.utils.time.TimeUtils;
import com.gingersoft.gsa.cloud.common.constans.ExpandConstant; import com.gingersoft.gsa.cloud.common.constans.ExpandConstant;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean; import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.joe.print.R;
import com.gingersoft.gsa.cloud.common.core.print.bean.PrjBean; import com.gingersoft.gsa.cloud.common.core.print.bean.PrjBean;
import com.joe.print.mvp.model.bean.HtmlLable; import com.joe.print.mvp.model.bean.HtmlLable;
import com.joe.print.mvp.print.common.HtmlContract; import com.joe.print.mvp.print.common.HtmlContract;
import com.gingersoft.gsa.cloud.print.bean.PrjBean;
import com.joe.print.R;
import com.joe.print.mvp.ui.adapter.KitChenPrjPrintFoodAdapter; import com.joe.print.mvp.ui.adapter.KitChenPrjPrintFoodAdapter;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -367,7 +368,9 @@ public class PrintPrjKitchen extends PrinterRoot { ...@@ -367,7 +368,9 @@ public class PrintPrjKitchen extends PrinterRoot {
//操作人員 //操作人員
tvOperator.setText(prjBean.getUserName()); tvOperator.setText(prjBean.getUserName());
if (RestaurantExpandInfoUtils.getValue(ExpandConstant.PrintPage, false)) { if (RestaurantExpandInfoUtils.getValue(ExpandConstant.PrintPage, false)) {
tvCurrentPageIndex.setText(prjBean.getCurrentIndex() + "/" + prjBean.getTotalPrj()); if (prjBean.getCurrentIndex() <= prjBean.getTotalPrj()) {
tvCurrentPageIndex.setText(prjBean.getCurrentIndex() + "/" + prjBean.getTotalPrj());
}
} }
return viewToZoomBitmap(context, view, printerDeviceBean); return viewToZoomBitmap(context, view, printerDeviceBean);
} }
......
...@@ -336,7 +336,6 @@ public class PrjService extends Service implements ReceiveListener { ...@@ -336,7 +336,6 @@ public class PrjService extends Service implements ReceiveListener {
private void newPrint(String json) { private void newPrint(String json) {
printDatas.clear(); printDatas.clear();
// listMap.clear();
Map<String, List<PrjBean.DataBean.Bean>> listMap = new HashMap<>(); Map<String, List<PrjBean.DataBean.Bean>> listMap = new HashMap<>();
currentIndex = 0; currentIndex = 0;
totalPrj = 0; totalPrj = 0;
......
...@@ -62,6 +62,7 @@ dependencies { ...@@ -62,6 +62,7 @@ dependencies {
api rootProject.ext.dependencies["annotations"] api rootProject.ext.dependencies["annotations"]
api rootProject.ext.dependencies["design"] api rootProject.ext.dependencies["design"]
api rootProject.ext.dependencies["constraintlayout"] api rootProject.ext.dependencies["constraintlayout"]
implementation 'androidx.viewpager2:viewpager2:1.0.0'
// lintChecks project(':qm-lintrule') // lintChecks project(':qm-lintrule')
//test //test
......
...@@ -48,14 +48,14 @@ import android.view.Gravity; ...@@ -48,14 +48,14 @@ import android.view.Gravity;
import android.view.View; import android.view.View;
import android.view.animation.Interpolator; import android.view.animation.Interpolator;
import com.qmuiteam.qmui.R;
import androidx.annotation.ColorInt; import androidx.annotation.ColorInt;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
import androidx.core.text.TextDirectionHeuristicsCompat; import androidx.core.text.TextDirectionHeuristicsCompat;
import androidx.core.view.GravityCompat; import androidx.core.view.GravityCompat;
import androidx.core.view.ViewCompat; import androidx.core.view.ViewCompat;
import com.qmuiteam.qmui.R;
public final class QMUICollapsingTextHelper { public final class QMUICollapsingTextHelper {
// Pre-JB-MR2 doesn't support HW accelerated canvas scaled text so we will workaround it // Pre-JB-MR2 doesn't support HW accelerated canvas scaled text so we will workaround it
...@@ -106,6 +106,7 @@ public final class QMUICollapsingTextHelper { ...@@ -106,6 +106,7 @@ public final class QMUICollapsingTextHelper {
private Typeface mCollapsedTypeface; private Typeface mCollapsedTypeface;
private Typeface mExpandedTypeface; private Typeface mExpandedTypeface;
private Typeface mCurrentTypeface; private Typeface mCurrentTypeface;
private float mTypefaceUpdateAreaPercent;
private CharSequence mText; private CharSequence mText;
private CharSequence mTextToDraw; private CharSequence mTextToDraw;
...@@ -225,9 +226,7 @@ public final class QMUICollapsingTextHelper { ...@@ -225,9 +226,7 @@ public final class QMUICollapsingTextHelper {
mCollapsedShadowRadius = a.getFloat(R.styleable.QMUITextAppearance_android_shadowRadius, 0); mCollapsedShadowRadius = a.getFloat(R.styleable.QMUITextAppearance_android_shadowRadius, 0);
a.recycle(); a.recycle();
if (Build.VERSION.SDK_INT >= 16) { mCollapsedTypeface = readFontFamilyTypeface(resId);
mCollapsedTypeface = readFontFamilyTypeface(resId);
}
recalculate(); recalculate();
} }
...@@ -251,9 +250,7 @@ public final class QMUICollapsingTextHelper { ...@@ -251,9 +250,7 @@ public final class QMUICollapsingTextHelper {
R.styleable.QMUITextAppearance_android_shadowRadius, 0); R.styleable.QMUITextAppearance_android_shadowRadius, 0);
a.recycle(); a.recycle();
if (Build.VERSION.SDK_INT >= 16) { mExpandedTypeface = readFontFamilyTypeface(resId);
mExpandedTypeface = readFontFamilyTypeface(resId);
}
recalculate(); recalculate();
} }
...@@ -391,6 +388,10 @@ public final class QMUICollapsingTextHelper { ...@@ -391,6 +388,10 @@ public final class QMUICollapsingTextHelper {
return false; return false;
} }
public void setTypefaceUpdateAreaPercent(float typefaceUpdateAreaPercent) {
mTypefaceUpdateAreaPercent = typefaceUpdateAreaPercent;
}
public final boolean isStateful() { public final boolean isStateful() {
return (mCollapsedTextColor != null && mCollapsedTextColor.isStateful()) return (mCollapsedTextColor != null && mCollapsedTextColor.isStateful())
|| (mExpandedTextColor != null && mExpandedTextColor.isStateful()); || (mExpandedTextColor != null && mExpandedTextColor.isStateful());
...@@ -631,12 +632,12 @@ public final class QMUICollapsingTextHelper { ...@@ -631,12 +632,12 @@ public final class QMUICollapsingTextHelper {
final float newTextSize; final float newTextSize;
boolean updateDrawText = false; boolean updateDrawText = false;
if(mExpandedFraction == 1f){ if(mExpandedFraction >= 1f - mTypefaceUpdateAreaPercent){
if (mCurrentTypeface != mCollapsedTypeface) { if (mCurrentTypeface != mCollapsedTypeface) {
mCurrentTypeface = mCollapsedTypeface; mCurrentTypeface = mCollapsedTypeface;
updateDrawText = true; updateDrawText = true;
} }
}else if(mExpandedFraction == 0f){ }else if(mExpandedFraction <= mTypefaceUpdateAreaPercent){
if (mCurrentTypeface != mExpandedTypeface) { if (mCurrentTypeface != mExpandedTypeface) {
mCurrentTypeface = mExpandedTypeface; mCurrentTypeface = mExpandedTypeface;
updateDrawText = true; updateDrawText = true;
...@@ -799,7 +800,7 @@ public final class QMUICollapsingTextHelper { ...@@ -799,7 +800,7 @@ public final class QMUICollapsingTextHelper {
} }
public static float lerp(float startValue, float endValue, float fraction, public static float lerp(float startValue, float endValue, float fraction,
Interpolator interpolator) { Interpolator interpolator) {
if (interpolator != null) { if (interpolator != null) {
fraction = interpolator.getInterpolation(fraction); fraction = interpolator.getInterpolation(fraction);
} }
......
...@@ -19,14 +19,14 @@ package com.qmuiteam.qmui.widget; ...@@ -19,14 +19,14 @@ package com.qmuiteam.qmui.widget;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import androidx.core.util.Pools;
import androidx.recyclerview.widget.RecyclerView;
import com.qmuiteam.qmui.R; import com.qmuiteam.qmui.R;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import androidx.core.util.Pools;
import androidx.recyclerview.widget.RecyclerView;
/** /**
* 一个带 cache 功能的“列表型数据-View”的适配器,适用于自定义 {@link View} 需要显示重复单元 {@link android.widget.ListView} 的情景, * 一个带 cache 功能的“列表型数据-View”的适配器,适用于自定义 {@link View} 需要显示重复单元 {@link android.widget.ListView} 的情景,
* cache 功能主要是保证在需要多次刷新数据或布局的情况下({@link android.widget.ListView} 或 {@link RecyclerView} 的 itemView) * cache 功能主要是保证在需要多次刷新数据或布局的情况下({@link android.widget.ListView} 或 {@link RecyclerView} 的 itemView)
...@@ -60,6 +60,7 @@ public abstract class QMUIItemViewsAdapter<T, V extends View> { ...@@ -60,6 +60,7 @@ public abstract class QMUIItemViewsAdapter<T, V extends View> {
Object notCacheTag = view.getTag(R.id.qmui_view_can_not_cache_tag); Object notCacheTag = view.getTag(R.id.qmui_view_can_not_cache_tag);
if (notCacheTag == null || !(boolean) notCacheTag) { if (notCacheTag == null || !(boolean) notCacheTag) {
try { try {
onViewRecycled(view);
mCachePool.release(view); mCachePool.release(view);
} catch (Exception ignored) { } catch (Exception ignored) {
} }
...@@ -86,6 +87,10 @@ public abstract class QMUIItemViewsAdapter<T, V extends View> { ...@@ -86,6 +87,10 @@ public abstract class QMUIItemViewsAdapter<T, V extends View> {
protected abstract V createView(ViewGroup parentView); protected abstract V createView(ViewGroup parentView);
protected void onViewRecycled(V v){
}
public QMUIItemViewsAdapter<T, V> addItem(T item) { public QMUIItemViewsAdapter<T, V> addItem(T item) {
mItemData.add(item); mItemData.add(item);
return this; return this;
......
...@@ -20,15 +20,14 @@ import android.graphics.Typeface; ...@@ -20,15 +20,14 @@ import android.graphics.Typeface;
import android.view.Gravity; import android.view.Gravity;
import android.view.View; import android.view.View;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import androidx.annotation.ColorInt;
import androidx.annotation.IntDef; import androidx.annotation.IntDef;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.qmuiteam.qmui.skin.QMUISkinHelper; import com.qmuiteam.qmui.skin.QMUISkinHelper;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
public class QMUITab { public class QMUITab {
public static final int ICON_POSITION_LEFT = 0; public static final int ICON_POSITION_LEFT = 0;
public static final int ICON_POSITION_TOP = 1; public static final int ICON_POSITION_TOP = 1;
...@@ -56,6 +55,7 @@ public class QMUITab { ...@@ -56,6 +55,7 @@ public class QMUITab {
int selectedTextSize; int selectedTextSize;
Typeface normalTypeface; Typeface normalTypeface;
Typeface selectedTypeface; Typeface selectedTypeface;
float typefaceUpdateAreaPercent;
int normalColor; int normalColor;
int selectColor; int selectColor;
int normalColorAttr; int normalColorAttr;
...@@ -65,6 +65,8 @@ public class QMUITab { ...@@ -65,6 +65,8 @@ public class QMUITab {
float selectedTabIconScale = 1f; float selectedTabIconScale = 1f;
QMUITabIcon tabIcon = null; QMUITabIcon tabIcon = null;
boolean skinChangeWithTintColor; boolean skinChangeWithTintColor;
boolean skinChangeNormalWithTintColor;
boolean skinChangeSelectedWithTintColor;
int normalIconAttr; int normalIconAttr;
int selectedIconAttr; int selectedIconAttr;
int contentWidth = 0; int contentWidth = 0;
...@@ -109,6 +111,13 @@ public class QMUITab { ...@@ -109,6 +111,13 @@ public class QMUITab {
rightSpaceWeight = rightWeight; rightSpaceWeight = rightWeight;
} }
public void setTypefaceUpdateAreaPercent(float typefaceUpdateAreaPercent) {
this.typefaceUpdateAreaPercent = typefaceUpdateAreaPercent;
}
public float getTypefaceUpdateAreaPercent() {
return typefaceUpdateAreaPercent;
}
public int getGravity() { public int getGravity() {
return gravity; return gravity;
......
...@@ -21,9 +21,9 @@ import android.view.ViewGroup; ...@@ -21,9 +21,9 @@ import android.view.ViewGroup;
import com.qmuiteam.qmui.widget.QMUIItemViewsAdapter; import com.qmuiteam.qmui.widget.QMUIItemViewsAdapter;
public class QMUITabAdapter extends QMUIItemViewsAdapter<QMUITab, QMUITabView> implements QMUITabView.Callback { public class QMUITabAdapter extends QMUIItemViewsAdapter<QMUITab, QMUITabView> implements QMUITabView.Callback {
private QMUITabSegment mTabSegment; private QMUIBasicTabSegment mTabSegment;
public QMUITabAdapter(QMUITabSegment tabSegment, ViewGroup parentView) { public QMUITabAdapter(QMUIBasicTabSegment tabSegment, ViewGroup parentView) {
super(parentView); super(parentView);
mTabSegment = tabSegment; mTabSegment = tabSegment;
} }
...@@ -37,6 +37,18 @@ public class QMUITabAdapter extends QMUIItemViewsAdapter<QMUITab, QMUITabView> i ...@@ -37,6 +37,18 @@ public class QMUITabAdapter extends QMUIItemViewsAdapter<QMUITab, QMUITabView> i
protected final void bind(QMUITab item, QMUITabView view, int position) { protected final void bind(QMUITab item, QMUITabView view, int position) {
onBindTab(item, view, position); onBindTab(item, view, position);
view.setCallback(this); view.setCallback(this);
// reset
if (view.getSelectFraction() != 0f || view.isSelected()) {
view.setSelected(false);
view.setSelectFraction(0f);
}
}
@Override
protected void onViewRecycled(QMUITabView qmuiTabView) {
qmuiTabView.setSelected(false);
qmuiTabView.setSelectFraction(0f);
qmuiTabView.setCallback(null);
} }
protected void onBindTab(QMUITab item, QMUITabView view, int position) { protected void onBindTab(QMUITab item, QMUITabView view, int position) {
...@@ -46,7 +58,7 @@ public class QMUITabAdapter extends QMUIItemViewsAdapter<QMUITab, QMUITabView> i ...@@ -46,7 +58,7 @@ public class QMUITabAdapter extends QMUIItemViewsAdapter<QMUITab, QMUITabView> i
@Override @Override
public void onClick(QMUITabView view) { public void onClick(QMUITabView view) {
int index = getViews().indexOf(view); int index = getViews().indexOf(view);
mTabSegment.onClickTab(index); mTabSegment.onClickTab(view, index);
} }
@Override @Override
......
...@@ -75,6 +75,39 @@ public class QMUITabIcon extends Drawable implements Drawable.Callback { ...@@ -75,6 +75,39 @@ public class QMUITabIcon extends Drawable implements Drawable.Callback {
invalidateSelf(); invalidateSelf();
} }
public void tintNormal(int normalColor){
DrawableCompat.setTint(mNormalIconDrawable, normalColor);
invalidateSelf();
}
public void tintSelected(int selectColor){
if (mSelectedIconDrawable != null) {
DrawableCompat.setTint(mSelectedIconDrawable, selectColor);
invalidateSelf();
}
}
public void srcNormal(@NonNull Drawable normalDrawable){
int normalAlpha = (int) (255 * (1 - mCurrentSelectFraction));
mNormalIconDrawable.setCallback(null);
mNormalIconDrawable = normalDrawable.mutate();
mNormalIconDrawable.setCallback(this);
mNormalIconDrawable.setAlpha(normalAlpha);
invalidateSelf();
}
public void srcSelected(@NonNull Drawable selectDrawable){
int selectedAlpha = (int) (255 * mCurrentSelectFraction);
if (mSelectedIconDrawable != null) {
mSelectedIconDrawable.setCallback(null);
}
mSelectedIconDrawable = selectDrawable.mutate();
mSelectedIconDrawable.setCallback(this);
mSelectedIconDrawable.setAlpha(selectedAlpha);
invalidateSelf();
}
public void src(@NonNull Drawable normalDrawable, @NonNull Drawable selectDrawable) { public void src(@NonNull Drawable normalDrawable, @NonNull Drawable selectDrawable) {
int normalAlpha = (int) (255 * (1 - mCurrentSelectFraction)); int normalAlpha = (int) (255 * (1 - mCurrentSelectFraction));
mNormalIconDrawable.setCallback(null); mNormalIconDrawable.setCallback(null);
......
...@@ -23,14 +23,14 @@ import android.graphics.Rect; ...@@ -23,14 +23,14 @@ import android.graphics.Rect;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.view.View; import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.graphics.drawable.DrawableCompat;
import com.qmuiteam.qmui.skin.QMUISkinHelper; import com.qmuiteam.qmui.skin.QMUISkinHelper;
import com.qmuiteam.qmui.skin.QMUISkinManager; import com.qmuiteam.qmui.skin.QMUISkinManager;
import com.qmuiteam.qmui.util.QMUIDrawableHelper;
import com.qmuiteam.qmui.util.QMUIResHelper; import com.qmuiteam.qmui.util.QMUIResHelper;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public class QMUITabIndicator { public class QMUITabIndicator {
/** /**
...@@ -99,7 +99,8 @@ public class QMUITabIndicator { ...@@ -99,7 +99,8 @@ public class QMUITabIndicator {
return mIndicatorTop; return mIndicatorTop;
} }
protected void updateInfo(int left, int width, int color) { @Deprecated
protected void updateInfo(int left, int width, int color){
if (mIndicatorRect == null) { if (mIndicatorRect == null) {
mIndicatorRect = new Rect(left, 0, mIndicatorRect = new Rect(left, 0,
left + width, 0); left + width, 0);
...@@ -112,9 +113,13 @@ public class QMUITabIndicator { ...@@ -112,9 +113,13 @@ public class QMUITabIndicator {
} }
} }
private void updateColor(int color){ protected void updateInfo(int left, int width, int color, float offsetPercent) {
updateInfo(left, width, color);
}
protected void updateColor(int color){
if (mIndicatorDrawable != null) { if (mIndicatorDrawable != null) {
QMUIDrawableHelper.setDrawableTintColor(mIndicatorDrawable, color); DrawableCompat.setTint(mIndicatorDrawable, color);
} else { } else {
if (mIndicatorPaint == null) { if (mIndicatorPaint == null) {
mIndicatorPaint = new Paint(); mIndicatorPaint = new Paint();
......
/*
* Tencent is pleased to support the open source community by making QMUI_Android available.
*
* Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved.
*
* Licensed under the MIT License (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
*
* http://opensource.org/licenses/MIT
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is
* distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.qmuiteam.qmui.widget.tab;
import android.content.Context;
import android.util.AttributeSet;
import androidx.annotation.Nullable;
import androidx.viewpager2.widget.ViewPager2;
import java.lang.ref.WeakReference;
/**
* 在 {@link QMUIBasicTabSegment} 的基础上添加与 {@link ViewPager2} 的联动使用
*/
public class QMUITabSegment2 extends QMUIBasicTabSegment {
private static final String TAG = "QMUITabSegment";
/**
* the scrollState of ViewPager
*/
private int mViewPagerScrollState = ViewPager2.SCROLL_STATE_IDLE;
private ViewPager2 mViewPager;
private ViewPager2.OnPageChangeCallback mOnPageChangeListener;
private OnTabSelectedListener mViewPagerSelectedListener;
public QMUITabSegment2(Context context) {
super(context);
}
public QMUITabSegment2(Context context, AttributeSet attrs) {
super(context, attrs);
}
public QMUITabSegment2(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected boolean needPreventEvent() {
return mViewPagerScrollState != ViewPager2.SCROLL_STATE_IDLE;
}
/**
* associate QMUITabSegment2 with a {@link ViewPager2}
*
* @param viewPager the ViewPager2 to associate
*/
public void setupWithViewPager(@Nullable final ViewPager2 viewPager) {
if (mViewPager != null) {
if (mOnPageChangeListener != null) {
mViewPager.unregisterOnPageChangeCallback(mOnPageChangeListener);
}
}
if (mViewPagerSelectedListener != null) {
removeOnTabSelectedListener(mViewPagerSelectedListener);
mViewPagerSelectedListener = null;
}
if (viewPager != null) {
mViewPager = viewPager;
if (mOnPageChangeListener == null) {
mOnPageChangeListener = new TabLayoutOnPageChangeListener(this);
}
viewPager.registerOnPageChangeCallback(mOnPageChangeListener);
mViewPagerSelectedListener = new ViewPagerOnTabSelectedListener(viewPager);
addOnTabSelectedListener(mViewPagerSelectedListener);
final int curItem = mViewPager.getCurrentItem();
selectTab(curItem, true, false);
} else {
mViewPager = null;
}
}
private void setViewPagerScrollState(int state) {
mViewPagerScrollState = state;
if (mViewPagerScrollState == ViewPager2.SCROLL_STATE_IDLE) {
if (mPendingSelectedIndex != NO_POSITION && mSelectAnimator == null) {
selectTab(mPendingSelectedIndex, true, false);
mPendingSelectedIndex = NO_POSITION;
}
}
}
public static class TabLayoutOnPageChangeListener extends ViewPager2.OnPageChangeCallback {
private final WeakReference<QMUITabSegment2> mTabSegmentRef;
public TabLayoutOnPageChangeListener(QMUITabSegment2 tabSegment) {
mTabSegmentRef = new WeakReference<>(tabSegment);
}
@Override
public void onPageScrollStateChanged(final int state) {
final QMUITabSegment2 tabSegment = mTabSegmentRef.get();
if (tabSegment != null) {
tabSegment.setViewPagerScrollState(state);
}
}
@Override
public void onPageScrolled(final int position, final float positionOffset,
final int positionOffsetPixels) {
final QMUITabSegment2 tabSegment = mTabSegmentRef.get();
if (tabSegment != null) {
tabSegment.updateIndicatorPosition(position, positionOffset);
}
}
@Override
public void onPageSelected(final int position) {
final QMUITabSegment2 tabSegment = mTabSegmentRef.get();
if (tabSegment != null && tabSegment.mPendingSelectedIndex != NO_POSITION) {
tabSegment.mPendingSelectedIndex = position;
return;
}
if (tabSegment != null && tabSegment.getSelectedIndex() != position
&& position < tabSegment.getTabCount()) {
tabSegment.selectTab(position, true, false);
}
}
}
private static class ViewPagerOnTabSelectedListener implements OnTabSelectedListener {
private final ViewPager2 mViewPager;
public ViewPagerOnTabSelectedListener(ViewPager2 viewPager) {
mViewPager = viewPager;
}
@Override
public void onTabSelected(int index) {
mViewPager.setCurrentItem(index, false);
}
@Override
public void onTabUnselected(int index) {
}
@Override
public void onTabReselected(int index) {
}
@Override
public void onDoubleTap(int index) {
}
}
}
...@@ -27,10 +27,16 @@ import android.view.Gravity; ...@@ -27,10 +27,16 @@ import android.view.Gravity;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.animation.Interpolator; import android.view.animation.Interpolator;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import com.qmuiteam.qmui.QMUILog; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.collection.SimpleArrayMap;
import androidx.core.view.GravityCompat;
import androidx.core.view.ViewCompat;
import com.qmuiteam.qmui.R; import com.qmuiteam.qmui.R;
import com.qmuiteam.qmui.skin.IQMUISkinHandlerView; import com.qmuiteam.qmui.skin.IQMUISkinHandlerView;
import com.qmuiteam.qmui.skin.QMUISkinHelper; import com.qmuiteam.qmui.skin.QMUISkinHelper;
...@@ -43,12 +49,6 @@ import com.qmuiteam.qmui.util.QMUILangHelper; ...@@ -43,12 +49,6 @@ import com.qmuiteam.qmui.util.QMUILangHelper;
import com.qmuiteam.qmui.util.QMUIResHelper; import com.qmuiteam.qmui.util.QMUIResHelper;
import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.collection.SimpleArrayMap;
import androidx.core.view.GravityCompat;
import androidx.core.view.ViewCompat;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public class QMUITabView extends FrameLayout implements IQMUISkinHandlerView { public class QMUITabView extends FrameLayout implements IQMUISkinHandlerView {
...@@ -76,10 +76,18 @@ public class QMUITabView extends FrameLayout implements IQMUISkinHandlerView { ...@@ -76,10 +76,18 @@ public class QMUITabView extends FrameLayout implements IQMUISkinHandlerView {
private float mSelectedTextLeft = 0; private float mSelectedTextLeft = 0;
private float mSelectedTextTop = 0; private float mSelectedTextTop = 0;
private float mSelectFraction = 0f;
private QMUIRoundButton mSignCountView; private QMUIRoundButton mSignCountView;
public QMUITabView(@NonNull Context context) { public QMUITabView(@NonNull Context context) {
super(context); super(context);
// 使得每个tab可被诸如TalkBack等屏幕阅读器聚焦
// 这样视力受损用户(如盲人、低、弱视力)就能与tab交互
this.setFocusable(true);
this.setFocusableInTouchMode(true);
setWillNotDraw(false); setWillNotDraw(false);
mCollapsingTextHelper = new QMUICollapsingTextHelper(this, 1f); mCollapsingTextHelper = new QMUICollapsingTextHelper(this, 1f);
mGestureDetector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() { mGestureDetector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() {
...@@ -133,6 +141,7 @@ public class QMUITabView extends FrameLayout implements IQMUISkinHandlerView { ...@@ -133,6 +141,7 @@ public class QMUITabView extends FrameLayout implements IQMUISkinHandlerView {
public void bind(QMUITab tab) { public void bind(QMUITab tab) {
mCollapsingTextHelper.setTextSize(tab.normalTextSize, tab.selectedTextSize, false); mCollapsingTextHelper.setTextSize(tab.normalTextSize, tab.selectedTextSize, false);
mCollapsingTextHelper.setTypeface(tab.normalTypeface, tab.selectedTypeface, false); mCollapsingTextHelper.setTypeface(tab.normalTypeface, tab.selectedTypeface, false);
mCollapsingTextHelper.setTypefaceUpdateAreaPercent(tab.typefaceUpdateAreaPercent);
int gravity = Gravity.LEFT | Gravity.TOP; int gravity = Gravity.LEFT | Gravity.TOP;
mCollapsingTextHelper.setGravity(gravity, gravity, false); mCollapsingTextHelper.setGravity(gravity, gravity, false);
mCollapsingTextHelper.setText(tab.getText()); mCollapsingTextHelper.setText(tab.getText());
...@@ -171,8 +180,14 @@ public class QMUITabView extends FrameLayout implements IQMUISkinHandlerView { ...@@ -171,8 +180,14 @@ public class QMUITabView extends FrameLayout implements IQMUISkinHandlerView {
requestLayout(); requestLayout();
} }
public float getSelectFraction() {
return mSelectFraction;
}
public void setSelectFraction(float fraction) { public void setSelectFraction(float fraction) {
fraction = QMUILangHelper.constrain(fraction, 0f, 1f); fraction = QMUILangHelper.constrain(fraction, 0f, 1f);
mSelectFraction = fraction;
QMUITabIcon tabIcon = mTab.getTabIcon(); QMUITabIcon tabIcon = mTab.getTabIcon();
if (tabIcon != null) { if (tabIcon != null) {
tabIcon.setSelectFraction(fraction, tabIcon.setSelectFraction(fraction,
...@@ -667,6 +682,16 @@ public class QMUITabView extends FrameLayout implements IQMUISkinHandlerView { ...@@ -667,6 +682,16 @@ public class QMUITabView extends FrameLayout implements IQMUISkinHandlerView {
super.draw(canvas); super.draw(canvas);
} }
@Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(info);
// 给每个tab添加文本标签
// 使得TalkBack等屏幕阅读器focus 到 tab上时可将tab的文本通过TTS朗读出来
// 这样视力受损用户(如盲人、低、弱视力)就能和widget交互
info.setContentDescription(mTab.getText());
}
protected void onDrawTab(Canvas canvas) { protected void onDrawTab(Canvas canvas) {
if (mTab == null) { if (mTab == null) {
return; return;
...@@ -702,24 +727,42 @@ public class QMUITabView extends FrameLayout implements IQMUISkinHandlerView { ...@@ -702,24 +727,42 @@ public class QMUITabView extends FrameLayout implements IQMUISkinHandlerView {
ColorStateList.valueOf(selectedColor), ColorStateList.valueOf(selectedColor),
true); true);
if (tab.tabIcon != null) { if (tab.tabIcon != null) {
if (tab.skinChangeWithTintColor) { if (tab.skinChangeWithTintColor || (tab.skinChangeNormalWithTintColor && tab.skinChangeSelectedWithTintColor)) {
tab.tabIcon.tint(normalColor, selectedColor); tab.tabIcon.tint(normalColor, selectedColor);
} else { } else {
Drawable normalIcon = null; if(tab.tabIcon.hasSelectedIcon()){
Drawable selectedIcon = null; if(tab.skinChangeNormalWithTintColor){
if (tab.normalIconAttr != 0) { tab.tabIcon.tintNormal(normalColor);
normalIcon = QMUISkinHelper.getSkinDrawable(this, tab.normalIconAttr); }else{
} if(tab.normalIconAttr != 0){
Drawable normalIcon = QMUISkinHelper.getSkinDrawable(this, tab.normalIconAttr);
if(normalIcon != null){
tab.tabIcon.srcNormal(normalIcon);
}
}
}
if (tab.selectedIconAttr != 0) { if(tab.skinChangeSelectedWithTintColor){
selectedIcon = QMUISkinHelper.getSkinDrawable(this, tab.selectedIconAttr); tab.tabIcon.tintSelected(normalColor);
} }else{
if (normalIcon != null && selectedIcon != null) { if(tab.selectedIconAttr != 0){
tab.tabIcon.src(normalIcon, selectedIcon); Drawable selectedIcon = QMUISkinHelper.getSkinDrawable(this, tab.selectedIconAttr);
} else if (normalIcon != null && !tab.tabIcon.hasSelectedIcon()) { if(selectedIcon != null){
tab.tabIcon.src(normalIcon, normalColor, selectedColor); tab.tabIcon.srcSelected(selectedIcon);
} else { }
QMUILog.i(TAG, "skin attr not matched with current value."); }
}
}else{
if(tab.skinChangeNormalWithTintColor){
tab.tabIcon.tint(normalColor, selectedColor);
}else{
if(tab.normalIconAttr != 0){
Drawable normalIcon = QMUISkinHelper.getSkinDrawable(this, tab.normalIconAttr);
if(normalIcon != null){
tab.tabIcon.src(normalIcon, normalColor, selectedColor);
}
}
}
} }
} }
} }
......
...@@ -90,6 +90,7 @@ ...@@ -90,6 +90,7 @@
<enum name="right" value="2"/> <enum name="right" value="2"/>
<enum name="bottom" value="3"/> <enum name="bottom" value="3"/>
</attr> </attr>
<attr name="qmui_tab_select_no_animation" format="boolean" />
</declare-styleable> </declare-styleable>
<attr name="QMUITabSegmentStyle" format="reference"/> <attr name="QMUITabSegmentStyle" format="reference"/>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment