Commit 3f6c41b6 by 宁斌

1、餐牌页拆分

parent 0028c801
......@@ -101,7 +101,7 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
@Override
public void setupActivityComponent(@NonNull AppComponent appComponent) {
LoganManager.w_code(TAG, "setupActivityComponent");
LoganManager.w_printer(TAG, "setupActivityComponent");
DaggerPrintComponent //如找不到该类,请编译一下项目
.builder()
.appComponent(appComponent)
......@@ -112,7 +112,7 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
@Override
public int initView(@Nullable Bundle savedInstanceState) {
LoganManager.w_code(TAG, "initView");
LoganManager.w_printer(TAG, "initView");
getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
return 0;//R.layout.print_bitmap;如果你不需要框架帮你设置 setContentView(id) 需要 自行设置,请返回 0
......@@ -120,7 +120,7 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
@Override
public void configImmersionBar(ImmersionBar immersionBar) {
LoganManager.w_code(TAG, "configImmersionBar");
LoganManager.w_printer(TAG, "configImmersionBar");
immersionBar
.fitsSystemWindows(true)
.statusBarColor(R.color.trans)
......@@ -130,7 +130,7 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
@Override
public void initData(@Nullable Bundle savedInstanceState) {
LoganManager.w_code(TAG, "initData");
LoganManager.w_printer(TAG, "initData");
PrinterFlowProxy.newInstance().registerPrinterFlowListener(printerFlowListener);
}
......@@ -227,7 +227,7 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
private void actionPrinter() {
LoganManager.w_code(TAG, "actionPrinter start");
LoganManager.w_printer(TAG, "actionPrinter start");
showPrintLoadingDialog();
......@@ -243,7 +243,7 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
//初始化打印配置
initPrintConfig(printContent);
LoganManager.w_code(TAG, "actionPrinter end");
LoganManager.w_printer(TAG, "actionPrinter end");
}
private void showPrintLoadingDialog() {
......@@ -273,7 +273,7 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
private void initPrintConfig(PrintContent printContent) {
LoganManager.w_code(TAG, "initPrintConfig start");
LoganManager.w_printer(TAG, "initPrintConfig start");
//開始
PrinterFlowProxy.newInstance().dispatchPrinterDataBefore(type, type, GsonUtils.GsonString(printContent), GsonUtils.GsonString(defaultPrint));
......@@ -307,8 +307,10 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
printByDevice(defaultPrint);
}
LoganManager.w_code(TAG, "initPrintConfig defaultPrint-->" + defaultPrint.toString());
LoganManager.w_code(TAG, "initPrintConfig end");
if (defaultPrint != null) {
LoganManager.w_printer(TAG, "initPrintConfig defaultPrint-->" + defaultPrint.toString());
}
LoganManager.w_printer(TAG, "initPrintConfig end");
}
/**
......@@ -398,7 +400,7 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
* @param defaultPrint 打印機
*/
private void printByDevice(PrinterDeviceBean defaultPrint) {
LoganManager.w_code(TAG, "printByDevice start");
LoganManager.w_printer(TAG, "printByDevice start");
//獲取對應的打印類
if (printerInIt instanceof PrintInstruction) {
//開錢箱
......@@ -447,7 +449,7 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
printFailure("未找到對應的打印類型");
}
}
LoganManager.w_code(TAG, "printByDevice end");
LoganManager.w_printer(TAG, "printByDevice end");
}
/**
......
......@@ -561,7 +561,7 @@ public class PrinterAddActivity extends BaseActivity<PrinterAddPresenter> implem
* 添加或測試打印機
*/
private void addOrTestPrint(View v) {
LoganManager.w_code(TAG, "addOrTestPrint start");
LoganManager.w_printer(TAG, "addOrTestPrint start");
if (!editTextIsNull(mEdPrintName)) {
ToastUtils.show(mContext, "請輸入打印機名稱");
return;
......@@ -652,8 +652,8 @@ public class PrinterAddActivity extends BaseActivity<PrinterAddPresenter> implem
}
} else if (v.getId() == R.id.print_test) {
//打印測試
LoganManager.w_code(TAG, "打印測試 start");
LoganManager.w_code(TAG, "打印測試 printerDeviceBean->" + printerDeviceBean.toString());
LoganManager.w_printer(TAG, "打印測試 start");
LoganManager.w_printer(TAG, "打印測試 printerDeviceBean->" + printerDeviceBean.toString());
CC.obtainBuilder(ComponentName.COMPONENT_PRINT)
.addParam(PrintConstans.PRINT_TYPE, PrintConstans.PRINT_TEST)
.addParam("deviceBean", printerDeviceBean)
......@@ -664,10 +664,10 @@ public class PrinterAddActivity extends BaseActivity<PrinterAddPresenter> implem
// if (!result.isSuccess()) {
// ToastUtils.show(this, "打印失敗");
// }
LoganManager.w_code(TAG, "打印測試 end");
LoganManager.w_printer(TAG, "打印測試 end");
});
}
LoganManager.w_code(TAG, "addOrTestPrint end");
LoganManager.w_printer(TAG, "addOrTestPrint end");
}
......
......@@ -23,6 +23,9 @@
android:name=".mvp.ui.activity.MealStandActivity"
android:screenOrientation="portrait" />
<activity
android:name=".mvp.ui.activity.MealStandActivity2"
android:screenOrientation="portrait" />
<activity
android:name=".mvp.ui.activity.OrderContentActivity"
android:screenOrientation="portrait" />
<activity
......
......@@ -10,7 +10,13 @@
android:supportsRtl="true"
android:networkSecurityConfig="@xml/network_android"
android:theme="@style/AppTheme">
<activity android:name=".mvp.ui.activity.CoordinatorlayoutActivity" />
<activity
android:name=".mvp.ui.activity.MealStandActivity2"
android:screenOrientation="portrait" />
<activity
android:name=".mvp.ui.activity.orderManager.OrderDetailActivity"
android:launchMode="singleTop"/>
......
package com.gingersoft.gsa.cloud.table.di.component;
import com.gingersoft.gsa.cloud.table.di.module.MealStand2Module;
import com.gingersoft.gsa.cloud.table.di.module.MealStandModule;
import com.gingersoft.gsa.cloud.table.mvp.contract.MealStandContract;
import com.gingersoft.gsa.cloud.table.mvp.ui.activity.MealStandActivity;
import com.gingersoft.gsa.cloud.table.mvp.ui.activity.MealStandActivity2;
import com.jess.arms.di.component.AppComponent;
import com.jess.arms.di.scope.ActivityScope;
import dagger.BindsInstance;
import dagger.Component;
/**
* ================================================
* Description:
* <p>
* Created by MVPArmsTemplate on 12/27/2019 19:17
* <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
* <a href="https://github.com/JessYanCoding">Follow me</a>
* <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
* <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
* <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
* ================================================
*/
@ActivityScope
@Component(modules = MealStand2Module.class, dependencies = AppComponent.class)
public interface MealStand2Component {
void inject(MealStandActivity2 activity);
@Component.Builder
interface Builder {
@BindsInstance
MealStand2Component.Builder view(MealStandContract.View view);
MealStand2Component.Builder appComponent(AppComponent appComponent);
MealStand2Component build();
}
}
\ No newline at end of file
package com.gingersoft.gsa.cloud.table.di.module;
import com.gingersoft.gsa.cloud.database.bean.ComboItem;
import com.gingersoft.gsa.cloud.database.bean.Discount;
import com.gingersoft.gsa.cloud.database.bean.Food;
import com.gingersoft.gsa.cloud.database.bean.Modifier;
import com.gingersoft.gsa.cloud.table.mvp.contract.MealStandContract;
import com.gingersoft.gsa.cloud.table.mvp.model.MealStandModel;
import com.gingersoft.gsa.cloud.table.mvp.model.bean.SoldoutCtrFood;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.BillItemAdapter;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.meal.ComboAdapter;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.meal.DiscountAdapter;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.meal.FoodAdapter;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.meal.FoodGroupAdapter;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.meal.ModifierAdapter;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.meal.SelectMealAdapter;
import com.jess.arms.di.scope.ActivityScope;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import dagger.Binds;
import dagger.Module;
import dagger.Provides;
/**
* ================================================
* Description:
* <p>
* Created by MVPArmsTemplate on 12/27/2019 19:17
* <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
* <a href="https://github.com/JessYanCoding">Follow me</a>
* <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
* <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
* <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
* ================================================
*/
@Module
public abstract class MealStand2Module {
@Binds
abstract MealStandContract.Model bindMealStandModel(MealStandModel model);
@ActivityScope
@Provides
@Named("foodGroupList")
static List<Food> provideFoodGroupList() {
return new ArrayList<>();
}
@ActivityScope
@Provides
@Named("foodList")
static List<Food> provideFoodList() {
return new ArrayList<>();
}
@ActivityScope
@Provides
static List<ComboItem> provideFoodCombo() {
return new ArrayList<>();
}
@ActivityScope
@Provides
static List<Modifier> provideModifierList() {
return new ArrayList<>();
}
@ActivityScope
@Provides
static List<Discount> provideDiscountList() {
return new ArrayList<>();
}
@ActivityScope
@Provides
static List<SoldoutCtrFood> provideSoldoutCtrList() {
return new ArrayList<>();
}
@Inject
protected SelectMealAdapter mSelectMealAdapter;
/**
* 賬單項適配器
*/
@Inject
protected BillItemAdapter mBillItemAdapter;
@ActivityScope
@Provides
static FoodAdapter provideFoodAdapter(MealStandContract.View IView, @Named("foodList") List<Food> foodList) {
return new FoodAdapter(IView.getActivity(), foodList, IView.getFromType());
}
@ActivityScope
@Provides
static ComboAdapter provideComboAdapter(MealStandContract.View IView, List<ComboItem> comboItemList) {
return new ComboAdapter(IView.getActivity(), comboItemList);
}
@ActivityScope
@Provides
static ModifierAdapter provideModifierAdapter(MealStandContract.View IView, List<Modifier> modifierList) {
return new ModifierAdapter(IView.getActivity(), modifierList);
}
@ActivityScope
@Provides
static DiscountAdapter provideDiscountAdapter(MealStandContract.View IView, List<Discount> discountList) {
return new DiscountAdapter(IView.getActivity(), discountList);
}
}
\ No newline at end of file
......@@ -6,11 +6,19 @@ import androidx.recyclerview.widget.LinearLayoutManager;
import com.gingersoft.gsa.cloud.database.bean.ComboItem;
import com.gingersoft.gsa.cloud.database.bean.Food;
import com.gingersoft.gsa.cloud.database.bean.Modifier;
import com.gingersoft.gsa.cloud.order.billItem.BillItem;
import com.gingersoft.gsa.cloud.order.commodity.OrderDetail;
import com.gingersoft.gsa.cloud.table.mvp.contract.MealStandContract;
import com.gingersoft.gsa.cloud.table.mvp.contract.SetMealContract;
import com.gingersoft.gsa.cloud.table.mvp.presenter.mealstand.SetMealPresenter;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.BillItemAdapter;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.meal.ComboAdapter;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.meal.FoodAdapter;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.meal.FoodGroupAdapter;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.meal.ModifierAdapter;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.meal.SelectMealAdapter;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.meal.SelectMealAdapter2;
import com.jess.arms.di.scope.ActivityScope;
import com.jess.arms.di.scope.FragmentScope;
import com.jess.arms.di.scope.FragmentScope;
......@@ -20,11 +28,13 @@ import dagger.Provides;
import com.gingersoft.gsa.cloud.table.mvp.contract.SetMealContract;
import com.gingersoft.gsa.cloud.table.mvp.model.SetMealModel;
import com.jess.arms.mvp.BasePresenter;
import com.jess.arms.mvp.IView;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
......@@ -46,6 +56,18 @@ public abstract class SetMealModule {
@Binds
abstract SetMealContract.Model bindSetMealModel(SetMealModel model);
// @FragmentScope
// @Provides
// static List<OrderDetail> provideOrderMealList() {
// return new ArrayList<>();
// }
//
// @FragmentScope
// @Provides
// static List<BillItem> provideBillItemList() {
// return new ArrayList<>();
// }
@FragmentScope
@Provides
@Named("foodGroupList")
......@@ -72,7 +94,6 @@ public abstract class SetMealModule {
return new ArrayList<>();
}
@FragmentScope
@Provides
@Named("fineTabTitles")
......@@ -80,6 +101,18 @@ public abstract class SetMealModule {
return new ArrayList<>();
}
// @FragmentScope
// @Provides
// static SelectMealAdapter2 provideSelectMealAdapter2(SetMealContract.View IView, List<OrderDetail> orderMealList, BasePresenter presenter) {
// return new SelectMealAdapter2(IView.getActivity2(), orderMealList,presenter);
// }
//
// @FragmentScope
// @Provides
// static BillItemAdapter provideBillItemAdapter(SetMealContract.View IView, List<BillItem> billItems) {
// return new BillItemAdapter(IView.getActivity2(), billItems,"$");
// }
@FragmentScope
@Provides
static FoodGroupAdapter provideFoodGroupAdapter(SetMealContract.View IView, @Named("foodGroupList") List<Food> foodGroupList) {
......@@ -104,23 +137,23 @@ public abstract class SetMealModule {
return new ModifierAdapter(IView.getActivity2(), modifierList);
}
@Named("foodGridLayoutManager")
@FragmentScope
@Provides
@Named("foodGridLayoutManager")
static GridLayoutManager provideFoodRecycleLayoutManager(SetMealContract.View IView) {
return new GridLayoutManager(IView.getActivity2(), 1, LinearLayoutManager.HORIZONTAL, false);
}
@Named("comboGridLayoutManager")
@FragmentScope
@Provides
@Named("comboGridLayoutManager")
static GridLayoutManager provideComboRecycleLayoutManager(SetMealContract.View IView) {
return new GridLayoutManager(IView.getActivity2(), 1, LinearLayoutManager.HORIZONTAL, false);
}
@Named("modifierGridLayoutManager")
@FragmentScope
@Provides
@Named("modifierGridLayoutManager")
static GridLayoutManager provideModifierRecycleLayoutManager(SetMealContract.View IView) {
return new GridLayoutManager(IView.getActivity2(), 1, LinearLayoutManager.HORIZONTAL, false);
}
......
......@@ -10,6 +10,7 @@ import com.gingersoft.gsa.cloud.pay.PayAction;
import com.gingersoft.gsa.cloud.pay.PaymentControl;
import com.gingersoft.gsa.cloud.pay.RequestParms;
import com.gingersoft.gsa.cloud.pay.ResultCallback;
import com.gingersoft.gsa.cloud.pay.bean.PayMethod;
import com.gingersoft.gsa.cloud.pay.device.pos.hyweb.bean.request.bg.GetTxnIdRequest;
import com.gingersoft.gsa.cloud.pay.device.pos.hyweb.bean.request.pos.VoidRequest;
import com.gingersoft.gsa.cloud.table.R;
......@@ -108,6 +109,18 @@ public class CancelOrder implements Strategy<OrderManagerResponse> {
public void onFailure(Throwable t) {
}
@Override
public void externalPayment() {
if (cancelListener != null) {
cancelListener.cancel(datasBean.getId());
}
}
@Override
public void hybridPayment(List<PayMethod> payMethods) {
}
})
.build();
PaymentControl.newInstance().showPayFlowFragment(mActivity, build);
......
......@@ -8,6 +8,11 @@ import com.gingersoft.gsa.cloud.database.bean.FoodCombo;
import com.gingersoft.gsa.cloud.database.bean.FoodModifier;
import com.gingersoft.gsa.cloud.database.bean.Modifier;
import com.gingersoft.gsa.cloud.table.mvp.ui.activity.MealStandActivity;
import com.gingersoft.gsa.cloud.table.mvp.ui.activity.MealStandActivity2;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.meal.ComboAdapter;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.meal.FoodAdapter;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.meal.FoodGroupAdapter;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.meal.ModifierAdapter;
import com.jess.arms.mvp.IView;
import com.jess.arms.mvp.IModel;
......@@ -16,6 +21,7 @@ import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import dagger.Lazy;
import io.reactivex.Single;
......@@ -59,6 +65,8 @@ public interface SetMealContract {
void setMealRvScrollToPosition(int position);
void resetSelect(int position, Food datasBean);
void returnFoodGroupList(List<Food> foodGroupList);
void returnFoodList(List<Food> foodList);
......@@ -67,7 +75,17 @@ public interface SetMealContract {
void returnModifierList(List<Modifier> modifierList);
MealStandActivity getActivity2();
void initFoodGroupAdapter(List<Food> foodGroupList);
void notifyFoodGroupAdapter();
void notifyFoodAdapter();
void notifyComboAdapterAdapter();
void notifyModifierAdapterAdapter();
MealStandActivity2 getActivity2();
int getFromType();
}
......
......@@ -40,9 +40,11 @@ import com.gingersoft.gsa.cloud.table.mvp.model.bean.request.AddOrderRequest;
import com.gingersoft.gsa.cloud.table.mvp.model.bean.request.CreateOrderRequest;
import com.gingersoft.gsa.cloud.table.mvp.presenter.mealstand.MealStandPresenter;
import com.gingersoft.gsa.cloud.table.mvp.ui.activity.MealStandActivity;
import com.gingersoft.gsa.cloud.table.mvp.ui.activity.MealStandActivity2;
import com.gingersoft.gsa.cloud.table.mvp.ui.activity.OrderContentActivity;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.BillItemAdapter;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.meal.SelectMealAdapter;
import com.gingersoft.gsa.cloud.table.mvp.ui.fragment.mealstand.SetMealFragment;
import com.gingersoft.gsa.cloud.ui.widget.dialog.CommonTipDialog;
import com.jess.arms.di.scope.ActivityScope;
import com.jess.arms.integration.AppManager;
......@@ -151,7 +153,7 @@ public abstract class BaseOrderPresenter<M extends BaseOrderContract.Model, V ex
public abstract void addOrderFood(boolean isPrint, Class<?> afterToActivity);
public void saveCreateTime(long createTime) {
public void saveCreateTime(long createTime) {
if (mDoshokuOrder == null) {
mDoshokuOrder.setOpenTableInfo(new TableBean.DataBean());
}
......@@ -163,13 +165,14 @@ public abstract class BaseOrderPresenter<M extends BaseOrderContract.Model, V ex
this.mModel = (M) model;
this.mRootView = (V) rootView;
this.mBaseOrderPresenter = this;
this.IActivity = (Activity) mRootView;
this.IActivity = (Activity) rootView;
if (IActivity instanceof MealStandActivity) {
mMealStandActivity = (MealStandActivity) IActivity;
} else if (IActivity instanceof OrderContentActivity) {
mOrderContentActivity = (OrderContentActivity) IActivity;
}
if (this instanceof MealStandPresenter) {
mMealStandPresenter = (MealStandPresenter) this;
}
......
package com.gingersoft.gsa.cloud.table.mvp.presenter.mealstand;
import android.app.Application;
import android.text.TextUtils;
import android.util.SparseArray;
import android.view.View;
import com.billy.cc.core.component.CC;
import com.gingersoft.gsa.cloud.common.bean.BaseResult;
import com.gingersoft.gsa.cloud.common.constans.ExpandConstant;
import com.gingersoft.gsa.cloud.common.constans.FoodSummaryConstans;
import com.gingersoft.gsa.cloud.common.constans.MealConstant;
import com.gingersoft.gsa.cloud.common.constans.PrintConstans;
import com.gingersoft.gsa.cloud.common.core.member.MemberInfo;
import com.gingersoft.gsa.cloud.common.core.restaurant.RestaurantInfoManager;
import com.gingersoft.gsa.cloud.common.core.restaurant.utils.RestaurantExpandInfoUtils;
import com.gingersoft.gsa.cloud.common.logan.LoganManager;
import com.gingersoft.gsa.cloud.common.utils.JsonUtils;
import com.gingersoft.gsa.cloud.common.utils.LanguageUtils;
import com.gingersoft.gsa.cloud.common.utils.MoneyUtil;
import com.gingersoft.gsa.cloud.common.utils.gson.GsonUtils;
import com.gingersoft.gsa.cloud.component.ComponentName;
import com.gingersoft.gsa.cloud.database.bean.ComboItem;
import com.gingersoft.gsa.cloud.database.bean.Discount;
import com.gingersoft.gsa.cloud.database.bean.Food;
import com.gingersoft.gsa.cloud.database.bean.FoodCombo;
import com.gingersoft.gsa.cloud.database.bean.Modifier;
import com.gingersoft.gsa.cloud.database.utils.FoodDaoUtils;
import com.gingersoft.gsa.cloud.database.utils.ModifierDaoUtils;
import com.gingersoft.gsa.cloud.order.bean.request.DeleteOrderRequest;
import com.gingersoft.gsa.cloud.order.commodity.OrderDetail;
import com.gingersoft.gsa.cloud.order.order.BaseOrder;
import com.gingersoft.gsa.cloud.order.order.DoshokuOrder;
import com.gingersoft.gsa.cloud.print.bean.PrintContent;
import com.gingersoft.gsa.cloud.print.bean.adapter.PrintContentAdapter;
import com.gingersoft.gsa.cloud.table.R;
import com.gingersoft.gsa.cloud.table.mvp.action.discount.MealDiscountAction;
import com.gingersoft.gsa.cloud.table.mvp.contract.MealStandContract;
import com.gingersoft.gsa.cloud.table.mvp.model.bean.FoodReason;
import com.gingersoft.gsa.cloud.table.mvp.model.bean.SoldoutCtrFood;
import com.gingersoft.gsa.cloud.table.mvp.model.bean.request.AddOrderRequest;
import com.gingersoft.gsa.cloud.table.mvp.model.bean.request.CreateOrderRequest;
import com.gingersoft.gsa.cloud.table.mvp.presenter.BaseOrderPresenter;
import com.gingersoft.gsa.cloud.table.mvp.presenter.BaseOrderPresenter2;
import com.gingersoft.gsa.cloud.table.mvp.ui.activity.MealStandActivity;
import com.gingersoft.gsa.cloud.table.mvp.ui.activity.MealStandActivity2;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.meal.ComboAdapter;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.meal.DiscountAdapter;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.meal.FoodAdapter;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.meal.FoodGroupAdapter;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.meal.ModifierAdapter;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.meal.SelectMealAdapter;
import com.gingersoft.gsa.cloud.table.mvp.ui.widget.CancelFoodDialog;
import com.gingersoft.gsa.cloud.ui.widget.dialog.BaseRetryDialog;
import com.gingersoft.gsa.cloud.ui.widget.dialog.CommonTipDialog;
import com.google.gson.internal.LinkedTreeMap;
import com.jess.arms.base.DefaultAdapter;
import com.jess.arms.di.scope.ActivityScope;
import com.jess.arms.http.imageloader.ImageLoader;
import com.jess.arms.integration.AppManager;
import com.jess.arms.utils.RxLifecycleUtils;
import com.qmuiteam.qmui.widget.dialog.QMUIDialog;
import com.qmuiteam.qmui.widget.dialog.QMUIDialogAction;
import org.simple.eventbus.Subscriber;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.annotations.NonNull;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import me.jessyan.rxerrorhandler.core.RxErrorHandler;
import me.jessyan.rxerrorhandler.handler.ErrorHandleSubscriber;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import static com.gingersoft.gsa.cloud.table.mvp.ui.activity.SoldoutCtrlActivity.FOOD_GROUP_TYPE;
import static com.gingersoft.gsa.cloud.table.mvp.ui.activity.SoldoutCtrlActivity.FOOD_TYPE;
import static com.gingersoft.gsa.cloud.table.mvp.ui.activity.SoldoutCtrlActivity.MODIFIER_TYPE;
/**
* ================================================
* Description:
* <p>
* Created by MVPArmsTemplate on 12/27/2019 19:17
* <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
* <a href="https://github.com/JessYanCoding">Follow me</a>
* <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
* <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
* <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
* ================================================
*/
@ActivityScope
public class MealStandPresenter2 extends BaseOrderPresenter2<MealStandContract.Model, MealStandContract.View> {
@Inject
RxErrorHandler mErrorHandler;
@Inject
Application mApplication;
@Inject
ImageLoader mImageLoader;
@Inject
AppManager mAppManager;
@Inject
public MealStandPresenter2(MealStandContract.Model model, MealStandContract.View rootView) {
super(model, rootView);
}
@Override
public void createOrder(boolean isPrint, Class<?> afterToActivity) {
}
@Override
public void addOrderFood(boolean isPrint, Class<?> afterToActivity) {
}
@Override
public void onDestroy() {
super.onDestroy();
this.mErrorHandler = null;
this.mAppManager = null;
this.mImageLoader = null;
this.mApplication = null;
}
}
......@@ -256,30 +256,7 @@ public class OrderPayActivity extends BaseFragmentActivity<OrderPayPresenter> im
String memberInfo;
String memberName = memberBean.getMemberName();
String LevelName1 = memberBean.getLevelName1();
// if (!TextUtils.isEmpty(LevelName1)) {
// memberInfo = LanguageUtils.get_language_system(this, "meal.info.member.name", "會員名稱:")
// + memberName
// + "(" + LevelName1 + ")";
// } else {
memberInfo = LanguageUtils.get_language_system(this, "meal.info.member.name", "會員:") + memberName;
// }
// boolean showPoints = false;
// if (mPresenter.getPointsAdd() != 0 && mPresenter.getPointsRedeem() != 0) {
// memberInfo = memberInfo + ":" + memberBean.getMemberPoint() + " +" + mPresenter.getPointsAdd() + " -" + mPresenter.getPointsRedeem();
// showPoints = true;
// } else {
// if (mPresenter.getPointsAdd() != 0) {
// memberInfo = memberInfo + ":" + memberBean.getMemberPoint() + " +" + mPresenter.getPointsAdd();
// showPoints = true;
// }
// if (mPresenter.getPointsRedeem() != 0) {
// memberInfo = memberInfo + ":" + memberBean.getMemberPoint() + " -" + mPresenter.getPointsRedeem();
// showPoints = true;
// }
// }
// if (!showPoints) {
// memberInfo = memberInfo + ":" + memberBean.getMemberPoint();
// }
memberIntegral = memberBean.getMemberPoint();
memberPointRedeemCash = memberBean.getPointRedeemCash();
//獲取積分支付抵扣金額
......@@ -581,9 +558,11 @@ public class OrderPayActivity extends BaseFragmentActivity<OrderPayPresenter> im
.action(PayAction.SALE)
.resturantId(RestaurantInfoManager.newInstance().getRestaurantId())
.orderId(DoshokuOrder.getInstance().getOrderId())
.payMethods(mBillMoneyList)
.payType(payMethod.getPayType())
.payMoney(payMethod.getPayMoney())
.resultCallback(new ResultCallback() {
@Override
public void onSuccess() {
paySuccess();
......@@ -593,14 +572,20 @@ public class OrderPayActivity extends BaseFragmentActivity<OrderPayPresenter> im
public void onFailure(Throwable t) {
}
@Override
public void externalPayment() {
mPresenter.sendOrderBefore();
}
@Override
public void hybridPayment(List<PayMethod> payMethods) {
}
})
.build();
PaymentControl.newInstance().showPayFlowFragment(this, parms);
// Intent intent = new Intent(mContext, PayFlowActivity.class);
// intent.putExtra("requestParms",build);
// launchActivity(intent);
// PosPay.builder()
// .context(GsaCloudApplication.getAppContext())
// .lifecycleView(OrderPayActivity.this)
......
......@@ -394,7 +394,7 @@ public class TableActivity extends BaseFragmentActivity<TablePresenter> implemen
@Override
public void startMealStandActivity() {
startActivity(new Intent(this, MealStandActivity.class));
startActivity(new Intent(this, MealStandActivity2.class));
}
@Override
......
......@@ -18,6 +18,8 @@ import com.jess.arms.base.DefaultAdapter;
import java.util.List;
import javax.inject.Inject;
import butterknife.BindView;
/**
......
......@@ -24,6 +24,8 @@ import com.jess.arms.utils.ArmsUtils;
import java.util.List;
import javax.inject.Inject;
import butterknife.BindView;
......
......@@ -100,14 +100,14 @@ public class MealDiscountFragment extends BaseFragment<MealDiscountPresenter> im
private void initViewPager() {
List<Fragment> mFragments = new ArrayList<>();
mFragments.add(NomalDiscountFragment.newInstance());
mFragments.add(CouponFragment.newInstance());
List<Fragment> fragments = new ArrayList<>();
fragments.add(NomalDiscountFragment.newInstance());
fragments.add(CouponFragment.newInstance());
//实例化适配器
TabFragmentAdapter mTabFragmentAdapter = new TabFragmentAdapter(getParentFragmentManager(), 1);
//设置加载的Fragment集合
mTabFragmentAdapter.setFragments(mFragments);
mTabFragmentAdapter.setFragments(fragments);
//设置Viewpager的适配器
viewPager.setAdapter(mTabFragmentAdapter);
//TabLayout绑定ViewPager
......
......@@ -52,4 +52,87 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout="@layout/meal_layout_meal_fine" />
<LinearLayout
android:id="@+id/ll_modify"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_45"
android:layout_gravity="bottom"
android:visibility="invisible">
<com.qmuiteam.qmui.alpha.QMUIAlphaTextView
android:id="@+id/btn_select_all"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginRight="1dp"
android:layout_weight="0.1"
android:background="#00B9F7"
android:gravity="center"
android:text="@string/all_selection"
android:textColor="@color/theme_white_color"
android:textSize="@dimen/sp_14"
android:visibility="gone" />
<com.qmuiteam.qmui.alpha.QMUIAlphaTextView
android:id="@+id/btn_anti_selection"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginRight="1dp"
android:layout_weight="0.1"
android:background="#00B9F7"
android:gravity="center"
android:text="@string/anti_selection"
android:textColor="@color/theme_white_color"
android:textSize="@dimen/sp_14"
android:visibility="gone" />
<com.qmuiteam.qmui.alpha.QMUIAlphaTextView
android:id="@+id/btn_taste"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginRight="1dp"
android:layout_weight="0.1"
android:background="#00B9F7"
android:gravity="center"
android:text="@string/taste"
android:textColor="@color/theme_white_color"
android:textSize="@dimen/sp_14" />
<com.qmuiteam.qmui.alpha.QMUIAlphaTextView
android:id="@+id/btn_msg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_marginRight="1dp"
android:layout_weight="0.1"
android:background="#7D8888"
android:gravity="center"
android:text="@string/msg"
android:textColor="@color/theme_white_color"
android:textSize="@dimen/sp_14" />
<com.qmuiteam.qmui.alpha.QMUIAlphaTextView
android:id="@+id/btn_delete"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginRight="1dp"
android:layout_weight="0.1"
android:background="#FF5024"
android:gravity="center"
android:text="@string/remove"
android:textColor="@color/theme_white_color"
android:textSize="@dimen/sp_14" />
<com.qmuiteam.qmui.alpha.QMUIAlphaTextView
android:id="@+id/btn_end"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginRight="1dp"
android:layout_weight="0.1"
android:background="@color/Grass_green"
android:gravity="center"
android:text="@string/end"
android:textColor="@color/theme_white_color"
android:textSize="@dimen/sp_14" />
</LinearLayout>
</merge>
\ No newline at end of file
......@@ -2,13 +2,13 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll_meals"
android:layout_width="match_parent"
android:layout_height="266dp"
android:layout_height="@dimen/dp_260"
android:orientation="vertical">
<LinearLayout
android:id="@+id/ll_meals_main"
android:layout_width="match_parent"
android:layout_height="221dp"
android:layout_height="0dp"
android:layout_weight="1">
<LinearLayout
......@@ -132,7 +132,7 @@
<LinearLayout
android:id="@+id/ll_Keys"
android:layout_width="match_parent"
android:layout_height="42dp">
android:layout_height="@dimen/dp_40">
<Button
android:id="@+id/btn_key1"
......@@ -200,4 +200,5 @@
android:src="@mipmap/meal_number_key"
android:tag="99" />
</LinearLayout>
</LinearLayout>
......@@ -13,117 +13,27 @@
android:layout_centerVertical="true"
android:text="Chronometer" />
<fragment
android:name="com.gingersoft.gsa.cloud.table.mvp.ui.fragment.mealstand.SetMealFragment"
<FrameLayout
android:id="@+id/fl_food_plate"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
android:layout_height="match_parent"
android:layout_above="@+id/ll_modify"/>
<FrameLayout
android:id="@+id/fl_food_menu"
android:id="@+id/fl_meal_discount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/fl_food_plate"/>
<!-- <include layout="@layout/meal_layout_food_plate"/>-->
<!-- <include layout="@layout/meal_layout_food_menu"/>-->
android:layout_height="match_parent"
android:layout_above="@+id/ll_modify"
android:layout_marginTop="@dimen/dp_260" />
<!--鍵盤-->
<com.gingersoft.gsa.cloud.ui.view.SearchKeyBoardView
android:id="@+id/meal_stand_search_keyboard_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@id/ll_stand_oper"
android:layout_below="@+id/ll_meals"
android:visibility="gone" />
<LinearLayout
android:id="@+id/ll_modify"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_45"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:visibility="invisible">
<com.qmuiteam.qmui.alpha.QMUIAlphaTextView
android:id="@+id/btn_select_all"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginRight="1dp"
android:layout_weight="0.1"
android:background="#00B9F7"
android:gravity="center"
android:text="@string/all_selection"
android:textColor="@color/theme_white_color"
android:textSize="@dimen/sp_14"
android:visibility="gone" />
<com.qmuiteam.qmui.alpha.QMUIAlphaTextView
android:id="@+id/btn_anti_selection"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginRight="1dp"
android:layout_weight="0.1"
android:background="#00B9F7"
android:gravity="center"
android:text="@string/anti_selection"
android:textColor="@color/theme_white_color"
android:textSize="@dimen/sp_14"
android:visibility="gone" />
<com.qmuiteam.qmui.alpha.QMUIAlphaTextView
android:id="@+id/btn_taste"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginRight="1dp"
android:layout_weight="0.1"
android:background="#00B9F7"
android:gravity="center"
android:text="@string/taste"
android:textColor="@color/theme_white_color"
android:textSize="@dimen/sp_14" />
<com.qmuiteam.qmui.alpha.QMUIAlphaTextView
android:id="@+id/btn_msg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_marginRight="1dp"
android:layout_weight="0.1"
android:background="#7D8888"
android:gravity="center"
android:text="@string/msg"
android:textColor="@color/theme_white_color"
android:textSize="@dimen/sp_14" />
<com.qmuiteam.qmui.alpha.QMUIAlphaTextView
android:id="@+id/btn_delete"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginRight="1dp"
android:layout_weight="0.1"
android:background="#FF5024"
android:gravity="center"
android:text="@string/remove"
android:textColor="@color/theme_white_color"
android:textSize="@dimen/sp_14" />
<com.qmuiteam.qmui.alpha.QMUIAlphaTextView
android:id="@+id/btn_end"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginRight="1dp"
android:layout_weight="0.1"
android:background="@color/Grass_green"
android:gravity="center"
android:text="@string/end"
android:textColor="@color/theme_white_color"
android:textSize="@dimen/sp_14" />
</LinearLayout>
android:layout_height="match_parent"
android:layout_above="@+id/ll_modify"
android:layout_marginTop="@dimen/dp_260"
android:visibility="gone"/>
<LinearLayout
android:id="@+id/ll_stand_oper"
......
......@@ -7,8 +7,8 @@ ext {
targetSdkVersion : 29,
//正式版: 1.0.3 3
//內部測試版:1.2.0 20
versionCode : 31,
versionName : "1.3.1"
versionCode : 32,
versionName : "1.3.2"
]
version = [
......
......@@ -30,9 +30,6 @@ public class LoganManager {
public static void w_code(String TAG, String log) {
Logan.w(log, LoganConfig.CODE_LEVLE);
// if (BuildConfig.DEBUG) {
Logan.f();
// }
printLog(TAG, log);
}
......@@ -113,6 +110,9 @@ public class LoganManager {
public static void w_printer(String TAG, String... eventAndLog) {
w_business(PRINTER_BUSINESS_TAG, TAG, eventAndLog);
// if (BuildConfig.DEBUG) {
Logan.f();
// }
}
public static void w_tableMode(String TAG, String... eventAndLog) {
......
......@@ -30,6 +30,7 @@ import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Connection;
import okhttp3.ConnectionPool;
import okhttp3.EventListener;
import okhttp3.FormBody;
import okhttp3.Handshake;
import okhttp3.MediaType;
......
......@@ -29,43 +29,43 @@ public class PaymentControl {
}
public void pay(RequestParms requestParms) {
final PosPayAction payOrigin = PayDeviceFactory.createPayOrigin();
final PosPayAction payOrigin = PayDeviceFactory.createPayDevice();
Preconditions.checkNotNull(payOrigin);
payOrigin.pay(requestParms);
}
public void tip(RequestParms requestParms) {
final PosPayAction payOrigin = PayDeviceFactory.createPayOrigin();
final PosPayAction payOrigin = PayDeviceFactory.createPayDevice();
Preconditions.checkNotNull(payOrigin);
payOrigin.tip(requestParms);
}
public void refund(RequestParms requestParms) {
final PosPayAction payOrigin = PayDeviceFactory.createPayOrigin();
final PosPayAction payOrigin = PayDeviceFactory.createPayDevice();
Preconditions.checkNotNull(payOrigin);
payOrigin.refund(requestParms);
}
public void voidO(RequestParms requestParms) {
final PosPayAction payOrigin = PayDeviceFactory.createPayOrigin();
final PosPayAction payOrigin = PayDeviceFactory.createPayDevice();
Preconditions.checkNotNull(payOrigin);
payOrigin.void0(this);
}
public void retrieval(RequestParms requestParms) {
final PosPayAction payOrigin = PayDeviceFactory.createPayOrigin();
final PosPayAction payOrigin = PayDeviceFactory.createPayDevice();
Preconditions.checkNotNull(payOrigin);
payOrigin.retrieval(this);
}
public void printStub(RequestParms requestParms) {
final PosPayAction payOrigin = PayDeviceFactory.createPayOrigin();
final PosPayAction payOrigin = PayDeviceFactory.createPayDevice();
Preconditions.checkNotNull(payOrigin);
payOrigin.printStub(this);
}
public void settlement(RequestParms requestParms) {
final PosPayAction payOrigin = PayDeviceFactory.createPayOrigin();
final PosPayAction payOrigin = PayDeviceFactory.createPayDevice();
Preconditions.checkNotNull(payOrigin);
payOrigin.settlement(this);
}
......
......@@ -5,9 +5,11 @@ import android.os.Parcelable;
import com.gingersoft.gsa.cloud.pay.Callback;
import com.gingersoft.gsa.cloud.pay.PayAction;
import com.gingersoft.gsa.cloud.pay.bean.PayMethod;
import com.google.gson.annotations.SerializedName;
import java.io.Serializable;
import java.util.List;
import lombok.Builder;
import lombok.Data;
......@@ -24,18 +26,23 @@ import lombok.Getter;
public class RequestParms implements Serializable {
private PayAction action;
private Callback callback;
private ResultCallback resultCallback;
private final int resturantId;
private final List<PayMethod> payMethods;
private final int payType;
private final long orderId;
private final double payMoney;
/**
* 退款相关
*/
private final String refundReason;
/**
* 操作行为回调如支付,退款等
*/
private Callback callback;
/**
* 结果回调
*/
private ResultCallback resultCallback;
// @Override
// public int describeContents() {
......
package com.gingersoft.gsa.cloud.pay;
import com.gingersoft.gsa.cloud.pay.bean.PayMethod;
import java.util.List;
/**
* @作者: bin
* @創建時間: 2021-04-14 15:05
......@@ -11,4 +15,14 @@ public interface ResultCallback {
void onSuccess();
void onFailure(Throwable t);
/**
* 外部支付,交给回调方处理
*/
void externalPayment();
/**
* 混合支付,选择二种以上支付方式
*/
void hybridPayment(List<PayMethod> payMethods);
}
......@@ -8,18 +8,7 @@ import com.gingersoft.gsa.cloud.pay.Callback;
* @更新時間: 2021-04-15 17:18
* @描述:
*/
public interface PhoneCallbackListener <T> extends Callback<T> {
public interface PhoneCallback extends Callback {
/**
* 支付
* @param response
*/
void onSuccess(T response);
/**
* 支付失败
* @param response
* @param e
*/
void onException(T response,Exception e);
}
......@@ -191,25 +191,25 @@ public class PayFlowFragment extends BaseDialogFragment<PayFlowPresenter> implem
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
LoganManager.w_code(TAG, "onActivityResult-" + "resultCode=" + resultCode + " requestCode=" + requestCode);
if (resultCode == android.app.Activity.RESULT_OK) {
switch (requestCode) {
case 555: {
if (intent.getExtras() != null) {
String status = (String) intent.getExtras().get("status");
String transaction_id = (String) intent.getExtras().get("transaction_id");
LoganManager.w_code(TAG, "onActivityResult-》" + "status=" + status + " transaction_id=" + transaction_id);
mPresenter.yedPayUpdateStatus(transaction_id, requestParms.getOrderId(), requestParms.getPayType(), requestParms.getResturantId());
}
break;
}
default:
showStatusLoadingDialog(PayStep.FAILURE);
break;
}
} else {
showStatusLoadingDialog(PayStep.FAILURE);
}
LoganManager.w_code(TAG, "onActivityResult->" + "resultCode=" + resultCode + " requestCode=" + requestCode);
// if (resultCode == android.app.Activity.RESULT_OK) {
// switch (requestCode) {
// case 555: {
// if (intent.getExtras() != null) {
// String status = (String) intent.getExtras().get("status");
// String transaction_id = (String) intent.getExtras().get("transaction_id");
// LoganManager.w_code(TAG, "onActivityResult-》" + "status=" + status + " transaction_id=" + transaction_id);
// mPresenter.yedPayUpdateStatus(transaction_id, requestParms.getOrderId(), requestParms.getPayType(), requestParms.getResturantId());
// }
// break;
// }
// default:
// showStatusLoadingDialog(PayStep.FAILURE);
// break;
// }
// } else {
// showStatusLoadingDialog(PayStep.FAILURE);
// }
}
@Override
......
......@@ -13,7 +13,7 @@ import com.gingersoft.gsa.cloud.pay.PaymentControl;
import com.gingersoft.gsa.cloud.pay.RequestParms;
import com.gingersoft.gsa.cloud.pay.ResultCallback;
import com.gingersoft.gsa.cloud.pay.lifecycle.model.bean.YedpayFindSaleStatusBean;
import com.gingersoft.gsa.cloud.pay.device.phone.PhoneCallbackListener;
import com.gingersoft.gsa.cloud.pay.device.phone.PhoneCallback;
import com.gingersoft.gsa.cloud.pay.device.pos.PosPayAction;
import com.gingersoft.gsa.cloud.pay.device.pos.bbpos.BBposCallback;
import com.gingersoft.gsa.cloud.pay.device.pos.hyweb.HywebCallback;
......@@ -229,17 +229,8 @@ public class PayFlowPresenter extends BasePresenter<PayFlowContract.Model, PayFl
};
private PhoneCallbackListener phoneCallbackListener = new PhoneCallbackListener() {
private PhoneCallback phoneCallback = new PhoneCallback() {
@Override
public void onSuccess(Object response) {
}
@Override
public void onException(Object response, Exception e) {
}
};
......
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