Commit d2a34349 by 宁斌

1、新增會員優惠券頁面 2、處理報表圖表控件滑動衝突問題

parent 84221077
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/theme_background_color"
android:orientation="vertical"> android:orientation="vertical">
<com.qmuiteam.qmui.widget.QMUITopBar <com.qmuiteam.qmui.widget.QMUITopBar
...@@ -16,5 +15,6 @@ ...@@ -16,5 +15,6 @@
android:id="@+id/section_layout" android:id="@+id/section_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants" /> android:descendantFocusability="blocksDescendants"
android:background="@color/theme_background_color"/>
</LinearLayout> </LinearLayout>
\ No newline at end of file
...@@ -132,7 +132,7 @@ public class ComponentMain implements IComponent { ...@@ -132,7 +132,7 @@ public class ComponentMain implements IComponent {
} }
private void openActivity(CC cc) { private void openActivity(CC cc) {
Intent intent = new Intent(cc.getContext(), NewMainActivity.class); Intent intent = new Intent(cc.getContext(), MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
cc.getContext().startActivity(intent); cc.getContext().startActivity(intent);
// CCUtil.createNavigateIntent(cc, NewMainActivity.class); // CCUtil.createNavigateIntent(cc, NewMainActivity.class);
......
...@@ -87,7 +87,6 @@ public class MainActivity extends BaseFragmentActivity<MainPresenter> implements ...@@ -87,7 +87,6 @@ public class MainActivity extends BaseFragmentActivity<MainPresenter> implements
return HomeFragment.newInstance(); return HomeFragment.newInstance();
case 1: case 1:
return ReportListFragment.newInstance(); return ReportListFragment.newInstance();
case 2:
default: default:
return MyFragment.newInstance(); return MyFragment.newInstance();
} }
......
...@@ -4,11 +4,13 @@ import android.content.Intent; ...@@ -4,11 +4,13 @@ import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.util.TypedValue; import android.util.TypedValue;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager; import androidx.viewpager.widget.ViewPager;
import com.gingersoft.gsa.cloud.main.R; import com.gingersoft.gsa.cloud.main.R;
import com.gingersoft.gsa.cloud.main.R2; import com.gingersoft.gsa.cloud.main.R2;
import com.gingersoft.gsa.cloud.main.di.component.DaggerReportComponent; import com.gingersoft.gsa.cloud.main.di.component.DaggerReportComponent;
...@@ -24,9 +26,12 @@ import com.jess.arms.base.BaseFragmentActivity; ...@@ -24,9 +26,12 @@ import com.jess.arms.base.BaseFragmentActivity;
import com.jess.arms.di.component.AppComponent; import com.jess.arms.di.component.AppComponent;
import com.jess.arms.utils.ArmsUtils; import com.jess.arms.utils.ArmsUtils;
import com.qmuiteam.qmui.widget.QMUITopBar; import com.qmuiteam.qmui.widget.QMUITopBar;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import butterknife.BindView; import butterknife.BindView;
import static com.jess.arms.utils.Preconditions.checkNotNull; import static com.jess.arms.utils.Preconditions.checkNotNull;
...@@ -54,6 +59,8 @@ public class ReportActivity extends BaseFragmentActivity<ReportPresenter> implem ...@@ -54,6 +59,8 @@ public class ReportActivity extends BaseFragmentActivity<ReportPresenter> implem
private TabFragmentAdapter mTabFragmentAdapter; private TabFragmentAdapter mTabFragmentAdapter;
private List<String> titles; private List<String> titles;
private BusinessReportFragment businessReportFragment;
@Override @Override
public void setupActivityComponent(@NonNull AppComponent appComponent) { public void setupActivityComponent(@NonNull AppComponent appComponent) {
DaggerReportComponent //如找不到该类,请编译一下项目 DaggerReportComponent //如找不到该类,请编译一下项目
...@@ -84,8 +91,10 @@ public class ReportActivity extends BaseFragmentActivity<ReportPresenter> implem ...@@ -84,8 +91,10 @@ public class ReportActivity extends BaseFragmentActivity<ReportPresenter> implem
titles.add("銷售分析"); titles.add("銷售分析");
titles.add("支付分析"); titles.add("支付分析");
businessReportFragment = BusinessReportFragment.newInstance();
List<Fragment> mFragments = new ArrayList<>(); List<Fragment> mFragments = new ArrayList<>();
mFragments.add(BusinessReportFragment.newInstance()); mFragments.add(businessReportFragment);
mFragments.add(SalesFragment.newInstance()); mFragments.add(SalesFragment.newInstance());
mFragments.add(PaymentMethodReportFragment.newInstance()); mFragments.add(PaymentMethodReportFragment.newInstance());
//实例化适配器 //实例化适配器
......
...@@ -4,6 +4,7 @@ import android.content.Intent; ...@@ -4,6 +4,7 @@ import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.os.Message; import android.os.Message;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.LinearLayout; import android.widget.LinearLayout;
...@@ -109,6 +110,9 @@ public class BusinessReportFragment extends BaseFragment<BusinessReportPresenter ...@@ -109,6 +110,9 @@ public class BusinessReportFragment extends BaseFragment<BusinessReportPresenter
private int manyDay = 7; private int manyDay = 7;
private String restaurantId; private String restaurantId;
private boolean mChartFocus;
public static BusinessReportFragment newInstance() { public static BusinessReportFragment newInstance() {
BusinessReportFragment fragment = new BusinessReportFragment(); BusinessReportFragment fragment = new BusinessReportFragment();
return fragment; return fragment;
...@@ -138,51 +142,37 @@ public class BusinessReportFragment extends BaseFragment<BusinessReportPresenter ...@@ -138,51 +142,37 @@ public class BusinessReportFragment extends BaseFragment<BusinessReportPresenter
mTvStartTime.setText(TimeUtils.getOldDate(-manyDay + 1)); mTvStartTime.setText(TimeUtils.getOldDate(-manyDay + 1));
mTvEndTime.setText(TimeUtils.getOldDate(0)); mTvEndTime.setText(TimeUtils.getOldDate(0));
//处理报表滑动过程中和页面滑动出现冲突
mLineChart.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mLineChart.requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_POINTER_UP:
mLineChart.requestDisallowInterceptTouchEvent(false);
break;
case MotionEvent.ACTION_CANCEL:
mLineChart.requestDisallowInterceptTouchEvent(false);
break;
}
return false;
}
});
}
@Override
public void onLazyInitView(@Nullable Bundle savedInstanceState) {
super.onLazyInitView(savedInstanceState);
getInfo(); getInfo();
} }
/**
* 通过此方法可以使 Fragment 能够与外界做一些交互和通信, 比如说外部的 Activity 想让自己持有的某个 Fragment 对象执行一些方法,
* 建议在有多个需要与外界交互的方法时, 统一传 {@link Message}, 通过 what 字段来区分不同的方法, 在 {@link #setData(Object)}
* 方法中就可以 {@code switch} 做不同的操作, 这样就可以用统一的入口方法做多个不同的操作, 可以起到分发的作用
* <p>
* 调用此方法时请注意调用时 Fragment 的生命周期, 如果调用 {@link #setData(Object)} 方法时 {@link Fragment#onCreate(Bundle)} 还没执行
* 但在 {@link #setData(Object)} 里却调用了 Presenter 的方法, 是会报空的, 因为 Dagger 注入是在 {@link Fragment#onCreate(Bundle)} 方法中执行的
* 然后才创建的 Presenter, 如果要做一些初始化操作,可以不必让外部调用 {@link #setData(Object)}, 在 {@link #initData(Bundle)} 中初始化就可以了
* <p>
* Example usage:
* <pre>
* public void setData(@Nullable Object data) {
* if (data != null && data instanceof Message) {
* switch (((Message) data).what) {
* case 0:
* loadData(((Message) data).arg1);
* break;
* case 1:
* refreshUI();
* break;
* default:
* //do something
* break;
* }
* }
* }
*
* // call setData(Object):
* Message data = new Message();
* data.what = 0;
* data.arg1 = 1;
* fragment.setData(data);
* </pre>
*
* @param data 当不需要参数时 {@code data} 可以为 {@code null}
*/
@Override @Override
public void setData(@Nullable Object data) { public void setData(@Nullable Object data) {
} }
@Override @Override
public void showLoading(String message) { public void showLoading(String message) {
if (message != null) if (message != null)
......
...@@ -40,6 +40,7 @@ import com.gingersoft.gsa.cloud.common.function.jump.ActivityJumpStrategy; ...@@ -40,6 +40,7 @@ import com.gingersoft.gsa.cloud.common.function.jump.ActivityJumpStrategy;
import com.gingersoft.gsa.cloud.common.leaks.WeakHandler; import com.gingersoft.gsa.cloud.common.leaks.WeakHandler;
import com.gingersoft.gsa.cloud.common.logan.LoganManager; import com.gingersoft.gsa.cloud.common.logan.LoganManager;
import com.gingersoft.gsa.cloud.common.service.ICommandService; import com.gingersoft.gsa.cloud.common.service.ICommandService;
import com.gingersoft.gsa.cloud.common.service.IServiceManager;
import com.gingersoft.gsa.cloud.common.utils.AppDevices; import com.gingersoft.gsa.cloud.common.utils.AppDevices;
import com.gingersoft.gsa.cloud.common.utils.JsonUtils; import com.gingersoft.gsa.cloud.common.utils.JsonUtils;
import com.gingersoft.gsa.cloud.common.utils.StytemUtils; import com.gingersoft.gsa.cloud.common.utils.StytemUtils;
...@@ -251,25 +252,8 @@ public class HomeFragment extends BaseFragment<HomePresenter> implements HomeCon ...@@ -251,25 +252,8 @@ public class HomeFragment extends BaseFragment<HomePresenter> implements HomeCon
} }
private void initService() { private void initService() {
boolean deliveryOrderServiceRunning = StytemUtils.isServiceRunning("com.gingersoft.gsa.cloud.common.service.ICommandService", _mActivity); IServiceManager.startICommandService(GsaCloudApplication.getAppContext());
if (!deliveryOrderServiceRunning) { IServiceManager.startPrjService(GsaCloudApplication.getAppContext());
Intent service = new Intent(GsaCloudApplication.getAppContext(), ICommandService.class);
service.putExtra(ICommandService.CONNECTION_TYPE, ICommandService.mCurrConnectionType);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mContext.startForegroundService(service);
} else {
mContext.startService(service);
}
}
boolean prjServiceRunning = StytemUtils.isServiceRunning("com.joe.print.mvp.print.service.PrjService", _mActivity);
if (!prjServiceRunning) {
//開啟Prj打印服務
CC.obtainBuilder(ComponentName.COMPONENT_PRINT)
.setActionName("openPrintService")
.build()
.call();
}
} }
/** /**
......
...@@ -41,7 +41,6 @@ public class MyFragment extends BaseFragment<MyPresenter> implements MyContract. ...@@ -41,7 +41,6 @@ public class MyFragment extends BaseFragment<MyPresenter> implements MyContract.
@BindView(R2.id.main_personal_center_rv) @BindView(R2.id.main_personal_center_rv)
RecyclerView rvMyList; RecyclerView rvMyList;
public static MyFragment newInstance() { public static MyFragment newInstance() {
MyFragment fragment = new MyFragment(); MyFragment fragment = new MyFragment();
return fragment; return fragment;
......
...@@ -5,6 +5,7 @@ import android.graphics.Color; ...@@ -5,6 +5,7 @@ import android.graphics.Color;
import android.os.Bundle; import android.os.Bundle;
import android.os.Message; import android.os.Message;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.TextView; import android.widget.TextView;
...@@ -108,6 +109,29 @@ public class PaymentMethodReportFragment extends BaseFragment<PaymentMethodRepor ...@@ -108,6 +109,29 @@ public class PaymentMethodReportFragment extends BaseFragment<PaymentMethodRepor
mTvStartTime.setText(TimeUtils.getOldDate(-7)); mTvStartTime.setText(TimeUtils.getOldDate(-7));
mTvEndTime.setText(TimeUtils.getOldDate(0)); mTvEndTime.setText(TimeUtils.getOldDate(0));
//处理报表滑动过程中和页面滑动出现冲突
chart.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
chart.requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_POINTER_UP:
chart.requestDisallowInterceptTouchEvent(false);
break;
case MotionEvent.ACTION_CANCEL:
chart.requestDisallowInterceptTouchEvent(false);
break;
}
return false;
}
});
}
@Override
public void onLazyInitView(@Nullable Bundle savedInstanceState) {
super.onLazyInitView(savedInstanceState);
getPayMenthInfo(); getPayMenthInfo();
} }
......
...@@ -5,6 +5,7 @@ import android.graphics.Color; ...@@ -5,6 +5,7 @@ import android.graphics.Color;
import android.os.Bundle; import android.os.Bundle;
import android.os.Message; import android.os.Message;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.LinearLayout; import android.widget.LinearLayout;
...@@ -134,46 +135,34 @@ public class SalesFragment extends BaseFragment<SalesPresenter> implements Sales ...@@ -134,46 +135,34 @@ public class SalesFragment extends BaseFragment<SalesPresenter> implements Sales
mTvEndTime.setText(TimeUtils.getOldDate(0)); mTvEndTime.setText(TimeUtils.getOldDate(0));
startEndTimePickerView.setOnUpdateTimePicker(onUpdateTimePicker); startEndTimePickerView.setOnUpdateTimePicker(onUpdateTimePicker);
//处理报表滑动过程中和页面滑动出现冲突
salesChart.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
salesChart.requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_POINTER_UP:
salesChart.requestDisallowInterceptTouchEvent(false);
break;
case MotionEvent.ACTION_CANCEL:
salesChart.requestDisallowInterceptTouchEvent(false);
break;
}
return false;
}
});
}
@Override
public void onLazyInitView(@Nullable Bundle savedInstanceState) {
super.onLazyInitView(savedInstanceState);
getSaleReport(); getSaleReport();
getDeliveryReport(); getDeliveryReport();
} }
/**
* 通过此方法可以使 Fragment 能够与外界做一些交互和通信, 比如说外部的 Activity 想让自己持有的某个 Fragment 对象执行一些方法,
* 建议在有多个需要与外界交互的方法时, 统一传 {@link Message}, 通过 what 字段来区分不同的方法, 在 {@link #setData(Object)}
* 方法中就可以 {@code switch} 做不同的操作, 这样就可以用统一的入口方法做多个不同的操作, 可以起到分发的作用
* <p>
* 调用此方法时请注意调用时 Fragment 的生命周期, 如果调用 {@link #setData(Object)} 方法时 {@link Fragment#onCreate(Bundle)} 还没执行
* 但在 {@link #setData(Object)} 里却调用了 Presenter 的方法, 是会报空的, 因为 Dagger 注入是在 {@link Fragment#onCreate(Bundle)} 方法中执行的
* 然后才创建的 Presenter, 如果要做一些初始化操作,可以不必让外部调用 {@link #setData(Object)}, 在 {@link #initData(Bundle)} 中初始化就可以了
* <p>
* Example usage:
* <pre>
* public void setData(@Nullable Object data) {
* if (data != null && data instanceof Message) {
* switch (((Message) data).what) {
* case 0:
* loadData(((Message) data).arg1);
* break;
* case 1:
* refreshUI();
* break;
* default:
* //do something
* break;
* }
* }
* }
*
* // call setData(Object):
* Message data = new Message();
* data.what = 0;
* data.arg1 = 1;
* fragment.setData(data);
* </pre>
*
* @param data 当不需要参数时 {@code data} 可以为 {@code null}
*/
@Override @Override
public void setData(@Nullable Object data) { public void setData(@Nullable Object data) {
......
...@@ -64,12 +64,9 @@ public class TableManagePresenter extends BasePresenter<TableManageContract.Mode ...@@ -64,12 +64,9 @@ public class TableManagePresenter extends BasePresenter<TableManageContract.Mode
private GetTableTimer tableTimer; private GetTableTimer tableTimer;
private Disposable mGetTablesDataDisposable; private Disposable mGetTablesDataDisposable;
private TableManageActivity IActivity;
@Inject @Inject
public TableManagePresenter(TableManageContract.Model model, TableManageContract.View rootView) { public TableManagePresenter(TableManageContract.Model model, TableManageContract.View rootView) {
super(model, rootView); super(model, rootView);
this.IActivity = (TableManageActivity) rootView;
} }
@Override @Override
......
package com.gingersoft.gsa.cloud.table.di.component;
import dagger.BindsInstance;
import dagger.Component;
import com.jess.arms.di.component.AppComponent;
import com.gingersoft.gsa.cloud.table.di.module.BillDiscountModule;
import com.gingersoft.gsa.cloud.table.mvp.contract.BillDiscountContract;
import com.jess.arms.di.scope.FragmentScope;
import com.gingersoft.gsa.cloud.table.mvp.ui.fragment.discount.BillDiscountFragment;
/**
* ================================================
* Description:
* <p>
* Created by MVPArmsTemplate on 04/02/2021 17:26
* <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>
* ================================================
*/
@FragmentScope
@Component(modules = BillDiscountModule.class, dependencies = AppComponent.class)
public interface BillDiscountComponent {
void inject(BillDiscountFragment fragment);
@Component.Builder
interface Builder {
@BindsInstance
BillDiscountComponent.Builder view(BillDiscountContract.View view);
BillDiscountComponent.Builder appComponent(AppComponent appComponent);
BillDiscountComponent build();
}
}
\ No newline at end of file
package com.gingersoft.gsa.cloud.table.di.component;
import dagger.BindsInstance;
import dagger.Component;
import dagger.Subcomponent;
import com.jess.arms.di.component.AppComponent;
import com.gingersoft.gsa.cloud.table.di.module.CouponModule;
import com.gingersoft.gsa.cloud.table.mvp.contract.CouponContract;
import com.jess.arms.di.scope.FragmentScope;
import com.gingersoft.gsa.cloud.table.mvp.ui.fragment.discount.CouponFragment;
/**
* ================================================
* Description:
* <p>
* Created by MVPArmsTemplate on 04/02/2021 17:28
* <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>
* ================================================
*/
@FragmentScope
@Component(modules = CouponModule.class, dependencies = AppComponent.class)
public interface CouponComponent {
void inject(CouponFragment fragment);
@Component.Builder
interface Builder {
@BindsInstance
CouponComponent.Builder view(CouponContract.View view);
CouponComponent.Builder appComponent(AppComponent appComponent);
CouponComponent build();
}
}
\ No newline at end of file
package com.gingersoft.gsa.cloud.table.di.module;
import com.gingersoft.gsa.cloud.ui.adapter.TagViewAdapter;
import com.gingersoft.gsa.cloud.ui.bean.TagViewItem;
import com.jess.arms.di.scope.ActivityScope;
import com.jess.arms.di.scope.FragmentScope;
import dagger.Binds;
import dagger.Module;
import dagger.Provides;
import com.gingersoft.gsa.cloud.table.mvp.contract.BillDiscountContract;
import com.gingersoft.gsa.cloud.table.mvp.model.BillDiscountModel;
import java.util.ArrayList;
import java.util.List;
/**
* ================================================
* Description:
* <p>
* Created by MVPArmsTemplate on 04/02/2021 17:26
* <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 BillDiscountModule {
@Binds
abstract BillDiscountContract.Model bindBillDiscountModel(BillDiscountModel model);
@FragmentScope
@Provides
static List<TagViewItem> provideBillDiscountList(){
return new ArrayList<>();
}
@FragmentScope
@Provides
static TagViewAdapter provideBillDiscountAdapter(List<TagViewItem> billDiscountList){
return new TagViewAdapter(billDiscountList);
}
}
\ No newline at end of file
package com.gingersoft.gsa.cloud.table.di.module;
import com.gingersoft.gsa.cloud.common.core.discount.MemberCoupon;
import com.gingersoft.gsa.cloud.ui.adapter.TagViewAdapter;
import com.gingersoft.gsa.cloud.ui.bean.TagViewItem;
import com.jess.arms.di.scope.ActivityScope;
import com.jess.arms.di.scope.FragmentScope;
import dagger.Binds;
import dagger.Module;
import dagger.Provides;
import com.gingersoft.gsa.cloud.table.mvp.contract.CouponContract;
import com.gingersoft.gsa.cloud.table.mvp.model.CouponModel;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
/**
* ================================================
* Description:
* <p>
* Created by MVPArmsTemplate on 04/02/2021 17:28
* <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 CouponModule {
@Binds
abstract CouponContract.Model bindCouponModel(CouponModel model);
@FragmentScope
@Provides
static List<TagViewItem> provideMemberCouponList(){
return new ArrayList<>();
}
@FragmentScope
@Provides
static TagViewAdapter provideMemberCouponAdapter(List<TagViewItem> memberCouponList){
return new TagViewAdapter(memberCouponList);
}
}
\ No newline at end of file
package com.gingersoft.gsa.cloud.table.di.module; package com.gingersoft.gsa.cloud.table.di.module;
import android.content.Context;
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.contract.MealStandContract;
import com.gingersoft.gsa.cloud.table.mvp.model.MealStandModel; 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.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.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.Binds;
import dagger.Module; import dagger.Module;
import dagger.Provides;
/** /**
...@@ -25,4 +45,73 @@ public abstract class MealStandModule { ...@@ -25,4 +45,73 @@ public abstract class MealStandModule {
@Binds @Binds
abstract MealStandContract.Model bindMealStandModel(MealStandModel model); 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<>();
}
@ActivityScope
@Provides
static FoodGroupAdapter provideFoodGroupAdapter(MealStandContract.View IView, @Named("foodGroupList") List<Food> foodGroupList) {
return new FoodGroupAdapter(IView.getActivity(), foodGroupList, IView.getFromType());
}
@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
...@@ -35,15 +35,4 @@ public abstract class TableModule { ...@@ -35,15 +35,4 @@ public abstract class TableModule {
@Binds @Binds
abstract TableContract.Model bindTableModel(TableModel model); abstract TableContract.Model bindTableModel(TableModel model);
@ActivityScope
@Provides
static List<Food> provideFoodList() {
return new ArrayList<>();
}
@ActivityScope
@Provides
static FoodAdapter provideFoodAdapter(Context context, List<Food> foodList, int fromType) {
return new FoodAdapter(context, foodList, fromType);
}
} }
\ No newline at end of file
package com.gingersoft.gsa.cloud.table.mvp.contract;
import androidx.recyclerview.widget.RecyclerView;
import com.gingersoft.gsa.cloud.database.bean.Discount;
import com.jess.arms.mvp.IView;
import com.jess.arms.mvp.IModel;
import com.kingja.loadsir.callback.Callback;
import java.util.List;
/**
* ================================================
* Description:
* <p>
* Created by MVPArmsTemplate on 04/02/2021 17:26
* <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>
* ================================================
*/
public interface BillDiscountContract {
//对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
interface View extends IView {
void returnBillCoupon(List<Discount> discounts);
}
//Model层定义接口,外部只需关心Model返回的数据,无需关心内部细节,即是否使用缓存
interface Model extends IModel {
List<Discount> queryDB_DiscountList(byte discountScope, byte discountType);
}
}
package com.gingersoft.gsa.cloud.table.mvp.contract;
import androidx.recyclerview.widget.RecyclerView;
import com.gingersoft.gsa.cloud.common.bean.BaseResult;
import com.gingersoft.gsa.cloud.common.core.discount.MemberCoupon;
import com.jess.arms.mvp.IView;
import com.jess.arms.mvp.IModel;
import com.kingja.loadsir.callback.Callback;
import com.kingja.loadsir.core.LoadService;
import com.kingja.loadsir.core.LoadSir;
import java.util.List;
import io.reactivex.Observable;
import io.reactivex.Single;
import retrofit2.http.Query;
/**
* ================================================
* Description:
* <p>
* Created by MVPArmsTemplate on 04/02/2021 17:28
* <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>
* ================================================
*/
public interface CouponContract {
//对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
interface View extends IView {
void returnMemberCouponList(List<MemberCoupon> memberCoupons);
void showLoadSirSuccess();
void showLoadSirCall(Class<? extends Callback> call);
LoadService getLoadService();
}
//Model层定义接口,外部只需关心Model返回的数据,无需关心内部细节,即是否使用缓存
interface Model extends IModel {
Single<List<MemberCoupon>> getMemberWalletList(int brandId, long memberId, long limitType, long pageIndex, long pageSize);
}
}
...@@ -5,6 +5,7 @@ import android.widget.BaseAdapter; ...@@ -5,6 +5,7 @@ import android.widget.BaseAdapter;
import com.gingersoft.gsa.cloud.common.bean.BaseResult; import com.gingersoft.gsa.cloud.common.bean.BaseResult;
import com.gingersoft.gsa.cloud.common.core.member.MemberInfo; import com.gingersoft.gsa.cloud.common.core.member.MemberInfo;
import com.gingersoft.gsa.cloud.common.core.restaurant.RestaurantInfoManager;
import com.gingersoft.gsa.cloud.database.bean.ComboItem; import com.gingersoft.gsa.cloud.database.bean.ComboItem;
import com.gingersoft.gsa.cloud.database.bean.Discount; import com.gingersoft.gsa.cloud.database.bean.Discount;
import com.gingersoft.gsa.cloud.database.bean.Food; import com.gingersoft.gsa.cloud.database.bean.Food;
...@@ -104,10 +105,13 @@ public interface MealStandContract { ...@@ -104,10 +105,13 @@ public interface MealStandContract {
void setMealRvScrollToPosition(int position); void setMealRvScrollToPosition(int position);
List<Food> getFoodGroupList();
Activity getActivity(); Activity getActivity();
void setModifierTop(int Margins); int getFromType();
void setModifierTop(int Margins);
void setCustomFoodDialog(int customType, OrderDetail foodItem); void setCustomFoodDialog(int customType, OrderDetail foodItem);
} }
......
...@@ -72,7 +72,7 @@ public interface OrderContentContract { ...@@ -72,7 +72,7 @@ public interface OrderContentContract {
//Model层定义接口,外部只需关心Model返回的数据,无需关心内部细节,即是否使用缓存 //Model层定义接口,外部只需关心Model返回的数据,无需关心内部细节,即是否使用缓存
interface Model extends BaseOrderContract.Model { interface Model extends BaseOrderContract.Model {
List<Discount> queryDB_DiscountList(byte discountScope, byte discountType); // List<Discount> queryDB_DiscountList(byte discountScope, byte discountType);
Observable<BaseOrderResponse> createOrder(RequestBody requestBody); Observable<BaseOrderResponse> createOrder(RequestBody requestBody);
......
package com.gingersoft.gsa.cloud.table.mvp.model;
import android.app.Application;
import com.gingersoft.gsa.cloud.database.bean.Discount;
import com.gingersoft.gsa.cloud.database.utils.DiscountDaoUtils;
import com.gingersoft.gsa.cloud.table.mvp.model.utils.MealConditionFilterUtils;
import com.google.gson.Gson;
import com.jess.arms.integration.IRepositoryManager;
import com.jess.arms.mvp.BaseModel;
import com.jess.arms.di.scope.FragmentScope;
import javax.inject.Inject;
import com.gingersoft.gsa.cloud.table.mvp.contract.BillDiscountContract;
import java.util.List;
/**
* ================================================
* Description:
* <p>
* Created by MVPArmsTemplate on 04/02/2021 17:26
* <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>
* ================================================
*/
@FragmentScope
public class BillDiscountModel extends BaseModel implements BillDiscountContract.Model {
@Inject
Gson mGson;
@Inject
Application mApplication;
@Inject
public BillDiscountModel(IRepositoryManager repositoryManager) {
super(repositoryManager);
}
@Override
public void onDestroy() {
super.onDestroy();
this.mGson = null;
this.mApplication = null;
}
@Override
public List<Discount> queryDB_DiscountList(byte discountScope, byte discountType) {
DiscountDaoUtils discountDaoUtils = new DiscountDaoUtils(mApplication);
List<Discount> discountList = discountDaoUtils.queryDiscountByQueryBuilder();
return MealConditionFilterUtils.discountConditionFilter(discountList,discountScope,discountType);
}
}
\ No newline at end of file
package com.gingersoft.gsa.cloud.table.mvp.model;
import android.app.Application;
import com.gingersoft.gsa.cloud.common.bean.BaseResult;
import com.gingersoft.gsa.cloud.common.core.discount.MemberCoupon;
import com.gingersoft.gsa.cloud.common.utils.gson.GsonUtils;
import com.gingersoft.gsa.cloud.table.mvp.model.service.MealService;
import com.gingersoft.gsa.cloud.table.mvp.model.service.MemberService;
import com.google.gson.Gson;
import com.jess.arms.integration.IRepositoryManager;
import com.jess.arms.mvp.BaseModel;
import com.jess.arms.di.scope.FragmentScope;
import javax.inject.Inject;
import com.gingersoft.gsa.cloud.table.mvp.contract.CouponContract;
import java.util.ArrayList;
import java.util.List;
import io.reactivex.Single;
import io.reactivex.functions.Function;
/**
* ================================================
* Description:
* <p>
* Created by MVPArmsTemplate on 04/02/2021 17:28
* <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>
* ================================================
*/
@FragmentScope
public class CouponModel extends BaseModel implements CouponContract.Model {
@Inject
Gson mGson;
@Inject
Application mApplication;
@Inject
public CouponModel(IRepositoryManager repositoryManager) {
super(repositoryManager);
}
@Override
public void onDestroy() {
super.onDestroy();
this.mGson = null;
this.mApplication = null;
}
@Override
public Single<List<MemberCoupon>> getMemberWalletList(int brandId, long memberId, long limitType, long pageIndex, long pageSize) {
return mRepositoryManager.obtainRetrofitService(MemberService.class)
.getMemberWalletList(brandId, memberId, limitType, pageIndex, pageSize)
.map(new Function<BaseResult, List<MemberCoupon>>() {
@Override
public List<MemberCoupon> apply(BaseResult result) throws Exception {
if (result.isSuccess()) {
return GsonUtils.jsonToList(result.getData(), MemberCoupon.class);
} else {
return new ArrayList<>();
}
}
});
}
}
\ No newline at end of file
...@@ -76,12 +76,12 @@ public class OrderContentModel extends BaseModel implements OrderContentContract ...@@ -76,12 +76,12 @@ public class OrderContentModel extends BaseModel implements OrderContentContract
.loadOrder(orderId); .loadOrder(orderId);
} }
@Override // @Override
public List<Discount> queryDB_DiscountList(byte discountScope, byte discountType) { // public List<Discount> queryDB_DiscountList(byte discountScope, byte discountType) {
DiscountDaoUtils discountDaoUtils = new DiscountDaoUtils(mApplication); // DiscountDaoUtils discountDaoUtils = new DiscountDaoUtils(mApplication);
List<Discount> discountList = discountDaoUtils.queryDiscountByQueryBuilder(); // List<Discount> discountList = discountDaoUtils.queryDiscountByQueryBuilder();
return MealConditionFilterUtils.discountConditionFilter(discountList,discountScope,discountType); // return MealConditionFilterUtils.discountConditionFilter(discountList,discountScope,discountType);
} // }
@Override @Override
public Observable<BaseOrderResponse> createOrder(RequestBody requestBody) { public Observable<BaseOrderResponse> createOrder(RequestBody requestBody) {
......
...@@ -3,6 +3,7 @@ package com.gingersoft.gsa.cloud.table.mvp.model.service; ...@@ -3,6 +3,7 @@ package com.gingersoft.gsa.cloud.table.mvp.model.service;
import com.gingersoft.gsa.cloud.common.bean.BaseResult; import com.gingersoft.gsa.cloud.common.bean.BaseResult;
import io.reactivex.Observable; import io.reactivex.Observable;
import io.reactivex.Single;
import me.jessyan.retrofiturlmanager.RetrofitUrlManager; import me.jessyan.retrofiturlmanager.RetrofitUrlManager;
import retrofit2.http.GET; import retrofit2.http.GET;
import retrofit2.http.Headers; import retrofit2.http.Headers;
...@@ -27,4 +28,7 @@ public interface MemberService { ...@@ -27,4 +28,7 @@ public interface MemberService {
@GET("coupon/queryCoupon" + RetrofitUrlManager.IDENTIFICATION_PATH_SIZE + 2) @GET("coupon/queryCoupon" + RetrofitUrlManager.IDENTIFICATION_PATH_SIZE + 2)
Observable<BaseResult> queryCoupon(@Query("tableId") int tableId,@Query("memberId") Long memberId, @Query("couponMemberId") long couponMemberId,@Query("couponNo") String couponNo,@Query("restaurantId") int restaurantId); Observable<BaseResult> queryCoupon(@Query("tableId") int tableId,@Query("memberId") Long memberId, @Query("couponMemberId") long couponMemberId,@Query("couponNo") String couponNo,@Query("restaurantId") int restaurantId);
@Headers({"Domain-Name: ricepon_member"})
@GET("member/getMemberWalletList" + RetrofitUrlManager.IDENTIFICATION_PATH_SIZE + 2)
Single<BaseResult> getMemberWalletList(@Query("brandId") int brandId, @Query("memberId") long memberId, @Query("limitType") long limitType, @Query("pageIndex") long pageIndex, @Query("pageSize") long pageSize);
} }
...@@ -145,8 +145,6 @@ public abstract class BaseOrderPresenter<M extends BaseOrderContract.Model, V ex ...@@ -145,8 +145,6 @@ public abstract class BaseOrderPresenter<M extends BaseOrderContract.Model, V ex
protected String roundingStr = "賬單小數"; protected String roundingStr = "賬單小數";
private final String noFoodDeliveryTip = "賬單沒有食品,是否開台?"; private final String noFoodDeliveryTip = "賬單沒有食品,是否開台?";
private Disposable disposable;
public abstract void createOrder(boolean isPrint, Class<?> afterToActivity); public abstract void createOrder(boolean isPrint, Class<?> afterToActivity);
...@@ -203,9 +201,6 @@ public abstract class BaseOrderPresenter<M extends BaseOrderContract.Model, V ex ...@@ -203,9 +201,6 @@ public abstract class BaseOrderPresenter<M extends BaseOrderContract.Model, V ex
this.mErrorHandler = null; this.mErrorHandler = null;
this.mAppManager = null; this.mAppManager = null;
this.mApplication = null; this.mApplication = null;
if (disposable != null && !disposable.isDisposed()) {
disposable.dispose();
}
} }
private void initOrderAdapter() { private void initOrderAdapter() {
...@@ -276,7 +271,7 @@ public abstract class BaseOrderPresenter<M extends BaseOrderContract.Model, V ex ...@@ -276,7 +271,7 @@ public abstract class BaseOrderPresenter<M extends BaseOrderContract.Model, V ex
LoganManager.w_tableMode(TAG, "合計金額=" + wholeAmount); LoganManager.w_tableMode(TAG, "合計金額=" + wholeAmount);
disposable = Observable.just(wholeAmount) Disposable disposable = Observable.just(wholeAmount)
.subscribeOn(Schedulers.computation()) .subscribeOn(Schedulers.computation())
/** /**
* 計算服務費(堂食) * 計算服務費(堂食)
...@@ -404,6 +399,7 @@ public abstract class BaseOrderPresenter<M extends BaseOrderContract.Model, V ex ...@@ -404,6 +399,7 @@ public abstract class BaseOrderPresenter<M extends BaseOrderContract.Model, V ex
} }
} }
}); });
addDispose(disposable);
} }
/** /**
......
package com.gingersoft.gsa.cloud.table.mvp.presenter;
import android.app.Application;
import com.gingersoft.gsa.cloud.common.constans.FoodSummaryConstans;
import com.gingersoft.gsa.cloud.common.loadsir.EmptyCallback;
import com.gingersoft.gsa.cloud.database.bean.Discount;
import com.gingersoft.gsa.cloud.order.order.BaseOrder;
import com.jess.arms.integration.AppManager;
import com.jess.arms.di.scope.FragmentScope;
import com.jess.arms.mvp.BasePresenter;
import com.jess.arms.http.imageloader.ImageLoader;
import me.jessyan.rxerrorhandler.core.RxErrorHandler;
import javax.inject.Inject;
import com.gingersoft.gsa.cloud.table.mvp.contract.BillDiscountContract;
import java.util.List;
/**
* ================================================
* Description:
* <p>
* Created by MVPArmsTemplate on 04/02/2021 17:26
* <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>
* ================================================
*/
@FragmentScope
public class BillDiscountPresenter extends BasePresenter<BillDiscountContract.Model, BillDiscountContract.View> {
@Inject
RxErrorHandler mErrorHandler;
@Inject
Application mApplication;
@Inject
ImageLoader mImageLoader;
@Inject
AppManager mAppManager;
@Inject
public BillDiscountPresenter(BillDiscountContract.Model model, BillDiscountContract.View rootView) {
super(model, rootView);
}
@Override
public void onDestroy() {
super.onDestroy();
this.mErrorHandler = null;
this.mAppManager = null;
this.mImageLoader = null;
this.mApplication = null;
}
public void queryBillDiscountList() {
List<Discount> discountList;
if (BaseOrder.isCurrentOrderType(FoodSummaryConstans.TAKEAWAY_TYPE)) {
discountList = mModel.queryDB_DiscountList(Discount.discount_scope_bill, Discount.ORDER_TYPE_TAKEAWAY);
} else {
discountList = mModel.queryDB_DiscountList(Discount.discount_scope_bill, Discount.ORDER_TYPE_MEAL_STAND);
}
mRootView.returnBillCoupon(discountList);
}
}
package com.gingersoft.gsa.cloud.table.mvp.presenter;
import android.app.Application;
import com.gingersoft.gsa.cloud.common.core.discount.MemberCoupon;
import com.gingersoft.gsa.cloud.common.core.member.MemberInfo;
import com.gingersoft.gsa.cloud.common.core.restaurant.RestaurantInfoManager;
import com.gingersoft.gsa.cloud.common.loadsir.EmptyCallback;
import com.gingersoft.gsa.cloud.common.utils.JsonUtils;
import com.gingersoft.gsa.cloud.order.order.DoshokuOrder;
import com.gingersoft.gsa.cloud.common.rxjava.ErrorHandleSingleSubscriber;
import com.gingersoft.gsa.cloud.table.mvp.model.bean.response.OrderManagerResponse;
import com.jess.arms.integration.AppManager;
import com.jess.arms.di.scope.FragmentScope;
import com.jess.arms.mvp.BasePresenter;
import com.jess.arms.http.imageloader.ImageLoader;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import me.jessyan.rxerrorhandler.core.RxErrorHandler;
import javax.inject.Inject;
import com.gingersoft.gsa.cloud.table.mvp.contract.CouponContract;
import com.jess.arms.utils.RxLifecycleUtils;
import com.scwang.smartrefresh.layout.api.RefreshLayout;
import java.util.List;
/**
* ================================================
* Description:
* <p>
* Created by MVPArmsTemplate on 04/02/2021 17:28
* <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>
* ================================================
*/
@FragmentScope
public class CouponPresenter extends BasePresenter<CouponContract.Model, CouponContract.View> {
@Inject
RxErrorHandler mErrorHandler;
@Inject
Application mApplication;
@Inject
ImageLoader mImageLoader;
@Inject
AppManager mAppManager;
//是否可以繼續上拉刷新
private boolean noMoreData = false;
private int limitType = 1;
private int pageIndex = 1;
private int pageSize = 20;
@Inject
public CouponPresenter(CouponContract.Model model, CouponContract.View rootView) {
super(model, rootView);
}
@Override
public void onDestroy() {
super.onDestroy();
this.mErrorHandler = null;
this.mAppManager = null;
this.mImageLoader = null;
this.mApplication = null;
}
public void getMemberWalletList(RefreshLayout refreshLayout, boolean isLoadMore) {
int brandId = RestaurantInfoManager.newInstance().getBrandId();
MemberInfo memberInfo = DoshokuOrder.getInstance().getMemberInfo();
long memberId = 0;
if (memberInfo != null) {
memberId = memberInfo.getId();
}
mModel.getMemberWalletList(brandId, memberId, limitType, pageIndex, pageSize)
.subscribeOn(Schedulers.io())
.doOnSubscribe(disposable -> {
if (refreshLayout == null) {
mRootView.showLoading(null);
}
}
)
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.doAfterTerminate(() -> mRootView.hideLoading())
.compose(RxLifecycleUtils.bindToLifecycle(mRootView))
.subscribe(new ErrorHandleSingleSubscriber<List<MemberCoupon>>(mErrorHandler, mRootView.getLoadService()) {
@Override
public void onSuccess(List<MemberCoupon> result) {
if (pageIndex != 0) {
//根據數據庫下標分頁
pageIndex = pageIndex * pageSize;
}
if (result.size() > 0) {
if (!noMoreData) {
mRootView.returnMemberCouponList(result);
mRootView.showLoadSirSuccess();
}
if (result.size() < pageSize) {
//沒有更多數據不能上拉刷新
noMoreData = true;
} else {
noMoreData = false;
}
} else {
if (!noMoreData) {
mRootView.showLoadSirCall(EmptyCallback.class);
}
}
resetRefreshLayout(noMoreData);
}
@Override
public void onError(Throwable t) {
if (pageIndex != 0) {
//根據數據庫下標分頁
pageIndex = pageIndex * pageSize;
}
resetRefreshLayout(false);
}
private void resetRefreshLayout(boolean noMoreData) {
if (refreshLayout != null) {
if (isLoadMore) {
if (noMoreData) {
refreshLayout.setNoMoreData(true);
}
refreshLayout.finishLoadMore();
} else {
refreshLayout.finishRefresh();
refreshLayout.resetNoMoreData();
}
}
}
});
}
}
...@@ -66,6 +66,7 @@ import java.util.ArrayList; ...@@ -66,6 +66,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named;
import io.reactivex.Observable; import io.reactivex.Observable;
import io.reactivex.ObservableEmitter; import io.reactivex.ObservableEmitter;
...@@ -108,49 +109,37 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod ...@@ -108,49 +109,37 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod
ImageLoader mImageLoader; ImageLoader mImageLoader;
@Inject @Inject
AppManager mAppManager; AppManager mAppManager;
// @Inject
FoodAdapter mFoodAdapter; @Inject
// @Inject @Named("foodList")
List<Food> mFoodList; List<Food> mFoodList;
@Inject
List<ComboItem> mFoodComboList; //套餐细项数据
@Inject
List<Modifier> mModifierList; //细项数据
@Inject
List<Discount> mDiscountList; //折扣数据
@Inject
List<SoldoutCtrFood> mSoldoutCtrList;//沽清食品數據
@Inject
FoodAdapter mFoodAdapter;
@Inject
ComboAdapter mComboAdapter;
@Inject
ModifierAdapter mModifierAdapter;
@Inject
DiscountAdapter mDiscountAdapter;
private MealStandActivity IActivity; private MealStandActivity IActivity;
private CancelFoodDialog mCancelFoodDialog; private CancelFoodDialog mCancelFoodDialog;
private ComboAdapter mComboAdapter;
private ModifierAdapter mModifierAdapter;
private DiscountAdapter mDiscountAdapter;
/**
* 食品数据
*/
private List<Food> mFoodGroupList = new ArrayList<>();
/**
* 當前食品組下食品
*/
// private List<Food> mFoodList = new ArrayList<>();
/**
* 套餐细项数据
*/
private List<ComboItem> mFoodComboList = new ArrayList<>();
private List<Modifier> mModifierList = new ArrayList<>();
/**
* 折扣数据
*/
private List<Discount> mDiscountList = new ArrayList<>();
/**
* 沽清食品數據
*/
private List<SoldoutCtrFood> mSoldoutCtrList = new ArrayList<>();
private MealDiscountAction mMealDiscountAction; private MealDiscountAction mMealDiscountAction;
private OrderDetail mCurrentOrderDetailBean; private OrderDetail mCurrentOrderDetailBean;
private boolean RvMealClicked; private boolean RvMealClicked;
@Inject @Inject
public MealStandPresenter(MealStandContract.Model model, MealStandContract.View rootView) { public MealStandPresenter(MealStandContract.Model model, MealStandContract.View rootView) {
super(model, rootView); super(model, rootView);
...@@ -226,16 +215,15 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod ...@@ -226,16 +215,15 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod
if (foodGroupList != null && foodGroupList.size() > 0) { if (foodGroupList != null && foodGroupList.size() > 0) {
mFoodGroupList.addAll(foodGroupList); mRootView.getFoodGroupList().addAll(foodGroupList);
Food defalutFoodGroup = getDefalutFoodGroup(mFoodGroupList); Food defalutFoodGroup = getDefalutFoodGroup(mRootView.getFoodGroupList());
if (defalutFoodGroup != null) { if (defalutFoodGroup != null) {
//默認選中第一組 //默認選中第一組
defalutFoodGroup.setSelected(true); defalutFoodGroup.setSelected(true);
} }
IActivity.initFoodGroupView(mFoodGroupList); IActivity.initFoodGroupView(mRootView.getFoodGroupList());
updateFoodSoldoutCtrData(); updateFoodSoldoutCtrData();
...@@ -246,14 +234,12 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod ...@@ -246,14 +234,12 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod
} }
private Food getDefalutFoodGroup(List<Food> foodGroupList) { private Food getDefalutFoodGroup(List<Food> foodGroupList) {
Food defalutFoodGroup = null;
for (Food food : foodGroupList) { for (Food food : foodGroupList) {
if (food.getInvisible() == 0) { if (food.getInvisible() == 0) {
defalutFoodGroup = food; return food;
break;
} }
} }
return defalutFoodGroup; return null;
} }
...@@ -262,19 +248,18 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod ...@@ -262,19 +248,18 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod
mRootView.setSelectFoodAdapter(mSelectMealAdapter); mRootView.setSelectFoodAdapter(mSelectMealAdapter);
} }
if (mFoodAdapter == null) { if (mFoodAdapter == null) {
mFoodAdapter = new FoodAdapter(IActivity, mFoodList, 1);
mRootView.setFoodAdapter(mFoodAdapter); mRootView.setFoodAdapter(mFoodAdapter);
} }
if (mComboAdapter == null) { if (mComboAdapter == null) {
mComboAdapter = new ComboAdapter(IActivity, mFoodComboList); // mComboAdapter = new ComboAdapter(IActivity, mFoodComboList);
mRootView.setComboAdapter(mComboAdapter); mRootView.setComboAdapter(mComboAdapter);
} }
if (mModifierAdapter == null) { if (mModifierAdapter == null) {
mModifierAdapter = new ModifierAdapter(IActivity, mModifierList); // mModifierAdapter = new ModifierAdapter(IActivity, mModifierList);
mRootView.setModifierAdapter(mModifierAdapter); mRootView.setModifierAdapter(mModifierAdapter);
} }
if (mDiscountAdapter == null) { if (mDiscountAdapter == null) {
mDiscountAdapter = new DiscountAdapter(IActivity, mDiscountList); // mDiscountAdapter = new DiscountAdapter(IActivity, mDiscountList);
mRootView.setDiscountAdapter(mDiscountAdapter); mRootView.setDiscountAdapter(mDiscountAdapter);
} }
} }
...@@ -524,7 +509,7 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod ...@@ -524,7 +509,7 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod
} }
private void loadComboData(OrderDetail food, boolean isSelectedMeal) { private void loadComboData(OrderDetail food, boolean isSelectedMeal) {
Observable.create(new ObservableOnSubscribe<List>() { Observable.create(new ObservableOnSubscribe<List>() {
@Override @Override
public void subscribe(ObservableEmitter<List> emitter) throws Exception { public void subscribe(ObservableEmitter<List> emitter) throws Exception {
long fid = food.getProductId(); long fid = food.getProductId();
...@@ -544,6 +529,7 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod ...@@ -544,6 +529,7 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod
} }
}).subscribeOn(Schedulers.io())//在IO线程执行数据库处理操作 }).subscribeOn(Schedulers.io())//在IO线程执行数据库处理操作
.observeOn(AndroidSchedulers.mainThread())//在UI线程 .observeOn(AndroidSchedulers.mainThread())//在UI线程
.compose(RxLifecycleUtils.bindToLifecycle(mRootView))
.subscribe(new Observer<List>() { .subscribe(new Observer<List>() {
private int nextCount = 0; private int nextCount = 0;
...@@ -552,6 +538,7 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod ...@@ -552,6 +538,7 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod
@Override @Override
public void onSubscribe(Disposable d) { public void onSubscribe(Disposable d) {
addDispose(d);
nextCount = 0; nextCount = 0;
} }
...@@ -1322,7 +1309,7 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod ...@@ -1322,7 +1309,7 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod
public void setFoodSoldoutCtrData(List<SoldoutCtrFood> soldoutCtrFoods) { public void setFoodSoldoutCtrData(List<SoldoutCtrFood> soldoutCtrFoods) {
for (SoldoutCtrFood scc : soldoutCtrFoods) { for (SoldoutCtrFood scc : soldoutCtrFoods) {
for (Food foodGroupBean : mFoodGroupList) { for (Food foodGroupBean : mRootView.getFoodGroupList()) {
if (scc.getType() == FOOD_TYPE && scc.getFoodId() != null && foodGroupBean.getId() != null && foodGroupBean.getId().equals(scc.getFoodId())) { if (scc.getType() == FOOD_TYPE && scc.getFoodId() != null && foodGroupBean.getId() != null && foodGroupBean.getId().equals(scc.getFoodId())) {
String qtyName = scc.getQtyName(); String qtyName = scc.getQtyName();
foodGroupBean.setMaxNumber(qtyName); foodGroupBean.setMaxNumber(qtyName);
...@@ -1339,7 +1326,7 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod ...@@ -1339,7 +1326,7 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod
} }
} }
} }
for (Food foodGroupBean : mFoodGroupList) { for (Food foodGroupBean : mRootView.getFoodGroupList()) {
if (foodGroupBean.getInvisible() == 2) { if (foodGroupBean.getInvisible() == 2) {
String qtyName = "暫停"; String qtyName = "暫停";
foodGroupBean.setMaxNumber(qtyName); foodGroupBean.setMaxNumber(qtyName);
...@@ -1400,7 +1387,7 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod ...@@ -1400,7 +1387,7 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod
} }
private void addFoodSoldoutCtrItem(List<SoldoutCtrFood> soldoutCtrFoods) { private void addFoodSoldoutCtrItem(List<SoldoutCtrFood> soldoutCtrFoods) {
for (Food foodGroupBean : mFoodGroupList) { for (Food foodGroupBean : mRootView.getFoodGroupList()) {
if (foodGroupBean.getInvisible() == 2) { if (foodGroupBean.getInvisible() == 2) {
SoldoutCtrFood soldoutCtrFood = new SoldoutCtrFood(); SoldoutCtrFood soldoutCtrFood = new SoldoutCtrFood();
soldoutCtrFood.setType((byte) FOOD_GROUP_TYPE); soldoutCtrFood.setType((byte) FOOD_GROUP_TYPE);
...@@ -1432,7 +1419,7 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod ...@@ -1432,7 +1419,7 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod
} }
private void clearFoodSoldoutCtrData() { private void clearFoodSoldoutCtrData() {
for (Food foodGroupBean : mFoodGroupList) { for (Food foodGroupBean : mRootView.getFoodGroupList()) {
foodGroupBean.setMaxNumber(""); foodGroupBean.setMaxNumber("");
foodGroupBean.setCurrentMaxNumber(""); foodGroupBean.setCurrentMaxNumber("");
} }
...@@ -1677,7 +1664,7 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod ...@@ -1677,7 +1664,7 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod
public void updateOrderFoodNumber() { public void updateOrderFoodNumber() {
setFoodBtnNumber(); setFoodBtnNumber();
setFoodGroupBtnNumber(IActivity.getFoodGroupGridViewAdapter(), mFoodGroupList); setFoodGroupBtnNumber(IActivity.getFoodGroupGridViewAdapter(), mRootView.getFoodGroupList());
mRootView.setOrderFoodCount(getOrderFoodNumber()); mRootView.setOrderFoodCount(getOrderFoodNumber());
} }
......
...@@ -5,6 +5,9 @@ import android.graphics.Color; ...@@ -5,6 +5,9 @@ import android.graphics.Color;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
import android.view.Window;
import androidx.fragment.app.FragmentManager;
import com.billy.cc.core.component.CC; import com.billy.cc.core.component.CC;
import com.gingersoft.gsa.cloud.common.bean.BaseResult; import com.gingersoft.gsa.cloud.common.bean.BaseResult;
...@@ -12,6 +15,7 @@ import com.gingersoft.gsa.cloud.common.constans.ExpandConstant; ...@@ -12,6 +15,7 @@ import com.gingersoft.gsa.cloud.common.constans.ExpandConstant;
import com.gingersoft.gsa.cloud.common.constans.FoodSummaryConstans; import com.gingersoft.gsa.cloud.common.constans.FoodSummaryConstans;
import com.gingersoft.gsa.cloud.common.constans.GoldConstants; import com.gingersoft.gsa.cloud.common.constans.GoldConstants;
import com.gingersoft.gsa.cloud.common.constans.PrintConstans; import com.gingersoft.gsa.cloud.common.constans.PrintConstans;
import com.gingersoft.gsa.cloud.common.core.discount.MemberCoupon;
import com.gingersoft.gsa.cloud.common.core.member.MemberInfo; 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.RestaurantInfoManager;
import com.gingersoft.gsa.cloud.common.core.restaurant.utils.RestaurantExpandInfoUtils; import com.gingersoft.gsa.cloud.common.core.restaurant.utils.RestaurantExpandInfoUtils;
...@@ -51,6 +55,7 @@ import com.gingersoft.gsa.cloud.table.mvp.ui.activity.TableActivity; ...@@ -51,6 +55,7 @@ import com.gingersoft.gsa.cloud.table.mvp.ui.activity.TableActivity;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.BillItemAdapter; import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.BillItemAdapter;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.OrderTopFunctionAdapter; import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.OrderTopFunctionAdapter;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.meal.SelectMealAdapter; import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.meal.SelectMealAdapter;
import com.gingersoft.gsa.cloud.table.mvp.ui.fragment.discount.DiscountDialogFragment;
import com.gingersoft.gsa.cloud.table.mvp.ui.widget.DiscountDialog; import com.gingersoft.gsa.cloud.table.mvp.ui.widget.DiscountDialog;
import com.gingersoft.gsa.cloud.table.mvp.ui.widget.SplitTableDialog; import com.gingersoft.gsa.cloud.table.mvp.ui.widget.SplitTableDialog;
import com.gingersoft.gsa.cloud.ui.widget.dialog.BaseRetryDialog; import com.gingersoft.gsa.cloud.ui.widget.dialog.BaseRetryDialog;
...@@ -61,6 +66,7 @@ import com.jess.arms.integration.AppManager; ...@@ -61,6 +66,7 @@ import com.jess.arms.integration.AppManager;
import com.jess.arms.utils.ArmsUtils; import com.jess.arms.utils.ArmsUtils;
import com.jess.arms.utils.RxLifecycleUtils; import com.jess.arms.utils.RxLifecycleUtils;
import com.scwang.smartrefresh.layout.api.RefreshLayout; import com.scwang.smartrefresh.layout.api.RefreshLayout;
import com.xuexiang.rxutil2.RxBindingUtils;
import com.xuexiang.rxutil2.rxjava.RxJavaUtils; import com.xuexiang.rxutil2.rxjava.RxJavaUtils;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -75,8 +81,10 @@ import io.reactivex.annotations.NonNull; ...@@ -75,8 +81,10 @@ import io.reactivex.annotations.NonNull;
import io.reactivex.disposables.Disposable; import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer; import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers; import io.reactivex.schedulers.Schedulers;
import leakcanary.internal.ForegroundService;
import me.jessyan.rxerrorhandler.core.RxErrorHandler; import me.jessyan.rxerrorhandler.core.RxErrorHandler;
import me.jessyan.rxerrorhandler.handler.ErrorHandleSubscriber; import me.jessyan.rxerrorhandler.handler.ErrorHandleSubscriber;
import me.yokeyword.fragmentation.anim.FragmentAnimator;
import okhttp3.FormBody; import okhttp3.FormBody;
import okhttp3.MediaType; import okhttp3.MediaType;
import okhttp3.RequestBody; import okhttp3.RequestBody;
...@@ -806,12 +814,12 @@ public class OrderContentPresenter extends BaseOrderPresenter<OrderContentContra ...@@ -806,12 +814,12 @@ public class OrderContentPresenter extends BaseOrderPresenter<OrderContentContra
} }
private void showDiscountDialog() { private void showDiscountDialog() {
if (mDiscountDialog == null) { if (IActivity.findFragment(DiscountDialogFragment.class) == null) {
mDiscountDialog = new DiscountDialog.Builder(IActivity); DiscountDialogFragment dialogFragment = DiscountDialogFragment.newInstance();
mDiscountDialog.setCanScan(true); dialogFragment.setOnDiscountItemClickListener(new DiscountDialogFragment.OnDiscountItemClickListener() {
mDiscountDialog.setOnClickListener(new DiscountDialog.Builder.OnClickListener() {
@Override @Override
public void onItemClick(Discount item, int position) { public void onBillDiscountClick(Discount item, int position) {
if (item.getMinBillAmount() > mShoppingCart.getWholeAmount()) { if (item.getMinBillAmount() > mShoppingCart.getWholeAmount()) {
//小於最小賬單金額 //小於最小賬單金額
mRootView.showMessage("小於最小賬單金額" + cashStr + item.getMinBillAmount() + " 無法使用此折扣"); mRootView.showMessage("小於最小賬單金額" + cashStr + item.getMinBillAmount() + " 無法使用此折扣");
...@@ -819,23 +827,53 @@ public class OrderContentPresenter extends BaseOrderPresenter<OrderContentContra ...@@ -819,23 +827,53 @@ public class OrderContentPresenter extends BaseOrderPresenter<OrderContentContra
} }
mNomalDiscountAction.setNomalDiscountList(mShoppingCart.getNomalDiscoutByMultyDiscountList()); mNomalDiscountAction.setNomalDiscountList(mShoppingCart.getNomalDiscoutByMultyDiscountList());
mNomalDiscountAction.action(item); mNomalDiscountAction.action(item);
dialogFragment.dismiss();
} }
@Override @Override
public void onScan() { public void onCouponClick(MemberCoupon item, int position) {
toScanActivity(); if (item.getBillMinAmount() > mShoppingCart.getWholeAmount()) {
//小於最小賬單金額
mRootView.showMessage("小於最小賬單金額" + cashStr + item.getBillMinAmount() + " 無法使用此優惠券");
return;
}
mNomalDiscountAction.setNomalDiscountList(mShoppingCart.getNomalDiscoutByMultyDiscountList());
mNomalDiscountAction.action(item.castDiscount());
dialogFragment.dismiss();
} }
}); });
dialogFragment.show(IActivity.getSupportFragmentManager(), "DiscountDialogFragment");
} }
List<Discount> discountList; // if (mDiscountDialog == null) {
if (BaseOrder.isCurrentOrderType(FoodSummaryConstans.TAKEAWAY_TYPE)) { // mDiscountDialog = new DiscountDialog.Builder(IActivity);
discountList = mModel.queryDB_DiscountList(Discount.discount_scope_bill, Discount.ORDER_TYPE_TAKEAWAY); // mDiscountDialog.setCanScan(true);
} else { // mDiscountDialog.setOnClickListener(new DiscountDialog.Builder.OnClickListener() {
discountList = mModel.queryDB_DiscountList(Discount.discount_scope_bill, Discount.ORDER_TYPE_MEAL_STAND); // @Override
} // public void onItemClick(Discount item, int position) {
// if (item.getMinBillAmount() > mShoppingCart.getWholeAmount()) {
mDiscountDialog.addItems(discountList); // //小於最小賬單金額
mDiscountDialog.build().show(); // mRootView.showMessage("小於最小賬單金額" + cashStr + item.getMinBillAmount() + " 無法使用此折扣");
// return;
// }
// mNomalDiscountAction.setNomalDiscountList(mShoppingCart.getNomalDiscoutByMultyDiscountList());
// mNomalDiscountAction.action(item);
// }
//
// @Override
// public void onScan() {
// toScanActivity();
// }
// });
// }
// List<Discount> discountList;
// if (BaseOrder.isCurrentOrderType(FoodSummaryConstans.TAKEAWAY_TYPE)) {
// discountList = mModel.queryDB_DiscountList(Discount.discount_scope_bill, Discount.ORDER_TYPE_TAKEAWAY);
// } else {
// discountList = mModel.queryDB_DiscountList(Discount.discount_scope_bill, Discount.ORDER_TYPE_MEAL_STAND);
// }
//
// mDiscountDialog.addItems(discountList);
// mDiscountDialog.build().show();
} }
/** /**
......
...@@ -240,6 +240,7 @@ public class OrderPayPresenter extends BaseOrderPresenter<OrderPayContract.Model ...@@ -240,6 +240,7 @@ public class OrderPayPresenter extends BaseOrderPresenter<OrderPayContract.Model
whetherFreeService = payMethod.getWhetherFreeService(); whetherFreeService = payMethod.getWhetherFreeService();
orderPay.setAmount(payMethod.getPayMoney()); orderPay.setAmount(payMethod.getPayMoney());
orderPay.setWhetherReportCount(payMethod.getWhetherReportCount()); orderPay.setWhetherReportCount(payMethod.getWhetherReportCount());
orderPay.setIntegralMultiple(payMethod.getIntegralMultiple());
orderPay.setPayName(payMethod.getPayName()); orderPay.setPayName(payMethod.getPayName());
payRequest.getOrderPays().add(orderPay); payRequest.getOrderPays().add(orderPay);
} }
......
...@@ -107,6 +107,9 @@ import java.util.ArrayList; ...@@ -107,6 +107,9 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import butterknife.BindView; import butterknife.BindView;
import butterknife.OnClick; import butterknife.OnClick;
import butterknife.OnLongClick; import butterknife.OnLongClick;
...@@ -281,7 +284,12 @@ public class MealStandActivity extends BaseFragmentActivity<MealStandPresenter> ...@@ -281,7 +284,12 @@ public class MealStandActivity extends BaseFragmentActivity<MealStandPresenter>
private ImageView[] ivPoints; private ImageView[] ivPoints;
private int mPageIndex; private int mPageIndex;
private int totalPage; private int totalPage;
private FoodGroupAdapter mFoodGroupAdapter; @Inject
@Named("foodGroupList")
List<Food> mFoodGroupList;
@Inject
FoodGroupAdapter mFoodGroupAdapter;
private PagerGridLayoutManager mLayoutManager; private PagerGridLayoutManager mLayoutManager;
private static final int FINISH = 101; private static final int FINISH = 101;
...@@ -419,7 +427,9 @@ public class MealStandActivity extends BaseFragmentActivity<MealStandPresenter> ...@@ -419,7 +427,9 @@ public class MealStandActivity extends BaseFragmentActivity<MealStandPresenter>
PagerConfig.setShowLog(true); PagerConfig.setShowLog(true);
// 使用原生的 Adapter 即可 // 使用原生的 Adapter 即可
mFoodGroupAdapter = new FoodGroupAdapter(this, foodGroupList, 1); // mFoodGroupAdapter = new FoodGroupAdapter(this, foodGroupList, 1);
mFoodGroupAdapter.setFoodGroupList(mFoodGroupList);
rv_food_group.setAdapter(mFoodGroupAdapter); rv_food_group.setAdapter(mFoodGroupAdapter);
mFoodGroupAdapter.setOnItemClickListener(new FoodGroupAdapter.OnItemClickListener() { mFoodGroupAdapter.setOnItemClickListener(new FoodGroupAdapter.OnItemClickListener() {
@Override @Override
...@@ -1212,6 +1222,11 @@ public class MealStandActivity extends BaseFragmentActivity<MealStandPresenter> ...@@ -1212,6 +1222,11 @@ public class MealStandActivity extends BaseFragmentActivity<MealStandPresenter>
} }
@Override @Override
public List<Food> getFoodGroupList() {
return mFoodGroupList;
}
@Override
public void initIntent() { public void initIntent() {
} }
...@@ -1274,6 +1289,11 @@ public class MealStandActivity extends BaseFragmentActivity<MealStandPresenter> ...@@ -1274,6 +1289,11 @@ public class MealStandActivity extends BaseFragmentActivity<MealStandPresenter>
return this; return this;
} }
@Override
public int getFromType() {
return 1;
}
public void clearInput() { public void clearInput() {
keyView.clearInput(); keyView.clearInput();
} }
...@@ -1414,7 +1434,7 @@ public class MealStandActivity extends BaseFragmentActivity<MealStandPresenter> ...@@ -1414,7 +1434,7 @@ public class MealStandActivity extends BaseFragmentActivity<MealStandPresenter>
if (customType == Food.CUSTOM_TYPE_101) { if (customType == Food.CUSTOM_TYPE_101) {
foodItem.setProductName(name); foodItem.setProductName(name);
} }
if(!TextUtils.isEmpty(money)){ if (!TextUtils.isEmpty(money)) {
foodItem.setUnit_price(Double.parseDouble(money)); foodItem.setUnit_price(Double.parseDouble(money));
foodItem.setPrice(foodItem.getUnit_price()); foodItem.setPrice(foodItem.getUnit_price());
mPresenter.toAddFoodItem(foodItem); mPresenter.toAddFoodItem(foodItem);
......
...@@ -171,7 +171,6 @@ public class OrderContentActivity extends BaseFragmentActivity<OrderContentPrese ...@@ -171,7 +171,6 @@ public class OrderContentActivity extends BaseFragmentActivity<OrderContentPrese
private List<TableBean.DataBean> mTableList; private List<TableBean.DataBean> mTableList;
private DoshokuOrder mDoshokuOrder; private DoshokuOrder mDoshokuOrder;
private ShoppingCart mShoppingCart;
@Override @Override
public void setupActivityComponent(@NonNull AppComponent appComponent) { public void setupActivityComponent(@NonNull AppComponent appComponent) {
...@@ -186,7 +185,6 @@ public class OrderContentActivity extends BaseFragmentActivity<OrderContentPrese ...@@ -186,7 +185,6 @@ public class OrderContentActivity extends BaseFragmentActivity<OrderContentPrese
@Override @Override
protected void onCreate(@Nullable Bundle savedInstanceState) { protected void onCreate(@Nullable Bundle savedInstanceState) {
mDoshokuOrder = DoshokuOrder.getInstance(); mDoshokuOrder = DoshokuOrder.getInstance();
mShoppingCart = mDoshokuOrder.getShoppingCart();
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
//设置根布局颜色,当layout根布局是FrameLayout时直接使用merge标签,应用DecorView默认就是FrameLayout无需再套一层 //设置根布局颜色,当layout根布局是FrameLayout时直接使用merge标签,应用DecorView默认就是FrameLayout无需再套一层
getWindow().getDecorView().setBackgroundColor(ArmsUtils.getColor(mContext, R.color.theme_white_color)); getWindow().getDecorView().setBackgroundColor(ArmsUtils.getColor(mContext, R.color.theme_white_color));
...@@ -294,7 +292,11 @@ public class OrderContentActivity extends BaseFragmentActivity<OrderContentPrese ...@@ -294,7 +292,11 @@ public class OrderContentActivity extends BaseFragmentActivity<OrderContentPrese
@Override @Override
public void onBackPressedSupport() { public void onBackPressedSupport() {
super.onBackPressedSupport(); super.onBackPressedSupport();
backPressed(); if (mCurrentOperatType == OrderConentActionConstant.transfer_food_2) {
hideTransferFoodLayout();
mCurrentOperatType = OrderConentActionConstant.order_conetnt_1;
tv_action_name.setVisibility(View.GONE);
}
} }
@Override @Override
......
...@@ -25,6 +25,8 @@ import com.jess.arms.utils.DeviceUtils; ...@@ -25,6 +25,8 @@ import com.jess.arms.utils.DeviceUtils;
import java.util.List; import java.util.List;
import javax.inject.Inject;
import butterknife.BindView; import butterknife.BindView;
/** /**
......
...@@ -61,7 +61,13 @@ public class FoodGroupAdapter extends DefaultAdapter<Food> { ...@@ -61,7 +61,13 @@ public class FoodGroupAdapter extends DefaultAdapter<Food> {
this.mParentColWidth = (int) (DeviceUtils.getScreenWidth(context) / foodGroupColumn); this.mParentColWidth = (int) (DeviceUtils.getScreenWidth(context) / foodGroupColumn);
this.mParentColHeight = GsaCloudApplication.uiStyleConfiguration.getFoodGroupBtnHeightValue(); this.mParentColHeight = GsaCloudApplication.uiStyleConfiguration.getFoodGroupBtnHeightValue();
this.mLayoutQtyHeight = GsaCloudApplication.uiStyleConfiguration.getLayoutQtyHeightValue(); this.mLayoutQtyHeight = GsaCloudApplication.uiStyleConfiguration.getLayoutQtyHeightValue();
}
public void setFoodGroupList(List<Food> foodGroupList) {
if (foodGroupList != null) {
mInfos.addAll(foodGroupList);
notifyDataSetChanged();
}
} }
@Override @Override
......
...@@ -8,11 +8,9 @@ import android.os.Message; ...@@ -8,11 +8,9 @@ import android.os.Message;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.gingersoft.gsa.cloud.order.contract.OrderStatusContract; import com.gingersoft.gsa.cloud.order.contract.OrderStatusContract;
import com.gingersoft.gsa.cloud.table.R; import com.gingersoft.gsa.cloud.table.R;
import com.gingersoft.gsa.cloud.table.R2; import com.gingersoft.gsa.cloud.table.R2;
......
package com.gingersoft.gsa.cloud.table.mvp.ui.fragment.discount;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.listener.OnItemClickListener;
import com.gingersoft.gsa.cloud.common.loadsir.EmptyCallback;
import com.gingersoft.gsa.cloud.database.bean.Discount;
import com.gingersoft.gsa.cloud.table.R;
import com.gingersoft.gsa.cloud.table.R2;
import com.gingersoft.gsa.cloud.table.di.component.DaggerBillDiscountComponent;
import com.gingersoft.gsa.cloud.table.mvp.contract.BillDiscountContract;
import com.gingersoft.gsa.cloud.table.mvp.presenter.BillDiscountPresenter;
import com.gingersoft.gsa.cloud.table.mvp.ui.activity.TableActivity;
import com.gingersoft.gsa.cloud.ui.adapter.TagViewAdapter;
import com.gingersoft.gsa.cloud.ui.bean.TagViewItem;
import com.gingersoft.gsa.cloud.ui.widget.dialog.LoadingDialog;
import com.jess.arms.base.BaseFragment;
import com.jess.arms.di.component.AppComponent;
import com.jess.arms.utils.ArmsUtils;
import com.kingja.loadsir.callback.Callback;
import com.kingja.loadsir.core.LoadService;
import com.kingja.loadsir.core.LoadSir;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import butterknife.BindView;
import static com.jess.arms.utils.Preconditions.checkNotNull;
/**
* ================================================
* Description:
* <p>
* Created by MVPArmsTemplate on 04/02/2021 17:26
* <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>
* ================================================
*/
public class BillDiscountFragment extends BaseFragment<BillDiscountPresenter> implements BillDiscountContract.View {
@BindView(R2.id.rv_bill_discount)
RecyclerView rvBillDiscount;
@Inject
List<TagViewItem> mBillDiscountList;
@Inject
TagViewAdapter mBillDiscountAdapter;
private LoadService loadService;
public static BillDiscountFragment newInstance() {
BillDiscountFragment fragment = new BillDiscountFragment();
return fragment;
}
@Override
public void setupFragmentComponent(@NonNull AppComponent appComponent) {
DaggerBillDiscountComponent //如找不到该类,请编译一下项目
.builder()
.appComponent(appComponent)
.view(this)
.build()
.inject(this);
}
@Override
public View initView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_bill_discount, container, false);
}
@Override
public void initData(@Nullable Bundle savedInstanceState) {
loadService = LoadSir.getDefault().register(rvBillDiscount);
initAdapter();
mPresenter.queryBillDiscountList();
}
private void initAdapter() {
rvBillDiscount.setLayoutManager(createLayoutManager());
rvBillDiscount.setAdapter(mBillDiscountAdapter);
mBillDiscountAdapter.setOnItemClickListener((adapter, view, position) -> {
if (onDiscountItemClickListener != null) {
onDiscountItemClickListener.onItemClick((Discount) mBillDiscountList.get(position).getTargetObj(), position);
}
});
}
private RecyclerView.LayoutManager createLayoutManager() {
return new GridLayoutManager(mContext, 3, LinearLayoutManager.VERTICAL, false) {
@Override
public RecyclerView.LayoutParams generateDefaultLayoutParams() {
return new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
}
};
}
@Override
public void setData(@Nullable Object data) {
}
@Override
public void showLoading(String message) {
if (message != null)
LoadingDialog.showDialogForLoading(_mActivity, message, true);
else
LoadingDialog.showDialogForLoading(_mActivity);
}
@Override
public void hideLoading() {
LoadingDialog.cancelDialogForLoading();
}
@Override
public void showMessage(@NonNull String message) {
checkNotNull(message);
ArmsUtils.makeText(_mActivity, message);
}
@Override
public void launchActivity(@NonNull Intent intent) {
if (intent != null) {
ArmsUtils.startActivity(intent);
}
}
@Override
public void killMyself() {
_mActivity.onBackPressedSupport();
}
@Override
public void returnBillCoupon(List<Discount> discounts) {
List<TagViewItem> tagViewItems = castTagItem(discounts);
if (tagViewItems.size() > 0) {
loadService.showSuccess();
} else {
loadService.showCallback(EmptyCallback.class);
}
if (mBillDiscountList.size() > 0) {
mBillDiscountList.clear();
}
mBillDiscountList.addAll(tagViewItems);
mBillDiscountAdapter.notifyDataSetChanged();
}
private List<TagViewItem> castTagItem(List<Discount> discountList) {
List<TagViewItem> tagViewItems = new ArrayList<>();
for (Discount discount : discountList) {
TagViewItem<Discount> tagViewItem = new TagViewItem();
tagViewItem.setId(discount.getId());
tagViewItem.setText(discount.getRemark());
tagViewItem.setTargetObj(discount);
tagViewItems.add(tagViewItem);
}
return tagViewItems;
}
private OnBillDiscountItemClickListener onDiscountItemClickListener;
public void setOnDiscountItemClickListener(OnBillDiscountItemClickListener onDiscountItemClickListener) {
this.onDiscountItemClickListener = onDiscountItemClickListener;
}
public interface OnBillDiscountItemClickListener {
void onItemClick(Discount item, int position);
}
}
package com.gingersoft.gsa.cloud.table.mvp.ui.fragment.discount;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.gingersoft.gsa.cloud.common.core.discount.MemberCoupon;
import com.gingersoft.gsa.cloud.common.loadsir.LoadsirUtil;
import com.gingersoft.gsa.cloud.table.R;
import com.gingersoft.gsa.cloud.table.R2;
import com.gingersoft.gsa.cloud.table.di.component.DaggerCouponComponent;
import com.gingersoft.gsa.cloud.table.mvp.contract.CouponContract;
import com.gingersoft.gsa.cloud.table.mvp.presenter.CouponPresenter;
import com.gingersoft.gsa.cloud.ui.adapter.TagViewAdapter;
import com.gingersoft.gsa.cloud.ui.bean.TagViewItem;
import com.gingersoft.gsa.cloud.ui.widget.dialog.LoadingDialog;
import com.jess.arms.base.BaseFragment;
import com.jess.arms.di.component.AppComponent;
import com.jess.arms.utils.ArmsUtils;
import com.kingja.loadsir.callback.Callback;
import com.kingja.loadsir.core.LoadService;
import com.kingja.loadsir.core.LoadSir;
import com.scwang.smartrefresh.layout.SmartRefreshLayout;
import com.scwang.smartrefresh.layout.api.RefreshLayout;
import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener;
import com.scwang.smartrefresh.layout.listener.OnRefreshListener;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import butterknife.BindView;
import static com.jess.arms.utils.Preconditions.checkNotNull;
/**
* ================================================
* Description:
* <p>
* Created by MVPArmsTemplate on 04/02/2021 17:28
* <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>
* ================================================
*/
public class CouponFragment extends BaseFragment<CouponPresenter> implements CouponContract.View {
@BindView(R2.id.refreshLayout)
SmartRefreshLayout refreshLayout;
@BindView(R2.id.rv_coupon)
RecyclerView rvCoupon;
@Inject
List<TagViewItem> mMemberCouponList;
@Inject
TagViewAdapter mMemberCouponAdapter;
private LoadService loadService;
public static CouponFragment newInstance() {
CouponFragment fragment = new CouponFragment();
return fragment;
}
@Override
public void setupFragmentComponent(@NonNull AppComponent appComponent) {
DaggerCouponComponent //如找不到该类,请编译一下项目
.builder()
.appComponent(appComponent)
.view(this)
.build()
.inject(this);
}
@Override
public View initView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_coupon, container, false);
}
@Override
public void initData(@Nullable Bundle savedInstanceState) {
loadService = LoadSir.getDefault().register(refreshLayout, new Callback.OnReloadListener() {
@Override
public void onReload(View v) {
mPresenter.getMemberWalletList(null, true);
}
});
initAdapter();
initRefreshLayout();
}
@Override
public void onLazyInitView(@Nullable Bundle savedInstanceState) {
super.onLazyInitView(savedInstanceState);
mPresenter.getMemberWalletList(null, true);
}
private void initAdapter() {
rvCoupon.setLayoutManager(createLayoutManager());
rvCoupon.setAdapter(mMemberCouponAdapter);
mMemberCouponAdapter.setOnItemClickListener((adapter, view, position) -> {
if (onCouponItemClickListener != null) {
onCouponItemClickListener.onItemClick((MemberCoupon) mMemberCouponList.get(position).getTargetObj(), position);
}
});
}
private RecyclerView.LayoutManager createLayoutManager() {
return new GridLayoutManager(mContext, 3, LinearLayoutManager.VERTICAL, false) {
@Override
public RecyclerView.LayoutParams generateDefaultLayoutParams() {
return new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
}
};
}
private void initRefreshLayout() {
refreshLayout.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh(@NonNull final RefreshLayout refreshLayout) {
mPresenter.getMemberWalletList(refreshLayout,true);
}
});
refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
@Override
public void onLoadMore(@NonNull final RefreshLayout refreshLayout) {
mPresenter.getMemberWalletList(refreshLayout,false);
}
});
refreshLayout.setEnableLoadMore(false);
}
@Override
public void setData(@Nullable Object data) {
}
@Override
public void showLoading(String message) {
if (message != null)
LoadingDialog.showDialogForLoading(_mActivity, message, true);
else
LoadingDialog.showDialogForLoading(_mActivity);
}
@Override
public void hideLoading() {
LoadingDialog.cancelDialogForLoading();
}
@Override
public void showMessage(@NonNull String message) {
checkNotNull(message);
ArmsUtils.makeText(_mActivity, message);
}
@Override
public void launchActivity(@NonNull Intent intent) {
if (intent != null) {
ArmsUtils.startActivity(intent);
}
}
@Override
public void killMyself() {
_mActivity.onBackPressedSupport();
}
@Override
public void returnMemberCouponList(List<MemberCoupon> memberCoupons) {
List<TagViewItem> tagViewItems = castTagItem(memberCoupons);
if (mMemberCouponList.size() > 0) {
mMemberCouponList.clear();
}
mMemberCouponList.addAll(tagViewItems);
mMemberCouponAdapter.notifyDataSetChanged();
}
private List<TagViewItem> castTagItem(List<MemberCoupon> memberCoupons) {
List<TagViewItem> tagViewItems = new ArrayList<>();
for (MemberCoupon coupon : memberCoupons) {
TagViewItem<MemberCoupon> tagViewItem = new TagViewItem();
tagViewItem.setId(coupon.getId());
tagViewItem.setText(coupon.getRemark());
tagViewItem.setTargetObj(coupon);
tagViewItems.add(tagViewItem);
}
return tagViewItems;
}
@Override
public void showLoadSirSuccess() {
loadService.showSuccess();
}
@Override
public void showLoadSirCall(Class<? extends Callback> call) {
loadService.showCallback(call);
}
@Override
public LoadService getLoadService() {
return loadService;
}
private OnCouponItemClickListener onCouponItemClickListener;
public void setOnCouponItemClickListener(OnCouponItemClickListener onCouponItemClickListener) {
this.onCouponItemClickListener = onCouponItemClickListener;
}
public interface OnCouponItemClickListener {
void onItemClick(MemberCoupon item, int position);
}
}
package com.gingersoft.gsa.cloud.table.mvp.ui.fragment.discount;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatDialogFragment;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.viewpager.widget.ViewPager;
import com.gingersoft.gsa.cloud.common.core.discount.MemberCoupon;
import com.gingersoft.gsa.cloud.common.core.member.MemberInfo;
import com.gingersoft.gsa.cloud.common.logan.LoganManager;
import com.gingersoft.gsa.cloud.database.bean.Discount;
import com.gingersoft.gsa.cloud.order.order.DoshokuOrder;
import com.gingersoft.gsa.cloud.table.R;
import com.gingersoft.gsa.cloud.table.R2;
import com.gingersoft.gsa.cloud.table.mvp.ui.fragment.InputTableFragment;
import com.gingersoft.gsa.cloud.table.mvp.ui.fragment.RegionFragment;
import com.gingersoft.gsa.cloud.table.mvp.ui.widget.DiscountDialog;
import com.gingersoft.gsa.cloud.ui.view.TriangleView;
import com.jess.arms.base.BaseDialogFragment;
import com.jess.arms.base.BaseFragment;
import com.jess.arms.di.component.AppComponent;
import com.jess.arms.mvp.BasePresenter;
import com.jess.arms.utils.ThirdViewUtil;
import com.qmuiteam.qmui.arch.QMUIFragmentPagerAdapter;
import com.qmuiteam.qmui.layout.QMUILinearLayout;
import com.qmuiteam.qmui.util.QMUIDisplayHelper;
import com.qmuiteam.qmui.widget.QMUITopBar;
import com.qmuiteam.qmui.widget.dialog.QMUIDialog;
import com.qmuiteam.qmui.widget.tab.QMUITab;
import com.qmuiteam.qmui.widget.tab.QMUITabBuilder;
import com.qmuiteam.qmui.widget.tab.QMUITabIndicator;
import com.qmuiteam.qmui.widget.tab.QMUITabSegment;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
/**
* @作者: bin
* @創建時間: 2021-04-02 17:14
* @更新時間: 2021-04-02 17:14
* @描述:
*/
public class DiscountDialogFragment extends BaseDialogFragment<BasePresenter> {
private final String TAG = "DiscountFragment";
// @BindView(R2.id.topbar)
// QMUITopBar topbar;
@BindView(R2.id.tabSegment)
QMUITabSegment tabSegment;
@BindView(R2.id.contentViewPager)
ViewPager contentViewPager;
@BindView(R2.id.ll_container)
QMUILinearLayout llContainer;
private CouponFragment couponFragment;
private BillDiscountFragment billDiscountFragment;
private boolean canScan = true;
private List<String> mTabTitles = new ArrayList<>();
private int mCurrentPageIndex = 0;
public static DiscountDialogFragment newInstance() {
DiscountDialogFragment fragment = new DiscountDialogFragment();
return fragment;
}
@Override
public void setupFragmentComponent(@NonNull AppComponent appComponent) {
}
@Override
public View initView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
this.getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
return inflater.inflate(R.layout.table_dialog_discout, container, false);
}
@Override
public void onStart() {
super.onStart();
Window dialogWindow = getDialog().getWindow();
if (dialogWindow != null) {
dialogWindow.getDecorView().setPadding(0, 0, 0, 0);
dialogWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
lp.width = WindowManager.LayoutParams.MATCH_PARENT;
lp.height = (int) (QMUIDisplayHelper.getScreenHeight(mContext) * 0.6);
lp.gravity = Gravity.BOTTOM;
lp.windowAnimations = android.R.style.Animation_InputMethod;
dialogWindow.setAttributes(lp);
}
}
@Override
public void initData(@Nullable Bundle savedInstanceState) {
float mShadowAlpha = 0.25f;
int mShadowElevationDp = 14;
llContainer.setRadiusAndShadow(15, QMUIDisplayHelper.dp2px(mContext, mShadowElevationDp), mShadowAlpha);
initTopbar();
initTabAndPager();
}
@Override
public void setData(@Nullable Object data) {
}
private void initTabAndPager() {
MemberInfo memberInfo = DoshokuOrder.getInstance().getMemberInfo();
QMUIFragmentPagerAdapter pagerAdapter = new QMUIFragmentPagerAdapter(getChildFragmentManager()) {
@Override
public Fragment createFragment(int position) {
switch (position) {
case 1:
if (couponFragment != null) {
return couponFragment;
}
couponFragment = CouponFragment.newInstance();
couponFragment.setOnCouponItemClickListener(new CouponFragment.OnCouponItemClickListener() {
@Override
public void onItemClick(MemberCoupon item, int position) {
if (onDiscountItemClickListener != null) {
onDiscountItemClickListener.onCouponClick(item, position);
}
}
});
return couponFragment;
default:
if (billDiscountFragment != null) {
return billDiscountFragment;
}
billDiscountFragment = BillDiscountFragment.newInstance();
billDiscountFragment.setOnDiscountItemClickListener(new BillDiscountFragment.OnBillDiscountItemClickListener() {
@Override
public void onItemClick(Discount item, int position) {
if (onDiscountItemClickListener != null) {
onDiscountItemClickListener.onBillDiscountClick(item, position);
}
}
});
return billDiscountFragment;
}
}
@Override
public int getCount() {
return mTabTitles.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mTabTitles.get(position);
}
};
QMUITabBuilder builder = tabSegment.tabBuilder();
mTabTitles.add("折扣");
QMUITab tab1 = builder
.setText(mTabTitles.get(0))
.build(_mActivity);
tabSegment.addTab(tab1);
if (memberInfo != null) {
mTabTitles.add("優惠券");
QMUITab tab2 = builder
.setText(mTabTitles.get(1))
.build(_mActivity);
tabSegment.addTab(tab2);
}
contentViewPager.setAdapter(pagerAdapter);
contentViewPager.setCurrentItem(mCurrentPageIndex);
int space = QMUIDisplayHelper.dp2px(_mActivity, 16);
tabSegment.setIndicator(new QMUITabIndicator(QMUIDisplayHelper.dp2px(_mActivity, 2), false, true));
tabSegment.setDefaultTextSize(QMUIDisplayHelper.dp2px(_mActivity, 16), QMUIDisplayHelper.dp2px(_mActivity, 16));
tabSegment.setPadding(space, 0, space, 0);
tabSegment.setupWithViewPager(contentViewPager, false);
tabSegment.addOnTabSelectedListener(new QMUITabSegment.OnTabSelectedListener() {
@Override
public void onTabSelected(int index) {
LoganManager.w_tableMode(TAG, "當前頁面【" + mTabTitles.get(index) + "】");
}
@Override
public void onTabUnselected(int index) {
}
@Override
public void onTabReselected(int index) {
}
@Override
public void onDoubleTap(int index) {
}
});
}
private void initTopbar() {
// topbar.setBackgroundColor(ContextCompat.getColor(_mActivity, R.color.theme_color));
// if (canScan) {
// topbar.addRightImageButton(R.mipmap.table_white_scan, R.id.topbar_right_change_button)
// .setOnClickListener(v -> {
// _mActivity.onBackPressedSupport();
// });
// }
// topbar.setTitle("折扣");
}
@Override
public boolean onBackPressedSupport() {
return super.onBackPressedSupport();
}
private OnDiscountItemClickListener onDiscountItemClickListener;
public void setOnDiscountItemClickListener(OnDiscountItemClickListener onDiscountItemClickListener) {
this.onDiscountItemClickListener = onDiscountItemClickListener;
}
public interface OnDiscountItemClickListener {
void onBillDiscountClick(Discount item, int position);
void onCouponClick(MemberCoupon item, int position);
}
}
package com.gingersoft.gsa.cloud.table.mvp.ui.widget; package com.gingersoft.gsa.cloud.table.mvp.ui.widget;
import android.app.Activity;
import android.app.Dialog; import android.app.Dialog;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.view.Gravity;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ImageView; import android.view.WindowManager;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewpager.widget.PagerTabStrip;
import androidx.viewpager.widget.ViewPager;
import com.gingersoft.gsa.cloud.common.logan.LoganManager;
import com.gingersoft.gsa.cloud.common.utils.log.LogUtil;
import com.gingersoft.gsa.cloud.database.bean.Discount;
import com.gingersoft.gsa.cloud.table.R; import com.gingersoft.gsa.cloud.table.R;
import com.gingersoft.gsa.cloud.table.R2;
import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.meal.DiscountAdapter; import com.gingersoft.gsa.cloud.table.mvp.ui.adapter.meal.DiscountAdapter;
import com.gingersoft.gsa.cloud.database.bean.Discount; import com.gingersoft.gsa.cloud.table.mvp.ui.fragment.InputTableFragment;
import com.gingersoft.gsa.cloud.table.mvp.ui.fragment.RegionFragment;
import com.gingersoft.gsa.cloud.ui.recylcler.decorator.DividerItemDecoration; import com.gingersoft.gsa.cloud.ui.recylcler.decorator.DividerItemDecoration;
import com.jess.arms.utils.ThirdViewUtil;
import com.qmuiteam.qmui.arch.QMUIFragmentPagerAdapter;
import com.qmuiteam.qmui.layout.QMUILinearLayout; import com.qmuiteam.qmui.layout.QMUILinearLayout;
import com.qmuiteam.qmui.util.QMUIDisplayHelper; import com.qmuiteam.qmui.util.QMUIDisplayHelper;
import com.qmuiteam.qmui.widget.QMUITopBar; import com.qmuiteam.qmui.widget.QMUITopBar;
import com.qmuiteam.qmui.widget.tab.QMUITab;
import com.qmuiteam.qmui.widget.tab.QMUITabBuilder;
import com.qmuiteam.qmui.widget.tab.QMUITabIndicator;
import com.qmuiteam.qmui.widget.tab.QMUITabSegment;
import com.qmuiteam.qmui.widget.tab.QMUITabView;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import androidx.annotation.NonNull; import butterknife.BindView;
import androidx.core.content.ContextCompat; import butterknife.Unbinder;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import lombok.Builder;
/** /**
* 作者:ELEGANT_BIN * 作者:ELEGANT_BIN
...@@ -47,6 +66,18 @@ public class DiscountDialog extends Dialog { ...@@ -47,6 +66,18 @@ public class DiscountDialog extends Dialog {
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
//noinspection ConstantConditions
getWindow().getDecorView().setPadding(0, 0, 0, 0);
// 在底部,宽度撑满
WindowManager.LayoutParams params = getWindow().getAttributes();
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
params.gravity = Gravity.BOTTOM | Gravity.CENTER;
int screenWidth = QMUIDisplayHelper.getScreenWidth(getContext());
int screenHeight = QMUIDisplayHelper.getScreenHeight(getContext());
params.width = screenWidth < screenHeight ? screenWidth : screenHeight;
getWindow().setAttributes(params);
setCanceledOnTouchOutside(true); setCanceledOnTouchOutside(true);
} }
...@@ -62,7 +93,25 @@ public class DiscountDialog extends Dialog { ...@@ -62,7 +93,25 @@ public class DiscountDialog extends Dialog {
public static class Builder implements View.OnClickListener { public static class Builder implements View.OnClickListener {
private Context mContext; // @BindView(R2.id.topbar)
// QMUITopBar topbar;
// @BindView(R2.id.recycler_discount)
// RecyclerView recyclerDiscount;
// @BindView(R2.id.tv_pager_indicator)
// PagerTabStrip tvPagerIndicator;
// @BindView(R2.id.ll_container)
// QMUILinearLayout llContainer;
@BindView(R2.id.topbar)
QMUITopBar topbar;
@BindView(R2.id.tabSegment)
QMUITabSegment tabSegment;
@BindView(R2.id.contentViewPager)
ViewPager contentViewPager;
@BindView(R2.id.ll_container)
QMUILinearLayout llContainer;
private FragmentActivity mContext;
private DiscountDialog mDialog; private DiscountDialog mDialog;
private int spanCount = 3; private int spanCount = 3;
...@@ -75,13 +124,17 @@ public class DiscountDialog extends Dialog { ...@@ -75,13 +124,17 @@ public class DiscountDialog extends Dialog {
private List<Discount> mItems; private List<Discount> mItems;
private DiscountAdapter mAdapter; private DiscountAdapter mAdapter;
private Unbinder mUnbinder;
private String[] mTabTitles = {"折扣", "優惠券"};
private QMUITopBar mTopBar; private int mCurrentPageIndex = 0;
private QMUILinearLayout ll_container;
private RecyclerView recycler_discount; // private QMUITopBar topbar;
private ImageView btn_close; // private QMUILinearLayout llContainer;
// private RecyclerView recyclerDiscount;
public Builder(Context context) { public Builder(FragmentActivity context) {
mContext = context; mContext = context;
mItems = new ArrayList<>(); mItems = new ArrayList<>();
mRadius = QMUIDisplayHelper.dp2px(mContext, 8); mRadius = QMUIDisplayHelper.dp2px(mContext, 8);
...@@ -112,45 +165,112 @@ public class DiscountDialog extends Dialog { ...@@ -112,45 +165,112 @@ public class DiscountDialog extends Dialog {
} }
mDialog = new DiscountDialog(mContext); mDialog = new DiscountDialog(mContext);
View contentView = buildViews(); View contentView = buildViews();
int screenHeight = (int) (QMUIDisplayHelper.getScreenHeight(mContext) * 0.6); mDialog.setContentView(contentView, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,(int) (QMUIDisplayHelper.getScreenHeight(mContext) * 0.65)));
mDialog.setContentView(contentView, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, screenHeight));
return mDialog; return mDialog;
} }
private View buildViews() { private View buildViews() {
View view = View.inflate(mContext, getContentViewLayoutId(), null); View view = View.inflate(mContext, getContentViewLayoutId(), null);
mTopBar = view.findViewById(R.id.topbar); ThirdViewUtil.bindTarget(this, view);
recycler_discount = view.findViewById(R.id.recycler_discount); topbar = view.findViewById(R.id.topbar);
ll_container = view.findViewById(R.id.ll_container); // recyclerDiscount = view.findViewById(R.id.recycler_discount);
// btn_close = view.findViewById(R.id.btn_close); llContainer = view.findViewById(R.id.ll_container);
// btn_close.setOnClickListener(new View.OnClickListener() { // ll_container.setRadiusAndShadow(mRadius, QMUIDisplayHelper.dp2px(mContext, mShadowElevationDp), mShadowAlpha);
// @Override
// public void onClick(View v) {
// closeDialog() ;
// }
// });
ll_container.setRadiusAndShadow(mRadius, QMUIDisplayHelper.dp2px(mContext, mShadowElevationDp), mShadowAlpha);
initTopbar(); initTopbar();
initTabAndPager();
initDiscountRecycleView(); initDiscountRecycleView();
return view; return view;
} }
private void initTabAndPager() {
QMUIFragmentPagerAdapter pagerAdapter = new QMUIFragmentPagerAdapter(mContext.getSupportFragmentManager()) {
@Override
public Fragment createFragment(int position) {
Bundle bundle = new Bundle();
// switch (position) {
// case 1:
// if (allTableFragment != null) {
// return allTableFragment;
// }
// allTableFragment = RegionFragment.newInstance();
// bundle.putInt("currentPageIndex", FUNCTION_ALL_TABLE);
// allTableFragment.setArguments(bundle);
// return allTableFragment;
// default:
// if (inputTableFragment != null) {
// return inputTableFragment;
// }
// inputTableFragment = InputTableFragment.newInstance();
// return inputTableFragment;
// }
return null;
}
@Override
public int getCount() {
return mTabTitles.length;
}
@Override
public CharSequence getPageTitle(int position) {
return "";
}
};
QMUITabBuilder builder = tabSegment.tabBuilder();
QMUITab tab1 = builder
.setText(mTabTitles[0])
.build(mContext);
QMUITab tab2 = builder
.setText(mTabTitles[1])
.build(mContext);
tabSegment
.addTab(tab1)
.addTab(tab2);
contentViewPager.setAdapter(pagerAdapter);
contentViewPager.setCurrentItem(mCurrentPageIndex);
int space = QMUIDisplayHelper.dp2px(mContext, 16);
tabSegment.setIndicator(new QMUITabIndicator(QMUIDisplayHelper.dp2px(mContext, 2), false, true));
tabSegment.setDefaultTextSize(QMUIDisplayHelper.dp2px(mContext, 16), QMUIDisplayHelper.dp2px(mContext, 16));
tabSegment.setPadding(space, 0, space, 0);
tabSegment.setupWithViewPager(contentViewPager, false);
tabSegment.addOnTabSelectedListener(new QMUITabSegment.OnTabSelectedListener() {
@Override
public void onTabSelected(int index) {
LoganManager.w_tableMode(TAG, "當前頁面【" + mTabTitles[index] + "】");
}
@Override
public void onTabUnselected(int index) {
}
@Override
public void onTabReselected(int index) {
}
@Override
public void onDoubleTap(int index) {
}
});
}
private void initTopbar() { private void initTopbar() {
if (mBagcolor != 0) { if (mBagcolor != 0) {
mTopBar.setBackgroundColor(mBagcolor); topbar.setBackgroundColor(mBagcolor);
} else { } else {
mTopBar.setBackgroundColor(ContextCompat.getColor(mContext, R.color.theme_color)); topbar.setBackgroundColor(ContextCompat.getColor(mContext, R.color.theme_color));
} }
if (canScan) { if (canScan) {
mTopBar.addRightImageButton(R.mipmap.table_white_scan, R.id.topbar_right_change_button) topbar.addRightImageButton(R.mipmap.table_white_scan, R.id.topbar_right_change_button)
.setOnClickListener(v -> { .setOnClickListener(v -> {
if (onClickListener != null) { if (onClickListener != null) {
onClickListener.onScan(); onClickListener.onScan();
} }
}); });
} }
mTopBar.setTitle("折扣"); topbar.setTitle("折扣");
} }
private void initDiscountRecycleView() { private void initDiscountRecycleView() {
...@@ -163,10 +283,10 @@ public class DiscountDialog extends Dialog { ...@@ -163,10 +283,10 @@ public class DiscountDialog extends Dialog {
} }
closeDialog(); closeDialog();
}); });
recycler_discount.addItemDecoration(new DividerItemDecoration(mContext, DividerItemDecoration.HORIZONTAL_LIST)); // recyclerDiscount.addItemDecoration(new DividerItemDecoration(mContext, DividerItemDecoration.HORIZONTAL_LIST));
recycler_discount.setLayoutManager(createLayoutManager()); // recyclerDiscount.setLayoutManager(createLayoutManager());
recycler_discount.setItemAnimator(new DefaultItemAnimator()); // recyclerDiscount.setItemAnimator(new DefaultItemAnimator());
recycler_discount.setAdapter(mAdapter); // recyclerDiscount.setAdapter(mAdapter);
} }
private RecyclerView.LayoutManager createLayoutManager() { private RecyclerView.LayoutManager createLayoutManager() {
......
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_bill_discount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" />
</FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fl_container"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.scwang.smartrefresh.layout.SmartRefreshLayout
android:id="@+id/refreshLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_coupon"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_gravity="bottom"
android:orientation="horizontal" />
</com.scwang.smartrefresh.layout.SmartRefreshLayout>
</FrameLayout>
\ No newline at end of file
...@@ -206,6 +206,12 @@ ...@@ -206,6 +206,12 @@
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
<FrameLayout
android:id="@+id/fl_container"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_320"
android:layout_gravity="bottom" />
<ViewStub <ViewStub
android:id="@+id/vs_transfer_food" android:id="@+id/vs_transfer_food"
android:layout_width="match_parent" android:layout_width="match_parent"
......
...@@ -4,30 +4,23 @@ ...@@ -4,30 +4,23 @@
android:id="@+id/ll_container" android:id="@+id/ll_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@color/theme_white_color"
android:orientation="vertical"> android:orientation="vertical">
<com.qmuiteam.qmui.widget.QMUITopBar <!-- <com.qmuiteam.qmui.widget.QMUITopBar-->
android:id="@+id/topbar" <!-- android:id="@+id/topbar"-->
android:layout_width="match_parent" <!-- android:layout_width="match_parent"-->
android:layout_height="?attr/qmui_topbar_height" <!-- android:layout_height="?attr/qmui_topbar_height"-->
app:qmui_topbar_title_color="@color/theme_white_color" /> <!-- app:qmui_topbar_title_color="@color/theme_white_color" />-->
<androidx.recyclerview.widget.RecyclerView <com.qmuiteam.qmui.widget.tab.QMUITabSegment
android:id="@+id/recycler_discount" android:id="@+id/tabSegment"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="@dimen/dp_45"
android:divider="@null" android:background="@drawable/shape_tab_panel_bg" />
android:fadeScrollbars="false"
android:orientation="vertical"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="3" />
<!-- <ImageView--> <androidx.viewpager.widget.ViewPager
<!-- android:id="@+id/btn_close"--> android:id="@+id/contentViewPager"
<!-- android:layout_width="wrap_content"--> android:layout_width="match_parent"
<!-- android:layout_height="wrap_content"--> android:layout_height="wrap_content" />
<!-- android:layout_margin="@dimen/dp_20"-->
<!-- android:src="@drawable/icon_dialog_close" />-->
</com.qmuiteam.qmui.layout.QMUILinearLayout> </com.qmuiteam.qmui.layout.QMUILinearLayout>
\ No newline at end of file
...@@ -48,5 +48,4 @@ ...@@ -48,5 +48,4 @@
android:id="@+id/contentViewPager" android:id="@+id/contentViewPager"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent" />
</LinearLayout> </LinearLayout>
\ No newline at end of file
...@@ -30,7 +30,7 @@ import com.gingersoft.gsa.cloud.common.utils.toast.ToastUtils; ...@@ -30,7 +30,7 @@ import com.gingersoft.gsa.cloud.common.utils.toast.ToastUtils;
import com.gingersoft.gsa.cloud.common.webview.WebviewHelper; import com.gingersoft.gsa.cloud.common.webview.WebviewHelper;
import com.gingersoft.gsa.cloud.webview.R; import com.gingersoft.gsa.cloud.webview.R;
import com.gingersoft.gsa.cloud.webview.R2; import com.gingersoft.gsa.cloud.webview.R2;
import com.gingersoft.gsa.cloud.webview.app.WebViewProgressBar; import com.gingersoft.gsa.cloud.webview.mvp.ui.view.WebViewProgressBar;
import com.gingersoft.gsa.cloud.webview.app.webviewUtils.WebImageListener; import com.gingersoft.gsa.cloud.webview.app.webviewUtils.WebImageListener;
import com.gingersoft.gsa.cloud.webview.app.webviewUtils.WebViewUtils; import com.gingersoft.gsa.cloud.webview.app.webviewUtils.WebViewUtils;
import com.jess.arms.base.BaseActivity; import com.jess.arms.base.BaseActivity;
...@@ -60,10 +60,6 @@ public class WebActivity extends BaseActivity<BasePresenter> implements IView { ...@@ -60,10 +60,6 @@ public class WebActivity extends BaseActivity<BasePresenter> implements IView {
@Inject @Inject
RxErrorHandler mErrorHandler; RxErrorHandler mErrorHandler;
// private CommonDialog msgDialog;
// @BindView(R.id.top_bar)
// TitleBar mTopBar;
@BindView(R2.id.topbar) @BindView(R2.id.topbar)
QMUITopBar mTopBar; QMUITopBar mTopBar;
@BindView(R2.id.web_view) @BindView(R2.id.web_view)
...@@ -75,29 +71,6 @@ public class WebActivity extends BaseActivity<BasePresenter> implements IView { ...@@ -75,29 +71,6 @@ public class WebActivity extends BaseActivity<BasePresenter> implements IView {
@BindView(R2.id.tv_hint) @BindView(R2.id.tv_hint)
TextView mTvHint; TextView mTvHint;
public static final int URI = 100;
public static final int CONTENT = 101;
public static final int URI_CONTENT = 102;
public static final int ADVERTISEMENT = 103;
public static final int NEWSINFOCHILD = 104;
public static final int TITLE_URI = 105;
public static final int TITLE_CONTENT = 106;
public static final int TITLE_URI_CONTENT = 107;
private boolean isContinue;
private int mType;
private String mUrl;
private String mContent;
private String mTitle;
// private AdvertisementInfo adInfo;
// private NewsInfoChild newsInfoChild;
private boolean isReceivedTitle = true; //是否使用网页title
private Intent intent;
private int mRightType;//右边使用什么样的图片
private boolean isNormalSizeToLargest;
@Override @Override
public void setupActivityComponent(@NonNull AppComponent appComponent) { public void setupActivityComponent(@NonNull AppComponent appComponent) {
...@@ -152,14 +125,7 @@ public class WebActivity extends BaseActivity<BasePresenter> implements IView { ...@@ -152,14 +125,7 @@ public class WebActivity extends BaseActivity<BasePresenter> implements IView {
@Override @Override
public void initData(Bundle savedInstanceState) { public void initData(Bundle savedInstanceState) {
intent = getIntent();
isNormalSizeToLargest = intent.getBooleanExtra("isNormalSizeToLargest", false);
initWebView(); initWebView();
//初始化类型(带标题、不带标题、加载url、加载html、传递对象)
initType();
//加载webview
initLoad();
} }
@Override @Override
...@@ -167,285 +133,12 @@ public class WebActivity extends BaseActivity<BasePresenter> implements IView { ...@@ -167,285 +133,12 @@ public class WebActivity extends BaseActivity<BasePresenter> implements IView {
} }
@SuppressWarnings("deprecation")
@SuppressLint("JavascriptInterface") @SuppressLint("JavascriptInterface")
private void initWebView() { private void initWebView() {
//使用硬件加速 //使用硬件加速
// mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); // mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
WebImageListener listener = new WebImageListener(this); WebViewUtils.initWebView(mWebView);
mWebView.addJavascriptInterface(listener, "listener");
mWebView.addJavascriptInterface(this, "android");
WebSettings settings = mWebView.getSettings();
if (isNormalSizeToLargest) {
settings.setTextSize(WebSettings.TextSize.LARGEST);
}
settings.setBlockNetworkImage(true);
settings.setAppCacheEnabled(true);
settings.setDomStorageEnabled(true);
settings.setDatabaseEnabled(true);
if (DeviceUtils.netIsConnected(this)) {
settings.setCacheMode(WebSettings.LOAD_DEFAULT);
} else {
settings.setCacheMode(WebSettings.LOAD_CACHE_ONLY);
}
//防止https连接里面加载http图片
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
settings.setMixedContentMode(WebSettings.LOAD_NORMAL);
}
settings.setBlockNetworkImage(false);
settings.setJavaScriptEnabled(true);
settings.setLoadWithOverviewMode(true);
settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
// 设置可以支持缩放
settings.setSupportZoom(true);
// 设置出现缩放工具
settings.setBuiltInZoomControls(true);
// 扩大比例的缩放
settings.setUseWideViewPort(true);
mWebView.setWebChromeClient(new MyWebChromeClient());
mWebView.setWebViewClient(new MyWebViewClient());
//可以设置是否允许通过file url加载的Javascript可以访问其他任何的源,也就是说,它包括其他的文件和http,https等其他的源
settings.setAllowUniversalAccessFromFileURLs(true);
}
private class MyWebChromeClient extends WebChromeClient {
@Override
public void onProgressChanged(WebView view, int newProgress) {
//loadingOperation(newProgress);
if (newProgress == 100) {
hideProgressWithAnim(mProgressBar1);
} else {
mProgressBar1.setVisibility(View.VISIBLE);
}
mProgressBar1.setProgress(newProgress);
}
@Override
public void onReceivedTitle(WebView view, String title) {
if (isReceivedTitle) { //如果为true才从显示html标题
if (title.startsWith("http://") || title.startsWith("https://")) {
mTopBar.setTitle("");
} else {
mTitle = title;
mTopBar.setTitle(title);
}
}
}
}
private class MyWebViewClient extends WebViewClient {
@Override
public void onPageFinished(WebView view, String url) {
mRightType = intent.getIntExtra(WebviewHelper.RIGHT_IMG_TYPE, WebviewHelper.RIGHT_TYPE_NULL);
// switch (mRightType) {
// case RIGHT_TYPE_SHARE:
// mTopBar.setRightTwoIvVisibility(View.VISIBLE);
// mTopBar.setRightTwoImg(R.drawable.icon_share);
// break;
// case RIGHT_TYPE_REFRESH:
// mTopBar.setRightTwoIvVisibility(View.VISIBLE);
// mTopBar.setRightTwoImg(R.drawable.ic_refresh);
// break;
// default:
// mTopBar.setRightTwoIvVisibility(View.GONE);
// break;
// }
WebViewUtils.addImageClickListener(mWebView);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url == null) return false;
try {
if (url.startsWith("weixin://") //微信
|| url.startsWith("alipays://") //支付宝
|| url.startsWith("mailto://") //邮件
) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
}
//判断用户单击的是那个超连接
String tag = "tel";
if (url.contains(tag)) {
PermissionUtil.callPhone(new PermissionUtil.RequestPermission() {
@SuppressLint("MissingPermission")
@Override
public void onRequestPermissionSuccess() {
String mobile = url.substring(url.lastIndexOf("/") + 1);
Intent mIntent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:" + mobile);
mIntent.setData(data);
startActivity(mIntent);
}
@Override
public void onRequestPermissionFailure(List<String> permissions) {
showMessage(ArmsUtils.getString(WebActivity.this,R.string.authorize_call_phone));
}
@Override
public void onRequestPermissionFailureWithAskNeverAgain(List<String> permissions) {
// msgDialog = new CommonDialog(WebActivity.this, R.style.dialog_style, 0, 0, new View.OnClickListener() {
// @Override
// public void onClick(View v) {
// switch (v.getId()) {
// case R.id.txt_yes:
// DeviceUtils.startSetting(WebActivity.this);
// break;
// case R.id.txt_no:
// break;
// }
// msgDialog.dismiss();
// }
// });
// msgDialog.show();
// msgDialog.setTitle(ArmsUtils.getString(WebActivity.this, R.string.prompt));
// msgDialog.setContext(ArmsUtils.getString(WebActivity.this, R.string.authorize_call_phone));
}
}, new RxPermissions(WebActivity.this), mErrorHandler);
return true;
}
} catch (Exception e) {
e.printStackTrace();
return true;
}
view.loadUrl(url);
return true;
}
// 错误页面的逻辑处理
@SuppressWarnings("deprecation")
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
//errorOperation();
mWebView.setVisibility(View.INVISIBLE);
mTvHint.setVisibility(View.VISIBLE);
}
}
private void initType() {
mType = intent.getIntExtra(WebviewHelper.TYPE_KEY, 0);
if (mType == URI || mType == CONTENT || mType == URI_CONTENT) {
setReceivedTitleStatus(null);
} else if (mType == TITLE_URI || mType == TITLE_CONTENT || mType == TITLE_URI_CONTENT) {
mTitle = intent.getStringExtra(WebviewHelper.TITLE_KEY);
setReceivedTitleStatus(mTitle);
}
// else if (mType == ADVERTISEMENT) {
// adInfo = (AdvertisementInfo) intent.getSerializableExtra("AdvertisementInfo");
// setReceivedTitleStatus(adInfo.getAdTitle());
// } else if (mType == NEWSINFOCHILD) {
// newsInfoChild = (NewsInfoChild) intent.getSerializableExtra("NewsInfoChild");
// setReceivedTitleStatus(newsInfoChild.getAdTitle());
// }
else {
setReceivedTitleStatus(null);
}
}
private void initLoad() {
switch (mType) {
case URI:
mUrl = intent.getStringExtra(WebviewHelper.URL_KEY);
if (!TextUtils.isEmpty(mUrl) && !mUrl.toLowerCase().equals("null")) {
mWebView.loadUrl(mUrl);
}
break;
case CONTENT:
mContent = intent.getStringExtra(WebviewHelper.CONTENT_KEY);
if (!TextUtils.isEmpty(mContent) && !mContent.toLowerCase().equals("null")) {
mWebView.loadDataWithBaseURL(null, mContent, "text/html", "utf-8", null);
}
break;
case URI_CONTENT:
mUrl = intent.getStringExtra(WebviewHelper.URL_KEY);
mContent = intent.getStringExtra(WebviewHelper.CONTENT_KEY);
if (!TextUtils.isEmpty(mUrl) && !mUrl.toLowerCase().equals("null")) {
mWebView.loadUrl(mUrl);
} else if (!TextUtils.isEmpty(mContent) && !mContent.toLowerCase().equals("null")) {
mWebView.loadDataWithBaseURL(null, mContent, "text/html", "utf-8", null);
}
break;
case TITLE_URI:
mUrl = intent.getStringExtra(WebviewHelper.URL_KEY);
mTitle = intent.getStringExtra(WebviewHelper.TITLE_KEY);
mTopBar.setTitle(mTitle);
if (!TextUtils.isEmpty(mUrl)) {
mWebView.loadUrl(mUrl);
}
break;
case TITLE_CONTENT:
mTitle = intent.getStringExtra(WebviewHelper.TITLE_KEY);
mContent = intent.getStringExtra(WebviewHelper.CONTENT_KEY);
mTopBar.setTitle(mTitle);
if (!TextUtils.isEmpty(mContent) && !mContent.toLowerCase().equals("null")) {
mWebView.loadDataWithBaseURL(null, mContent, "text/html", "utf-8", null);
}
break;
case TITLE_URI_CONTENT:
mTitle = intent.getStringExtra(WebviewHelper.TITLE_KEY);
mUrl = intent.getStringExtra(WebviewHelper.URL_KEY);
mContent = intent.getStringExtra(WebviewHelper.CONTENT_KEY);
mTopBar.setTitle(mTitle);
if (!TextUtils.isEmpty(mUrl) && !mUrl.toLowerCase().equals("null")) {
mWebView.loadUrl(mUrl);
} else if (!TextUtils.isEmpty(mContent) && !mContent.toLowerCase().equals("null")) {
mWebView.loadDataWithBaseURL(null, mContent, "text/html", "utf-8", null);
}
break;
// case ADVERTISEMENT:
// if (adInfo != null) {
// mTitle = adInfo.getAdTitle();
// mTopBar.setTitle(mTitle);
//// if (adInfo.getAdType().equals("0")) {
//// mWebView.loadDataWithBaseURL(null, adInfo.getAdDesc(), "text/html", "utf-8", null);
//// } else if (adInfo.getAdType().equals("1")) {
// String url = (SApplication.adServerAddress() + adURL + adInfo.getId()).replace("member-web/", "");
// mWebView.loadUrl(url);
//// } else {
//// mWebView.loadDataWithBaseURL(null,adInfo.getAdUrl(), "text/html", "utf-8", null);
//// }
// }
// break;
// case NEWSINFOCHILD:
// if (newsInfoChild != null) {
// mTitle = newsInfoChild.getAdTitle();
// mTopBar.setCenterText(mTitle);
// String url = (SApplication.adServerAddress() + adURL + newsInfoChild.getId()).replace("member-web/", "");
// mWebView.loadUrl(url);
// }
// break;
case 0:
break;
}
}
/**
* 是否使用其他頁面传递过来的标题
*
* @param title
*/
private void setReceivedTitleStatus(String title) {
if (!TextUtils.isEmpty(title)) {
isReceivedTitle = false;
} else {
isReceivedTitle = true;
}
} }
@Override @Override
...@@ -461,7 +154,6 @@ public class WebActivity extends BaseActivity<BasePresenter> implements IView { ...@@ -461,7 +154,6 @@ public class WebActivity extends BaseActivity<BasePresenter> implements IView {
@Override @Override
public void showMessage(@NonNull String message) { public void showMessage(@NonNull String message) {
Preconditions.checkNotNull(message); Preconditions.checkNotNull(message);
// ArmsUtils.snackbarText(message);
ToastUtils.show(mContext, message); ToastUtils.show(mContext, message);
} }
...@@ -506,224 +198,4 @@ public class WebActivity extends BaseActivity<BasePresenter> implements IView { ...@@ -506,224 +198,4 @@ public class WebActivity extends BaseActivity<BasePresenter> implements IView {
} }
} }
@Override
protected void onDestroy() {
clearWebViewResource();
super.onDestroy();
}
private void clearWebViewResource() {
if (mWebView != null) {
mWebView.removeAllViews();
// in android 5.1(sdk:21) we should invoke this to avoid memory leak
// see (https://coolpers.github.io/webview/memory/leak/2015/07/16/android-5.1-webview-memory-leak.html)
((ViewGroup) mWebView.getParent()).removeView(mWebView);
mWebView.setTag(null);
mWebView.clearHistory();
mWebView.destroy();
mWebView = null;
}
}
@OnClick(R2.id.tv_hint)
void clickHint() {
mTvHint.setVisibility(View.INVISIBLE);
mWebView.setVisibility(View.VISIBLE);
mWebView.reload();
}
private void loadingOperation(int newProgress) {
// 如果没有网络直接跳出方法
// if (!NetWorkUtils.isAvailableByPing()) {
if (!DeviceUtils.netIsConnected(this)) {
return;
}
// 如果进度条隐藏则让它显示
if (View.INVISIBLE == mProgressBar.getVisibility()) {
mProgressBar.setVisibility(View.VISIBLE);
}
// 大于80的进度的时候,放慢速度加载,否则交给自己加载
if (newProgress >= 80) {
// 拦截webView自己的处理方式
if (isContinue) {
return;
}
mProgressBar.setCurProgress(100, 3000, () -> {
finishOperation(true);
isContinue = false;
});
isContinue = true;
} else {
mProgressBar.setNormalProgress(newProgress);
}
}
private void errorOperation() {
// 隐藏webview
mWebView.setVisibility(View.INVISIBLE);
if (View.INVISIBLE == mProgressBar.getVisibility()) {
mProgressBar.setVisibility(View.VISIBLE);
}
//3.5s 加载 0->80 进度的加载 为了实现,特意调节长了事件
mProgressBar.setCurProgress(80, 3500, () -> {
//3.5s 加载 80->100 进度的加载
mProgressBar.setCurProgress(100, 3500, () -> finishOperation(false));
});
}
private void finishOperation(boolean flag) {
// 最后加载设置100进度
mProgressBar.setNormalProgress(100);
// 显示网络异常布局
mTvHint.setVisibility(flag ? View.INVISIBLE : View.VISIBLE);
hideProgressWithAnim(mProgressBar);
}
private void hideProgressWithAnim(final View progressBar) {
AnimationSet animation = new AnimationSet(this, null);
AlphaAnimation alpha = new AlphaAnimation(1.0f, 0.0f);
alpha.setDuration(1000);
animation.addAnimation(alpha);
animation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
progressBar.setVisibility(View.INVISIBLE);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
progressBar.startAnimation(animation);
}
@JavascriptInterface
public void adResults(String title, String content) {
// OnekeyShare.showWebShare(this, title, content);
}
// /**
// * @param type 1 (餐牌模式)餐厅详情 2品牌介绍3餐厅外卖
// * @param jsonStr 入参json字符串
// */
// @JavascriptInterface
// public void startFunction(int type, String jsonStr) {
//
// boolean flatbedloginStatus = (int) SPUtils.get(this, SPConstant.FLATBED_LOGIN_STATUS, -1) != -1 ? true : false;
// if (flatbedloginStatus)
// return;
//
// if (TextUtils.isEmpty(jsonStr) || jsonStr.equals("null")) {
// showMessage("沒有傳入相關參數");
// return;
// }
// try {
// JSONObject jsonObj = new JSONObject(jsonStr);
// if (type == 1 || type == 3) {
// String restaurantId = jsonObj.optString("restaurantId");
// if (!TextUtils.isEmpty(restaurantId) || !restaurantId.equals("null")) {
// Intent intent = new Intent(this, RestaurantActivity.class);
// intent.putExtra("id", restaurantId);
// if (type == 1) {
// intent.putExtra("menuType", DefaultConfig.MENU_TYPE_DETAILS);
// } else {
// intent.putExtra("menuType", DefaultConfig.MENU_TYPE_TAKEAWAY);
// }
// startActivity(intent);
// }
// } else if (type == 2) {
// String brandId = jsonObj.optString("brandId");
// if (!TextUtils.isEmpty(brandId) || !brandId.equals("null")) {
// Intent intent = new Intent(this, JoinMemberCardActivity.class);
// intent.putExtra(DefaultConfig.BRAND_ID, Integer.valueOf(brandId));
// startActivity(intent);
// }
// }
// } catch (JSONException e) {
// e.printStackTrace();
// }
// }
public static void startWebActivityForResult_url(Activity context, String url, int rightType, int reslutCode) {
Intent intent = new Intent(context, WebActivity.class);
intent.putExtra(WebviewHelper.TYPE_KEY, URI);
intent.putExtra(WebviewHelper.URL_KEY, url);
intent.putExtra(WebviewHelper.RIGHT_IMG_TYPE, rightType);
context.startActivityForResult(intent, reslutCode);
}
public static void startWebActivity_url(Context context, String url, int rightType) {
Intent intent = new Intent(context, WebActivity.class);
intent.putExtra(WebviewHelper.TYPE_KEY, URI);
intent.putExtra(WebviewHelper.URL_KEY, url);
intent.putExtra(WebviewHelper.RIGHT_IMG_TYPE, rightType);
context.startActivity(intent);
}
public static void startWebActivity_content(Context context, String content, int rightType) {
Intent intent = new Intent(context, WebActivity.class);
intent.putExtra(WebviewHelper.TYPE_KEY, CONTENT);
intent.putExtra(WebviewHelper.CONTENT_KEY, content);
intent.putExtra(WebviewHelper.RIGHT_IMG_TYPE, rightType);
context.startActivity(intent);
}
public static void startWebActivity_uri_content(Context context, String url, String content, int rightType) {
Intent intent = new Intent(context, WebActivity.class);
intent.putExtra(WebviewHelper.TYPE_KEY, URI_CONTENT);
intent.putExtra(WebviewHelper.URL_KEY, url);
intent.putExtra(WebviewHelper.CONTENT_KEY, content);
intent.putExtra(WebviewHelper.RIGHT_IMG_TYPE, rightType);
context.startActivity(intent);
}
public static void startWebActivity_title_url(Context context, String title, String url, int rightType) {
Intent intent = new Intent(context, WebActivity.class);
intent.putExtra(WebviewHelper.TYPE_KEY, TITLE_URI);
intent.putExtra(WebviewHelper.TITLE_KEY, title);
intent.putExtra(WebviewHelper.URL_KEY, url);
intent.putExtra(WebviewHelper.RIGHT_IMG_TYPE, rightType);
context.startActivity(intent);
}
public static void startWebActivity_title_content(Context context, String title, String content, int rightType, boolean isNormalSizeToLargest) {
Intent intent = new Intent(context, WebActivity.class);
intent.putExtra(WebviewHelper.TYPE_KEY, TITLE_CONTENT);
intent.putExtra(WebviewHelper.TITLE_KEY, title);
intent.putExtra(WebviewHelper.CONTENT_KEY, content);
intent.putExtra(WebviewHelper.RIGHT_IMG_TYPE, rightType);
intent.putExtra("isNormalSizeToLargest", isNormalSizeToLargest);
context.startActivity(intent);
}
public static void startWebActivity_title_url_content(Context context, String title, String url, String content, int rightType) {
Intent intent = new Intent(context, WebActivity.class);
intent.putExtra(WebviewHelper.TYPE_KEY, TITLE_URI_CONTENT);
intent.putExtra(WebviewHelper.TITLE_KEY, title);
intent.putExtra(WebviewHelper.URL_KEY, url);
intent.putExtra(WebviewHelper.CONTENT_KEY, content);
intent.putExtra(WebviewHelper.RIGHT_IMG_TYPE, rightType);
context.startActivity(intent);
}
// public static void startWebActivity_Advertisement(Context context, AdvertisementInfo info, int rightType) {
// Intent intent = new Intent(context, WebActivity.class);
// intent.putExtra(WebviewHelper.TYPE_KEY, ADVERTISEMENT);
// intent.putExtra(RIGHT_IMG_TYPE, rightType);
// intent.putExtra("AdvertisementInfo", info);
// context.startActivity(intent);
// }
//
// public static void startWebActivity_NewsInfoChild(Context context, NewsInfoChild newsInfoChild, int rightType) {
// Intent intent = new Intent(context, WebActivity.class);
// intent.putExtra(WebviewHelper.TYPE_KEY, NEWSINFOCHILD);
// intent.putExtra(RIGHT_IMG_TYPE, rightType);
// intent.putExtra("NewsInfoChild", newsInfoChild);
// context.startActivity(intent);
// }
} }
package com.gingersoft.gsa.cloud.webview.app; package com.gingersoft.gsa.cloud.webview.mvp.ui.view;
import android.animation.Animator; import android.animation.Animator;
import android.animation.ValueAnimator; import android.animation.ValueAnimator;
......
...@@ -14,7 +14,7 @@ ext { ...@@ -14,7 +14,7 @@ ext {
version = [ version = [
androidSupportSdkVersion: "29+", androidSupportSdkVersion: "29+",
retrofitSdkVersion : '2.3.0', retrofitSdkVersion : '2.3.0',
dagger2SdkVersion : "2.19", dagger2SdkVersion : "2.26",
glideSdkVersion : "4.9.0", glideSdkVersion : "4.9.0",
butterknifeSdkVersion : "10.2.1", butterknifeSdkVersion : "10.2.1",
rxlifecycleSdkVersion : "1.0", rxlifecycleSdkVersion : "1.0",
......
/*
* Copyright 2017 JessYan
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.jess.arms.base;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatDialogFragment;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
import com.gyf.immersionbar.ImmersionBar;
import com.jess.arms.base.delegate.IFragment;
import com.jess.arms.integration.cache.Cache;
import com.jess.arms.integration.cache.CacheType;
import com.jess.arms.integration.lifecycle.FragmentLifecycleable;
import com.jess.arms.mvp.IPresenter;
import com.jess.arms.utils.ArmsUtils;
import com.trello.rxlifecycle2.android.FragmentEvent;
import javax.inject.Inject;
import io.reactivex.subjects.BehaviorSubject;
import io.reactivex.subjects.Subject;
import me.yokeyword.fragmentation.ExtraTransaction;
import me.yokeyword.fragmentation.ISupportFragment;
import me.yokeyword.fragmentation.SupportFragmentDelegate;
import me.yokeyword.fragmentation.SupportHelper;
import me.yokeyword.fragmentation.anim.FragmentAnimator;
/**
* ================================================
* 因为 Java 只能单继承,所以如果要用到需要继承特定 @{@link Fragment} 的三方库,那你就需要自己自定义 @{@link Fragment}
* 继承于这个特定的 @{@link Fragment},然后再按照 {@link BaseDialogFragment} 的格式,将代码复制过去,记住一定要实现{@link IFragment}
* <p>
* Created by JessYan on 22/03/2016
* <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
* <a href="https://github.com/JessYanCoding">Follow me</a>
* ================================================
*/
public abstract class BaseDialogFragment<P extends IPresenter> extends AppCompatDialogFragment implements IFragment, ISupportFragment, FragmentLifecycleable {
protected final String TAG = this.getClass().getSimpleName();
private final BehaviorSubject<FragmentEvent> mLifecycleSubject = BehaviorSubject.create();
private Cache<String, Object> mCache;
protected Context mContext;
@Inject
@Nullable
protected P mPresenter;//如果当前页面逻辑简单, Presenter 可以为 null
private int mBindId = -1;
final SupportFragmentDelegate mDelegate = new SupportFragmentDelegate(this);
protected BaseFragmentActivity _mActivity;
@NonNull
@Override
public synchronized Cache<String, Object> provideCache() {
if (mCache == null) {
mCache = ArmsUtils.obtainAppComponentFromContext(mContext).cacheFactory().build(CacheType.FRAGMENT_CACHE);
}
return mCache;
}
public int getColor(int colorId) {
return ContextCompat.getColor(requireContext(), colorId);
}
@NonNull
@Override
public final Subject<FragmentEvent> provideLifecycleSubject() {
return mLifecycleSubject;
}
@Override
public SupportFragmentDelegate getSupportDelegate() {
return mDelegate;
}
/**
* Perform some extra transactions.
* 额外的事务:自定义Tag,添加SharedElement动画,操作非回退栈Fragment
*/
@Override
public ExtraTransaction extraTransaction() {
return mDelegate.extraTransaction();
}
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
Activity activity = (Activity) context;
mDelegate.onAttach(activity);
_mActivity = (BaseFragmentActivity) mDelegate.getActivity();
mContext = mDelegate.getActivity();
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mDelegate.onCreate(savedInstanceState);
}
@Override
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
return mDelegate.onCreateAnimation(transit, enter, nextAnim);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mDelegate.onActivityCreated(savedInstanceState);
}
private View view;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (view != null) {
ViewGroup viewGroup = (ViewGroup) view.getRootView();
if (viewGroup != null) {
viewGroup.removeView(view);
}
return view;
}
view = initView(inflater, container, savedInstanceState);
return view;
}
@Nullable
@Override
public View getView() {
return view;
}
@Override
public void configImmersionBar(ImmersionBar immersionBar) {
// immersionBar.statusBarColor("#398BED") //状态栏颜色,不写默认透明色
// .statusBarDarkFont(true) //原理:如果当前设备支持状态栏字体变色,会设置状态栏字体为黑色,如果当前设备不支持
// .fitsSystemWindows(true)
//// .fullScreen(true)
// .init();
}
/**
* 是否使用eventBus,默认为使用(true),
*
* @return
*/
@Override
public boolean useEventBus() {
return true;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mDelegate.onSaveInstanceState(outState);
}
@Override
public void onResume() {
super.onResume();
mDelegate.onResume();
}
@Override
public void onPause() {
super.onPause();
mDelegate.onPause();
}
@Override
public void onDestroyView() {
mDelegate.onDestroyView();
super.onDestroyView();
}
@Override
public void onDestroy() {
mDelegate.onDestroy();
super.onDestroy();
if (mPresenter != null) mPresenter.onDestroy();//释放资源
this.mPresenter = null;
}
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
mDelegate.onHiddenChanged(hidden);
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
mDelegate.setUserVisibleHint(isVisibleToUser);
}
/**
* Causes the Runnable r to be added to the action queue.
* <p>
* The runnable will be run after all the previous action has been run.
* <p>
* 前面的事务全部执行后 执行该Action
*
* @deprecated Use {@link #post(Runnable)} instead.
*/
@Deprecated
@Override
public void enqueueAction(Runnable runnable) {
mDelegate.enqueueAction(runnable);
}
/**
* Causes the Runnable r to be added to the action queue.
* <p>
* The runnable will be run after all the previous action has been run.
* <p>
* 前面的事务全部执行后 执行该Action
*/
@Override
public void post(Runnable runnable) {
mDelegate.post(runnable);
}
/**
* Called when the enter-animation end.
* 入栈动画 结束时,回调
*/
@Override
public void onEnterAnimationEnd(Bundle savedInstanceState) {
mDelegate.onEnterAnimationEnd(savedInstanceState);
}
/**
* Lazy initial,Called when fragment is first called.
* <p>
* 同级下的 懒加载 + ViewPager下的懒加载 的结合回调方法
*/
@Override
public void onLazyInitView(@Nullable Bundle savedInstanceState) {
mDelegate.onLazyInitView(savedInstanceState);
}
/**
* Called when the fragment is visible.
* 当Fragment对用户可见时回调
* <p>
* Is the combination of [onHiddenChanged() + onResume()/onPause() + setUserVisibleHint()]
*/
@Override
public void onSupportVisible() {
mDelegate.onSupportVisible();
}
/**
* Called when the fragment is invivible.
* <p>
* Is the combination of [onHiddenChanged() + onResume()/onPause() + setUserVisibleHint()]
*/
@Override
public void onSupportInvisible() {
mDelegate.onSupportInvisible();
}
/**
* Return true if the fragment has been supportVisible.
*/
@Override
final public boolean isSupportVisible() {
return mDelegate.isSupportVisible();
}
/**
* Set fragment animation with a higher priority than the ISupportActivity
* 设定当前Fragmemt动画,优先级比在SupportActivity里高
*/
@Override
public FragmentAnimator onCreateFragmentAnimator() {
return mDelegate.onCreateFragmentAnimator();
}
/**
* 获取设置的全局动画 copy
*
* @return FragmentAnimator
*/
@Override
public FragmentAnimator getFragmentAnimator() {
return mDelegate.getFragmentAnimator();
}
/**
* 设置Fragment内的全局动画
*/
@Override
public void setFragmentAnimator(FragmentAnimator fragmentAnimator) {
mDelegate.setFragmentAnimator(fragmentAnimator);
}
/**
* 按返回键触发,前提是SupportActivity的onBackPressed()方法能被调用
*
* @return false则继续向上传递, true则消费掉该事件
*/
@Override
public boolean onBackPressedSupport() {
return mDelegate.onBackPressedSupport();
}
/**
* 类似 {@link Activity#setResult(int, Intent)}
* <p>
* Similar to {@link Activity#setResult(int, Intent)}
*
* @see #startForResult(ISupportFragment, int)
*/
@Override
public void setFragmentResult(int resultCode, Bundle bundle) {
mDelegate.setFragmentResult(resultCode, bundle);
}
/**
* 类似 {@link Activity#onActivityResult(int, int, Intent)}
* <p>
* Similar to {@link Activity#onActivityResult(int, int, Intent)}
*
* @see #startForResult(ISupportFragment, int)
*/
@Override
public void onFragmentResult(int requestCode, int resultCode, Bundle data) {
mDelegate.onFragmentResult(requestCode, resultCode, data);
}
/**
* 在start(TargetFragment,LaunchMode)时,启动模式为SingleTask/SingleTop, 回调TargetFragment的该方法
* 类似 {@link Activity#onNewIntent(Intent)}
* <p>
* Similar to {@link Activity#onNewIntent(Intent)}
*
* @param args putNewBundle(Bundle newBundle)
* @see #start(ISupportFragment, int)
*/
@Override
public void onNewBundle(Bundle args) {
mDelegate.onNewBundle(args);
}
/**
* 添加NewBundle,用于启动模式为SingleTask/SingleTop时
*
* @see #start(ISupportFragment, int)
*/
@Override
public void putNewBundle(Bundle newBundle) {
mDelegate.putNewBundle(newBundle);
}
/****************************************以下为可选方法(Optional methods)******************************************************/
// 自定制Support时,可移除不必要的方法
/**
* 隐藏软键盘
*/
protected void hideSoftInput() {
mDelegate.hideSoftInput();
}
/**
* 显示软键盘,调用该方法后,会在onPause时自动隐藏软键盘
*/
protected void showSoftInput(final View view) {
mDelegate.showSoftInput(view);
}
/**
* 加载根Fragment, 即Activity内的第一个Fragment 或 Fragment内的第一个子Fragment
*
* @param containerId 容器id
* @param toFragment 目标Fragment
*/
public void loadRootFragment(int containerId, ISupportFragment toFragment) {
mDelegate.loadRootFragment(containerId, toFragment);
}
public void loadRootFragment(int containerId, ISupportFragment toFragment, boolean addToBackStack, boolean allowAnim) {
mDelegate.loadRootFragment(containerId, toFragment, addToBackStack, allowAnim);
}
public void start(ISupportFragment toFragment) {
mDelegate.start(toFragment);
}
/**
* @param launchMode Similar to Activity's LaunchMode.
*/
public void start(final ISupportFragment toFragment, @LaunchMode int launchMode) {
mDelegate.start(toFragment, launchMode);
}
/**
* Launch an fragment for which you would like a result when it poped.
*/
public void startForResult(ISupportFragment toFragment, int requestCode) {
mDelegate.startForResult(toFragment, requestCode);
}
/**
* Start the target Fragment and pop itself
*/
public void startWithPop(ISupportFragment toFragment) {
mDelegate.startWithPop(toFragment);
}
/**
* @see #popTo(Class, boolean)
* +
* @see #start(ISupportFragment)
*/
public void startWithPopTo(ISupportFragment toFragment, Class<?> targetFragmentClass, boolean includeTargetFragment) {
mDelegate.startWithPopTo(toFragment, targetFragmentClass, includeTargetFragment);
}
public void replaceFragment(ISupportFragment toFragment, boolean addToBackStack) {
mDelegate.replaceFragment(toFragment, addToBackStack);
}
public void pop() {
mDelegate.pop();
}
/**
* Pop the last fragment transition from the manager's fragment
* back stack.
* <p>
* 出栈到目标fragment
*
* @param targetFragmentClass 目标fragment
* @param includeTargetFragment 是否包含该fragment
*/
public void popTo(Class<?> targetFragmentClass, boolean includeTargetFragment) {
mDelegate.popTo(targetFragmentClass, includeTargetFragment);
}
/**
* 获取栈内的fragment对象
*/
public <T extends ISupportFragment> T findChildFragment(Class<T> fragmentClass) {
return SupportHelper.findFragment(getChildFragmentManager(), fragmentClass);
}
}
...@@ -15,14 +15,17 @@ ...@@ -15,14 +15,17 @@
*/ */
package com.jess.arms.base; package com.jess.arms.base;
import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.graphics.Color;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.animation.Animation; import android.view.animation.Animation;
import com.gyf.immersionbar.ImmersionBar;
import com.jess.arms.base.delegate.IFragment; import com.jess.arms.base.delegate.IFragment;
import com.jess.arms.integration.cache.Cache; import com.jess.arms.integration.cache.Cache;
import com.jess.arms.integration.cache.CacheType; import com.jess.arms.integration.cache.CacheType;
...@@ -74,8 +77,6 @@ public abstract class BaseFragment<P extends IPresenter> extends Fragment implem ...@@ -74,8 +77,6 @@ public abstract class BaseFragment<P extends IPresenter> extends Fragment implem
final SupportFragmentDelegate mDelegate = new SupportFragmentDelegate(this); final SupportFragmentDelegate mDelegate = new SupportFragmentDelegate(this);
protected BaseFragmentActivity _mActivity; protected BaseFragmentActivity _mActivity;
private Observable mObservable;
@NonNull @NonNull
@Override @Override
public synchronized Cache<String, Object> provideCache() { public synchronized Cache<String, Object> provideCache() {
...@@ -85,7 +86,7 @@ public abstract class BaseFragment<P extends IPresenter> extends Fragment implem ...@@ -85,7 +86,7 @@ public abstract class BaseFragment<P extends IPresenter> extends Fragment implem
return mCache; return mCache;
} }
public int getColor(int colorId){ public int getColor(int colorId) {
return ContextCompat.getColor(requireContext(), colorId); return ContextCompat.getColor(requireContext(), colorId);
} }
...@@ -109,14 +110,6 @@ public abstract class BaseFragment<P extends IPresenter> extends Fragment implem ...@@ -109,14 +110,6 @@ public abstract class BaseFragment<P extends IPresenter> extends Fragment implem
return mDelegate.extraTransaction(); return mDelegate.extraTransaction();
} }
// @Override
// public void onAttach(Activity activity) {
// super.onAttach(activity);
// mDelegate.onAttach(activity);
// _mActivity = (BaseFragmentActivity) mDelegate.getActivity();
// mContext = mDelegate.getActivity();
// }
@Override @Override
public void onAttach(@NonNull Context context) { public void onAttach(@NonNull Context context) {
super.onAttach(context); super.onAttach(context);
...@@ -143,12 +136,6 @@ public abstract class BaseFragment<P extends IPresenter> extends Fragment implem ...@@ -143,12 +136,6 @@ public abstract class BaseFragment<P extends IPresenter> extends Fragment implem
mDelegate.onActivityCreated(savedInstanceState); mDelegate.onActivityCreated(savedInstanceState);
} }
// @Override
// protected View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container) {
// mCacheRootView = initView(inflater, container, null);
// return mCacheRootView;
// }
private View view; private View view;
@Nullable @Nullable
...@@ -165,12 +152,25 @@ public abstract class BaseFragment<P extends IPresenter> extends Fragment implem ...@@ -165,12 +152,25 @@ public abstract class BaseFragment<P extends IPresenter> extends Fragment implem
return view; return view;
} }
@Nullable @Nullable
@Override @Override
public View getView() { public View getView() {
return view; return view;
} }
@SuppressLint("ResourceType")
@Override
public void configImmersionBar(ImmersionBar immersionBar) {
immersionBar
.statusBarColor("#398BED") //状态栏颜色,不写默认透明色
.statusBarDarkFont(true) //原理:如果当前设备支持状态栏字体变色,会设置状态栏字体为黑色,如果当前设备不支持
.fitsSystemWindows(true)
// .fullScreen(true)
.init();
}
/** /**
* 是否使用eventBus,默认为使用(true), * 是否使用eventBus,默认为使用(true),
* *
......
...@@ -53,15 +53,8 @@ public class ActivityDelegateImpl implements ActivityDelegate { ...@@ -53,15 +53,8 @@ public class ActivityDelegateImpl implements ActivityDelegate {
//注册到事件主线 //注册到事件主线
EventBus.getDefault().register(mActivity); EventBus.getDefault().register(mActivity);
} }
// if (iActivity.useLightMode()) {
// //设置状态栏黑色字体 iActivity.configImmersionBar(ImmersionBar.with(mActivity));
// QMUIStatusBarHelper.setStatusBarLightMode(mActivity);
// } else {
// //默认状态栏白色字体
// QMUIStatusBarHelper.setStatusBarDarkMode(mActivity);
// }
// //设置沉浸式状态栏颜色
// QMUIStatusBarHelper.translucent(mActivity, iActivity.getStatusBarColor());
//这里提供 AppComponent 对象给 BaseActivity 的子类, 用于 Dagger2 的依赖注入 //这里提供 AppComponent 对象给 BaseActivity 的子类, 用于 Dagger2 的依赖注入
iActivity.setupActivityComponent(ArmsUtils.obtainAppComponentFromContext(mActivity)); iActivity.setupActivityComponent(ArmsUtils.obtainAppComponentFromContext(mActivity));
} }
......
...@@ -19,14 +19,17 @@ import android.content.Context; ...@@ -19,14 +19,17 @@ import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import com.gyf.immersionbar.ImmersionBar;
import com.jess.arms.utils.ArmsUtils; import com.jess.arms.utils.ArmsUtils;
import org.simple.eventbus.EventBus; import org.simple.eventbus.EventBus;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import butterknife.Unbinder; import butterknife.Unbinder;
import timber.log.Timber; import timber.log.Timber;
...@@ -68,15 +71,24 @@ public class FragmentDelegateImpl implements FragmentDelegate { ...@@ -68,15 +71,24 @@ public class FragmentDelegateImpl implements FragmentDelegate {
@Override @Override
public void onCreateView(@Nullable View view, @Nullable Bundle savedInstanceState) { public void onCreateView(@Nullable View view, @Nullable Bundle savedInstanceState) {
//绑定到butterknife //绑定到butterknife
if (view != null) if (view != null) {
mUnbinder = ButterKnife.bind(mFragment, view); mUnbinder = ButterKnife.bind(mFragment, view);
}
// if (mFragment instanceof DialogFragment) {
// } else {
// iFragment.configImmersionBar(ImmersionBar.with(mFragment));
// }
} }
@Override @Override
public void onActivityCreate(@Nullable Bundle savedInstanceState) { public void onActivityCreate(@Nullable Bundle savedInstanceState) {
iFragment.initData(savedInstanceState); iFragment.initData(savedInstanceState);
// if (mFragment instanceof DialogFragment) {
// iFragment.configImmersionBar(ImmersionBar.with((DialogFragment) mFragment));
// }
} }
@Override @Override
public void onStart() { public void onStart() {
......
...@@ -22,6 +22,7 @@ import android.view.LayoutInflater; ...@@ -22,6 +22,7 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import com.gyf.immersionbar.ImmersionBar;
import com.jess.arms.base.BaseFragment; import com.jess.arms.base.BaseFragment;
import com.jess.arms.di.component.AppComponent; import com.jess.arms.di.component.AppComponent;
import com.jess.arms.integration.cache.Cache; import com.jess.arms.integration.cache.Cache;
...@@ -62,6 +63,12 @@ public interface IFragment { ...@@ -62,6 +63,12 @@ public interface IFragment {
*/ */
void setupFragmentComponent(@NonNull AppComponent appComponent); void setupFragmentComponent(@NonNull AppComponent appComponent);
/**
* 重写此方法可配置当前页面的沉浸式主题
*/
void configImmersionBar(ImmersionBar immersionBar);
/** /**
* 是否使用 {@link EventBus} * 是否使用 {@link EventBus}
* *
......
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.gingersoft.gsa.cloud.common">
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="com.asus.msa.SupplementaryDID.ACCESS" />
<application
android:name="com.gingersoft.gsa.cloud.app.GsaCloudApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:supportsRtl="true"
android:networkSecurityConfig="@xml/network_android"
android:theme="@style/AppTheme">
<meta-data
android:name="com.gingersoft.gsa.cloud.common.config.globalconfig.GlobalConfiguration"
android:value="ConfigModule" />
<meta-data
android:name="design_width_in_dp"
android:value="360"/>
<meta-data
android:name="design_height_in_dp"
android:value="640"/>
<service
android:name="com.gingersoft.gsa.cloud.common.service.ICommandService"
android:enabled="true" />
</application>
</manifest>
<resources>
<!-- &lt;!&ndash; Base application theme. &ndash;&gt;-->
<!-- <style name="table_AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">-->
<!-- &lt;!&ndash; Customize your theme here. &ndash;&gt;-->
<!-- <item name="colorPrimary">@color/table_colorPrimary</item>-->
<!-- <item name="colorPrimaryDark">@color/table_colorPrimaryDark</item>-->
<!-- <item name="colorAccent">@color/table_colorAccent</item>-->
<!-- </style>-->
</resources>
package com.gingersoft.gsa.cloud.common.bean;
import androidx.annotation.LayoutRes;
import androidx.annotation.StringRes;
import lombok.Data;
/**
* @作者: bin
* @創建時間: 2021-04-06 16:48
* @更新時間: 2021-04-06 16:48
* @描述:
*/
@Data
public class LayoutInfoBean {
@StringRes
private int pageTitle;
@LayoutRes
private int layoutId;
}
package com.gingersoft.gsa.cloud.common.core.discount;
/**
* @作者: bin
* @創建時間: 2021-04-07 15:44
* @更新時間: 2021-04-07 15:44
* @描述:
*/
public abstract class AbstractDiscount {
}
package com.gingersoft.gsa.cloud.common.core.discount;
/**
* @作者: bin
* @創建時間: 2021-04-07 15:45
* @更新時間: 2021-04-07 15:45
* @描述:
*/
public class BillDiscount extends AbstractDiscount {
}
package com.gingersoft.gsa.cloud.common.core.discount;
import com.gingersoft.gsa.cloud.database.bean.Discount;
import lombok.Data;
/**
* @作者: bin
* @創建時間: 2021-04-07 15:45
* @更新時間: 2021-04-07 15:45
* @描述:
*/
@Data
public class MemberCoupon extends AbstractDiscount {
private long id;
private String couponTypeName;
private String beginDate;
private String endDate;
private int periodDays;
private int upperLimitTimes;
private double billMinAmount;
private double amount;
private int discount;
private String remark;
private String couponNo;
private int useTimes;
public Discount castDiscount() {
Discount discount = new Discount();
discount.setId(getId());
discount.setDiscountValue(getDiscount());
discount.setMinBillAmount(getBillMinAmount());
discount.setRemark(getRemark());
discount.setBeginTime(getBeginDate());
discount.setEndTime(getEndDate());
return discount;
}
}
\ No newline at end of file
package com.gingersoft.gsa.cloud.common.loadsir;
import android.app.Activity;
import android.content.Context;
import android.net.ParseException;
import android.view.View;
import com.gingersoft.gsa.cloud.app.GsaCloudApplication;
import com.gingersoft.gsa.cloud.common.R;
import com.gingersoft.gsa.cloud.common.constans.AppConstans;
import com.google.gson.JsonIOException;
import com.google.gson.JsonParseException;
import com.jess.arms.utils.ArmsUtils;
import com.kingja.loadsir.core.LoadService;
import com.kingja.loadsir.core.Transport;
import org.json.JSONException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import retrofit2.HttpException;
/**
* @作者: bin
* @創建時間: 2021-04-07 16:27
* @更新時間: 2021-04-07 16:27
* @描述: 反馈页工具类,可根据对应的网络状况显示详细信息
*/
public class LoadsirUtil {
public static void showCallbackByError(Throwable t, LoadService loadService) {
if (t instanceof UnknownHostException) {
loadService.showCallback(ErrorCallback.class);
} else if (t instanceof SocketTimeoutException) {
loadService.showCallback(TimeoutCallback.class);
} else if (t instanceof HttpException) {
HttpException httpException = (HttpException) t;
String msg = convertStatusCode(GsaCloudApplication.getAppContext(), httpException);
Class<ErrorCallback> errorCallback = ErrorCallback.class;
loadService.setCallBack(errorCallback.getClass(), new OnTransport(msg));
loadService.showCallback(errorCallback.getClass());
} else if (t instanceof JsonParseException || t instanceof ParseException || t instanceof JSONException || t instanceof JsonIOException) {
String msg = ArmsUtils.getString(GsaCloudApplication.getAppContext(), R.string.response_error_data_parsing_error);
Class<ErrorCallback> errorCallback = ErrorCallback.class;
loadService.setCallBack(errorCallback.getClass(), new OnTransport(msg));
loadService.showCallback(errorCallback.getClass());
}
}
private final static String convertStatusCode(Context context, HttpException httpException) {
String msg = null;
if (httpException.code() == 500) {
msg = ArmsUtils.getString(context, R.string.response_error_server_error);
} else if (httpException.code() == 404) {
msg = ArmsUtils.getString(context, R.string.response_error_address_does_not_exist);
} else if (httpException.code() == 403) {
msg = ArmsUtils.getString(context, R.string.response_error_request_rejected_by_server);
} else if (httpException.code() == 307) {
msg = ArmsUtils.getString(context, R.string.response_error_request_was_redirected_to_another_page);
} else if (httpException.code() == 401) {
msg = ArmsUtils.getString(context, R.string.response_error_request_logged);
} else {
msg = httpException.message();
}
return msg;
}
private static final class OnTransport implements Transport {
private Class<?> callbackClass;
private String msg;
public OnTransport(Class<?> callbackClass, String msg) {
this.callbackClass = callbackClass;
this.msg = msg;
}
public OnTransport(String msg) {
this.msg = msg;
}
@Override
public void order(Context context, View rootView) {
View tv_loadsir_error_img = rootView.findViewById(R.id.tv_loadsir_error_img);
tv_loadsir_error_img.setTag(msg);
}
}
}
package com.gingersoft.gsa.cloud.common.loadsir;
import com.kingja.loadsir.callback.Callback;
import com.kingja.loadsir.core.LoadService;
/**
* @author : bin
* @create date: 2020-10-27
* @update date: 2020-10-27
* @description:
*/
public class LoadsirUtils {
public static void loadState(LoadService loadService, Callback callback){
}
}
...@@ -9,7 +9,7 @@ import com.kingja.loadsir.callback.Callback; ...@@ -9,7 +9,7 @@ import com.kingja.loadsir.callback.Callback;
* @update date: 2020-10-27 * @update date: 2020-10-27
* @description: * @description:
*/ */
public class TimeoutCallback extends Callback { public class TimeoutCallback extends Callback {
@Override @Override
protected int onCreateView() { protected int onCreateView() {
......
package com.gingersoft.gsa.cloud.common.rxjava;
import com.gingersoft.gsa.cloud.common.loadsir.LoadsirUtil;
import com.kingja.loadsir.core.LoadService;
import io.reactivex.SingleObserver;
import io.reactivex.annotations.NonNull;
import io.reactivex.disposables.Disposable;
import me.jessyan.rxerrorhandler.core.RxErrorHandler;
import me.jessyan.rxerrorhandler.handler.ErrorHandlerFactory;
/**
* @作者: bin
* @創建時間: 2021-04-07 14:03
* @更新時間: 2021-04-07 14:03
* @描述:
*/
public abstract class ErrorHandleSingleSubscriber<T> implements SingleObserver<T> {
private ErrorHandlerFactory mHandlerFactory;
private LoadService mLoadService;
public ErrorHandleSingleSubscriber(RxErrorHandler rxErrorHandler, LoadService loadService) {
this.mHandlerFactory = rxErrorHandler.getHandlerFactory();
this.mLoadService = loadService;
}
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onSuccess(T t) {
}
@Override
public void onError(@NonNull Throwable t) {
t.printStackTrace();
//如果你某个地方不想使用全局错误处理,则重写 onError(Throwable) 并将 super.onError(e); 删掉
//如果你不仅想使用全局错误处理,还想加入自己的逻辑,则重写 onError(Throwable) 并在 super.onError(e); 后面加入自己的逻辑
mHandlerFactory.handleError(t);
if (mLoadService != null) {
//统一处理反馈页error显示信息
LoadsirUtil.showCallbackByError(t, mLoadService);
}
}
}
...@@ -72,12 +72,23 @@ public class MealOrderPayRequest implements Parcelable{ ...@@ -72,12 +72,23 @@ public class MealOrderPayRequest implements Parcelable{
private double tipsPrice; private double tipsPrice;
/**積分支付 所消費的積分*/ /**積分支付 所消費的積分*/
private Double consumptionPoints; private Double consumptionPoints;
/**
* 獲取積分
*/
private Double getIntegral;
/**
* 積分倍數
*/
private Double integralMultiple;
/**
* 扣減積分
*/
private Double deductionIntegral;
/**報表是否計算人數*/ /**報表是否計算人數*/
private Integer whetherReportCount; private Integer whetherReportCount;
/**支付名稱*/ /**支付名稱*/
private String payName; private String payName;
public OrderPay() { public OrderPay() {
} }
...@@ -92,6 +103,11 @@ public class MealOrderPayRequest implements Parcelable{ ...@@ -92,6 +103,11 @@ public class MealOrderPayRequest implements Parcelable{
dest.writeDouble(this.amount); dest.writeDouble(this.amount);
dest.writeDouble(this.tipsPrice); dest.writeDouble(this.tipsPrice);
dest.writeValue(this.consumptionPoints); dest.writeValue(this.consumptionPoints);
dest.writeValue(this.getIntegral);
dest.writeValue(this.integralMultiple);
dest.writeValue(this.deductionIntegral);
dest.writeValue(this.whetherReportCount);
dest.writeString(this.payName);
} }
protected OrderPay(Parcel in) { protected OrderPay(Parcel in) {
...@@ -99,6 +115,11 @@ public class MealOrderPayRequest implements Parcelable{ ...@@ -99,6 +115,11 @@ public class MealOrderPayRequest implements Parcelable{
this.amount = in.readDouble(); this.amount = in.readDouble();
this.tipsPrice = in.readDouble(); this.tipsPrice = in.readDouble();
this.consumptionPoints = (Double) in.readValue(Double.class.getClassLoader()); this.consumptionPoints = (Double) in.readValue(Double.class.getClassLoader());
this.getIntegral = (Double) in.readValue(Double.class.getClassLoader());
this.integralMultiple = (Double) in.readValue(Double.class.getClassLoader());
this.deductionIntegral = (Double) in.readValue(Double.class.getClassLoader());
this.whetherReportCount = (Integer) in.readValue(Integer.class.getClassLoader());
this.payName = in.readString();
} }
public static final Creator<OrderPay> CREATOR = new Creator<OrderPay>() { public static final Creator<OrderPay> CREATOR = new Creator<OrderPay>() {
......
...@@ -128,15 +128,15 @@ public class PayMethod implements Parcelable { ...@@ -128,15 +128,15 @@ public class PayMethod implements Parcelable {
/** /**
* '獲取積分 * '獲取積分
*/ */
private int getIntegral; private double getIntegral;
/** /**
* 積分倍數 * 積分倍數
*/ */
private int integralMultiple; private double integralMultiple;
/** /**
* 扣減積分 * 扣減積分
*/ */
private float deductionIntegral; private double deductionIntegral;
/** /**
* 對接類型 (0:否 1:yedpay 2:八達通 3:積分 ) * 對接類型 (0:否 1:yedpay 2:八達通 3:積分 )
*/ */
...@@ -277,9 +277,9 @@ public class PayMethod implements Parcelable { ...@@ -277,9 +277,9 @@ public class PayMethod implements Parcelable {
dest.writeInt(this.whetherSignatureLine); dest.writeInt(this.whetherSignatureLine);
dest.writeInt(this.paySeq); dest.writeInt(this.paySeq);
dest.writeInt(this.whetherOpenBox); dest.writeInt(this.whetherOpenBox);
dest.writeInt(this.getIntegral); dest.writeDouble(this.getIntegral);
dest.writeInt(this.integralMultiple); dest.writeDouble(this.integralMultiple);
dest.writeFloat(this.deductionIntegral); dest.writeDouble(this.deductionIntegral);
dest.writeInt(this.dockingType); dest.writeInt(this.dockingType);
dest.writeString(this.billType); dest.writeString(this.billType);
dest.writeInt(this.tablePrintingAmount); dest.writeInt(this.tablePrintingAmount);
...@@ -320,9 +320,9 @@ public class PayMethod implements Parcelable { ...@@ -320,9 +320,9 @@ public class PayMethod implements Parcelable {
this.whetherSignatureLine = in.readInt(); this.whetherSignatureLine = in.readInt();
this.paySeq = in.readInt(); this.paySeq = in.readInt();
this.whetherOpenBox = in.readInt(); this.whetherOpenBox = in.readInt();
this.getIntegral = in.readInt(); this.getIntegral = in.readDouble();
this.integralMultiple = in.readInt(); this.integralMultiple = in.readDouble();
this.deductionIntegral = in.readFloat(); this.deductionIntegral = in.readDouble();
this.dockingType = in.readInt(); this.dockingType = in.readInt();
this.billType = in.readString(); this.billType = in.readString();
this.tablePrintingAmount = in.readInt(); this.tablePrintingAmount = in.readInt();
......
...@@ -36,6 +36,8 @@ import android.content.Context; ...@@ -36,6 +36,8 @@ import android.content.Context;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.os.Build; import android.os.Build;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.webkit.JavascriptInterface; import android.webkit.JavascriptInterface;
import android.webkit.JsResult; import android.webkit.JsResult;
import android.webkit.WebChromeClient; import android.webkit.WebChromeClient;
...@@ -53,6 +55,7 @@ import java.util.Map; ...@@ -53,6 +55,7 @@ import java.util.Map;
public class AAChartView extends WebView { public class AAChartView extends WebView {
public interface AAChartViewCallBack { public interface AAChartViewCallBack {
void chartViewDidFinishLoad(AAChartView aaChartView); void chartViewDidFinishLoad(AAChartView aaChartView);
...@@ -68,6 +71,9 @@ public class AAChartView extends WebView { ...@@ -68,6 +71,9 @@ public class AAChartView extends WebView {
public Boolean isClearBackgroundColor; public Boolean isClearBackgroundColor;
public AAChartViewCallBack callBack; public AAChartViewCallBack callBack;
public void setContentWidth(Float contentWidth) { public void setContentWidth(Float contentWidth) {
this.contentWidth = contentWidth; this.contentWidth = contentWidth;
String jsStr = "setTheChartViewContentWidth('" String jsStr = "setTheChartViewContentWidth('"
......
package com.gingersoft.gsa.cloud.ui.adapter;
import android.content.res.ColorStateList;
import androidx.annotation.Nullable;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.gingersoft.gsa.cloud.ui.R;
import com.gingersoft.gsa.cloud.ui.bean.TagViewItem;
import com.gingersoft.gsa.cloud.ui.bean.view.SectionTextItem;
import com.jess.arms.utils.ArmsUtils;
import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton;
import java.util.List;
public class TagViewAdapter extends BaseQuickAdapter<TagViewItem, BaseViewHolder> {
public TagViewAdapter(@Nullable List<TagViewItem> data) {
super(R.layout.item_tag_view, data);
}
@Override
protected void convert(BaseViewHolder helper, TagViewItem item) {
QMUIRoundButton roundButton = helper.getView(R.id.btn_tag);
roundButton.setText(item.getText());
roundButton.setTextSize(item.getTextSize());
if (item.isChecked()) {
roundButton.setBackgroundColor(item.getCheckedBgColor());
roundButton.setStrokeColors(ColorStateList.valueOf(item.getCheckedBgColor()));
roundButton.setTextColor(item.getCheckedTextColor());
} else {
roundButton.setBackgroundColor(item.getUnCheckedBgColor());
roundButton.setStrokeColors(ColorStateList.valueOf(item.getSidelineColor()));
roundButton.setTextColor(item.getUnCheckedTextColor());
}
}
}
package com.gingersoft.gsa.cloud.ui.bean;
import android.view.View;
import com.gingersoft.gsa.cloud.app.GsaCloudApplication;
import com.gingersoft.gsa.cloud.common.R2;
import com.gingersoft.gsa.cloud.ui.R;
import com.jess.arms.utils.ArmsUtils;
import butterknife.BindColor;
import butterknife.BindDimen;
import butterknife.ButterKnife;
import lombok.Data;
/**
* @作者: bin
* @創建時間: 2021-04-06 15:14
* @更新時間: 2021-04-06 15:14
* @描述:
*/
@Data
public class TagViewItem<T> {
private long id;
private String text;
int textSize = 14;
//选择字体颜色
int checkedTextColor;
//未选择字体颜色
int unCheckedTextColor;
//边线颜色
int sidelineColor;
//选择背景色
int checkedBgColor;
//未选择背景色
int unCheckedBgColor;
boolean checked = false;
//目标对象
private T targetObj;
public TagViewItem() {
checkedTextColor = ArmsUtils.getColor(GsaCloudApplication.getAppContext(), R.color.theme_grey_color);
unCheckedTextColor = ArmsUtils.getColor(GsaCloudApplication.getAppContext(), R.color.theme_grey_color);
sidelineColor = ArmsUtils.getColor(GsaCloudApplication.getAppContext(), R.color.theme_grey_color);
checkedBgColor = ArmsUtils.getColor(GsaCloudApplication.getAppContext(), R.color.theme_color);
unCheckedBgColor = ArmsUtils.getColor(GsaCloudApplication.getAppContext(), R.color.theme_white_color);
}
}
<?xml version="1.0" encoding="utf-8"?>
<com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/btn_tag"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/dp_8"
android:paddingLeft="@dimen/dp_15"
android:paddingRight="@dimen/dp_15"
android:paddingTop="@dimen/dp_12"
android:paddingBottom="@dimen/dp_12"
android:textSize="@dimen/dp_16"
android:textColor="@color/theme_grey_color"
android:text="草莓派"
app:qmui_radius="@dimen/dp_5"
app:qmui_borderColor="@color/theme_grey_color">
</com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton>
\ No newline at end of file
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