From 0a5a735d701c5584f4c27e68a808d9089fba6f41 Mon Sep 17 00:00:00 2001 From: Fanhuitong <981964879@qq.com> Date: Tue, 5 Mar 2024 16:44:23 +0800 Subject: [PATCH] =?UTF-8?q?version:4.4=20fix:=20update:=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E4=B8=8B=E5=8D=95=EF=BC=8C=E5=BE=AE=E4=BF=A1=E6=94=AF=E4=BB=98?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96=E8=B5=84=E8=AE=AF=E5=88=86=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 3 +- app/src/main/AndroidManifest.xml | 12 + .../uiuios/aios/activity/DetailsActivity.java | 168 +++++- .../uiuios/aios/activity/GoodsActivity.java | 196 +++++++ .../aios/activity/InfoListActivity.java | 8 +- .../aios/activity/InformationActivity.java | 179 ++++--- .../uiuios/aios/activity/OrderActivity.java | 177 +++++++ .../com/uiuios/aios/activity/PayActivity.java | 185 +++++++ .../aios/activity/SpikeListActivity.java | 8 +- .../uiuios/aios/adapter/NewGoodsAdapter.java | 17 + .../uiuios/aios/base/DataBindingActivity.java | 112 ++++ .../com/uiuios/aios/bean/ArticleList.java | 27 + .../java/com/uiuios/aios/bean/GoodsInfo.java | 46 +- .../java/com/uiuios/aios/bean/GoodsList.java | 27 + .../java/com/uiuios/aios/bean/GoodsType.java | 25 + .../java/com/uiuios/aios/bean/OrderBean.java | 35 ++ .../java/com/uiuios/aios/bean/RegionInfo.java | 34 ++ .../java/com/uiuios/aios/bean/WxpayBean.java | 80 +++ .../com/uiuios/aios/config/CommonConfig.java | 5 + .../aios/fragment/second/SecondFragment.java | 23 +- .../aios/fragment/second/SecondPresenter.java | 21 +- .../uiuios/aios/manager/RemoteManager.java | 9 +- .../aios/network/NetInterfaceManager.java | 109 +++- .../com/uiuios/aios/network/UrlAddress.java | 28 +- .../network/api/ArticleCategorysListApi.java | 17 + .../aios/network/api/ArticleListApi.java | 3 +- .../uiuios/aios/network/api/CategorysApi.java | 4 +- .../uiuios/aios/network/api/GoodsBuyApi.java | 21 + .../uiuios/aios/network/api/GoodsListApi.java | 6 +- .../uiuios/aios/network/api/GoodsTypeApi.java | 16 + .../aios/network/api/GoodsTypeListApi.java | 17 + .../uiuios/aios/network/api/OrderPayApi.java | 21 + .../aios/network/api/OrderPayCheckApi.java | 19 + .../aios/network/api/RegionListApi.java | 18 + .../aios/network/api/RegionListCall.java | 20 + .../com/uiuios/aios/utils/BitmapUtils.java | 63 +++ .../com/uiuios/aios/view/CounterView.java | 281 ++++++++++ app/src/main/res/drawable-hdpi/add.png | Bin 0 -> 3685 bytes app/src/main/res/drawable-hdpi/icon_add.png | Bin 3685 -> 949 bytes app/src/main/res/drawable-hdpi/icon_close.png | Bin 1701 -> 1184 bytes .../main/res/drawable-hdpi/icon_location.png | Bin 3600 -> 2857 bytes app/src/main/res/drawable-hdpi/icon_more.png | Bin 0 -> 1121 bytes .../main/res/drawable-hdpi/icon_reduce.png | Bin 0 -> 781 bytes .../res/drawable-hdpi/icon_wechat_pay.png | Bin 0 -> 2016 bytes .../main/res/drawable-hdpi/qrcode_expired.png | Bin 0 -> 21423 bytes app/src/main/res/drawable/number.xml | 8 + .../main/res/drawable/qrcode_background.xml | 13 + .../main/res/layout-land/fragment_second.xml | 1 + .../main/res/layout-land/item_goods_list.xml | 1 + .../main/res/layout-port/item_goods_list.xml | 26 +- .../main/res/layout/activity_add_alarm.xml | 2 +- .../res/layout/activity_add_alarm_clock.xml | 2 +- app/src/main/res/layout/activity_details.xml | 497 +++++++++--------- app/src/main/res/layout/activity_goods.xml | 128 +++++ .../main/res/layout/activity_info_details.xml | 7 +- .../main/res/layout/activity_info_list.xml | 6 +- .../main/res/layout/activity_information.xml | 39 +- app/src/main/res/layout/activity_order.xml | 248 +++++++++ app/src/main/res/layout/activity_pay.xml | 164 ++++++ app/src/main/res/layout/item_information.xml | 2 +- app/src/main/res/layout/item_new_goods.xml | 2 +- app/src/main/res/layout/item_notification.xml | 4 +- app/src/main/res/values/colors.xml | 5 +- app/src/main/res/values/styles.xml | 7 + 64 files changed, 2783 insertions(+), 419 deletions(-) create mode 100644 app/src/main/java/com/uiuios/aios/activity/GoodsActivity.java create mode 100644 app/src/main/java/com/uiuios/aios/activity/OrderActivity.java create mode 100644 app/src/main/java/com/uiuios/aios/activity/PayActivity.java create mode 100644 app/src/main/java/com/uiuios/aios/base/DataBindingActivity.java create mode 100644 app/src/main/java/com/uiuios/aios/bean/ArticleList.java create mode 100644 app/src/main/java/com/uiuios/aios/bean/GoodsList.java create mode 100644 app/src/main/java/com/uiuios/aios/bean/GoodsType.java create mode 100644 app/src/main/java/com/uiuios/aios/bean/OrderBean.java create mode 100644 app/src/main/java/com/uiuios/aios/bean/RegionInfo.java create mode 100644 app/src/main/java/com/uiuios/aios/bean/WxpayBean.java create mode 100644 app/src/main/java/com/uiuios/aios/network/api/ArticleCategorysListApi.java create mode 100644 app/src/main/java/com/uiuios/aios/network/api/GoodsBuyApi.java create mode 100644 app/src/main/java/com/uiuios/aios/network/api/GoodsTypeApi.java create mode 100644 app/src/main/java/com/uiuios/aios/network/api/GoodsTypeListApi.java create mode 100644 app/src/main/java/com/uiuios/aios/network/api/OrderPayApi.java create mode 100644 app/src/main/java/com/uiuios/aios/network/api/OrderPayCheckApi.java create mode 100644 app/src/main/java/com/uiuios/aios/network/api/RegionListApi.java create mode 100644 app/src/main/java/com/uiuios/aios/network/api/RegionListCall.java create mode 100644 app/src/main/java/com/uiuios/aios/view/CounterView.java create mode 100644 app/src/main/res/drawable-hdpi/add.png create mode 100644 app/src/main/res/drawable-hdpi/icon_more.png create mode 100644 app/src/main/res/drawable-hdpi/icon_reduce.png create mode 100644 app/src/main/res/drawable-hdpi/icon_wechat_pay.png create mode 100644 app/src/main/res/drawable-hdpi/qrcode_expired.png create mode 100644 app/src/main/res/drawable/number.xml create mode 100644 app/src/main/res/drawable/qrcode_background.xml create mode 100644 app/src/main/res/layout/activity_goods.xml create mode 100644 app/src/main/res/layout/activity_order.xml create mode 100644 app/src/main/res/layout/activity_pay.xml diff --git a/app/build.gradle b/app/build.gradle index a2cb5e5..98cab62 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -205,7 +205,7 @@ dependencies { androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' - implementation 'com.google.android.material:material:1.0.0' + implementation 'com.google.android.material:material:1.1.0' implementation "androidx.room:room-runtime:2.4.3" annotationProcessor "androidx.room:room-compiler:2.4.3" @@ -269,6 +269,7 @@ dependencies { implementation 'com.github.ForgetAll:LoadingDialog:v1.1.2' //动态权限框架 implementation 'com.github.getActivity:XXPermissions:16.6' + } preBuild { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 42b6eb2..18f02df 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -185,6 +185,18 @@ android:name=".activity.InformationDetailsActivity" android:launchMode="singleTask" android:screenOrientation="userPortrait" /> + + + >, ObservableSource>() { +// @Override +// public ObservableSource apply(BaseResponse> listBaseResponse) throws Throwable { +// if (listBaseResponse.code == 200) { +// List regionInfos = listBaseResponse.data; +// String province = mMMKV.decodeString(CommonConfig.MAP_PROVINCE_KEY, ""); +// Map provinceMap = regionInfos.stream().collect(Collectors.toMap(RegionInfo::getArea_name, RegionInfo::getId)); +// if (TextUtils.isEmpty(provinceMap.get(province))) { +// return NetInterfaceManager.getInstance().getRegionListApi().getRegionList("110000000000"); +// } else { +// return NetInterfaceManager.getInstance().getRegionListApi().getRegionList(provinceMap.get(province)); +// } +// } else { +// return NetInterfaceManager.getInstance().getRegionListApi().getRegionList("110000000000"); +// } +// } +// }) +// .flatMap(new Function>() { +// @Override +// public ObservableSource apply(Object o) throws Throwable { +// BaseResponse> listBaseResponse = (BaseResponse>) o; +// if (listBaseResponse.code == 200) { +// List regionInfos = listBaseResponse.data; +// String province = mMMKV.decodeString(CommonConfig.MAP_CITY_KEY, ""); +// Map provinceMap = regionInfos.stream().collect(Collectors.toMap(RegionInfo::getArea_name, RegionInfo::getId)); +// if (TextUtils.isEmpty(provinceMap.get(province))) { +// return NetInterfaceManager.getInstance().getRegionListApi().getRegionList("110100000000"); +// } else { +// return NetInterfaceManager.getInstance().getRegionListApi().getRegionList(provinceMap.get(province)); +// } +// } else { +// return NetInterfaceManager.getInstance().getRegionListApi().getRegionList("110100000000"); +// } +// } +// }) +// .flatMap(new Function>() { +// @Override +// public ObservableSource apply(Object o) throws Throwable { +// BaseResponse> listBaseResponse = (BaseResponse>) o; +// if (listBaseResponse.code == 200) { +// List regionInfos = listBaseResponse.data; +// String province = mMMKV.decodeString(CommonConfig.MAP_DISTRICT_KEY, ""); +// Map provinceMap = regionInfos.stream().collect(Collectors.toMap(RegionInfo::getArea_name, RegionInfo::getId)); +// if (TextUtils.isEmpty(provinceMap.get(province))) { +// return NetInterfaceManager.getInstance().getRegionListApi().getRegionList("110101000000"); +// } else { +// return NetInterfaceManager.getInstance().getRegionListApi().getRegionList(provinceMap.get(province)); +// } +// } else { +// return NetInterfaceManager.getInstance().getRegionListApi().getRegionList("110101000000"); +// } +// } +// }) +// .subscribe(new Observer() { +// @Override +// public void onSubscribe(@NonNull Disposable d) { +// Log.e("getRegionList", "onSubscribe: "); +// } +// +// @Override +// public void onNext(@NonNull Object o) { +// Log.e("getRegionList", "onNext: "); +// } +// +// @Override +// public void onError(@NonNull Throwable e) { +// Log.e("getRegionList", "onError: " + e.getMessage()); +// } +// +// @Override +// public void onComplete() { +// Log.e("getRegionList", "onComplete: "); +// } +// }); } }); tv_type.setText(mGoodsInfo.getType()); } + /** + * 初始化数据 + */ + @Override + public void initData() { +// NetInterfaceManager.getInstance().getRegionListApi().getRegionList("0") +// .subscribeOn(Schedulers.io()) +// .observeOn(Schedulers.io())//设定第一次请求结果放在io线程并同时执行第二次 请求 +// .flatMap(new Function>, ObservableSource>() { +// @Override +// public ObservableSource apply(BaseResponse> listBaseResponse) throws Throwable { +// return NetInterfaceManager.getInstance().getRegionListApi().getRegionList("0"); +// } +// }) +// .observeOn(Schedulers.io())//设定第三次请求结果放在io线程并同时执行次 自己的登录请求 +// .flatMap(new Function>() { +// @Override +// public ObservableSource apply(Object o) throws Throwable { +// return NetInterfaceManager.getInstance().getRegionListApi().getRegionList("0"); +// } +// }) +// .observeOn(AndroidSchedulers.mainThread()) +// .subscribe(); + } } diff --git a/app/src/main/java/com/uiuios/aios/activity/GoodsActivity.java b/app/src/main/java/com/uiuios/aios/activity/GoodsActivity.java new file mode 100644 index 0000000..660a29e --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/activity/GoodsActivity.java @@ -0,0 +1,196 @@ +package com.uiuios.aios.activity; + +import android.text.TextUtils; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.databinding.DataBindingUtil; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.google.android.material.tabs.TabLayout; +import com.trello.rxlifecycle4.RxLifecycle; +import com.trello.rxlifecycle4.android.ActivityEvent; +import com.trello.rxlifecycle4.android.FragmentEvent; +import com.uiuios.aios.R; +import com.uiuios.aios.adapter.GoodsListAdapter; +import com.uiuios.aios.base.BaseDataBindingActivity; +import com.uiuios.aios.bean.BaseResponse; +import com.uiuios.aios.bean.GoodsInfo; +import com.uiuios.aios.bean.GoodsList; +import com.uiuios.aios.bean.GoodsType; +import com.uiuios.aios.databinding.ActivityGoodsBinding; +import com.uiuios.aios.network.NetInterfaceManager; + +import java.util.HashMap; +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; + +import io.reactivex.rxjava3.annotations.NonNull; +import io.reactivex.rxjava3.core.Observer; +import io.reactivex.rxjava3.disposables.Disposable; + +public class GoodsActivity extends BaseDataBindingActivity { + private static final String TAG = GoodsActivity.class.getSimpleName(); + + private ActivityGoodsBinding mBinding; + + private RecyclerView mRecyclerView; + private GoodsListAdapter mGoodsAdapter; + + private HashMap mGoodsTypeMap; + + /** + * 初始化视图 + */ + @Override + public void initView() { + mBinding = DataBindingUtil.setContentView(this, R.layout.activity_goods); + mBinding.setListener(new Listener()); + mRecyclerView = mBinding.recyclerView; + mGoodsAdapter = new GoodsListAdapter(); + mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); + mRecyclerView.setAdapter(mGoodsAdapter); + + mBinding.tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + Log.e(TAG, "onTabSelected: " + tab.getText()); + if (tab.getText() != null && !TextUtils.isEmpty(tab.getText())) { + String text = tab.getText().toString(); + if (mGoodsTypeMap.get(text) != null) { + getAllGoods(mGoodsTypeMap.get(text).getId()); + } + } + + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + Log.e(TAG, "onTabUnselected: " + tab.getText()); + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + Log.e(TAG, "onTabReselected: " + tab.getText()); + } + }); + } + + /** + * 初始化数据 + */ + @Override + public void initData() { + getGoodsType(); + } + + private void getGoodsType() { + NetInterfaceManager.getInstance() + .getGoodsTypeListObservable() + .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) + .subscribe(new Observer>>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getGoodsType", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse> listBaseResponse) { + Log.e("getGoodsType", "onNext: " + listBaseResponse); + if (listBaseResponse.code == 200) { + mBinding.tabLayout.setVisibility(View.VISIBLE); + List goodsTypeList = listBaseResponse.data; + List typeString = goodsTypeList.stream().map(GoodsType::getName).collect(Collectors.toList()); + String[] type = new String[goodsTypeList.size()]; + type = typeString.toArray(type); + mGoodsTypeMap = new HashMap<>(); + for (int i = 0; i < type.length; i++) { + mGoodsTypeMap.put(type[i], goodsTypeList.get(i)); + TabLayout.Tab tab = mBinding.tabLayout.newTab();//关键的创建一个Tab,注意这里使用的是已经实例的mTablayout创建的Tab,很容易疏忽使用new Tablayout().new Tab()的方式创建,这个是会报错的. + tab.setText(type[i]); + if (i == 0) { + mBinding.tabLayout.addTab(tab, 0, true);//设置选择的item + } else { + mBinding.tabLayout.addTab(tab); + } + } + getAllGoods(goodsTypeList.get(0).getId()); + } else { + mBinding.tabLayout.setVisibility(View.GONE); + getAllGoods(); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getGoodsType", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("getGoodsType", "onComplete: "); + } + }); + } + + + private void getAllGoods(int type) { + NetInterfaceManager.getInstance() + .getGoodsListObservable(type) + .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) + .subscribe(getGoodsListObservable()); + } + + + private void getAllGoods() { + NetInterfaceManager.getInstance() + .getGoodsListObservable() + .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) + .subscribe(getGoodsListObservable()); + } + + private Observer> getGoodsListObservable() { + return new Observer>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getAllGoods", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse listBaseResponse) { + Log.e("getAllGoods", "onNext: " + listBaseResponse); + if (listBaseResponse.code == 200) { + GoodsList goodsList = listBaseResponse.data; + List goodsInfos = goodsList.getData(); + mGoodsAdapter.setGoodsInfoList(goodsInfos); + mRecyclerView.setVisibility(View.VISIBLE); + mBinding.clNodata.setVisibility(View.GONE); + } else { + mRecyclerView.setVisibility(View.GONE); + mBinding.clNodata.setVisibility(View.VISIBLE); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getAllGoods", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("getAllGoods", "onComplete: "); + } + }; + } + + public class Listener { + public void back(View view) { + finish(); + } + } +} diff --git a/app/src/main/java/com/uiuios/aios/activity/InfoListActivity.java b/app/src/main/java/com/uiuios/aios/activity/InfoListActivity.java index cc1ecf1..81cb49f 100644 --- a/app/src/main/java/com/uiuios/aios/activity/InfoListActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/InfoListActivity.java @@ -14,6 +14,7 @@ import com.uiuios.aios.R; import com.uiuios.aios.adapter.ArticleAdapter; import com.uiuios.aios.base.BaseActivity; import com.uiuios.aios.bean.ArticleInfo; +import com.uiuios.aios.bean.ArticleList; import com.uiuios.aios.bean.BaseResponse; import com.uiuios.aios.network.NetInterfaceManager; import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX; @@ -69,16 +70,17 @@ public class InfoListActivity extends BaseActivity { public void initData() { NetInterfaceManager.getInstance().getArticleListObservable() .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) - .subscribe(new Observer>>() { + .subscribe(new Observer>() { @Override public void onSubscribe(@NonNull Disposable d) { Log.e("getArticle", "onSubscribe: "); } @Override - public void onNext(@NonNull BaseResponse> listBaseResponse) { + public void onNext(@NonNull BaseResponse listBaseResponse) { Log.e("getArticle", "onNext: " + listBaseResponse); - List articleInfoList = listBaseResponse.data; + ArticleList articleList = listBaseResponse.data; + List articleInfoList = articleList.getData(); if (articleInfoList != null && articleInfoList.size() != 0) { iv1.setVisibility(android.view.View.GONE); mArticleAdapter.setArticleBeanList(articleInfoList); diff --git a/app/src/main/java/com/uiuios/aios/activity/InformationActivity.java b/app/src/main/java/com/uiuios/aios/activity/InformationActivity.java index 81f1485..24092f6 100644 --- a/app/src/main/java/com/uiuios/aios/activity/InformationActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/InformationActivity.java @@ -1,26 +1,33 @@ package com.uiuios.aios.activity; -import androidx.appcompat.app.AppCompatActivity; import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.databinding.DataBindingUtil; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import android.os.Bundle; +import android.text.TextUtils; import android.util.Log; import android.view.View; +import com.google.android.material.tabs.TabLayout; import com.trello.rxlifecycle4.RxLifecycle; import com.trello.rxlifecycle4.android.ActivityEvent; import com.uiuios.aios.R; import com.uiuios.aios.adapter.InformationAdapter; -import com.uiuios.aios.adapter.TitleAdapter; -import com.uiuios.aios.base.BaseActivity; +import com.uiuios.aios.base.BaseDataBindingActivity; +import com.uiuios.aios.base.DataBindingActivity; import com.uiuios.aios.bean.ArticleInfo; +import com.uiuios.aios.bean.ArticleList; import com.uiuios.aios.bean.BaseResponse; import com.uiuios.aios.bean.CategoryBean; +import com.uiuios.aios.databinding.ActivityInformationBinding; import com.uiuios.aios.network.NetInterfaceManager; +import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX; +import java.util.HashMap; import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; import butterknife.BindView; import butterknife.ButterKnife; @@ -28,54 +35,66 @@ import io.reactivex.rxjava3.annotations.NonNull; import io.reactivex.rxjava3.core.Observer; import io.reactivex.rxjava3.disposables.Disposable; -public class InformationActivity extends BaseActivity { +public class InformationActivity extends DataBindingActivity { + private static final String TAG = InformationActivity.class.getSimpleName(); - @BindView(R.id.rv_title) - RecyclerView rv_title; + @BindView(R.id.tabLayout) + TabLayout tabLayout; + @BindView(R.id.root) + ConstraintLayout root; @BindView(R.id.rv_video) RecyclerView rv_video; @BindView(R.id.cl_nodata) ConstraintLayout cl_nodata; - private TitleAdapter mTitleAdapter; + private ActivityInformationBinding mBinding; private InformationAdapter mInformationAdapter; - @Override - public int getLayoutId() { - return R.layout.activity_information; - } + private HashMap mCategoryMap; @Override public void initView() { + mBinding = DataBindingUtil.setContentView(this, R.layout.activity_information); ButterKnife.bind(this); - mTitleAdapter = new TitleAdapter(); - mTitleAdapter.setTitleChangeCallback(new TitleAdapter.TitleChangeCallback() { - @Override - public void onTitleChange(CategoryBean categoryBean) { - int id = categoryBean.getId(); - if (id == -100) { + UltimateBarX.statusBarOnly(this) + .transparent() + .apply(); - } else { + UltimateBarX.addStatusBarTopPadding(tabLayout); - } - } - }); - LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); - linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); - rv_title.setLayoutManager(linearLayoutManager); - rv_title.setAdapter(mTitleAdapter); - - mInformationAdapter =new InformationAdapter(); - LinearLayoutManager linearLayoutManager1 = new LinearLayoutManager(this); + mInformationAdapter = new InformationAdapter(); + LinearLayoutManager linearLayoutManager1 = new LinearLayoutManager(this); linearLayoutManager1.setOrientation(LinearLayoutManager.VERTICAL); rv_video.setLayoutManager(linearLayoutManager1); rv_video.setAdapter(mInformationAdapter); + + mBinding.tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + Log.e(TAG, "onTabSelected: " + tab.getText()); + if (tab.getText() != null && !TextUtils.isEmpty(tab.getText())) { + String text = tab.getText().toString(); + if (mCategoryMap.get(text) != null) { + getArticleList(mCategoryMap.get(text).getId()); + } + } + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + Log.e(TAG, "onTabUnselected: " + tab.getText()); + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + Log.e(TAG, "onTabReselected: " + tab.getText()); + } + }); } @Override public void initData() { getCategorys(); - getArticleList(); } private void getCategorys() { @@ -91,9 +110,26 @@ public class InformationActivity extends BaseActivity { public void onNext(@NonNull BaseResponse> listBaseResponse) { Log.e("getCategorys", "onNext: " + listBaseResponse); if (listBaseResponse.code == 200) { - mTitleAdapter.setCategoryList(listBaseResponse.data); + mBinding.tabLayout.setVisibility(View.VISIBLE); + List categoryList = listBaseResponse.data; + List typeString = categoryList.stream().map(CategoryBean::getName).collect(Collectors.toList()); + String[] type = new String[categoryList.size()]; + type = typeString.toArray(type); + mCategoryMap = new HashMap<>(); + for (int i = 0; i < type.length; i++) { + mCategoryMap.put(type[i], categoryList.get(i)); + TabLayout.Tab tab = mBinding.tabLayout.newTab();//关键的创建一个Tab,注意这里使用的是已经实例的mTablayout创建的Tab,很容易疏忽使用new Tablayout().new Tab()的方式创建,这个是会报错的. + tab.setText(type[i]); + if (i == 0) { + mBinding.tabLayout.addTab(tab, 0, true);//设置选择的item + } else { + mBinding.tabLayout.addTab(tab); + } + } + getArticleList(categoryList.get(0).getId()); } else { - mTitleAdapter.setCategoryList(null); + mBinding.tabLayout.setVisibility(View.GONE); + getArticleList(); } } @@ -111,38 +147,55 @@ public class InformationActivity extends BaseActivity { } private void getArticleList() { - NetInterfaceManager.getInstance().getArticleListObservable() + NetInterfaceManager.getInstance() + .getArticleListObservable() .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) - .subscribe(new Observer>>() { - @Override - public void onSubscribe(@NonNull Disposable d) { - Log.e("getArticle", "onSubscribe: "); - } - - @Override - public void onNext(@NonNull BaseResponse> listBaseResponse) { - Log.e("getArticle", "onNext: " + listBaseResponse); - List articleInfoList = listBaseResponse.data; - if (articleInfoList != null && articleInfoList.size() != 0) { - mInformationAdapter.setArticleInfos(articleInfoList); - rv_video.setVisibility(View.VISIBLE); - cl_nodata.setVisibility(android.view.View.GONE); - } else { - rv_video.setVisibility(android.view.View.GONE); - cl_nodata.setVisibility(android.view.View.VISIBLE); - } - } - - @Override - public void onError(@NonNull Throwable e) { - Log.e("getArticle", "onError: " + e.getMessage()); - } - - @Override - public void onComplete() { - Log.e("getArticle", "onComplete: "); - } - }); + .subscribe(getArticleListObserver()); } + private void getArticleList(int id) { + NetInterfaceManager.getInstance() + .getArticleListObservable(id) + .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) + .subscribe(getArticleListObserver()); + } + + private Observer> getArticleListObserver() { + return new Observer>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getArticle", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse listBaseResponse) { + Log.e("getArticle", "onNext: " + listBaseResponse); + if (listBaseResponse.code == 200) { + ArticleList articleList = listBaseResponse.data; + List articleInfoList = articleList.getData(); + if (articleInfoList != null && articleInfoList.size() != 0) { + mInformationAdapter.setArticleInfos(articleInfoList); + rv_video.setVisibility(View.VISIBLE); + cl_nodata.setVisibility(android.view.View.GONE); + } else { + rv_video.setVisibility(android.view.View.GONE); + cl_nodata.setVisibility(android.view.View.VISIBLE); + } + } else { + rv_video.setVisibility(android.view.View.GONE); + cl_nodata.setVisibility(android.view.View.VISIBLE); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getArticle", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("getArticle", "onComplete: "); + } + }; + } } diff --git a/app/src/main/java/com/uiuios/aios/activity/OrderActivity.java b/app/src/main/java/com/uiuios/aios/activity/OrderActivity.java new file mode 100644 index 0000000..cbfec55 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/activity/OrderActivity.java @@ -0,0 +1,177 @@ +package com.uiuios.aios.activity; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.databinding.DataBindingUtil; + +import android.content.Intent; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.util.Log; +import android.view.View; + +import com.trello.rxlifecycle4.RxLifecycle; +import com.trello.rxlifecycle4.android.ActivityEvent; +import com.uiuios.aios.BuildConfig; +import com.uiuios.aios.R; +import com.uiuios.aios.base.BaseDataBindingActivity; +import com.uiuios.aios.bean.BaseResponse; +import com.uiuios.aios.bean.GoodsInfo; +import com.uiuios.aios.bean.OrderBean; +import com.uiuios.aios.databinding.ActivityOrderBinding; +import com.uiuios.aios.manager.RemoteManager; +import com.uiuios.aios.network.NetInterfaceManager; +import com.uiuios.aios.utils.ToastUtil; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.Map; + +import io.reactivex.rxjava3.annotations.NonNull; +import io.reactivex.rxjava3.core.Observer; +import io.reactivex.rxjava3.disposables.Disposable; +import okhttp3.RequestBody; + +public class OrderActivity extends BaseDataBindingActivity { + private static final String TAG = OrderActivity.class.getSimpleName(); + + private ActivityOrderBinding mBinding; + + private GoodsInfo mGoodsInfo; + private int mStock; + private int mNumer = 1; + + /** + * 初始化视图 + */ + @Override + public void initView() { + mBinding = DataBindingUtil.setContentView(this, R.layout.activity_order); + mBinding.ivReduce.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String numberString = mBinding.editText.getText().toString(); + int number = Integer.parseInt(numberString); + if (number > 1) { + mBinding.editText.setText(String.valueOf(number - 1)); + mNumer = number - 1; + mBinding.tvPay.setText("立即支付 ¥" + multi(mGoodsInfo.getBuying_price(), mNumer)); + } + } + }); + mBinding.ivAdd.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String numberString = mBinding.editText.getText().toString(); + int number = Integer.parseInt(numberString); + if (number < mStock) { + mBinding.editText.setText(String.valueOf(number + 1)); + mNumer = number + 1; + mBinding.tvPay.setText("立即支付 ¥" + multi(mGoodsInfo.getBuying_price(), mNumer)); + } + } + }); + mBinding.editText.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + Log.e("editText", "beforeTextChanged: " + s); + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + Log.e("editText", "onTextChanged: " + s); + } + + @Override + public void afterTextChanged(Editable s) { + Log.e("editText", "afterTextChanged: " + s); + String numberString = s.toString(); + if (TextUtils.isEmpty(s)) { + return; + } + int number = Integer.parseInt(numberString); + if (number > mStock) { + mNumer = mStock; + mBinding.tvPay.setText("立即支付 ¥" + multi(mGoodsInfo.getBuying_price(), mNumer)); + } else if (number == 0) { + mNumer = 1; + mBinding.editText.setText("1"); + mBinding.tvPay.setText("立即支付 ¥" + multi(mGoodsInfo.getBuying_price(), mNumer)); + } else { + mNumer = number; + mBinding.tvPay.setText("立即支付 ¥" + multi(mGoodsInfo.getBuying_price(), mNumer)); + } + } + }); + } + + public static String multi(String v1, int v2) { + BigDecimal b1 = new BigDecimal(v1); + BigDecimal b2 = new BigDecimal(String.valueOf(v2)); + return b1.multiply(b2).toString(); + } + + /** + * 初始化数据 + */ + @Override + public void initData() { + Intent intent = getIntent(); + if (intent == null) return; + GoodsInfo goodsInfo = (GoodsInfo) intent.getSerializableExtra("GoodsInfo"); + if (goodsInfo == null) return; + mGoodsInfo = goodsInfo; + mBinding.setGoodsInfo(mGoodsInfo); + mBinding.tvPrice.setText("券后¥" + mGoodsInfo.getBuying_price()); + mBinding.tvOriginalPrice.setText("券前¥" + mGoodsInfo.getOriginal_price()); + mStock = mGoodsInfo.getStock(); + mBinding.tvStock.setText("库存:" + mStock); + mBinding.tvPay.setText("立即支付 ¥" + mGoodsInfo.getBuying_price()); + mBinding.clPay.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + creactOrder(); + } + }); + } + + private void creactOrder() { + Map params = new HashMap<>(); + params.put("goods_id", NetInterfaceManager.convertToRequestBody(mGoodsInfo.getId())); + params.put("num", NetInterfaceManager.convertToRequestBody(mBinding.editText.getText().toString())); + params.put("sn", NetInterfaceManager.convertToRequestBody(RemoteManager.getInstance().getSerial())); + params.put("desktop_app_package", NetInterfaceManager.convertToRequestBody(BuildConfig.APPLICATION_ID)); + NetInterfaceManager.getInstance().getGoodsBuyObservable(params) + .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) + .subscribe(new Observer>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("goodsPay", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse baseResponse) { + Log.e("goodsPay", "onNext: " + baseResponse); + if (baseResponse.code == 200) { + OrderBean orderBean = baseResponse.data; + Intent intent1 = new Intent(OrderActivity.this, PayActivity.class); + intent1.putExtra("OrderBean", orderBean); + startActivity(intent1); + } else { + ToastUtil.show("下单失败"); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("goodsPay", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("goodsPay", "onComplete: "); + } + }); + } +} diff --git a/app/src/main/java/com/uiuios/aios/activity/PayActivity.java b/app/src/main/java/com/uiuios/aios/activity/PayActivity.java new file mode 100644 index 0000000..07a65f9 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/activity/PayActivity.java @@ -0,0 +1,185 @@ +package com.uiuios.aios.activity; + +import android.content.Intent; +import android.util.Log; +import android.view.View; + +import androidx.databinding.DataBindingUtil; + +import com.trello.rxlifecycle4.RxLifecycle; +import com.trello.rxlifecycle4.android.ActivityEvent; +import com.uiuios.aios.R; +import com.uiuios.aios.base.BaseDataBindingActivity; +import com.uiuios.aios.bean.BaseResponse; +import com.uiuios.aios.bean.OrderBean; +import com.uiuios.aios.bean.WxpayBean; +import com.uiuios.aios.databinding.ActivityPayBinding; +import com.uiuios.aios.network.NetInterfaceManager; +import com.uiuios.aios.utils.BitmapUtils; +import com.uiuios.aios.utils.ToastUtil; + +import java.util.concurrent.TimeUnit; + +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; +import io.reactivex.rxjava3.annotations.NonNull; +import io.reactivex.rxjava3.core.Observable; +import io.reactivex.rxjava3.core.Observer; +import io.reactivex.rxjava3.disposables.Disposable; +import io.reactivex.rxjava3.functions.Consumer; +import io.reactivex.rxjava3.schedulers.Schedulers; + +public class PayActivity extends BaseDataBindingActivity { + private static final String TAG = PayActivity.class.getSimpleName(); + + private ActivityPayBinding mBinding; + + private OrderBean mOrderBean; + + /** + * 初始化视图 + */ + @Override + public void initView() { + mBinding = DataBindingUtil.setContentView(this, R.layout.activity_pay); + mBinding.tvRefresh.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + getWechatPayQrcode(mOrderBean); + } + }); + } + + /** + * 初始化数据 + */ + @Override + public void initData() { + Intent intent = getIntent(); + if (intent == null) return; + OrderBean orderBean = (OrderBean) intent.getSerializableExtra("OrderBean"); + if (orderBean == null) return; + mOrderBean = orderBean; + getWechatPayQrcode(mOrderBean); + } + + private Disposable mCountdownSubscribe; + + private void getWechatPayQrcode(OrderBean orderBean) { + if (orderBean == null) return; + NetInterfaceManager.getInstance() + .getOrderPayObservable(orderBean.getOrder_sn(), orderBean.getOrder_id()) + .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) + .subscribe(new Observer>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getOrderPayObservable", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse wxpayBeanBaseResponse) { + Log.e("getOrderPayObservable", "onNext: " + wxpayBeanBaseResponse); + if (wxpayBeanBaseResponse.code == 200) { + WxpayBean wxpayBean = wxpayBeanBaseResponse.data; + mBinding.setWxpayBean(wxpayBean); + mBinding.tvOrderId.setText("订单编号:" + wxpayBean.getOrder_sn()); + long expireTime = wxpayBean.getTime_expire(); + mBinding.ivWxQrcode.setImageBitmap(BitmapUtils.createQRImage(wxpayBean.getCode_url(), 400, 400)); + initCountdown(expireTime); + checkOrder(wxpayBean); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getOrderPayObservable", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("getOrderPayObservable", "onComplete: "); + } + }); + } + + private void initCountdown(long second) { + if (mCountdownSubscribe != null && !mCountdownSubscribe.isDisposed()) { + mCountdownSubscribe.dispose(); + } + mCountdownSubscribe = Observable.interval(1, TimeUnit.SECONDS) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Consumer() { + + @Override + public void accept(Long aLong) throws Exception { + long timestamp = System.currentTimeMillis() / 1000; + Log.e("initCountdown", "accept: time_expire = " + second); + Log.e("initCountdown", "accept: aLong = " + aLong); + Log.e("initCountdown", "accept: timestamp = " + timestamp); + if (timestamp >= second) { + mBinding.ivWxQrcode.setImageDrawable(getDrawable(R.drawable.qrcode_expired)); + if (mCountdownSubscribe != null && !mCountdownSubscribe.isDisposed()) { + mCountdownSubscribe.dispose(); + } + } else { + + } + } + }); + } + + private Disposable mCheckOrderSubscribe; + + private void checkOrder(WxpayBean wxpayBean) { + if (mCheckOrderSubscribe != null && !mCheckOrderSubscribe.isDisposed()) { + mCheckOrderSubscribe.dispose(); + } + mCheckOrderSubscribe = Observable.interval(5, TimeUnit.SECONDS) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Consumer() { + + @Override + public void accept(Long aLong) throws Exception { + NetInterfaceManager.getInstance() + .getOrderPayCheckObservable(wxpayBean.getOrder_sn(), wxpayBean.getOrder_id()) + .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("checkOrder", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse baseResponse) { + Log.e("checkOrder", "onNext: " + baseResponse); + if (baseResponse.code == 200) { + if (mCountdownSubscribe != null && !mCountdownSubscribe.isDisposed()) { + mCountdownSubscribe.dispose(); + } + if (mCheckOrderSubscribe != null && !mCheckOrderSubscribe.isDisposed()) { + mCheckOrderSubscribe.dispose(); + } + ToastUtil.show("支付成功"); + finish(); + } else { + Log.e("checkOrder", "onNext: " + "支付失败"); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("checkOrder", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("checkOrder", "onComplete: "); + } + }); + } + }); + } + + +} diff --git a/app/src/main/java/com/uiuios/aios/activity/SpikeListActivity.java b/app/src/main/java/com/uiuios/aios/activity/SpikeListActivity.java index 422b71e..ae6f1ba 100644 --- a/app/src/main/java/com/uiuios/aios/activity/SpikeListActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/SpikeListActivity.java @@ -15,6 +15,7 @@ import com.uiuios.aios.adapter.GoodsListAdapter; import com.uiuios.aios.base.BaseActivity; import com.uiuios.aios.bean.BaseResponse; import com.uiuios.aios.bean.GoodsInfo; +import com.uiuios.aios.bean.GoodsList; import com.uiuios.aios.network.NetInterfaceManager; import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX; @@ -76,16 +77,17 @@ public class SpikeListActivity extends BaseActivity { NetInterfaceManager.getInstance() .getGoodsListObservable() .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) - .subscribe(new Observer>>() { + .subscribe(new Observer>() { @Override public void onSubscribe(@NonNull Disposable d) { Log.e("getGoods", "onSubscribe: "); } @Override - public void onNext(@NonNull BaseResponse> listBaseResponse) { + public void onNext(@NonNull BaseResponse listBaseResponse) { Log.e("getGoods", "onNext: " + listBaseResponse); - List goodsInfos = listBaseResponse.data; + GoodsList goodsList = listBaseResponse.data; + List goodsInfos = goodsList.getData(); if (goodsInfos != null && goodsInfos.size() != 0) { iv1.setVisibility(android.view.View.GONE); mGoodsAdapter.setGoodsInfoList(goodsInfos); diff --git a/app/src/main/java/com/uiuios/aios/adapter/NewGoodsAdapter.java b/app/src/main/java/com/uiuios/aios/adapter/NewGoodsAdapter.java index 45cc892..05846df 100644 --- a/app/src/main/java/com/uiuios/aios/adapter/NewGoodsAdapter.java +++ b/app/src/main/java/com/uiuios/aios/adapter/NewGoodsAdapter.java @@ -16,6 +16,7 @@ import com.bumptech.glide.Glide; import com.shehuan.niv.NiceImageView; import com.uiuios.aios.R; import com.uiuios.aios.activity.DetailsActivity; +import com.uiuios.aios.activity.GoodsActivity; import com.uiuios.aios.bean.GoodsInfo; import java.util.List; @@ -41,8 +42,22 @@ public class NewGoodsAdapter extends RecyclerView.Adapter { + public final BehaviorSubject lifecycleSubject = BehaviorSubject.create(); + + public DataBindingActivity() { + super(); + } + + @ContentView + public DataBindingActivity(@LayoutRes int contentLayoutId) { + super(contentLayoutId); + } + + @Override + @NonNull + @CheckResult + public final Observable lifecycle() { + return lifecycleSubject.hide(); + } + + @Override + @NonNull + @CheckResult + public final LifecycleTransformer bindUntilEvent(@NonNull ActivityEvent event) { + return RxLifecycle.bindUntilEvent(lifecycleSubject, event); + } + + @Override + @NonNull + @CheckResult + public final LifecycleTransformer bindToLifecycle() { + return RxLifecycleAndroid.bindActivity(lifecycleSubject); + } + + @Override + @CallSuper + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + lifecycleSubject.onNext(ActivityEvent.CREATE); + initView(); + initData(); + } + + + /** + * 初始化视图 + */ + public abstract void initView(); + + + /** + * 初始化数据 + */ + public abstract void initData(); + + @Override + @CallSuper + protected void onStart() { + super.onStart(); + lifecycleSubject.onNext(ActivityEvent.START); + } + + @Override + @CallSuper + protected void onResume() { + super.onResume(); + lifecycleSubject.onNext(ActivityEvent.RESUME); + } + + @Override + @CallSuper + protected void onPause() { + lifecycleSubject.onNext(ActivityEvent.PAUSE); + super.onPause(); + } + + @Override + @CallSuper + protected void onStop() { + lifecycleSubject.onNext(ActivityEvent.STOP); + super.onStop(); + } + + @Override + @CallSuper + protected void onDestroy() { + lifecycleSubject.onNext(ActivityEvent.DESTROY); + super.onDestroy(); + } +} diff --git a/app/src/main/java/com/uiuios/aios/bean/ArticleList.java b/app/src/main/java/com/uiuios/aios/bean/ArticleList.java new file mode 100644 index 0000000..dbc4860 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/bean/ArticleList.java @@ -0,0 +1,27 @@ +package com.uiuios.aios.bean; + +import java.io.Serializable; +import java.util.List; + +public class ArticleList implements Serializable { + private static final long serialVersionUID = 2429549762527224397L; + + int current_page; + List data; + + public int getCurrent_page() { + return current_page; + } + + public void setCurrent_page(int current_page) { + this.current_page = current_page; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } +} diff --git a/app/src/main/java/com/uiuios/aios/bean/GoodsInfo.java b/app/src/main/java/com/uiuios/aios/bean/GoodsInfo.java index dfb78cd..31c869d 100644 --- a/app/src/main/java/com/uiuios/aios/bean/GoodsInfo.java +++ b/app/src/main/java/com/uiuios/aios/bean/GoodsInfo.java @@ -6,7 +6,7 @@ import java.io.Serializable; public class GoodsInfo implements Serializable { private static final long serialVersionUID = -229267734972111105L; - int id; + String id; /*商品名*/ String goods_name; /*简介*/ @@ -18,9 +18,9 @@ public class GoodsInfo implements Serializable { /*视频链接*/ String video_url; /*原价*/ - float original_price; + String original_price; /*抢购价*/ - float buying_price; + String buying_price; /*库存*/ int stock; /*跳转链接*/ @@ -31,14 +31,16 @@ public class GoodsInfo implements Serializable { String ensure; @SerializedName("class") String type; + int weight; + int click_count; + int type_id; - - public int getId() { + public String getId() { return id; } - public void setId(int id) { + public void setId(String id) { this.id = id; } @@ -82,19 +84,19 @@ public class GoodsInfo implements Serializable { this.video_url = video_url; } - public float getOriginal_price() { + public String getOriginal_price() { return original_price; } - public void setOriginal_price(float original_price) { + public void setOriginal_price(String original_price) { this.original_price = original_price; } - public float getBuying_price() { + public String getBuying_price() { return buying_price; } - public void setBuying_price(float buying_price) { + public void setBuying_price(String buying_price) { this.buying_price = buying_price; } @@ -153,4 +155,28 @@ public class GoodsInfo implements Serializable { public void setType(String type) { this.type = type; } + + public int getWeight() { + return weight; + } + + public void setWeight(int weight) { + this.weight = weight; + } + + public int getClick_count() { + return click_count; + } + + public void setClick_count(int click_count) { + this.click_count = click_count; + } + + public int getType_id() { + return type_id; + } + + public void setType_id(int type_id) { + this.type_id = type_id; + } } diff --git a/app/src/main/java/com/uiuios/aios/bean/GoodsList.java b/app/src/main/java/com/uiuios/aios/bean/GoodsList.java new file mode 100644 index 0000000..7a983ad --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/bean/GoodsList.java @@ -0,0 +1,27 @@ +package com.uiuios.aios.bean; + +import java.io.Serializable; +import java.util.List; + +public class GoodsList implements Serializable { + private static final long serialVersionUID = 2691720359257416172L; + + int current_page; + List data; + + public int getCurrent_page() { + return current_page; + } + + public void setCurrent_page(int current_page) { + this.current_page = current_page; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } +} diff --git a/app/src/main/java/com/uiuios/aios/bean/GoodsType.java b/app/src/main/java/com/uiuios/aios/bean/GoodsType.java new file mode 100644 index 0000000..6297f9d --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/bean/GoodsType.java @@ -0,0 +1,25 @@ +package com.uiuios.aios.bean; + +import java.io.Serializable; + +public class GoodsType implements Serializable { + private static final long serialVersionUID = -3861404325733396969L; + int id; + String name; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/app/src/main/java/com/uiuios/aios/bean/OrderBean.java b/app/src/main/java/com/uiuios/aios/bean/OrderBean.java new file mode 100644 index 0000000..9511983 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/bean/OrderBean.java @@ -0,0 +1,35 @@ +package com.uiuios.aios.bean; + +import java.io.Serializable; + +public class OrderBean implements Serializable { + private static final long serialVersionUID = -7589758006696263943L; + + String order_id; + String order_sn; + String sn; + + public String getOrder_id() { + return order_id; + } + + public void setOrder_id(String order_id) { + this.order_id = order_id; + } + + public String getOrder_sn() { + return order_sn; + } + + public void setOrder_sn(String order_sn) { + this.order_sn = order_sn; + } + + public String getSn() { + return sn; + } + + public void setSn(String sn) { + this.sn = sn; + } +} diff --git a/app/src/main/java/com/uiuios/aios/bean/RegionInfo.java b/app/src/main/java/com/uiuios/aios/bean/RegionInfo.java new file mode 100644 index 0000000..1fea8f4 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/bean/RegionInfo.java @@ -0,0 +1,34 @@ +package com.uiuios.aios.bean; + +import java.io.Serializable; + +public class RegionInfo implements Serializable { + private static final long serialVersionUID = 6794758421072894673L; + String id; + String area_name; + String parent_id; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getArea_name() { + return area_name; + } + + public void setArea_name(String area_name) { + this.area_name = area_name; + } + + public String getParent_id() { + return parent_id; + } + + public void setParent_id(String parent_id) { + this.parent_id = parent_id; + } +} diff --git a/app/src/main/java/com/uiuios/aios/bean/WxpayBean.java b/app/src/main/java/com/uiuios/aios/bean/WxpayBean.java new file mode 100644 index 0000000..853837f --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/bean/WxpayBean.java @@ -0,0 +1,80 @@ +package com.uiuios.aios.bean; + +import java.io.Serializable; + +public class WxpayBean implements Serializable { + private static final long serialVersionUID = -8399062772511195038L; + + String price; + String code_url; + long time_expire; + String goods_name; + String goods_img; + String order_sn; + String order_id; + String num; + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getCode_url() { + return code_url; + } + + public void setCode_url(String code_url) { + this.code_url = code_url; + } + + public long getTime_expire() { + return time_expire; + } + + public void setTime_expire(long time_expire) { + this.time_expire = time_expire; + } + + public String getGoods_name() { + return goods_name; + } + + public void setGoods_name(String goods_name) { + this.goods_name = goods_name; + } + + public String getGoods_img() { + return goods_img; + } + + public void setGoods_img(String goods_img) { + this.goods_img = goods_img; + } + + public String getOrder_sn() { + return order_sn; + } + + public void setOrder_sn(String order_sn) { + this.order_sn = order_sn; + } + + public String getOrder_id() { + return order_id; + } + + public void setOrder_id(String order_id) { + this.order_id = order_id; + } + + public String getNum() { + return num; + } + + public void setNum(String num) { + this.num = num; + } +} diff --git a/app/src/main/java/com/uiuios/aios/config/CommonConfig.java b/app/src/main/java/com/uiuios/aios/config/CommonConfig.java index 03aead2..c39417e 100644 --- a/app/src/main/java/com/uiuios/aios/config/CommonConfig.java +++ b/app/src/main/java/com/uiuios/aios/config/CommonConfig.java @@ -7,6 +7,11 @@ public class CommonConfig { public static final String MAP_LONGITUDE_KEY = "map_longitude_key"; public static final String MAP_LATITUDE_KEY = "map_latitude_key"; public static final String MAP_ADDRESS_KEY = "map_address_key"; + public static final String MAP_PROVINCE_KEY = "map_province_key"; + public static final String MAP_CITY_KEY = "map_city_key"; + public static final String MAP_DISTRICT_KEY = "map_district_key"; + public static final String MAP_STREET_KEY = "map_street_key"; + public static final String MAP_LOCATION_DESCRIBE_KEY = "map_locationDescribe_key"; public static final String MAP_ERROR_KEY = "map_error_key"; public static final String LOCK_SCREEN_PASSWORD ="aios_lockScreenPasswordKey"; diff --git a/app/src/main/java/com/uiuios/aios/fragment/second/SecondFragment.java b/app/src/main/java/com/uiuios/aios/fragment/second/SecondFragment.java index 2201285..af52563 100644 --- a/app/src/main/java/com/uiuios/aios/fragment/second/SecondFragment.java +++ b/app/src/main/java/com/uiuios/aios/fragment/second/SecondFragment.java @@ -12,6 +12,7 @@ import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.ConstraintLayout; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearSnapHelper; import androidx.recyclerview.widget.RecyclerView; @@ -54,6 +55,9 @@ public class SecondFragment extends BaseFragment implements SecondContact.View, @BindView(R.id.rv_knowledge) RecyclerView rv_knowledge; + @BindView(R.id.cl_service) + ConstraintLayout cl_service; + private View rootView; private Context mContext; private ContentResolver mCRv; @@ -174,13 +178,13 @@ public class SecondFragment extends BaseFragment implements SecondContact.View, @Override public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); - Log.e("rv_goods", "onScrollStateChanged: newState = " + newState); + Log.i("rv_goods", "onScrollStateChanged: newState = " + newState); if (newState == RecyclerView.SCROLL_STATE_IDLE) { mGoodsScrolling = false; // 获取当前滚动到的条目位置 int firstIndex = linearLayoutManager.findFirstVisibleItemPosition(); - Log.e("rv_goods", "onScrollStateChanged: firstIndex = " + firstIndex); - Log.e("rv_goods", "onScrollStateChanged: mCurrentGoodsIndex = " + mCurrentGoodsIndex); + Log.i("rv_goods", "onScrollStateChanged: firstIndex = " + firstIndex); + Log.i("rv_goods", "onScrollStateChanged: mCurrentGoodsIndex = " + mCurrentGoodsIndex); mCurrentGoodsIndex = firstIndex + 1; } else { mGoodsScrolling = true; @@ -204,13 +208,13 @@ public class SecondFragment extends BaseFragment implements SecondContact.View, @Override public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); - Log.e("rv_article", "onScrollStateChanged: newState = " + newState); + Log.i("rv_article", "onScrollStateChanged: newState = " + newState); if (newState == RecyclerView.SCROLL_STATE_IDLE) { mArticleScrolling = false; // 获取当前滚动到的条目位置 int firstIndex = linearLayoutManager2.findFirstVisibleItemPosition(); - Log.e("rv_article", "onScrollStateChanged: firstIndex = " + firstIndex); - Log.e("rv_article", "onScrollStateChanged: mCurrentArticleIndex = " + mCurrentArticleIndex); + Log.i("rv_article", "onScrollStateChanged: firstIndex = " + firstIndex); + Log.i("rv_article", "onScrollStateChanged: mCurrentArticleIndex = " + mCurrentArticleIndex); mCurrentArticleIndex = firstIndex + 1; } else { mArticleScrolling = true; @@ -274,6 +278,13 @@ public class SecondFragment extends BaseFragment implements SecondContact.View, rv_knowledge.setAdapter(mKnowledgeVideoAdapter); LinearSnapHelper snapHelper4 = new LinearSnapHelper(); snapHelper4.attachToRecyclerView(rv_knowledge); + + cl_service.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + } + }); } private void initData() { diff --git a/app/src/main/java/com/uiuios/aios/fragment/second/SecondPresenter.java b/app/src/main/java/com/uiuios/aios/fragment/second/SecondPresenter.java index fa67f34..ecce2a6 100644 --- a/app/src/main/java/com/uiuios/aios/fragment/second/SecondPresenter.java +++ b/app/src/main/java/com/uiuios/aios/fragment/second/SecondPresenter.java @@ -7,8 +7,10 @@ import com.trello.rxlifecycle4.RxLifecycle; import com.trello.rxlifecycle4.android.FragmentEvent; import com.uiui.video.bean.VideoInfo; import com.uiuios.aios.bean.ArticleInfo; +import com.uiuios.aios.bean.ArticleList; import com.uiuios.aios.bean.BaseResponse; import com.uiuios.aios.bean.GoodsInfo; +import com.uiuios.aios.bean.GoodsList; import com.uiuios.aios.network.NetInterfaceManager; import java.util.ArrayList; @@ -54,16 +56,17 @@ public class SecondPresenter implements SecondContact.Presenter { NetInterfaceManager.getInstance() .getGoodsListObservable() .compose(RxLifecycle.bindUntilEvent(getLifecycle(), FragmentEvent.DESTROY)) - .subscribe(new Observer>>() { + .subscribe(new Observer>() { @Override public void onSubscribe(@NonNull Disposable d) { Log.e("getGoods", "onSubscribe: "); } @Override - public void onNext(@NonNull BaseResponse> listBaseResponse) { + public void onNext(@NonNull BaseResponse listBaseResponse) { Log.e("getGoods", "onNext: " + listBaseResponse); - List goodsInfos = listBaseResponse.data; + GoodsList goodsList = listBaseResponse.data; + List goodsInfos = goodsList.getData(); mView.setGoods(goodsInfos); } @@ -83,16 +86,18 @@ public class SecondPresenter implements SecondContact.Presenter { public void getArticle() { NetInterfaceManager.getInstance().getArticleListObservable() .compose(RxLifecycle.bindUntilEvent(getLifecycle(), FragmentEvent.DESTROY)) - .subscribe(new Observer>>() { + .subscribe(new Observer>() { @Override public void onSubscribe(@NonNull Disposable d) { Log.e("getArticle", "onSubscribe: "); } @Override - public void onNext(@NonNull BaseResponse> listBaseResponse) { + public void onNext(@NonNull BaseResponse listBaseResponse) { Log.e("getArticle", "onNext: " + listBaseResponse); - mView.setArticle(listBaseResponse.data); + ArticleList articleList = listBaseResponse.data; + List articleInfoList = articleList.getData(); + mView.setArticle(articleInfoList); } @Override @@ -120,7 +125,7 @@ public class SecondPresenter implements SecondContact.Presenter { @Override public void onNext(@NonNull BaseResponse> listBaseResponse) { Log.e("getLivenVideoList", "onNext: " + listBaseResponse); - if (listBaseResponse.code==200){ + if (listBaseResponse.code == 200) { mView.setLivenVideoList(listBaseResponse.data); } } @@ -149,7 +154,7 @@ public class SecondPresenter implements SecondContact.Presenter { @Override public void onNext(@NonNull BaseResponse> listBaseResponse) { Log.e("getKnowledgeVideoList", "onNext: " + listBaseResponse); - if (listBaseResponse.code==200){ + if (listBaseResponse.code == 200) { mView.setKnowledgeVideoList(listBaseResponse.data); } } diff --git a/app/src/main/java/com/uiuios/aios/manager/RemoteManager.java b/app/src/main/java/com/uiuios/aios/manager/RemoteManager.java index 2eff83d..a88912f 100644 --- a/app/src/main/java/com/uiuios/aios/manager/RemoteManager.java +++ b/app/src/main/java/com/uiuios/aios/manager/RemoteManager.java @@ -155,8 +155,13 @@ public class RemoteManager { }.getType(); MapBean mapBean = gson.fromJson(jsonString, type); mMMKV.encode(CommonConfig.MAP_ADDRESS_KEY, mapBean.getAddress() + mapBean.getLocationDescribe()); - mMMKV.encode(CommonConfig.MAP_LONGITUDE_KEY, mapBean.getLongitude()); - mMMKV.encode(CommonConfig.MAP_LATITUDE_KEY, mapBean.getLatitude()); + mMMKV.encode(CommonConfig.MAP_LONGITUDE_KEY, String.valueOf(mapBean.getLongitude())); + mMMKV.encode(CommonConfig.MAP_LATITUDE_KEY, String.valueOf(mapBean.getLatitude())); + mMMKV.encode(CommonConfig.MAP_PROVINCE_KEY, mapBean.getProvince()); + mMMKV.encode(CommonConfig.MAP_CITY_KEY, mapBean.getCity()); + mMMKV.encode(CommonConfig.MAP_DISTRICT_KEY, mapBean.getDistrict()); + mMMKV.encode(CommonConfig.MAP_STREET_KEY, mapBean.getTown() + mapBean.getStreet()); + mMMKV.encode(CommonConfig.MAP_LOCATION_DESCRIBE_KEY, mapBean.getStreet() + mapBean.getLocationDescribe()); return mapBean; } } diff --git a/app/src/main/java/com/uiuios/aios/network/NetInterfaceManager.java b/app/src/main/java/com/uiuios/aios/network/NetInterfaceManager.java index dffe7ee..263b6cb 100644 --- a/app/src/main/java/com/uiuios/aios/network/NetInterfaceManager.java +++ b/app/src/main/java/com/uiuios/aios/network/NetInterfaceManager.java @@ -11,23 +11,28 @@ import com.trello.rxlifecycle4.RxLifecycle; import com.trello.rxlifecycle4.android.ActivityEvent; import com.trello.rxlifecycle4.android.FragmentEvent; import com.uiui.video.bean.VideoInfo; +import com.uiuios.aios.BuildConfig; +import com.uiuios.aios.alarm.AlarmClockData; import com.uiuios.aios.alarm.AlarmUtils; import com.uiuios.aios.bean.ActivityBean; -import com.uiuios.aios.alarm.AlarmClockData; import com.uiuios.aios.bean.AlarmClockId; -import com.uiuios.aios.bean.ArticleInfo; +import com.uiuios.aios.bean.ArticleList; import com.uiuios.aios.bean.BaseResponse; import com.uiuios.aios.bean.CategoryBean; import com.uiuios.aios.bean.Contact; import com.uiuios.aios.bean.DemandBean; -import com.uiuios.aios.bean.GoodsInfo; +import com.uiuios.aios.bean.GoodsList; +import com.uiuios.aios.bean.GoodsType; import com.uiuios.aios.bean.HealthCode; import com.uiuios.aios.bean.MapGeoBean; import com.uiuios.aios.bean.NetDesktopIcon; +import com.uiuios.aios.bean.OrderBean; +import com.uiuios.aios.bean.RegionInfo; import com.uiuios.aios.bean.SnInfo; import com.uiuios.aios.bean.SystemSettings; import com.uiuios.aios.bean.UserAvatarInfo; import com.uiuios.aios.bean.UserId; +import com.uiuios.aios.bean.WxpayBean; import com.uiuios.aios.config.CommonConfig; import com.uiuios.aios.disklrucache.CacheHelper; import com.uiuios.aios.gson.GsonUtils; @@ -41,6 +46,7 @@ import com.uiuios.aios.network.api.AlarmClockDeleteApi; import com.uiuios.aios.network.api.AlarmClockEditApi; import com.uiuios.aios.network.api.AlarmClockQueryApi; import com.uiuios.aios.network.api.AppUsageRecordApi; +import com.uiuios.aios.network.api.ArticleCategorysListApi; import com.uiuios.aios.network.api.ArticleListApi; import com.uiuios.aios.network.api.CategorysApi; import com.uiuios.aios.network.api.DemandListApi; @@ -48,11 +54,18 @@ import com.uiuios.aios.network.api.GetAdminSnSettingApi; import com.uiuios.aios.network.api.GetDesktopApi; import com.uiuios.aios.network.api.GetMailList; import com.uiuios.aios.network.api.GetUserIDApi; +import com.uiuios.aios.network.api.GoodsBuyApi; import com.uiuios.aios.network.api.GoodsListApi; +import com.uiuios.aios.network.api.GoodsTypeApi; +import com.uiuios.aios.network.api.GoodsTypeListApi; import com.uiuios.aios.network.api.HealthCodeApi; import com.uiuios.aios.network.api.KnowledgeVideoListApi; import com.uiuios.aios.network.api.LivenVideoListApi; import com.uiuios.aios.network.api.MailListAddApi; +import com.uiuios.aios.network.api.OrderPayApi; +import com.uiuios.aios.network.api.OrderPayCheckApi; +import com.uiuios.aios.network.api.RegionListApi; +import com.uiuios.aios.network.api.RegionListCall; import com.uiuios.aios.network.api.RunNewApp; import com.uiuios.aios.network.api.SNInfoApi; import com.uiuios.aios.network.api.SOSRecordApi; @@ -83,9 +96,11 @@ import io.reactivex.rxjava3.schedulers.Schedulers; import io.reactivex.rxjava3.subjects.BehaviorSubject; import okhttp3.Cache; import okhttp3.Headers; +import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.OkHttpClient; import okhttp3.Request; +import okhttp3.RequestBody; import retrofit2.Retrofit; import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; @@ -210,6 +225,26 @@ public class NetInterfaceManager { .observeOn(AndroidSchedulers.mainThread()); } + public static RequestBody convertToRequestBody(String param) { + RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain"), param); + return requestBody; + } + + public static RequestBody convertToRequestBody(int param) { + RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain"), String.valueOf(param)); + return requestBody; + } + + public static RequestBody convertToRequestBody(long param) { + RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain"), String.valueOf(param)); + return requestBody; + } + + public static RequestBody convertToRequestBody(double param) { + RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain"), String.valueOf(param)); + return requestBody; + } + /** * 通过sn获取设备的信息 * @@ -271,27 +306,41 @@ public class NetInterfaceManager { .observeOn(AndroidSchedulers.mainThread()); } - public Observable>> getGoodsListObservable() { + public Observable> getGoodsListObservable() { return mRetrofit.create(GoodsListApi.class) .getGoodsList(RemoteManager.getInstance().getSerial()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } - public Observable>> getCategorysObservable() { - return mRetrofit.create(CategorysApi.class) - .getCategorys(RemoteManager.getInstance().getSerial()) + public Observable> getGoodsListObservable(int type) { + return mRetrofit.create(GoodsTypeListApi.class) + .getGoodsList(RemoteManager.getInstance().getSerial(), type) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } - public Observable>> getArticleListObservable() { + public Observable>> getCategorysObservable() { + return mRetrofit.create(CategorysApi.class) + .getArticleCategorys(RemoteManager.getInstance().getSerial()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Observable> getArticleListObservable() { return mRetrofit.create(ArticleListApi.class) .getArticleList(RemoteManager.getInstance().getSerial()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } + public Observable> getArticleListObservable(int id) { + return mRetrofit.create(ArticleCategorysListApi.class) + .getArticleList(RemoteManager.getInstance().getSerial(),id) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + public Observable>> getContactListObservable() { return mRetrofit.create(GetMailList.class) .getContact(RemoteManager.getInstance().getSerial()) @@ -320,6 +369,14 @@ public class NetInterfaceManager { .observeOn(AndroidSchedulers.mainThread()); } + + public Observable>> getGoodsTypeListObservable() { + return mRetrofit.create(GoodsTypeApi.class) + .getGoodsTypeList() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + /* *闹钟相关 */ @@ -382,6 +439,42 @@ public class NetInterfaceManager { .observeOn(AndroidSchedulers.mainThread()); } + public Observable>> getRegionListObservable(String id) { + return mRetrofit.create(RegionListApi.class) + .getRegionList(id) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Observable> getGoodsBuyObservable(Map params) { + return mRetrofit.create(GoodsBuyApi.class) + .goodsBuy(params) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Observable> getOrderPayObservable(String order_sn, String order_id) { + return mRetrofit.create(OrderPayApi.class) + .orderPay(RemoteManager.getInstance().getSerial(), order_sn, order_id, BuildConfig.APPLICATION_ID) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Observable getOrderPayCheckObservable(String order_sn, String order_id) { + return mRetrofit.create(OrderPayCheckApi.class) + .checkOrder(RemoteManager.getInstance().getSerial(), order_sn, order_id) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + + public RegionListApi getRegionListApi() { + return mRetrofit.create(RegionListApi.class); + } + + public RegionListCall getRegionListCall() { + return mRetrofit.create(RegionListCall.class); + } public interface onCompleteCallback { void onComplete(); diff --git a/app/src/main/java/com/uiuios/aios/network/UrlAddress.java b/app/src/main/java/com/uiuios/aios/network/UrlAddress.java index 25708d0..c0961f0 100644 --- a/app/src/main/java/com/uiuios/aios/network/UrlAddress.java +++ b/app/src/main/java/com/uiuios/aios/network/UrlAddress.java @@ -24,14 +24,22 @@ public class UrlAddress { public static final String UPDATE_DESKTOP_LAYOUT = "updateDesktopLayout"; /*获取桌面布局*/ public static final String GET_DESKTOP_LAYOUT = "getDesktopLayout"; + /*获取商品分类列表*/ + public static final String GOODS_TYPE_LIST = "goods-type-list"; /*获取抢购列表*/ public static final String GET_GOODS_LIST = "getGoodsList"; - /*养生资讯分类*/ - public static final String CATEGORYS = "article/categorys"; - /*获取资讯列表*/ - public static final String GET_ARTICLE_LIST = "getArticleList"; /*获取抢购详情*/ public static final String GET_GOODS_DETAILS = "getGoodsDetails"; + /*商品下单*/ + public static final String GOODS_BUY = "goods/buy"; + /*商品调起支付*/ + public static final String ORDER_PAY = "pay/order-pay"; + /*商品支付查询(低频轮询)*/ + public static final String ORDER_PAY_CHECK = "pay/order-pay-check"; + /*养生资讯分类*/ + public static final String ARTICLE_CATEGORYS = "article/categorys"; + /*获取资讯列表*/ + public static final String GET_ARTICLE_LIST = "getArticleList"; /*获取资讯详情*/ public static final String GET_ARTICLE_DETAILS = "getArticleDetails"; /*同城活动列表*/ @@ -69,6 +77,18 @@ public class UrlAddress { public static final String GET_USER_ID = "getUserId"; + /*获取省市区数据*/ + public static final String REGION_LIST = "common/region-list"; + + /** + * 订单管理 + */ + /*订单列表*/ + public static final String ORDER_INDEX = "order/index"; + /*订单详情*/ + public static final String ORDER_SHOW = "order/show"; + /*订单物流查询*/ + public static final String ORDER_EXPRESS = "order/express"; /*养生视频列表*/ diff --git a/app/src/main/java/com/uiuios/aios/network/api/ArticleCategorysListApi.java b/app/src/main/java/com/uiuios/aios/network/api/ArticleCategorysListApi.java new file mode 100644 index 0000000..8711b08 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/network/api/ArticleCategorysListApi.java @@ -0,0 +1,17 @@ +package com.uiuios.aios.network.api; + +import com.uiuios.aios.bean.ArticleList; +import com.uiuios.aios.bean.BaseResponse; +import com.uiuios.aios.network.UrlAddress; + +import io.reactivex.rxjava3.core.Observable; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface ArticleCategorysListApi { + @GET(UrlAddress.GET_ARTICLE_LIST) + Observable> getArticleList( + @Query("sn") String sn, + @Query("article_type") int articleType + ); +} diff --git a/app/src/main/java/com/uiuios/aios/network/api/ArticleListApi.java b/app/src/main/java/com/uiuios/aios/network/api/ArticleListApi.java index 981d929..9a10059 100644 --- a/app/src/main/java/com/uiuios/aios/network/api/ArticleListApi.java +++ b/app/src/main/java/com/uiuios/aios/network/api/ArticleListApi.java @@ -1,6 +1,7 @@ package com.uiuios.aios.network.api; import com.uiuios.aios.bean.ArticleInfo; +import com.uiuios.aios.bean.ArticleList; import com.uiuios.aios.bean.BaseResponse; import com.uiuios.aios.network.UrlAddress; @@ -12,7 +13,7 @@ import retrofit2.http.Query; public interface ArticleListApi { @GET(UrlAddress.GET_ARTICLE_LIST) - Observable>> getArticleList( + Observable> getArticleList( @Query("sn") String sn ); } diff --git a/app/src/main/java/com/uiuios/aios/network/api/CategorysApi.java b/app/src/main/java/com/uiuios/aios/network/api/CategorysApi.java index 291a1a0..a80a5e6 100644 --- a/app/src/main/java/com/uiuios/aios/network/api/CategorysApi.java +++ b/app/src/main/java/com/uiuios/aios/network/api/CategorysApi.java @@ -11,8 +11,8 @@ import retrofit2.http.GET; import retrofit2.http.Query; public interface CategorysApi { - @GET(UrlAddress.CATEGORYS) - Observable>> getCategorys( + @GET(UrlAddress.ARTICLE_CATEGORYS) + Observable>> getArticleCategorys( @Query("sn") String sn ); } diff --git a/app/src/main/java/com/uiuios/aios/network/api/GoodsBuyApi.java b/app/src/main/java/com/uiuios/aios/network/api/GoodsBuyApi.java new file mode 100644 index 0000000..debc931 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/network/api/GoodsBuyApi.java @@ -0,0 +1,21 @@ +package com.uiuios.aios.network.api; + +import com.uiuios.aios.bean.BaseResponse; +import com.uiuios.aios.bean.OrderBean; +import com.uiuios.aios.network.UrlAddress; + +import java.util.Map; + +import io.reactivex.rxjava3.core.Observable; +import okhttp3.RequestBody; +import retrofit2.http.Multipart; +import retrofit2.http.POST; +import retrofit2.http.PartMap; + +public interface GoodsBuyApi { + @Multipart + @POST(UrlAddress.GOODS_BUY) + Observable> goodsBuy( + @PartMap Map params + ); +} diff --git a/app/src/main/java/com/uiuios/aios/network/api/GoodsListApi.java b/app/src/main/java/com/uiuios/aios/network/api/GoodsListApi.java index abcaa8e..7215be1 100644 --- a/app/src/main/java/com/uiuios/aios/network/api/GoodsListApi.java +++ b/app/src/main/java/com/uiuios/aios/network/api/GoodsListApi.java @@ -1,18 +1,16 @@ package com.uiuios.aios.network.api; import com.uiuios.aios.bean.BaseResponse; -import com.uiuios.aios.bean.GoodsInfo; +import com.uiuios.aios.bean.GoodsList; import com.uiuios.aios.network.UrlAddress; -import java.util.List; - import io.reactivex.rxjava3.core.Observable; import retrofit2.http.GET; import retrofit2.http.Query; public interface GoodsListApi { @GET(UrlAddress.GET_GOODS_LIST) - Observable>> getGoodsList( + Observable> getGoodsList( @Query("sn") String sn ); } diff --git a/app/src/main/java/com/uiuios/aios/network/api/GoodsTypeApi.java b/app/src/main/java/com/uiuios/aios/network/api/GoodsTypeApi.java new file mode 100644 index 0000000..b1461b4 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/network/api/GoodsTypeApi.java @@ -0,0 +1,16 @@ +package com.uiuios.aios.network.api; + +import com.uiuios.aios.bean.BaseResponse; +import com.uiuios.aios.bean.GoodsType; +import com.uiuios.aios.network.UrlAddress; + +import java.util.List; + +import io.reactivex.rxjava3.core.Observable; +import retrofit2.http.GET; + +public interface GoodsTypeApi { + @GET(UrlAddress.GOODS_TYPE_LIST) + Observable>> getGoodsTypeList( + ); +} diff --git a/app/src/main/java/com/uiuios/aios/network/api/GoodsTypeListApi.java b/app/src/main/java/com/uiuios/aios/network/api/GoodsTypeListApi.java new file mode 100644 index 0000000..eaddbb9 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/network/api/GoodsTypeListApi.java @@ -0,0 +1,17 @@ +package com.uiuios.aios.network.api; + +import com.uiuios.aios.bean.BaseResponse; +import com.uiuios.aios.bean.GoodsList; +import com.uiuios.aios.network.UrlAddress; + +import io.reactivex.rxjava3.core.Observable; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface GoodsTypeListApi { + @GET(UrlAddress.GET_GOODS_LIST) + Observable> getGoodsList( + @Query("sn") String sn, + @Query("goods_type") int goodsType + ); +} diff --git a/app/src/main/java/com/uiuios/aios/network/api/OrderPayApi.java b/app/src/main/java/com/uiuios/aios/network/api/OrderPayApi.java new file mode 100644 index 0000000..b6d0f72 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/network/api/OrderPayApi.java @@ -0,0 +1,21 @@ +package com.uiuios.aios.network.api; + +import com.uiuios.aios.bean.BaseResponse; +import com.uiuios.aios.bean.WxpayBean; +import com.uiuios.aios.network.UrlAddress; + +import io.reactivex.rxjava3.core.Observable; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.POST; + +public interface OrderPayApi { + @FormUrlEncoded + @POST(UrlAddress.ORDER_PAY) + Observable> orderPay( + @Field("sn") String sn, + @Field("order_sn") String order_sn, + @Field("order_id") String order_id, + @Field("desktop_app_package") String desktop_app_package + ); +} diff --git a/app/src/main/java/com/uiuios/aios/network/api/OrderPayCheckApi.java b/app/src/main/java/com/uiuios/aios/network/api/OrderPayCheckApi.java new file mode 100644 index 0000000..1632275 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/network/api/OrderPayCheckApi.java @@ -0,0 +1,19 @@ +package com.uiuios.aios.network.api; + +import com.uiuios.aios.bean.BaseResponse; +import com.uiuios.aios.network.UrlAddress; + +import io.reactivex.rxjava3.core.Observable; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.POST; + +public interface OrderPayCheckApi { + @FormUrlEncoded + @POST(UrlAddress.ORDER_PAY_CHECK) + Observable checkOrder( + @Field("sn") String sn, + @Field("order_sn") String order_sn, + @Field("order_id") String order_id + ); +} diff --git a/app/src/main/java/com/uiuios/aios/network/api/RegionListApi.java b/app/src/main/java/com/uiuios/aios/network/api/RegionListApi.java new file mode 100644 index 0000000..3ca5a88 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/network/api/RegionListApi.java @@ -0,0 +1,18 @@ +package com.uiuios.aios.network.api; + +import com.uiuios.aios.bean.BaseResponse; +import com.uiuios.aios.bean.RegionInfo; +import com.uiuios.aios.network.UrlAddress; + +import java.util.List; + +import io.reactivex.rxjava3.core.Observable; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface RegionListApi { + @GET(UrlAddress.REGION_LIST) + Observable>> getRegionList( + @Query("parent_id") String parent_id + ); +} diff --git a/app/src/main/java/com/uiuios/aios/network/api/RegionListCall.java b/app/src/main/java/com/uiuios/aios/network/api/RegionListCall.java new file mode 100644 index 0000000..158567b --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/network/api/RegionListCall.java @@ -0,0 +1,20 @@ +package com.uiuios.aios.network.api; + +import com.uiuios.aios.bean.BaseResponse; +import com.uiuios.aios.bean.RegionInfo; +import com.uiuios.aios.network.UrlAddress; + +import java.util.List; + +import io.reactivex.rxjava3.core.Flowable; +import io.reactivex.rxjava3.core.Observable; +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface RegionListCall { + @GET(UrlAddress.REGION_LIST) + Flowable>> getRegionList( + @Query("parent_id") String parent_id + ); +} diff --git a/app/src/main/java/com/uiuios/aios/utils/BitmapUtils.java b/app/src/main/java/com/uiuios/aios/utils/BitmapUtils.java index f5cd100..5bc79a4 100644 --- a/app/src/main/java/com/uiuios/aios/utils/BitmapUtils.java +++ b/app/src/main/java/com/uiuios/aios/utils/BitmapUtils.java @@ -17,9 +17,17 @@ import android.graphics.drawable.VectorDrawable; import android.os.Build; import android.util.Log; +import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; +import com.google.zxing.WriterException; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.QRCodeWriter; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import com.uiuios.aios.R; import java.io.ByteArrayOutputStream; +import java.util.HashMap; +import java.util.Map; public class BitmapUtils { public static Bitmap Bytes2Bimap(byte[] b) { @@ -137,4 +145,59 @@ public class BitmapUtils { return background; } + + public static Bitmap createQRImage(String content, int widthPix, int heightPix) { + try { +// if (content == null || "".equals(content)) { +// return false; +// } + + //配置参数 + Map hints = new HashMap<>(); + hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); + //容错级别 + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); + //设置空白边距的宽度 + hints.put(EncodeHintType.MARGIN, 1); //default is 4 + + // 图像数据转换,使用了矩阵转换 + BitMatrix bitMatrix = null; + try { + bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, widthPix, + heightPix, hints); + } catch (WriterException e) { + e.printStackTrace(); + } + int[] pixels = new int[widthPix * heightPix]; + // 下面这里按照二维码的算法,逐个生成二维码的图片, + // 两个for循环是图片横列扫描的结果 + for (int y = 0; y < heightPix; y++) { + for (int x = 0; x < widthPix; x++) { + if (bitMatrix.get(x, y)) { + pixels[y * widthPix + x] = 0xff000000; + } else { + pixels[y * widthPix + x] = 0xffffffff; + } + } + } + + // 生成二维码图片的格式,使用ARGB_8888 + Bitmap bitmap = Bitmap.createBitmap(widthPix, heightPix, Bitmap.Config.ARGB_8888); + bitmap.setPixels(pixels, 0, widthPix, 0, 0, widthPix, heightPix); +// +// if (logoBm != null) { +// bitmap = addLogo(bitmap, logoBm); +// } + + //必须使用compress方法将bitmap保存到文件中再进行读取。直接返回的bitmap是没有任何压缩的, + // 内存消耗巨大! + return bitmap; +// return bitmap != null && bitmap.compress(Bitmap.CompressFormat.JPEG, 100); + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + } diff --git a/app/src/main/java/com/uiuios/aios/view/CounterView.java b/app/src/main/java/com/uiuios/aios/view/CounterView.java new file mode 100644 index 0000000..9bf3e12 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/view/CounterView.java @@ -0,0 +1,281 @@ +package com.uiuios.aios.view; + +import android.content.Context; +import android.icu.math.BigDecimal; +import android.text.Editable; +import android.text.InputFilter; +import android.text.InputType; +import android.text.Spanned; +import android.text.TextWatcher; +import android.util.AttributeSet; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.LinearLayout; + +import com.uiuios.aios.utils.ToastUtil; + +/** + * Copyright (C) 2023-2024 Author + * + * 数量加减控件 + * 前面减号后面加号中间输入 + * + * @author xiaolu + * @date 2023/11/8 + * @version 1.0.0 + */ +public class CounterView extends LinearLayout { + private Button decreaseButton; // 减少按钮 + private Button increaseButton; // 增加按钮 + private EditText valueEditText; // 数值编辑框 + private View customView; // 自定义视图 + + private BigDecimal minValue = BigDecimal.ZERO; // 最小值 + private BigDecimal maxValue = BigDecimal.valueOf(100); // 最大值 + private BigDecimal increment = BigDecimal.ONE; // 步进值 + private BigDecimal defaultValue = BigDecimal.ZERO; // 默认值 + private OnValueChangedListener valueChangedListener; // 数值变化监听器 + private boolean decimalEnabled = false; // 是否允许小数 + private int decimalPlaces = 0; // 小数位数 + + /** + * 构造方法,用于创建 CustomCounterView 实例。 + * + * @param context 上下文参数,不能为空 + */ + public CounterView(Context context) { + super(context); + init(context); + } + + /** + * 构造方法,用于创建 CustomCounterView 实例。 + * + * @param context 上下文参数,不能为空 + * @param attrs 属性参数 + */ + public CounterView(Context context, AttributeSet attrs) { + super(context, attrs); + init(context); + applyAttributes(context, attrs); + } + + /** + * 构造方法,用于创建 CustomCounterView 实例。 + * + * @param context 上下文参数,不能为空 + * @param attrs 属性参数 + * @param defStyle 默认样式参数 + */ + public CounterView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(context); + applyAttributes(context, attrs); + } + + // 初始化方法 + private void init(Context context) { + decreaseButton = new Button(context); + decreaseButton.setText("-"); + addView(decreaseButton); + + valueEditText = new EditText(context); + valueEditText.setInputType(InputType.TYPE_CLASS_NUMBER); + addView(valueEditText); + + increaseButton = new Button(context); + increaseButton.setText("+"); + addView(increaseButton); + + customView = new View(context); + addView(customView); + + decreaseButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + decreaseValue(); + } + }); + + increaseButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + increaseValue(); + } + }); + + valueEditText.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + try { + BigDecimal currentValue = new BigDecimal(s.toString()); + if (currentValue.compareTo(minValue) < 0) { + ToastUtil.show("输入数字不能小于最小值 " + minValue); + setEditTextValue(minValue.toString()); + } else if (currentValue.compareTo(maxValue) > 0) { + ToastUtil.show("输入数字不能大于最大值 " + maxValue); + setEditTextValue(maxValue.toString()); + } + } catch (NumberFormatException e) { + e.printStackTrace(); + } + } + + @Override + public void afterTextChanged(Editable s) { + + } + }); + } + + // 应用属性方法 + private void applyAttributes(Context context, AttributeSet attrs) { + + } + + // 设置默认值方法 + public void setDefaultValue(BigDecimal defaultValue) { + this.defaultValue = defaultValue; + setValue(defaultValue); + } + + // 设置最小值方法 + public void setMinValue(BigDecimal minValue) { + this.minValue = minValue; + } + + // 设置最大值方法 + public void setMaxValue(BigDecimal maxValue) { + this.maxValue = maxValue; + } + + // 设置步进值方法 + public void setIncrement(BigDecimal increment) { + this.increment = increment; + } + + // 获取当前数值方法 + public BigDecimal getValue() { + return BigDecimal.ZERO; + } + + // 设置数值方法 + public void setValue(BigDecimal value) { + valueEditText.setText(value.toString()); + // 将光标移动到文本末尾 + valueEditText.setSelection(valueEditText.getText().length()); + } + + // 更新文本数据方法 + private void setEditTextValue(String value) { + valueEditText.setText(value); + // 将光标移动到文本末尾 + valueEditText.setSelection(valueEditText.getText().length()); + } + + // 减少数值方法 + private void decreaseValue() { + try { + String input = valueEditText.getText().toString().trim(); + if (!input.isEmpty()) { + BigDecimal currentValue = new BigDecimal(input); + BigDecimal newValue = currentValue.subtract(increment); + if (newValue.compareTo(minValue) < 0) { + ToastUtil.show("输入数字不能小于最小值 " + minValue); + newValue = minValue; + } + setEditTextValue(newValue.toString()); + notifyValueChanged(); + } + } catch (NumberFormatException e) { + setEditTextValue("0"); + notifyValueChanged(); + } + } + + // 增加数值方法 + private void increaseValue() { + try { + String input = valueEditText.getText().toString().trim(); + if (!input.isEmpty()) { + BigDecimal currentValue = new BigDecimal(input); + BigDecimal newValue = currentValue.add(increment); + if (newValue.compareTo(maxValue) > 0) { + ToastUtil.show("输入数字不能大于最大值 " + maxValue); + newValue = maxValue; + } + setEditTextValue(newValue.toString()); + notifyValueChanged(); + } + } catch (NumberFormatException e) { + setEditTextValue("0"); + notifyValueChanged(); + } + } + + /** + * 开启小数输入 + * @param decimalEnabled 是否开启 开:true 关:false + * @param decimalPlaces 小数位数控制,如果是-1不控制位数,否则就是小数位数 + */ + public void setDecimalEnabled(boolean decimalEnabled, int decimalPlaces) { + this.decimalEnabled = decimalEnabled; + this.decimalPlaces = decimalPlaces; + if (decimalEnabled) { + if (decimalPlaces == -1) { + valueEditText.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL); + } else { + valueEditText.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL | InputType.TYPE_NUMBER_FLAG_SIGNED); + } + } else { + valueEditText.setInputType(InputType.TYPE_CLASS_NUMBER); + } + applyDecimalFilter(); + } + + private void applyDecimalFilter() { + valueEditText.setFilters(new InputFilter[]{new InputFilter() { + @Override + public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { + if (decimalEnabled) { + String value = dest.toString().substring(0, dstart) + source.toString() + dest.toString().substring(dend); + if (!value.isEmpty() && !value.equals(".") && !value.equals("-")) { + try { + BigDecimal newValue = new BigDecimal(value); + if (decimalPlaces >= 0 && newValue.scale() > decimalPlaces) { + return ""; + } + } catch (NumberFormatException | ArithmeticException e) { + return ""; + } + } + } + return null; + } + }}); + } + + // 通知值已经改变方法 + private void notifyValueChanged() { + if (valueChangedListener != null) { + valueChangedListener.onValueChanged(new BigDecimal(valueEditText.getText().toString())); + } + } + + // 设置数值变化监听器方法 + public void setOnValueChangedListener(OnValueChangedListener listener) { + this.valueChangedListener = listener; + } + + // 数值变化监听器接口 + public interface OnValueChangedListener { + void onValueChanged(BigDecimal newValue); + } +} + diff --git a/app/src/main/res/drawable-hdpi/add.png b/app/src/main/res/drawable-hdpi/add.png new file mode 100644 index 0000000000000000000000000000000000000000..b00c6c3e8fb1becc14b50bf1658d821a92989aa5 GIT binary patch literal 3685 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 Jd0nd7@DG`>_00eP literal 1701 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 delta 3600 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 M8(SJR7adC&Wt^StLY z7UXA#Nh75I!gAK?3TfnD4pvO@W@f2_24X7AUX8B)c~1agRE}=dhFvA&LwB}~B+I{_ zxaVXCC1*7`ie)$TN8-eKU0-fuho;RHr7iu)A=DhwUg$Y+edNyC=|F-csdZH#4sl8?M`vn$l7OY9^-RQ?(;4+&mC&6XBam zX5Ic7^j*UI6O6TX=yXJ)%(_9 z;2p80)3YbCF?6`v62Yynxck?;I{(P=t3`>Q&YV9Jmo$mHo+GE*Qryk!SfjFF?9 zJ>Xd)h?o3ceQJaMHl*^Sq3V~{pQVO~7+K1x`IN&bRim94L)3^MMw-(OV;JQy(oE_u zEli!3XF^HNX!k;c0=*v=75BbdU|5aU>tsA_M`R{qQDE}_*FU$wCB@z+Hg>s54{~etX*~uncw z->>-mxaniXd#UPcx3pI8^a{mp36d4pa`13`XG-XypzD{jjy!)X@vk~jB+jd?oWraA zgN0R#VoZwN)%_Xuncd-ER-So2$8^m0RGIsz6q>~D$;ZT+aq`=MfE!`TE9c|E?A%8y c|GzMk6tG*n{3kE(qaPbNYw~qns}1IV0XI&f-T(jq literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/icon_reduce.png b/app/src/main/res/drawable-hdpi/icon_reduce.png new file mode 100644 index 0000000000000000000000000000000000000000..9f7a71316b84e0df6ee6ba72d9a1df25bb1de343 GIT binary patch literal 781 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 DFoGBN literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/number.xml b/app/src/main/res/drawable/number.xml new file mode 100644 index 0000000..ba2caee --- /dev/null +++ b/app/src/main/res/drawable/number.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/qrcode_background.xml b/app/src/main/res/drawable/qrcode_background.xml new file mode 100644 index 0000000..e650da0 --- /dev/null +++ b/app/src/main/res/drawable/qrcode_background.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-land/fragment_second.xml b/app/src/main/res/layout-land/fragment_second.xml index 1261c2b..45b3955 100644 --- a/app/src/main/res/layout-land/fragment_second.xml +++ b/app/src/main/res/layout-land/fragment_second.xml @@ -153,6 +153,7 @@ @@ -53,8 +53,8 @@ + android:textSize="@dimen/sp_11" + app:layout_constraintBottom_toTopOf="@+id/tv_price" + app:layout_constraintStart_toStartOf="@+id/tv_price" /> + android:textColor="@color/radio_botton_gray" + android:textSize="@dimen/sp_9" + app:layout_constraintBottom_toTopOf="@+id/progressBar" + app:layout_constraintStart_toStartOf="@+id/tv_desc" + tools:layout_editor_absoluteX="37dp" /> - - + - + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + android:gravity="center" + android:text="¥0" + android:textColor="@color/white" + android:textSize="@dimen/sp_22" /> + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_goods.xml b/app/src/main/res/layout/activity_goods.xml new file mode 100644 index 0000000..7e02541 --- /dev/null +++ b/app/src/main/res/layout/activity_goods.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_info_details.xml b/app/src/main/res/layout/activity_info_details.xml index c91f2d8..1cf5ff2 100644 --- a/app/src/main/res/layout/activity_info_details.xml +++ b/app/src/main/res/layout/activity_info_details.xml @@ -10,6 +10,7 @@ diff --git a/app/src/main/res/layout/activity_info_list.xml b/app/src/main/res/layout/activity_info_list.xml index cf4fad1..2d87cb5 100644 --- a/app/src/main/res/layout/activity_info_list.xml +++ b/app/src/main/res/layout/activity_info_list.xml @@ -1,11 +1,11 @@ + android:background="@color/gray" + tools:context=".activity.InfoListActivity"> - - + - + + + + + android:layout_height="@dimen/dp_40" + android:background="@color/action_bar_red" + app:layout_constraintTop_toTopOf="parent" + app:tabSelectedTextColor="@color/white" + app:tabIndicatorColor="@color/white" + app:tabTextAppearance="@style/InformationTextStyle" + app:tabTextColor="@color/noti_text_gray" /> + app:layout_constraintTop_toBottomOf="@+id/tabLayout" /> + app:layout_constraintTop_toBottomOf="@+id/tabLayout"> - - \ No newline at end of file + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_order.xml b/app/src/main/res/layout/activity_order.xml new file mode 100644 index 0000000..c5f49d3 --- /dev/null +++ b/app/src/main/res/layout/activity_order.xml @@ -0,0 +1,248 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_pay.xml b/app/src/main/res/layout/activity_pay.xml new file mode 100644 index 0000000..9841da5 --- /dev/null +++ b/app/src/main/res/layout/activity_pay.xml @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_information.xml b/app/src/main/res/layout/item_information.xml index 9e7450d..a02d432 100644 --- a/app/src/main/res/layout/item_information.xml +++ b/app/src/main/res/layout/item_information.xml @@ -24,7 +24,7 @@ android:layout_marginStart="@dimen/dp_8" android:layout_marginEnd="@dimen/dp_8" android:textSize="@dimen/sp_11" - android:textColor="@color/white" + android:textColor="@color/black" app:layout_constraintBottom_toTopOf="@+id/tv_time" app:layout_constraintEnd_toStartOf="@+id/nv_consult" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/item_new_goods.xml b/app/src/main/res/layout/item_new_goods.xml index 8a852f6..ec7b2a6 100644 --- a/app/src/main/res/layout/item_new_goods.xml +++ b/app/src/main/res/layout/item_new_goods.xml @@ -5,8 +5,8 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> - diff --git a/app/src/main/res/layout/item_notification.xml b/app/src/main/res/layout/item_notification.xml index 1b65501..0073d3f 100644 --- a/app/src/main/res/layout/item_notification.xml +++ b/app/src/main/res/layout/item_notification.xml @@ -7,7 +7,7 @@ #272727 #454347 #ffffff - + #f5433f + #F68F8C + #F4F4F4 + #E03A2E #EDECEC #FFFFFF #00FFFFFF diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 0efd098..3c1e4ed 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -65,4 +65,11 @@ true + + +