diff --git a/app/build.gradle b/app/build.gradle index d0e2b81..898ef02 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.uiuios.aios" minSdkVersion 24 targetSdkVersion 29 - versionCode 41 - versionName "5.0" + versionCode 42 + versionName "5.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2383865..040bd19 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -128,7 +128,7 @@ android:name=".activity.main.PhoneMainActivity" android:exported="true" android:launchMode="singleTask" - android:screenOrientation="userPortrait" /> + android:screenOrientation="portrait" /> @@ -137,12 +137,12 @@ + android:screenOrientation="portrait" /> + android:screenOrientation="portrait" /> + android:screenOrientation="portrait" /> + + + android:screenOrientation="portrait" /> + android:screenOrientation="portrait" /> + android:screenOrientation="portrait" /> + android:screenOrientation="portrait" /> + android:screenOrientation="portrait" /> + android:screenOrientation="portrait" /> + android:screenOrientation="portrait" /> >() { @Override public void onSubscribe(@NonNull Disposable d) { @@ -88,7 +103,7 @@ public class ExpressActivity extends BaseDataBindingActivity { } mBinding.timelineLayout.setVisibility(View.VISIBLE); mBinding.clNodata.setVisibility(View.GONE); - }else { + } else { mBinding.timelineLayout.setVisibility(View.GONE); mBinding.clNodata.setVisibility(View.VISIBLE); } diff --git a/app/src/main/java/com/uiuios/aios/activity/GoodsActivity.java b/app/src/main/java/com/uiuios/aios/activity/GoodsActivity.java index 9802741..47f3fe4 100644 --- a/app/src/main/java/com/uiuios/aios/activity/GoodsActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/GoodsActivity.java @@ -3,10 +3,7 @@ package com.uiuios.aios.activity; import android.content.Intent; 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; @@ -15,11 +12,9 @@ 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.base.DataBindingActivity; import com.uiuios.aios.bean.BaseResponse; import com.uiuios.aios.bean.GoodsInfo; import com.uiuios.aios.bean.GoodsList; @@ -30,14 +25,13 @@ import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX; 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 DataBindingActivity { +public class GoodsActivity extends BaseDataBindingActivity { private static final String TAG = GoodsActivity.class.getSimpleName(); private ActivityGoodsBinding mBinding; @@ -47,16 +41,37 @@ public class GoodsActivity extends DataBindingActivity { private HashMap mGoodsTypeMap; + /** + * 设置布局 + */ + @Override + protected int getLayoutId() { + return R.layout.activity_goods; + } + + /** + * @return 是否是黑色状态栏 + */ + @Override + protected boolean setNightMode() { + return true; + } + + @Override + protected boolean setfitWindow() { + return true; + } + /** * 初始化视图 */ @Override public void initView() { - mBinding = DataBindingUtil.setContentView(this, R.layout.activity_goods); + mBinding = DataBindingUtil.setContentView(this, getLayoutId()); mBinding.setListener(new Listener()); - UltimateBarX.statusBarOnly(this) - .transparent() - .apply(); +// UltimateBarX.statusBarOnly(this) +// .transparent() +// .apply(); UltimateBarX.addStatusBarTopPadding(mBinding.constraintLayout); mRecyclerView = mBinding.recyclerView; mGoodsAdapter = new GoodsListAdapter(); @@ -105,7 +120,7 @@ public class GoodsActivity extends DataBindingActivity { private void getGoodsType() { NetInterfaceManager.getInstance() .getGoodsTypeListObservable() - .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) + .compose(RxLifecycle.bindUntilEvent(getLifecycleSubject(), ActivityEvent.DESTROY)) .subscribe(new Observer>>() { @Override public void onSubscribe(@NonNull Disposable d) { @@ -155,7 +170,7 @@ public class GoodsActivity extends DataBindingActivity { private void getAllGoods(int type) { NetInterfaceManager.getInstance() .getGoodsListObservable(type) - .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) + .compose(RxLifecycle.bindUntilEvent(getLifecycleSubject(), ActivityEvent.DESTROY)) .subscribe(getGoodsListObservable()); } @@ -163,7 +178,7 @@ public class GoodsActivity extends DataBindingActivity { private void getAllGoods() { NetInterfaceManager.getInstance() .getGoodsListObservable() - .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) + .compose(RxLifecycle.bindUntilEvent(getLifecycleSubject(), ActivityEvent.DESTROY)) .subscribe(getGoodsListObservable()); } 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 eb0f4c6..69262a2 100644 --- a/app/src/main/java/com/uiuios/aios/activity/InfoListActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/InfoListActivity.java @@ -52,6 +52,16 @@ public class InfoListActivity extends BaseActivity { return R.layout.activity_info_list; } + @Override + protected boolean setNightMode() { + return false; + } + + @Override + protected boolean setfitWindow() { + return true; + } + @Override public void initView() { ButterKnife.bind(this); @@ -69,7 +79,7 @@ public class InfoListActivity extends BaseActivity { @Override public void initData() { NetInterfaceManager.getInstance().getArticleListObservable() - .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) + .compose(RxLifecycle.bindUntilEvent(getLifecycleSubject(), ActivityEvent.DESTROY)) .subscribe(new Observer>() { @Override public void onSubscribe(@NonNull Disposable d) { 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 dcdf42c..94a2a64 100644 --- a/app/src/main/java/com/uiuios/aios/activity/InformationActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/InformationActivity.java @@ -1,21 +1,20 @@ package com.uiuios.aios.activity; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; + import androidx.constraintlayout.widget.ConstraintLayout; import androidx.databinding.DataBindingUtil; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -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.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; @@ -26,7 +25,6 @@ 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; @@ -35,10 +33,9 @@ import io.reactivex.rxjava3.annotations.NonNull; import io.reactivex.rxjava3.core.Observer; import io.reactivex.rxjava3.disposables.Disposable; -public class InformationActivity extends DataBindingActivity { +public class InformationActivity extends BaseDataBindingActivity { private static final String TAG = InformationActivity.class.getSimpleName(); - @BindView(R.id.tabLayout) TabLayout tabLayout; @BindView(R.id.cl_bar) @@ -53,14 +50,35 @@ public class InformationActivity extends DataBindingActivity { private HashMap mCategoryMap; + /** + * 设置布局 + */ + @Override + protected int getLayoutId() { + return R.layout.activity_information; + } + + /** + * @return 是否是黑色状态栏 + */ + @Override + protected boolean setNightMode() { + return true; + } + + + @Override + protected boolean setfitWindow() { + return false; + } + @Override public void initView() { - mBinding = DataBindingUtil.setContentView(this, R.layout.activity_information); + mBinding = DataBindingUtil.setContentView(this, getLayoutId()); ButterKnife.bind(this); - UltimateBarX.statusBarOnly(this) - .transparent() - .apply(); - +// UltimateBarX.statusBarOnly(this) +// .transparent() +// .apply(); UltimateBarX.addStatusBarTopPadding(cl_bar); mInformationAdapter = new InformationAdapter(); @@ -100,7 +118,7 @@ public class InformationActivity extends DataBindingActivity { private void getCategorys() { NetInterfaceManager.getInstance().getCategorysObservable() - .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) + .compose(RxLifecycle.bindUntilEvent(getLifecycleSubject(), ActivityEvent.DESTROY)) .subscribe(new Observer>>() { @Override public void onSubscribe(@NonNull Disposable d) { @@ -150,14 +168,14 @@ public class InformationActivity extends DataBindingActivity { private void getArticleList() { NetInterfaceManager.getInstance() .getArticleListObservable() - .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) + .compose(RxLifecycle.bindUntilEvent(getLifecycleSubject(), ActivityEvent.DESTROY)) .subscribe(getArticleListObserver()); } private void getArticleList(int id) { NetInterfaceManager.getInstance() .getArticleListObservable(id) - .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) + .compose(RxLifecycle.bindUntilEvent(getLifecycleSubject(), ActivityEvent.DESTROY)) .subscribe(getArticleListObserver()); } diff --git a/app/src/main/java/com/uiuios/aios/activity/InformationDetailsActivity.java b/app/src/main/java/com/uiuios/aios/activity/InformationDetailsActivity.java index c3ae9f6..e256cea 100644 --- a/app/src/main/java/com/uiuios/aios/activity/InformationDetailsActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/InformationDetailsActivity.java @@ -22,12 +22,27 @@ public class InformationDetailsActivity extends BaseDataBindingActivity { private ActivityInfoDetailsBinding mBinding; + @Override + protected int getLayoutId() { + return R.layout.activity_info_details; + } + + @Override + protected boolean setNightMode() { + return false; + } + + @Override + protected boolean setfitWindow() { + return true; + } + /** * 初始化视图 */ @Override public void initView() { - mBinding = DataBindingUtil.setContentView(this, R.layout.activity_info_details); + mBinding = DataBindingUtil.setContentView(this, getLayoutId()); } diff --git a/app/src/main/java/com/uiuios/aios/activity/OrderActivity.java b/app/src/main/java/com/uiuios/aios/activity/OrderActivity.java index 9be8c6a..6e65768 100644 --- a/app/src/main/java/com/uiuios/aios/activity/OrderActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/OrderActivity.java @@ -62,12 +62,27 @@ public class OrderActivity extends BaseDataBindingActivity { ActivityResultLauncher launcher; + @Override + protected int getLayoutId() { + return R.layout.activity_order; + } + + @Override + protected boolean setNightMode() { + return false; + } + + @Override + protected boolean setfitWindow() { + return true; + } + /** * 初始化视图 */ @Override public void initView() { - mBinding = DataBindingUtil.setContentView(this, R.layout.activity_order); + mBinding = DataBindingUtil.setContentView(this, getLayoutId()); launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback() { @Override public void onActivityResult(ActivityResult result) { @@ -209,7 +224,7 @@ public class OrderActivity extends BaseDataBindingActivity { params.put("desktop_app_package", NetInterfaceManager.convertToRequestBody(BuildConfig.APPLICATION_ID)); params.put("address_id", NetInterfaceManager.convertToRequestBody(mAddressId)); NetInterfaceManager.getInstance().getGoodsBuyObservable(params) - .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) + .compose(RxLifecycle.bindUntilEvent(getLifecycleSubject(), ActivityEvent.DESTROY)) .subscribe(new Observer>() { @Override public void onSubscribe(@NonNull Disposable d) { diff --git a/app/src/main/java/com/uiuios/aios/activity/OrderListActivity.java b/app/src/main/java/com/uiuios/aios/activity/OrderListActivity.java index e83a86e..0c63d69 100644 --- a/app/src/main/java/com/uiuios/aios/activity/OrderListActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/OrderListActivity.java @@ -30,12 +30,27 @@ public class OrderListActivity extends BaseDataBindingActivity { private ActivityOrderListBinding mBinding; private OrderAdapter mOrderAdapter; + @Override + protected int getLayoutId() { + return R.layout.activity_order_list; + } + + @Override + protected boolean setNightMode() { + return false; + } + + @Override + protected boolean setfitWindow() { + return true; + } + /** * 初始化视图 */ @Override public void initView() { - mBinding = DataBindingUtil.setContentView(this, R.layout.activity_order_list); + mBinding = DataBindingUtil.setContentView(this, getLayoutId()); mOrderAdapter = new OrderAdapter(); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); @@ -100,13 +115,13 @@ public class OrderListActivity extends BaseDataBindingActivity { private void getAllOrderList() { NetInterfaceManager.getInstance().getAllOrderObservable() - .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) + .compose(RxLifecycle.bindUntilEvent(getLifecycleSubject(), ActivityEvent.DESTROY)) .subscribe(getOrderListObserver()); } private void getOrderIndexList(int status) { NetInterfaceManager.getInstance().getOrderIndexObservable(status) - .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) + .compose(RxLifecycle.bindUntilEvent(getLifecycleSubject(), ActivityEvent.DESTROY)) .subscribe(getOrderListObserver()); } diff --git a/app/src/main/java/com/uiuios/aios/activity/PayActivity.java b/app/src/main/java/com/uiuios/aios/activity/PayActivity.java index 44cff2d..2d2dfcc 100644 --- a/app/src/main/java/com/uiuios/aios/activity/PayActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/PayActivity.java @@ -35,12 +35,27 @@ public class PayActivity extends BaseDataBindingActivity { private OrderBean mOrderBean; + @Override + protected int getLayoutId() { + return R.layout.activity_pay; + } + + @Override + protected boolean setNightMode() { + return false; + } + + @Override + protected boolean setfitWindow() { + return true; + } + /** * 初始化视图 */ @Override public void initView() { - mBinding = DataBindingUtil.setContentView(this, R.layout.activity_pay); + mBinding = DataBindingUtil.setContentView(this, getLayoutId()); mBinding.tvRefresh.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -74,7 +89,7 @@ public class PayActivity extends BaseDataBindingActivity { if (orderBean == null) return; NetInterfaceManager.getInstance() .getOrderPayObservable(orderBean.getOrder_sn(), orderBean.getOrder_id()) - .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) + .compose(RxLifecycle.bindUntilEvent(getLifecycleSubject(), ActivityEvent.DESTROY)) .subscribe(new Observer>() { @Override public void onSubscribe(@NonNull Disposable d) { @@ -112,7 +127,7 @@ public class PayActivity extends BaseDataBindingActivity { mCountdownSubscribe.dispose(); } mCountdownSubscribe = Observable.interval(1, TimeUnit.SECONDS) - .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) + .compose(RxLifecycle.bindUntilEvent(getLifecycleSubject(), ActivityEvent.DESTROY)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer() { @@ -142,7 +157,7 @@ public class PayActivity extends BaseDataBindingActivity { mCheckOrderSubscribe.dispose(); } mCheckOrderSubscribe = Observable.interval(5, TimeUnit.SECONDS) - .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) + .compose(RxLifecycle.bindUntilEvent(getLifecycleSubject(), ActivityEvent.DESTROY)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer() { @@ -150,7 +165,7 @@ public class PayActivity extends BaseDataBindingActivity { public void accept(Long aLong) throws Exception { NetInterfaceManager.getInstance() .getOrderPayCheckObservable(wxpayBean.getOrder_sn(), wxpayBean.getOrder_id()) - .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) + .compose(RxLifecycle.bindUntilEvent(getLifecycleSubject(), ActivityEvent.DESTROY)) .subscribe(new Observer() { @Override public void onSubscribe(@NonNull Disposable d) { diff --git a/app/src/main/java/com/uiuios/aios/activity/QuickAppActivity.java b/app/src/main/java/com/uiuios/aios/activity/QuickAppActivity.java index 49ec0bd..89588a7 100644 --- a/app/src/main/java/com/uiuios/aios/activity/QuickAppActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/QuickAppActivity.java @@ -38,6 +38,16 @@ public class QuickAppActivity extends BaseActivity { return R.layout.activity_quick_app; } + @Override + protected boolean setNightMode() { + return false; + } + + @Override + protected boolean setfitWindow() { + return true; + } + @Override public void initView() { ButterKnife.bind(this); diff --git a/app/src/main/java/com/uiuios/aios/activity/ScreenLockActivity.java b/app/src/main/java/com/uiuios/aios/activity/ScreenLockActivity.java index 47e6bf4..306ac97 100644 --- a/app/src/main/java/com/uiuios/aios/activity/ScreenLockActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/ScreenLockActivity.java @@ -90,6 +90,16 @@ public class ScreenLockActivity extends BaseActivity { return R.layout.activity_screen_lock; } + @Override + protected boolean setNightMode() { + return false; + } + + @Override + protected boolean setfitWindow() { + return true; + } + @Override public void initView() { ButterKnife.bind(this); 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 ae6f1ba..8a33f64 100644 --- a/app/src/main/java/com/uiuios/aios/activity/SpikeListActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/SpikeListActivity.java @@ -40,7 +40,7 @@ public class SpikeListActivity extends BaseActivity { @Override public int getLayoutId() { - lifecycleSubject.onNext(ActivityEvent.CREATE); + getLifecycleSubject().onNext(ActivityEvent.CREATE); UltimateBarX.statusBar(this) .transparent() .colorRes(R.color.colorPrimaryDark) @@ -54,6 +54,16 @@ public class SpikeListActivity extends BaseActivity { return R.layout.activity_spike_list; } + @Override + protected boolean setNightMode() { + return false; + } + + @Override + protected boolean setfitWindow() { + return true; + } + @Override public void initView() { ButterKnife.bind(this); @@ -76,7 +86,7 @@ public class SpikeListActivity extends BaseActivity { private void getGoodsInfo() { NetInterfaceManager.getInstance() .getGoodsListObservable() - .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) + .compose(RxLifecycle.bindUntilEvent(getLifecycleSubject(), ActivityEvent.DESTROY)) .subscribe(new Observer>() { @Override public void onSubscribe(@NonNull Disposable d) { diff --git a/app/src/main/java/com/uiuios/aios/activity/SplashActivity.java b/app/src/main/java/com/uiuios/aios/activity/SplashActivity.java index d6a2f8c..56012b2 100644 --- a/app/src/main/java/com/uiuios/aios/activity/SplashActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/SplashActivity.java @@ -20,6 +20,16 @@ public class SplashActivity extends BaseActivity { return R.layout.activity_splash; } + @Override + protected boolean setNightMode() { + return false; + } + + @Override + protected boolean setfitWindow() { + return true; + } + /** * 初始化视图 */ diff --git a/app/src/main/java/com/uiuios/aios/activity/alarm/AlarmActivity.java b/app/src/main/java/com/uiuios/aios/activity/alarm/AlarmActivity.java index b17c27c..62a1bb2 100644 --- a/app/src/main/java/com/uiuios/aios/activity/alarm/AlarmActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/alarm/AlarmActivity.java @@ -81,6 +81,15 @@ public class AlarmActivity extends BaseActivity implements AlarmContact.AlarmVie return R.layout.activity_alarm; } + @Override + protected boolean setNightMode() { + return false; + } + + @Override + protected boolean setfitWindow() { + return true; + } /** * 初始化视图 */ @@ -89,7 +98,7 @@ public class AlarmActivity extends BaseActivity implements AlarmContact.AlarmVie ButterKnife.bind(this); mPresenter = new AlarmPresenter(this); mPresenter.attachView(this); - mPresenter.setLifecycle(lifecycleSubject); + mPresenter.setLifecycle(getLifecycleSubject()); mAlarmAdapter = new AlarmAdapter(); mAlarmAdapter.setOnLongClickListener(new AlarmAdapter.OnLongClickListener() { @@ -236,7 +245,7 @@ public class AlarmActivity extends BaseActivity implements AlarmContact.AlarmVie mPresenter.getAlarmClock(mType); } else { NetInterfaceManager.getInstance().deleteAlarmClockObservable(alarmClockData.getId()) - .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) + .compose(RxLifecycle.bindUntilEvent(getLifecycleSubject(), ActivityEvent.DESTROY)) .subscribe(new Observer() { @Override public void onSubscribe(@NonNull Disposable d) { diff --git a/app/src/main/java/com/uiuios/aios/activity/alarm/AlarmContact.java b/app/src/main/java/com/uiuios/aios/activity/alarm/AlarmContact.java index 41d289f..73ec89c 100644 --- a/app/src/main/java/com/uiuios/aios/activity/alarm/AlarmContact.java +++ b/app/src/main/java/com/uiuios/aios/activity/alarm/AlarmContact.java @@ -1,8 +1,8 @@ package com.uiuios.aios.activity.alarm; import com.uiuios.aios.alarm.AlarmClockData; -import com.uiuios.aios.base.BasePresenter; -import com.uiuios.aios.base.BaseView; +import com.uiuios.aios.base.mvp.BasePresenter; +import com.uiuios.aios.base.mvp.BaseView; import java.util.List; diff --git a/app/src/main/java/com/uiuios/aios/activity/alarm/port/PortAlarmActivity.java b/app/src/main/java/com/uiuios/aios/activity/alarm/port/PortAlarmActivity.java new file mode 100644 index 0000000..560dfd8 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/activity/alarm/port/PortAlarmActivity.java @@ -0,0 +1,218 @@ +package com.uiuios.aios.activity.alarm.port; + +import android.content.Intent; +import android.util.Log; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.trello.rxlifecycle4.RxLifecycle; +import com.trello.rxlifecycle4.android.ActivityEvent; +import com.uiuios.aios.R; +import com.uiuios.aios.activity.alarmclock.port.PortAlarmClockAddActivity; +import com.uiuios.aios.alarm.AlarmClockData; +import com.uiuios.aios.alarm.AlarmUtils; +import com.uiuios.aios.alarm.PortAlarmAdapter; +import com.uiuios.aios.base.mvvm.BaseMvvmActivity; +import com.uiuios.aios.bean.BaseResponse; +import com.uiuios.aios.databinding.ActivityAlarmPortBinding; +import com.uiuios.aios.dialog.DeleteDialog; +import com.uiuios.aios.network.NetInterfaceManager; +import com.uiuios.aios.utils.ToastUtil; + +import java.util.List; + +import io.reactivex.rxjava3.core.Observer; +import io.reactivex.rxjava3.disposables.Disposable; + +public class PortAlarmActivity extends BaseMvvmActivity { + private static final String TAG = PortAlarmActivity.class.getSimpleName(); + + private PortAlarmAdapter mAlarmAdapter; + private int mType = 0; + + /** + * 设置布局 + */ + @Override + public int getLayoutId() { + return R.layout.activity_alarm_port; + } + + @Override + protected boolean setNightMode() { + return true; + } + + @Override + protected boolean setfitWindow() { + return true; + } + + @Override + protected void initDataBinding() { + mViewModel.setCtx(this); + mViewModel.setVDBinding(mViewDataBinding); + mViewModel.setLifecycle(getLifecycleSubject()); + mViewDataBinding.setClick(new Click()); + } + + /** + * 初始化视图 + */ + @Override + public void initView() { + + mAlarmAdapter = new PortAlarmAdapter(); + mAlarmAdapter.setOnLongClickListener(new PortAlarmAdapter.OnLongClickListener() { + @Override + public void onLongClick(AlarmClockData alarmClockData) { + showDialog(alarmClockData); + } + }); + mViewDataBinding.rvData.setLayoutManager(new LinearLayoutManager(PortAlarmActivity.this)); + mViewDataBinding.rvData.setAdapter(mAlarmAdapter); + mViewDataBinding.rvData.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { + super.onScrollStateChanged(recyclerView, newState); + switch (newState){ + /*正在拖拽*/ + case RecyclerView.SCROLL_STATE_DRAGGING: + break; + /*滑动停止*/ + default: + case RecyclerView.SCROLL_STATE_IDLE: + break; + /*惯性滑动中*/ + case RecyclerView.SCROLL_STATE_SETTLING: + break; + } + } + + @Override + public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + } + }); + } + + /** + * 初始化数据 + */ + @Override + public void initData() { + mViewModel.getAlarmClockData().observe(this, new androidx.lifecycle.Observer>() { + @Override + public void onChanged(List alarmClockData) { + setAlarmClock(alarmClockData); + } + }); + + mViewModel.getAlarmClock(mType); + } + + @Override + protected void onResume() { + super.onResume(); + } + + + private void showDialog(AlarmClockData alarmClockData) { + DeleteDialog dialog = new DeleteDialog(this); + dialog.setTitle("提醒") + .setMessage("是否要删除本次闹钟") + .setPositive("确定") + .setNegtive("取消") + .setOnClickBottomListener(new DeleteDialog.OnClickBottomListener() { + @Override + public void onPositiveClick() { + deleteAlarm(alarmClockData); + dialog.dismiss(); + } + + @Override + public void onNegtiveClick() { + dialog.dismiss(); + } + }); + dialog.show(); + } + + private void deleteAlarm(AlarmClockData alarmClockData) { + if (alarmClockData.isIs_local()) { + alarmClockData.setDeleted(true); + AlarmUtils.getInstance().deleteAlarmClock(alarmClockData); + mViewModel.getAlarmClock(mType); + } else { + NetInterfaceManager.getInstance().deleteAlarmClockObservable(alarmClockData.getId()) + .compose(RxLifecycle.bindUntilEvent(getLifecycleSubject(), ActivityEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("deleteAlarm", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse baseResponse) { + Log.e("deleteAlarm", "onNext: " + baseResponse); + if (baseResponse.code == 200) { + AlarmUtils.getInstance().deleteAlarmClock(alarmClockData); + ToastUtil.show("删除成功"); + } else { + ToastUtil.show("删除失败:" + baseResponse.msg); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("deleteAlarm", "onError: " + e.getMessage()); + alarmClockData.setDeleted(true); + AlarmUtils.getInstance().updateAlarmClock(alarmClockData); + onComplete(); + } + + @Override + public void onComplete() { + Log.e("deleteAlarm", "onComplete: "); + mViewModel.getAlarmClock(mType); + } + }); + } + } + + + public void setAlarmClock(List alarmClockData) { + List localAddAlarm = AlarmUtils.getInstance().getLocalAddAlarm(); + Log.e(TAG, "setAlarmClock: localAddAlarm size = " + localAddAlarm); + if (alarmClockData != null) { + localAddAlarm.addAll(alarmClockData); + } + if (localAddAlarm.size() == 0) { + mAlarmAdapter.setAlarmClockData(null); +// swipeRefreshLayout.setRefreshing(false); + mViewDataBinding.clNodata.setVisibility(View.VISIBLE); + mViewDataBinding.rvData.setVisibility(View.GONE); + ToastUtil.show("没有数据"); + } else { + mAlarmAdapter.setAlarmClockData(localAddAlarm); +// swipeRefreshLayout.setRefreshing(false); + mViewDataBinding.clNodata.setVisibility(View.GONE); + mViewDataBinding.rvData.setVisibility(View.VISIBLE); + } + } + + + + public class Click { + public void exit(View view) { + finish(); + } + + public void add(View view) { + startActivity(new Intent(PortAlarmActivity.this, PortAlarmClockAddActivity.class)); + } + } +} diff --git a/app/src/main/java/com/uiuios/aios/activity/alarm/port/PortAlarmViewModel.java b/app/src/main/java/com/uiuios/aios/activity/alarm/port/PortAlarmViewModel.java new file mode 100644 index 0000000..36d4b32 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/activity/alarm/port/PortAlarmViewModel.java @@ -0,0 +1,90 @@ +package com.uiuios.aios.activity.alarm.port; + +import android.util.Log; + +import androidx.lifecycle.MutableLiveData; + +import com.uiuios.aios.alarm.AlarmClockData; +import com.uiuios.aios.base.mvvm.BaseViewModel; +import com.uiuios.aios.bean.BaseResponse; +import com.uiuios.aios.databinding.ActivityAlarmPortBinding; +import com.uiuios.aios.network.NetInterfaceManager; + +import java.util.List; + +import io.reactivex.rxjava3.annotations.NonNull; +import io.reactivex.rxjava3.core.Observer; +import io.reactivex.rxjava3.disposables.Disposable; + +public class PortAlarmViewModel extends BaseViewModel { + + private static final String TAG = PortAlarmViewModel.class.getSimpleName(); + + @Override + public ActivityAlarmPortBinding getVDBinding() { + return binding; + } + + @Override + public void onDestroy() { + + } + + private MutableLiveData> mAlarmClockData =new MutableLiveData<>(); + + public MutableLiveData> getAlarmClockData() { + return mAlarmClockData; + } + + public void getAlarmClock() { + NetInterfaceManager.getInstance().getAlarmClock(true, getLifecycle(), new NetInterfaceManager.AlarmClockCallback() { + @Override + public void setAlarmClock(List alarmClockList) { + if (alarmClockList.size() == 0) { + setAlarmClockEmpty(); + } else { + + } + } + + @Override + public void setAlarmClockEmpty() { + + } + + @Override + public void onError() { + + } + }); + } + + public void getAlarmClock(int type) { + Log.e(TAG, "getAlarmClock: " + type); + NetInterfaceManager.getInstance().getAlarmClockObservable(type) + .subscribe(new Observer>>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getAlarmClock", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse> listBaseResponse) { + Log.e("getAlarmClock", "onNext: " + listBaseResponse); + mAlarmClockData.setValue(listBaseResponse.data); + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getAlarmClock", "onError: " + e.getMessage()); + onComplete(); + } + + @Override + public void onComplete() { + Log.e("getAlarmClock", "onComplete: "); + } + }); + } + +} diff --git a/app/src/main/java/com/uiuios/aios/activity/alarmclock/AlarmClockActivity.java b/app/src/main/java/com/uiuios/aios/activity/alarmclock/AlarmClockActivity.java index ec4a673..5813646 100644 --- a/app/src/main/java/com/uiuios/aios/activity/alarmclock/AlarmClockActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/alarmclock/AlarmClockActivity.java @@ -19,9 +19,9 @@ import com.trello.rxlifecycle4.RxLifecycle; import com.trello.rxlifecycle4.android.ActivityEvent; import com.uiuios.aios.R; import com.uiuios.aios.alarm.AlarmAdapter; -import com.uiuios.aios.alarm.AlarmUtils; import com.uiuios.aios.alarm.AlarmClockData; -import com.uiuios.aios.base.BaseLifecycleActivity; +import com.uiuios.aios.alarm.AlarmUtils; +import com.uiuios.aios.base.mvp.BaseMvpActivity; import com.uiuios.aios.bean.BaseResponse; import com.uiuios.aios.dialog.DeleteDialog; import com.uiuios.aios.network.NetInterfaceManager; @@ -37,7 +37,7 @@ import cn.jzvd.Jzvd; import io.reactivex.rxjava3.core.Observer; import io.reactivex.rxjava3.disposables.Disposable; -public class AlarmClockActivity extends BaseLifecycleActivity implements AlarmClockContact.ClockView { +public class AlarmClockActivity extends BaseMvpActivity implements AlarmClockContact.ClockView { private static final String TAG = AlarmClockActivity.class.getSimpleName(); @BindView(R.id.recyclerView) @@ -59,6 +59,16 @@ public class AlarmClockActivity extends BaseLifecycleActivity implements AlarmCl return R.layout.activity_alarm; } + @Override + protected boolean setNightMode() { + return false; + } + + @Override + protected boolean setfitWindow() { + return true; + } + @Override public void initView() { UltimateBarX.statusBarOnly(this) @@ -68,7 +78,7 @@ public class AlarmClockActivity extends BaseLifecycleActivity implements AlarmCl ButterKnife.bind(this); mPresenter = new AlarmClockPresenter(this); mPresenter.attachView(this); - mPresenter.setLifecycle(lifecycleSubject); + mPresenter.setLifecycle(getLifecycleSubject()); mAlarmAdapter = new AlarmAdapter(); mAlarmAdapter.setOnLongClickListener(new AlarmAdapter.OnLongClickListener() { @@ -126,7 +136,7 @@ public class AlarmClockActivity extends BaseLifecycleActivity implements AlarmCl AlarmUtils.getInstance().deleteAlarmClock(alarmClockData); } else { NetInterfaceManager.getInstance().deleteAlarmClockObservable(alarmClockData.getId()) - .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) + .compose(RxLifecycle.bindUntilEvent(getLifecycleSubject(), ActivityEvent.DESTROY)) .subscribe(new Observer() { @Override public void onSubscribe(@NonNull Disposable d) { diff --git a/app/src/main/java/com/uiuios/aios/activity/alarmclock/AlarmClockAddActivity.java b/app/src/main/java/com/uiuios/aios/activity/alarmclock/AlarmClockAddActivity.java index d8a02b2..6933cb5 100644 --- a/app/src/main/java/com/uiuios/aios/activity/alarmclock/AlarmClockAddActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/alarmclock/AlarmClockAddActivity.java @@ -34,8 +34,8 @@ import com.trello.rxlifecycle4.android.ActivityEvent; import com.uiuios.aios.R; import com.uiuios.aios.alarm.AlarmClockData; import com.uiuios.aios.alarm.AlarmUtils; -import com.uiuios.aios.base.BaseLifecycleActivity; import com.uiuios.aios.base.GlideEngine; +import com.uiuios.aios.base.mvp.BaseMvpActivity; import com.uiuios.aios.service.main.MainService; import com.uiuios.aios.utils.FFmpegUtils; import com.uiuios.aios.utils.FileUtil; @@ -63,7 +63,7 @@ import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.RequestBody; -public class AlarmClockAddActivity extends BaseLifecycleActivity { +public class AlarmClockAddActivity extends BaseMvpActivity { private static final String TAG = AlarmClockAddActivity.class.getSimpleName(); @BindView(R.id.cl_content) @@ -114,9 +114,19 @@ public class AlarmClockAddActivity extends BaseLifecycleActivity { return R.layout.activity_add_alarm; } + @Override + protected boolean setNightMode() { + return false; + } + + @Override + protected boolean setfitWindow() { + return true; + } + @Override public void initView() { - lifecycleSubject.onNext(ActivityEvent.CREATE); + getLifecycleSubject().onNext(ActivityEvent.CREATE); UltimateBarX.statusBarOnly(this) .colorRes(R.color.default_blue) .fitWindow(true) diff --git a/app/src/main/java/com/uiuios/aios/activity/alarmclock/AlarmClockContact.java b/app/src/main/java/com/uiuios/aios/activity/alarmclock/AlarmClockContact.java index e5bd46a..2a22e3a 100644 --- a/app/src/main/java/com/uiuios/aios/activity/alarmclock/AlarmClockContact.java +++ b/app/src/main/java/com/uiuios/aios/activity/alarmclock/AlarmClockContact.java @@ -1,8 +1,8 @@ package com.uiuios.aios.activity.alarmclock; -import com.uiuios.aios.base.BasePresenter; -import com.uiuios.aios.base.BaseView; import com.uiuios.aios.alarm.AlarmClockData; +import com.uiuios.aios.base.mvp.BasePresenter; +import com.uiuios.aios.base.mvp.BaseView; import java.util.List; diff --git a/app/src/main/java/com/uiuios/aios/activity/alarmclock/port/PortAlarmClockAddActivity.java b/app/src/main/java/com/uiuios/aios/activity/alarmclock/port/PortAlarmClockAddActivity.java new file mode 100644 index 0000000..10d43ca --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/activity/alarmclock/port/PortAlarmClockAddActivity.java @@ -0,0 +1,320 @@ +package com.uiuios.aios.activity.alarmclock.port; + +import android.content.Intent; +import android.content.res.ColorStateList; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.CompoundButton; + +import com.bigkoo.pickerview.builder.TimePickerBuilder; +import com.bigkoo.pickerview.listener.CustomListener; +import com.bigkoo.pickerview.listener.OnTimeSelectListener; +import com.bigkoo.pickerview.view.TimePickerView; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.resource.bitmap.RoundedCorners; +import com.bumptech.glide.request.RequestOptions; +import com.luck.picture.lib.basic.PictureSelector; +import com.luck.picture.lib.config.SelectMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.interfaces.OnResultCallbackListener; +import com.uiuios.aios.R; +import com.uiuios.aios.alarm.AlarmClockData; +import com.uiuios.aios.alarm.AlarmUtils; +import com.uiuios.aios.base.GlideEngine; +import com.uiuios.aios.base.mvvm.BaseMvvmActivity; +import com.uiuios.aios.databinding.ActivityAddAlarmPortBinding; +import com.uiuios.aios.service.main.MainService; +import com.uiuios.aios.utils.FFmpegUtils; +import com.uiuios.aios.utils.FileUtil; +import com.uiuios.aios.utils.ScreenUtil; +import com.uiuios.aios.utils.TimeUtils; +import com.uiuios.aios.utils.ToastUtil; +import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX; + +import java.io.File; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.concurrent.ThreadLocalRandom; + +import butterknife.ButterKnife; +import io.reactivex.rxjava3.annotations.NonNull; +import io.reactivex.rxjava3.core.Observer; +import io.reactivex.rxjava3.disposables.Disposable; + +public class PortAlarmClockAddActivity extends BaseMvvmActivity { + private static final String TAG = PortAlarmClockAddActivity.class.getSimpleName(); + + private TimePickerView pvTime; + + private String mPictrueFilePath; + private Date mDate; + /*类型 1一次性 2每天 3周一到周五 4周六周日*/ + private int mDayType = 1; + private int mClockType = 1; + + + @Override + public int getLayoutId() { + return R.layout.activity_add_alarm_port; + } + + @Override + protected boolean setNightMode() { + return true; + } + + @Override + protected boolean setfitWindow() { + return false; + } + + @Override + protected void initDataBinding() { + mViewModel.setCtx(this); + mViewModel.setVDBinding(mViewDataBinding); + mViewModel.setLifecycle(getLifecycleSubject()); + mViewDataBinding.setClick(new Click()); + } + + @Override + public void initView() { + UltimateBarX.statusBarOnly(this) + .colorRes(R.color.default_blue) + .fitWindow(true) + .apply(); + + ButterKnife.bind(this); + initTimePicker(); + + mViewDataBinding.rb1.setChecked(true); + mViewDataBinding.rb1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { + if (isChecked) { + ColorStateList colorStateList = getResources().getColorStateList(R.color.white); + mViewDataBinding.rb1.setTextColor(colorStateList); + mDayType = 1; + } else { + ColorStateList colorStateList = getResources().getColorStateList(R.color.radio_botton_gray); + mViewDataBinding.rb1.setTextColor(colorStateList); + } + } + }); + mViewDataBinding.rb2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { + if (isChecked) { + ColorStateList colorStateList = getResources().getColorStateList(R.color.white); + mViewDataBinding.rb2.setTextColor(colorStateList); + mDayType = 2; + } else { + ColorStateList colorStateList = getResources().getColorStateList(R.color.radio_botton_gray); + mViewDataBinding.rb2.setTextColor(colorStateList); + } + } + }); + + mViewDataBinding.rbAll.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked) { + mClockType = 1; + mViewDataBinding.etActivation.setText("用药闹钟"); + } else { + + } + } + }); + mViewDataBinding.rbLook.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked) { + mClockType = 2; + mViewDataBinding.etActivation.setText("接送闹钟"); + } else { + + } + } + }); + mViewDataBinding.rbReserve.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked) { + mClockType = 3; + mViewDataBinding.etActivation.setText("预约闹钟"); + } else { + + } + } + }); + + + } + + @Override + public void initData() { + + } + + + private void checkContent() { + pvTime.returnData(); + if (TextUtils.isEmpty(mViewDataBinding.etActivation.getText())) { + ToastUtil.show("请输入标题"); + return; + } + if (TextUtils.isEmpty(mPictrueFilePath)) { + ToastUtil.show("请选择图片"); + return; + } + String timeStamp = getTime(mDate); + Log.e(TAG, "checkContent: " + timeStamp); + Log.e(TAG, "checkContent: " + mPictrueFilePath); + + AlarmClockData alarmClockData = new AlarmClockData(); + alarmClockData.setFile(mPictrueFilePath); + alarmClockData.setType(mDayType); + alarmClockData.setTime(timeStamp); + alarmClockData.setTitle(mViewDataBinding.etActivation.getText().toString()); + alarmClockData.setRemind_type(0); + alarmClockData.setIs_onoff(1); + alarmClockData.setClazz(mClockType); + + ThreadLocalRandom random = ThreadLocalRandom.current(); + int fakeId = random.nextInt(Integer.MAX_VALUE); + Log.e(TAG, "checkContent: fakeId = " + fakeId); + alarmClockData.setId(fakeId); + alarmClockData.setIs_local(true); + Log.e(TAG, "checkContent: addAlarmClock = " + AlarmUtils.getInstance().addAlarmClock(alarmClockData)); + ToastUtil.show("添加成功"); + Intent intent = new Intent(MainService.uploadAlarmClockReceiver.UPLOAD_ALARM_RECEIVER_ACTION); + sendBroadcast(intent); + finish(); + } + + private void openSelector() { + PictureSelector.create(PortAlarmClockAddActivity.this) + .openGallery(SelectMimeType.ofAll()) + .setSelectionMode(1) + .setImageEngine(GlideEngine.createGlideEngine()) + .forResult(new OnResultCallbackListener() { + @Override + public void onResult(ArrayList result) { + mPictrueFilePath = result.get(0).getRealPath(); + File file = new File(mPictrueFilePath); + if (file.exists()) { + RequestOptions options = new RequestOptions().transform(new RoundedCorners(ScreenUtil.dip2px(PortAlarmClockAddActivity.this, 8F))); + Glide.with(mViewDataBinding.nvPic).load(file).apply(options).into(mViewDataBinding.nvPic); + mViewDataBinding.nvPic.setVisibility(View.VISIBLE); + mViewDataBinding.clPic.setVisibility(View.GONE); + if (FileUtil.isVideoFile(mPictrueFilePath)) { + FFmpegUtils.getDurationInMilliseconds(mPictrueFilePath, new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("openSelector", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull Integer integer) { + Log.e("openSelector", "onNext: " + integer); + mViewDataBinding.tvDuration.setText(TimeUtils.secToTime(integer)); + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("openSelector", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("openSelector", "onComplete: "); + } + }); + } else { + mViewDataBinding.tvDuration.setText(""); + } + } else { + mPictrueFilePath = ""; + mViewDataBinding.nvPic.setVisibility(View.GONE); + mViewDataBinding.clPic.setVisibility(View.VISIBLE); + } + } + + @Override + public void onCancel() { + Log.e(TAG, "onCancel: "); + } + }); + } + + private void initTimePicker() { + //控制时间范围(如果不设置范围,则使用默认时间1900-2100年,此段代码可注释) + //因为系统Calendar的月份是从0-11的,所以如果是调用Calendar的set方法来设置时间,月份的范围也要是从0-11 + Calendar selectedDate = Calendar.getInstance(); + + Calendar startDate = Calendar.getInstance(); + startDate.set(2013, 0, 23); + + Calendar endDate = Calendar.getInstance(); + endDate.set(2019, 11, 28); + + //时间选择器 + pvTime = new TimePickerBuilder(this, new OnTimeSelectListener() { + @Override + public void onTimeSelect(Date date, View v) {//选中事件回调 + // 这里回调过来的v,就是show()方法里面所添加的 View 参数,如果show的时候没有添加参数,v则为null + /*btn_Time.setText(getTime(date));*/ + mDate = date; + Log.e(TAG, "onTimeSelect: " + getTime(date)); + } + }) + .setLayoutRes(R.layout.pickerview_custom_time, new CustomListener() { + @Override + public void customLayout(View v) { + + } + }) + .setType(new boolean[]{false, false, false, true, true, false}) + .setLabel("", "", "", "时", "分", "") //设置空字符串以隐藏单位提示 hide label + .setDividerColor(Color.GRAY) + .setContentTextSize(30) + .setDate(selectedDate) + .setRangDate(startDate, selectedDate) + .setDecorView(mViewDataBinding.clContent)//非dialog模式下,设置ViewGroup, pickerView将会添加到这个ViewGroup中 + .setOutSideColor(0x00000000) + .setOutSideCancelable(false) + .build(); + pvTime.setKeyBackCancelable(false);//系统返回键监听屏蔽掉 + pvTime.show(mViewDataBinding.clContent, false);//弹出时间选择器,传递参数过去,回调的时候则可以绑定此view + + } + + private String getTime(Date date) { + SimpleDateFormat format; + if (mDayType == 1) { + format = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + } else { + format = new SimpleDateFormat("HH:mm"); + } + return format.format(date); + } + + + public class Click { + public void exit(View view) { + finish(); + } + + public void openGallery(View view) { + openSelector(); + } + + public void submit(View view) { + checkContent(); + } + } +} diff --git a/app/src/main/java/com/uiuios/aios/activity/alarmclock/port/PortAlarmClockAddViewModel.java b/app/src/main/java/com/uiuios/aios/activity/alarmclock/port/PortAlarmClockAddViewModel.java new file mode 100644 index 0000000..2ed5b08 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/activity/alarmclock/port/PortAlarmClockAddViewModel.java @@ -0,0 +1,17 @@ +package com.uiuios.aios.activity.alarmclock.port; + +import com.uiuios.aios.base.mvvm.BaseViewModel; +import com.uiuios.aios.databinding.ActivityAddAlarmPortBinding; + +public class PortAlarmClockAddViewModel extends BaseViewModel { + + @Override + public ActivityAddAlarmPortBinding getVDBinding() { + return binding; + } + + @Override + public void onDestroy() { + + } +} diff --git a/app/src/main/java/com/uiuios/aios/activity/code/FamilySpaceActivity.java b/app/src/main/java/com/uiuios/aios/activity/code/FamilySpaceActivity.java index b8cf038..a4eb890 100644 --- a/app/src/main/java/com/uiuios/aios/activity/code/FamilySpaceActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/code/FamilySpaceActivity.java @@ -43,12 +43,22 @@ public class FamilySpaceActivity extends BaseActivity implements FamilySpaceCont return R.layout.activity_family_space; } + @Override + protected boolean setNightMode() { + return false; + } + + @Override + protected boolean setfitWindow() { + return true; + } + @Override public void initView() { ButterKnife.bind(this); mPresenter = new FamilySpacePresenter(this); mPresenter.attachView(this); - mPresenter.setLifecycle(lifecycleSubject); + mPresenter.setLifecycle(getLifecycleSubject()); iv_back.setOnClickListener(view -> finish()); mHealthCodeAdapter = new HealthCodeAdapter(); mViewPager.setAdapter(mHealthCodeAdapter); diff --git a/app/src/main/java/com/uiuios/aios/activity/code/FamilySpaceContact.java b/app/src/main/java/com/uiuios/aios/activity/code/FamilySpaceContact.java index dc38ebe..6c952f4 100644 --- a/app/src/main/java/com/uiuios/aios/activity/code/FamilySpaceContact.java +++ b/app/src/main/java/com/uiuios/aios/activity/code/FamilySpaceContact.java @@ -1,7 +1,7 @@ package com.uiuios.aios.activity.code; -import com.uiuios.aios.base.BasePresenter; -import com.uiuios.aios.base.BaseView; +import com.uiuios.aios.base.mvp.BasePresenter; +import com.uiuios.aios.base.mvp.BaseView; import com.uiuios.aios.bean.HealthCode; import java.util.List; diff --git a/app/src/main/java/com/uiuios/aios/activity/contact/AddContactActivity.java b/app/src/main/java/com/uiuios/aios/activity/contact/AddContactActivity.java index 266e979..aba4e19 100644 --- a/app/src/main/java/com/uiuios/aios/activity/contact/AddContactActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/contact/AddContactActivity.java @@ -20,16 +20,14 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener; import com.shehuan.niv.NiceImageView; import com.trello.rxlifecycle4.RxLifecycle; import com.trello.rxlifecycle4.android.ActivityEvent; - import com.uiuios.aios.R; -import com.uiuios.aios.base.BaseLightActivity; +import com.uiuios.aios.base.BaseActivity; import com.uiuios.aios.base.GlideEngine; import com.uiuios.aios.bean.BaseResponse; import com.uiuios.aios.manager.RemoteManager; import com.uiuios.aios.network.NetInterfaceManager; import com.uiuios.aios.utils.GlideLoadUtils; import com.uiuios.aios.utils.ToastUtil; -import com.uiuios.aios.utils.Utils; import com.uiuios.aios.view.ToggleButton; import java.io.File; @@ -47,7 +45,7 @@ import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.RequestBody; -public class AddContactActivity extends BaseLightActivity { +public class AddContactActivity extends BaseActivity { private static final String TAG = AddContactActivity.class.getSimpleName(); @BindView(R.id.iv_cancel) @@ -72,6 +70,16 @@ public class AddContactActivity extends BaseLightActivity { return R.layout.activity_add_contact; } + @Override + protected boolean setNightMode() { + return true; + } + + @Override + protected boolean setfitWindow() { + return true; + } + @Override public void initView() { ButterKnife.bind(this); @@ -156,7 +164,7 @@ public class AddContactActivity extends BaseLightActivity { params.put("is_urgent", String.valueOf(toggleButton.isToggleOn())); NetInterfaceManager.getInstance() .getMailListAddObservable(params, body) - .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) + .compose(RxLifecycle.bindUntilEvent(getLifecycleSubject(), ActivityEvent.DESTROY)) .subscribe(new Observer() { @Override public void onSubscribe(@NonNull Disposable d) { diff --git a/app/src/main/java/com/uiuios/aios/activity/contact/ContactActivity.java b/app/src/main/java/com/uiuios/aios/activity/contact/ContactActivity.java index db0d452..73b9cf9 100644 --- a/app/src/main/java/com/uiuios/aios/activity/contact/ContactActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/contact/ContactActivity.java @@ -48,12 +48,22 @@ public class ContactActivity extends BaseActivity implements ContactContact.Cont return R.layout.activity_contact; } + @Override + protected boolean setNightMode() { + return false; + } + + @Override + protected boolean setfitWindow() { + return true; + } + @Override public void initView() { ButterKnife.bind(this); mContactPresenter = new ContactPresenter(this); mContactPresenter.attachView(this); - mContactPresenter.setLifecycle(lifecycleSubject); + mContactPresenter.setLifecycle(getLifecycleSubject()); mContactAdapter = new ContactAdapter(); if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { rv_contact.setLayoutManager(new GridLayoutManager(this, 3)); diff --git a/app/src/main/java/com/uiuios/aios/activity/contact/ContactContact.java b/app/src/main/java/com/uiuios/aios/activity/contact/ContactContact.java index 8aa65cb..6e74a17 100644 --- a/app/src/main/java/com/uiuios/aios/activity/contact/ContactContact.java +++ b/app/src/main/java/com/uiuios/aios/activity/contact/ContactContact.java @@ -1,7 +1,7 @@ package com.uiuios.aios.activity.contact; -import com.uiuios.aios.base.BasePresenter; -import com.uiuios.aios.base.BaseView; +import com.uiuios.aios.base.mvp.BasePresenter; +import com.uiuios.aios.base.mvp.BaseView; import com.uiuios.aios.bean.Contact; import java.util.List; diff --git a/app/src/main/java/com/uiuios/aios/activity/dialer/DialerActivity.java b/app/src/main/java/com/uiuios/aios/activity/dialer/DialerActivity.java index 4f6c4d0..1466ad7 100644 --- a/app/src/main/java/com/uiuios/aios/activity/dialer/DialerActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/dialer/DialerActivity.java @@ -68,6 +68,16 @@ public class DialerActivity extends BaseActivity { return R.layout.activity_dialer; } + @Override + protected boolean setNightMode() { + return false; + } + + @Override + protected boolean setfitWindow() { + return true; + } + @Override public void initView() { getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); diff --git a/app/src/main/java/com/uiuios/aios/activity/location/LocationAcivity.java b/app/src/main/java/com/uiuios/aios/activity/location/LocationAcivity.java index 681cf0b..b5c6a3e 100644 --- a/app/src/main/java/com/uiuios/aios/activity/location/LocationAcivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/location/LocationAcivity.java @@ -88,6 +88,16 @@ public class LocationAcivity extends BaseActivity implements LocationContact.Loc return R.layout.activity_location; } + @Override + protected boolean setNightMode() { + return false; + } + + @Override + protected boolean setfitWindow() { + return true; + } + /** * 初始化视图 */ @@ -96,7 +106,7 @@ public class LocationAcivity extends BaseActivity implements LocationContact.Loc ButterKnife.bind(this); mPresenter = new LocationPresenter(this); mPresenter.attachView(this); - mPresenter.setLifecycle(lifecycleSubject); + mPresenter.setLifecycle(getLifecycleSubject()); bg.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { diff --git a/app/src/main/java/com/uiuios/aios/activity/location/LocationContact.java b/app/src/main/java/com/uiuios/aios/activity/location/LocationContact.java index 70cba09..7c69e30 100644 --- a/app/src/main/java/com/uiuios/aios/activity/location/LocationContact.java +++ b/app/src/main/java/com/uiuios/aios/activity/location/LocationContact.java @@ -1,7 +1,7 @@ package com.uiuios.aios.activity.location; -import com.uiuios.aios.base.BasePresenter; -import com.uiuios.aios.base.BaseView; +import com.uiuios.aios.base.mvp.BasePresenter; +import com.uiuios.aios.base.mvp.BaseView; import com.uiuios.aios.bean.AddressBean; import java.util.List; diff --git a/app/src/main/java/com/uiuios/aios/activity/main/BaseMainActivity.java b/app/src/main/java/com/uiuios/aios/activity/main/BaseMainActivity.java index b676d78..2ab5d3b 100644 --- a/app/src/main/java/com/uiuios/aios/activity/main/BaseMainActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/main/BaseMainActivity.java @@ -87,13 +87,18 @@ public abstract class BaseMainActivity extends BaseActivity implements MainConta private int appListIndex = 3; private int defaultCurrent = 2; + @Override + protected boolean setfitWindow() { + return false; + } + @Override public void initView() { ButterKnife.bind(this); toggleNotificationListenerService(this); mMainPresenter = new MainPresenter(this); mMainPresenter.attachView(this); - mMainPresenter.setLifecycle(lifecycleSubject); + mMainPresenter.setLifecycle(getLifecycleSubject()); if (BuildConfig.DEBUG) { // SystemClock.setCurrentTimeMillis(1662123600000L);//09-02 diff --git a/app/src/main/java/com/uiuios/aios/activity/main/MainActivity.java b/app/src/main/java/com/uiuios/aios/activity/main/MainActivity.java index 6109531..952bc4b 100644 --- a/app/src/main/java/com/uiuios/aios/activity/main/MainActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/main/MainActivity.java @@ -16,6 +16,11 @@ public class MainActivity extends BaseMainActivity { return R.layout.activity_main; } + @Override + protected boolean setNightMode() { + return false; + } + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); diff --git a/app/src/main/java/com/uiuios/aios/activity/main/MainContact.java b/app/src/main/java/com/uiuios/aios/activity/main/MainContact.java index 2c930a8..e4abda1 100644 --- a/app/src/main/java/com/uiuios/aios/activity/main/MainContact.java +++ b/app/src/main/java/com/uiuios/aios/activity/main/MainContact.java @@ -1,7 +1,7 @@ package com.uiuios.aios.activity.main; -import com.uiuios.aios.base.BasePresenter; -import com.uiuios.aios.base.BaseView; +import com.uiuios.aios.base.mvp.BasePresenter; +import com.uiuios.aios.base.mvp.BaseView; public class MainContact { public interface Presenter extends BasePresenter { diff --git a/app/src/main/java/com/uiuios/aios/activity/main/PhoneMainActivity.java b/app/src/main/java/com/uiuios/aios/activity/main/PhoneMainActivity.java index 46ff825..f223b02 100644 --- a/app/src/main/java/com/uiuios/aios/activity/main/PhoneMainActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/main/PhoneMainActivity.java @@ -9,4 +9,9 @@ public class PhoneMainActivity extends BaseMainActivity { public int getLayoutId() { return R.layout.phone_activity_main; } + + @Override + protected boolean setNightMode() { + return false; + } } diff --git a/app/src/main/java/com/uiuios/aios/activity/weather/WeatherActivity.java b/app/src/main/java/com/uiuios/aios/activity/weather/WeatherActivity.java index d0b75c5..f1c07b1 100644 --- a/app/src/main/java/com/uiuios/aios/activity/weather/WeatherActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/weather/WeatherActivity.java @@ -1,266 +1,251 @@ package com.uiuios.aios.activity.weather; -import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.content.res.Resources; -import android.graphics.Color; +import android.icu.util.Calendar; import android.os.Bundle; -import android.os.Handler; -import android.os.Message; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.view.inputmethod.InputMethodManager; -import android.widget.ImageView; -import android.widget.TextView; import androidx.activity.result.ActivityResult; import androidx.activity.result.ActivityResultCallback; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; +import androidx.lifecycle.Observer; import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import com.bigkoo.pickerview.builder.OptionsPickerBuilder; -import com.bigkoo.pickerview.listener.OnOptionsSelectListener; -import com.bigkoo.pickerview.view.OptionsPickerView; +import com.blankj.utilcode.util.NetworkUtils; import com.google.gson.Gson; +import com.qweather.sdk.bean.base.Code; import com.qweather.sdk.bean.weather.WeatherDailyBean; +import com.qweather.sdk.bean.weather.WeatherNowBean; import com.tencent.mmkv.MMKV; import com.uiuios.aios.R; import com.uiuios.aios.activity.location.LocationAcivity; -import com.uiuios.aios.adapter.WeatherDayApdapter; -import com.uiuios.aios.base.BaseActivity; +import com.uiuios.aios.adapter.WeatherDayApdapterPort; +import com.uiuios.aios.base.mvvm.BaseMvvmActivity; import com.uiuios.aios.bean.JsonBean; import com.uiuios.aios.bean.MapGeoResult; import com.uiuios.aios.config.CommonConfig; -import com.uiuios.aios.gson.GetJsonDataUtil; +import com.uiuios.aios.databinding.ActivityWeatherBinding; import com.uiuios.aios.manager.RemoteManager; +import com.uiuios.aios.utils.DataUtil; +import com.uiuios.aios.utils.TimeUtils; import com.uiuios.aios.utils.ToastUtil; import com.uiuios.aios.view.HorizontalItemDecoration; - -import org.json.JSONArray; - import java.util.ArrayList; +import java.util.Date; import java.util.List; -import butterknife.BindView; -import butterknife.ButterKnife; - -public class WeatherActivity extends BaseActivity implements WeatherContact.WeatherView { +public class WeatherActivity extends BaseMvvmActivity + implements NetworkUtils.OnNetworkStatusChangedListener { private static final String TAG = WeatherActivity.class.getSimpleName(); - @BindView(R.id.rv_weather) - RecyclerView rv_weather; - @BindView(R.id.tv_location) - TextView tv_location; - @BindView(R.id.iv_back) - ImageView iv_back; - @BindView(R.id.tv_refresh) - TextView tv_refresh; - private WeatherPresenter mPresenter; - private WeatherDayApdapter mWeatherDayApdapter; + private WeatherDayApdapterPort mWeatherDayApdapter; private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); private List options1Items = new ArrayList<>(); private ArrayList> options2Items = new ArrayList<>(); private ArrayList>> options3Items = new ArrayList<>(); - private Thread thread; - private static final int MSG_LOAD_DATA = 0x0001; - private static final int MSG_LOAD_SUCCESS = 0x0002; - private static final int MSG_LOAD_FAILED = 0x0003; - private static boolean isLoaded = false; + private boolean mLoaded = false; - private String mProvince; - private String mCity; - private String mDistrict; + private ActivityResultLauncher register = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback() { + @Override + public void onActivityResult(ActivityResult result) { + Log.e(TAG, "onActivityResult: " + result); + if (result != null) { + Intent intent = result.getData(); + if (intent != null && result.getResultCode() == Activity.RESULT_OK) { + Bundle bundle = intent.getExtras(); + Log.e(TAG, "onActivityResult: " + bundle); + String address = bundle.getString("address"); + String district = bundle.getString("district"); + mMMKV.encode(CommonConfig.MANUALLY_SELECT_LOCATION_ADDRESS, address); + mMMKV.encode(CommonConfig.MANUALLY_SELECT_LOCATION_DISTRICT, district); + mViewModel.decodeGeo(address); + mViewDataBinding.tvLocation.setText(district); + } + } + } + }); - private ActivityResultLauncher register; + @Override + public void onDisconnected() { + + } + + @Override + public void onConnected(NetworkUtils.NetworkType networkType) { + + } @Override public int getLayoutId() { return R.layout.activity_weather; } + @Override + protected boolean setNightMode() { + return false; + } + + @Override + protected boolean setfitWindow() { + return true; + } + + @Override + protected void initDataBinding() { + mViewModel.setCtx(this); + mViewModel.setVDBinding(mViewDataBinding); + mViewModel.setLifecycle(getLifecycleSubject()); + + mViewDataBinding.setClick(new ClickListener()); + } + @Override public void initView() { - ButterKnife.bind(this); - mPresenter = new WeatherPresenter(this); - mPresenter.attachView(this); - mPresenter.setLifecycle(lifecycleSubject); + NetworkUtils.registerNetworkStatusChangedListener(this); + RemoteManager.getInstance().getLocation(); + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); Resources resources = getResources(); if (resources.getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); - rv_weather.addItemDecoration(new HorizontalItemDecoration(30, this));//10表示10dp + mViewDataBinding.rvWeather.addItemDecoration(new HorizontalItemDecoration(30, this));//10表示10dp } else { linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); } - rv_weather.setLayoutManager(linearLayoutManager); -// rv_weather.setLayoutManager(new GridLayoutManager(this, 3)); -// rv_weather.addItemDecoration(new RecyclerItemDecoration(ScreenUtils.dp2px(resources, 10), ScreenUtils.dp2px(resources, 10), 3)); - mWeatherDayApdapter = new WeatherDayApdapter(); - rv_weather.setAdapter(mWeatherDayApdapter); - iv_back.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - finish(); - } - }); - tv_refresh.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - String district = mMMKV.decodeString(CommonConfig.MANUALLY_SELECT_LOCATION_DISTRICT, ""); - String tude = mMMKV.decodeString(CommonConfig.MANUALLY_SELECT_LOCATION_TUDE, ""); - if (TextUtils.isEmpty(tude)) { - mPresenter.getLocation(); - } else { - tv_location.setText(district); - mPresenter.getWeather(tude); - } - ToastUtil.show("刷新成功"); - } - }); - tv_location.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - hideSoftKeyBoard(v); - if (!isLoaded) { - ToastUtil.show("位置数据没有加载完成"); - } else { -// showPickerView(); - register.launch(new Intent(WeatherActivity.this, LocationAcivity.class)); - } - } - }); - register = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback() { - @Override - public void onActivityResult(ActivityResult result) { - Log.e(TAG, "onActivityResult: " + result); - if (result != null) { - Intent intent = result.getData(); - if (intent != null && result.getResultCode() == Activity.RESULT_OK) { - Bundle bundle = intent.getExtras(); - Log.e(TAG, "onActivityResult: " + bundle); - String address = bundle.getString("address"); - mDistrict = bundle.getString("district"); - mMMKV.encode(CommonConfig.MANUALLY_SELECT_LOCATION_ADDRESS, address); - mMMKV.encode(CommonConfig.MANUALLY_SELECT_LOCATION_DISTRICT, mDistrict); - mPresenter.decodeGeo(address); - tv_location.setText(mDistrict); - } - } - } - }); - } + mViewDataBinding.rvWeather.setLayoutManager(linearLayoutManager); +// mViewDataBinding.rvWeather.setLayoutManager(new GridLayoutManager(this, 3)); +// mViewDataBinding.rvWeather.addItemDecoration(new RecyclerItemDecoration(ScreenUtils.dp2px(resources, 10), ScreenUtils.dp2px(resources, 10), 3)); + mWeatherDayApdapter = new WeatherDayApdapterPort(); + mViewDataBinding.rvWeather.setAdapter(mWeatherDayApdapter); - private void showPickerView() {// 弹出选择器 - OptionsPickerView pvOptions = new OptionsPickerBuilder(this, new OnOptionsSelectListener() { - @Override - public void onOptionsSelect(int options1, int options2, int options3, View v) { - //返回的分别是三个级别的选中位置 - mProvince = options1Items.size() > 0 ? - options1Items.get(options1).getPickerViewText() : ""; + mViewDataBinding.tvDate.setText(DataUtil.formatDateDay() + "\t" + TimeUtils.getWeek()); - mCity = options2Items.size() > 0 - && options2Items.get(options1).size() > 0 ? - options2Items.get(options1).get(options2) : ""; - - mDistrict = options2Items.size() > 0 - && options3Items.get(options1).size() > 0 - && options3Items.get(options1).get(options2).size() > 0 ? - options3Items.get(options1).get(options2).get(options3) : ""; - - String address = mProvince + mCity + mDistrict; - Log.e(TAG, "onOptionsSelect: " + address); - tv_location.setText(mDistrict); - mMMKV.encode(CommonConfig.MANUALLY_SELECT_LOCATION_ADDRESS, address); - mMMKV.encode(CommonConfig.MANUALLY_SELECT_LOCATION_DISTRICT, mDistrict); - mPresenter.decodeGeo(address); - - } - }) - - .setTitleText("城市选择") - .setDividerColor(Color.BLACK) - .setTextColorCenter(Color.BLACK) //设置选中项文字颜色 - .setContentTextSize(20) - .setLineSpacingMultiplier(2.5f) - .build(); - -// pvOptions.setPicker(options1Items);//一级选择器 -// pvOptions.setPicker(options1Items, options2Items);//二级选择器 - pvOptions.setPicker(options1Items, options2Items, options3Items);//三级选择器 - pvOptions.show(); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(new Date()); + int hour = calendar.get(Calendar.HOUR_OF_DAY); + if (6 < hour && hour < 18) { + mViewDataBinding.root.setBackground(getDrawable(R.drawable.weather_background_day)); + } else { + mViewDataBinding.root.setBackground(getDrawable(R.drawable.weather_background_night)); + } } @Override public void initData() { - mHandler.sendEmptyMessage(MSG_LOAD_DATA); - String district = mMMKV.decodeString(CommonConfig.MANUALLY_SELECT_LOCATION_DISTRICT, ""); - String tude = mMMKV.decodeString(CommonConfig.MANUALLY_SELECT_LOCATION_TUDE, ""); + + mViewModel.getOptions1ItemsData().observe(this, new Observer>() { + @Override + public void onChanged(List jsonBeans) { + options1Items = jsonBeans; + } + }); + mViewModel.getOptions2ItemsData().observe(this, new Observer>>() { + @Override + public void onChanged(ArrayList> arrayLists) { + options2Items = arrayLists; + } + }); + mViewModel.getOptions3ItemsData().observe(this, new Observer>>>() { + @Override + public void onChanged(ArrayList>> arrayLists) { + options3Items = arrayLists; + } + }); + mViewModel.getBooleanData().observe(this, new Observer() { + @Override + public void onChanged(Boolean aBoolean) { + mLoaded = aBoolean; + } + }); + + mViewModel.getGeoResultData().observe(this, new Observer() { + @Override + public void onChanged(MapGeoResult mapGeoResult) { + if (mapGeoResult != null) { + mMMKV.encode(CommonConfig.MANUALLY_SELECT_LOCATION_TUDE, mapGeoResult.getLocation().toString()); + mViewModel.getWeatherNow(mapGeoResult.getLocation().toString()); + mViewModel.getWeather7D(mapGeoResult.getLocation().toString()); + } else { + ToastUtil.show("获取位置信息失败"); + } + } + }); + mViewModel.getLocationData().observe(this, new Observer() { + @Override + public void onChanged(String s) { + mViewDataBinding.tvLocation.setText(s); + ToastUtil.show("刷新成功"); + mViewModel.decodeGeo(s); + } + }); + mViewModel.getWeatherNowData().observe(this, new Observer() { + @Override + public void onChanged(WeatherNowBean weatherNowBean) { + //先判断返回的status是否正确,当status正确时获取数据,若status不正确,可查看status对应的Code值找到原因 + if (weatherNowBean != null) { + if (Code.OK == weatherNowBean.getCode()) { + WeatherNowBean.NowBaseBean now = weatherNowBean.getNow(); + Log.d("getWeatherNow: ", "onSuccess: now " + new Gson().toJson(now)); + mViewDataBinding.setNowBaseBean(now); + ToastUtil.show("刷新成功"); + } else { + //在此查看返回数据失败的原因 + Code code = weatherNowBean.getCode(); + Log.d("getWeatherNow: ", "failed code: " + code); + } + } else { + Log.e(TAG, "getWeatherNow: weatherNowBean is null"); + ToastUtil.show("获取天气失败"); + mViewModel.getWeatherCache(); + } + } + }); + mViewModel.getWeatherDailyData().observe(this, new Observer() { + @Override + public void onChanged(WeatherDailyBean weatherDailyBean) { + if (weatherDailyBean != null) { + mWeatherDayApdapter.setDailyBeans(weatherDailyBean.getDaily()); + WeatherDailyBean.DailyBean dailyBean = weatherDailyBean.getDaily().get(0); + mViewDataBinding.tvMinMax.setText(dailyBean.getTempMin() + "℃ - " + dailyBean.getTempMax() + "℃"); + } + } + }); + + +// mViewModel.loadProvince(); + getWeather(); + } + + private void getWeather() { + String district = mMMKV.decodeString(CommonConfig.MANUALLY_SELECT_LOCATION_DISTRICT, CommonConfig.DEFAULT_LOCATION_DISTRICT); + String tude = mMMKV.decodeString(CommonConfig.MANUALLY_SELECT_LOCATION_TUDE, CommonConfig.DEFAULT_LOCATION_TUDE); if (TextUtils.isEmpty(tude)) { - mPresenter.getLocation(); + mViewModel.getLocation(); } else { - tv_location.setText(district); - mPresenter.getWeather(tude); + mViewDataBinding.tvLocation.setText(district); + mViewModel.getWeatherNow(tude); + mViewModel.getWeather7D(tude); } } - @Override - public void setGeo(MapGeoResult mapGeoresult) { - if (mapGeoresult != null) { - mMMKV.encode(CommonConfig.MANUALLY_SELECT_LOCATION_TUDE, mapGeoresult.getLocation().toString()); - mPresenter.getWeather(mapGeoresult.getLocation().toString()); - } else { - ToastUtil.show("获取位置信息失败"); - } - } - - @Override - public void setLocation(String location) { - tv_location.setText(location); - ToastUtil.show("刷新成功"); - mPresenter.getWeatherCache(); - } - - @Override - public void setWeatherCache(WeatherDailyBean weatherCache) { - if (weatherCache != null) { - mWeatherDayApdapter.setDailyBeans(weatherCache.getDaily()); - } - mPresenter.getWeather(RemoteManager.getInstance().getLocationTude()); - } - - @Override - public void setWeather(WeatherDailyBean weather) { - if (weather != null) { - mWeatherDayApdapter.setDailyBeans(weather.getDaily()); - } - } - - @Override - protected void onResume() { - super.onResume(); - } - - @Override - protected void onPause() { - super.onPause(); - } - @Override protected void onDestroy() { super.onDestroy(); - mPresenter.detachView(); + NetworkUtils.unregisterNetworkStatusChangedListener(this); } private void hideSoftKeyBoard(View view) { @@ -270,105 +255,31 @@ public class WeatherActivity extends BaseActivity implements WeatherContact.Weat } } - @SuppressLint("HandlerLeak") - private Handler mHandler = new Handler() { - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case MSG_LOAD_DATA: - if (thread == null) {//如果已创建就不再重新创建子线程了 - Log.e(TAG, "handleMessage: Begin Parse Data"); - thread = new Thread(new Runnable() { - @Override - public void run() { - // 子线程中解析省市区数据 - initJsonData(); - } - }); - thread.start(); - } - break; - case MSG_LOAD_SUCCESS: - Log.e(TAG, "handleMessage: Parse Succeed"); - isLoaded = true; - break; - - case MSG_LOAD_FAILED: - Log.e(TAG, "handleMessage: Parse Failed"); - break; - default: - } - } - }; - - - private void initJsonData() {//解析数据 - - /** - * 注意:assets 目录下的Json文件仅供参考,实际使用可自行替换文件 - * 关键逻辑在于循环体 - * - * */ - String JsonData = new GetJsonDataUtil().getJson(this, "province.json");//获取assets目录下的json文件数据 - - ArrayList jsonBean = parseData(JsonData);//用Gson 转成实体 - - /** - * 添加省份数据 - * - * 注意:如果是添加的JavaBean实体,则实体类需要实现 IPickerViewData 接口, - * PickerView会通过getPickerViewText方法获取字符串显示出来。 - */ - options1Items = jsonBean; - - for (int i = 0; i < jsonBean.size(); i++) {//遍历省份 - ArrayList cityList = new ArrayList<>();//该省的城市列表(第二级) - ArrayList> province_AreaList = new ArrayList<>();//该省的所有地区列表(第三极) - - for (int c = 0; c < jsonBean.get(i).getCityList().size(); c++) {//遍历该省份的所有城市 - String cityName = jsonBean.get(i).getCityList().get(c).getName(); - cityList.add(cityName);//添加城市 - ArrayList city_AreaList = new ArrayList<>();//该城市的所有地区列表 - - //如果无地区数据,建议添加空字符串,防止数据为null 导致三个选项长度不匹配造成崩溃 - /*if (jsonBean.get(i).getCityList().get(c).getArea() == null - || jsonBean.get(i).getCityList().get(c).getArea().size() == 0) { - city_AreaList.add(""); - } else { - city_AreaList.addAll(jsonBean.get(i).getCityList().get(c).getArea()); - }*/ - city_AreaList.addAll(jsonBean.get(i).getCityList().get(c).getArea()); - province_AreaList.add(city_AreaList);//添加该省所有地区数据 - } - - /** - * 添加城市数据 - */ - options2Items.add(cityList); - - /** - * 添加地区数据 - */ - options3Items.add(province_AreaList); + public class ClickListener { + public void exit(View view) { + finish(); } - mHandler.sendEmptyMessage(MSG_LOAD_SUCCESS); - } - - public ArrayList parseData(String result) {//Gson 解析 - ArrayList detail = new ArrayList<>(); - try { - JSONArray data = new JSONArray(result); - Gson gson = new Gson(); - for (int i = 0; i < data.length(); i++) { - JsonBean entity = gson.fromJson(data.optJSONObject(i).toString(), JsonBean.class); - detail.add(entity); - } - } catch (Exception e) { - e.printStackTrace(); - mHandler.sendEmptyMessage(MSG_LOAD_FAILED); + public void selectAddress(View view) { + hideSoftKeyBoard(view); +// if (!mLoaded) { +// ToastUtil.show("位置数据没有加载完成"); +// } else { + register.launch(new Intent(WeatherActivity.this, LocationAcivity.class)); +// } + } + + public void refresh(View view) { + String district = mMMKV.decodeString(CommonConfig.MANUALLY_SELECT_LOCATION_DISTRICT, CommonConfig.DEFAULT_LOCATION_DISTRICT); + String tude = mMMKV.decodeString(CommonConfig.MANUALLY_SELECT_LOCATION_TUDE, CommonConfig.DEFAULT_LOCATION_TUDE); + if (TextUtils.isEmpty(tude)) { + mViewModel.getLocation(); + } else { + mViewDataBinding.tvLocation.setText(district); + mViewModel.getWeatherNow(tude); + mViewModel.getWeather7D(tude); + } } - return detail; } } diff --git a/app/src/main/java/com/uiuios/aios/activity/weather/WeatherContact.java b/app/src/main/java/com/uiuios/aios/activity/weather/WeatherContact.java deleted file mode 100644 index 4f53f4d..0000000 --- a/app/src/main/java/com/uiuios/aios/activity/weather/WeatherContact.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.uiuios.aios.activity.weather; - -import com.qweather.sdk.bean.weather.WeatherDailyBean; -import com.uiuios.aios.base.BasePresenter; -import com.uiuios.aios.base.BaseView; -import com.uiuios.aios.bean.MapGeoResult; - -public class WeatherContact { - public interface Presenter extends BasePresenter { - void decodeGeo(String address); - //获取定位缓存 - void getLocation(); - //获取天气缓存 - void getWeatherCache(); - //获取天气 - void getWeather(String locationTude); - } - - public interface WeatherView extends BaseView { - void setGeo(MapGeoResult mapGeoresult); - //设置定位缓存 - void setLocation(String location); - //设置天气缓存 - void setWeatherCache(WeatherDailyBean weatherCache); - //设置天气 - void setWeather(WeatherDailyBean weather); - } -} diff --git a/app/src/main/java/com/uiuios/aios/activity/weather/WeatherPresenter.java b/app/src/main/java/com/uiuios/aios/activity/weather/WeatherPresenter.java deleted file mode 100644 index ab0c0e4..0000000 --- a/app/src/main/java/com/uiuios/aios/activity/weather/WeatherPresenter.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.uiuios.aios.activity.weather; - -import android.content.Context; -import android.util.Log; - -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; -import com.qweather.sdk.bean.weather.WeatherDailyBean; -import com.qweather.sdk.view.QWeather; -import com.tencent.mmkv.MMKV; -import com.trello.rxlifecycle4.RxLifecycle; -import com.trello.rxlifecycle4.android.ActivityEvent; -import com.uiuios.aios.bean.MapGeoBean; -import com.uiuios.aios.config.CommonConfig; -import com.uiuios.aios.manager.RemoteManager; -import com.uiuios.aios.network.NetInterfaceManager; - -import java.lang.reflect.Type; - -import io.reactivex.rxjava3.annotations.NonNull; -import io.reactivex.rxjava3.core.Observer; -import io.reactivex.rxjava3.disposables.Disposable; -import io.reactivex.rxjava3.subjects.BehaviorSubject; - -/** - * MainActivity和MainService 的 Presenter - * - * @author jgy02 - */ -public class WeatherPresenter implements WeatherContact.Presenter { - private static final String TAG = WeatherPresenter.class.getSimpleName(); - public static final String WEATHER_DAILY_KEY = "WEATHER_DAILY_JSON_STRING"; - private WeatherContact.WeatherView mView; - private Context mContext; - private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); - - private BehaviorSubject lifecycle; - - public void setLifecycle(BehaviorSubject lifecycle) { - this.lifecycle = lifecycle; - } - - public BehaviorSubject getLifecycle() { - return lifecycle; - } - - WeatherPresenter(Context context) { - this.mContext = context; - Log.e(TAG, "WeatherPresenter: " + context.getClass()); - } - - @Override - public void attachView(@NonNull WeatherContact.WeatherView view) { - this.mView = view; - } - - @Override - public void detachView() { - this.mView = null; - } - - - @Override - public void decodeGeo(String address) { - Log.e(TAG, "decodeGeo: " + address); - NetInterfaceManager.getInstance().getGeoObservable(address) - .compose(RxLifecycle.bindUntilEvent(lifecycle, ActivityEvent.DESTROY)) - .subscribe(new Observer() { - @Override - public void onSubscribe(@NonNull Disposable d) { - Log.e("decodeGeo", "onSubscribe: "); - } - - @Override - public void onNext(@NonNull MapGeoBean mapGeoBean) { - Log.e("decodeGeo", "onNext: " + mapGeoBean); - if (mapGeoBean.getStatus() == 0) { - mView.setGeo(mapGeoBean.getResult()); - } else { - mView.setGeo(null); - } - } - - @Override - public void onError(@NonNull Throwable e) { - Log.e("decodeGeo", "onError: " + e.getMessage()); - mView.setGeo(null); - onComplete(); - } - - @Override - public void onComplete() { - Log.e("decodeGeo", "onComplete: "); - } - }); - - } - - @Override - public void getLocation() { - String location = RemoteManager.getInstance().getDistrict(); - mView.setLocation(location); - } - - @Override - public void getWeatherCache() { - // TODO: 2022/1/21 读取json,反序列化,排序 - String jsonString = mMMKV.decodeString(WEATHER_DAILY_KEY, ""); - Type type = new TypeToken() { - }.getType(); - WeatherDailyBean weatherDailyBean = new Gson().fromJson(jsonString, type); - mView.setWeatherCache(weatherDailyBean); - } - - @Override - public void getWeather(String locationTude) { - QWeather.getWeather7D(mContext, locationTude, new QWeather.OnResultWeatherDailyListener() { - @Override - public void onError(Throwable throwable) { - Log.e("getWeather", "onError: " + throwable.getMessage()); - if (mView != null) { - mView.setWeather(null); - } - } - - @Override - public void onSuccess(WeatherDailyBean weatherDailyBean) { - String jsonString = new Gson().toJson(weatherDailyBean); - Log.d("getWeather", "onSuccess: " + jsonString); - mMMKV.encode(WEATHER_DAILY_KEY, jsonString); - if (mView != null) { - mView.setWeather(weatherDailyBean); - } - } - }); - } -} diff --git a/app/src/main/java/com/uiuios/aios/activity/weather/WeatherViewModel.java b/app/src/main/java/com/uiuios/aios/activity/weather/WeatherViewModel.java new file mode 100644 index 0000000..318dbda --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/activity/weather/WeatherViewModel.java @@ -0,0 +1,286 @@ +package com.uiuios.aios.activity.weather; + +import android.util.Log; + +import androidx.lifecycle.MutableLiveData; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.qweather.sdk.bean.base.Lang; +import com.qweather.sdk.bean.base.Unit; +import com.qweather.sdk.bean.weather.WeatherDailyBean; +import com.qweather.sdk.bean.weather.WeatherNowBean; +import com.qweather.sdk.view.QWeather; +import com.tencent.mmkv.MMKV; +import com.trello.rxlifecycle4.RxLifecycle; +import com.trello.rxlifecycle4.android.ActivityEvent; +import com.uiuios.aios.base.mvvm.BaseViewModel; +import com.uiuios.aios.bean.JsonBean; +import com.uiuios.aios.bean.MapGeoBean; +import com.uiuios.aios.bean.MapGeoResult; +import com.uiuios.aios.config.CommonConfig; +import com.uiuios.aios.databinding.ActivityWeatherBinding; +import com.uiuios.aios.gson.GetJsonDataUtil; +import com.uiuios.aios.manager.RemoteManager; +import com.uiuios.aios.network.NetInterfaceManager; + +import org.json.JSONArray; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; +import io.reactivex.rxjava3.annotations.NonNull; +import io.reactivex.rxjava3.core.Observable; +import io.reactivex.rxjava3.core.ObservableEmitter; +import io.reactivex.rxjava3.core.ObservableOnSubscribe; +import io.reactivex.rxjava3.core.Observer; +import io.reactivex.rxjava3.disposables.Disposable; +import io.reactivex.rxjava3.schedulers.Schedulers; + +public class WeatherViewModel extends BaseViewModel { + private static final String TAG = WeatherViewModel.class.getSimpleName(); + + private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); + + + @Override + public ActivityWeatherBinding getVDBinding() { + return binding; + } + + @Override + public void onDestroy() { + + } + + private MutableLiveData> mOptions1ItemsData = new MutableLiveData<>(); + private MutableLiveData>> mOptions2ItemsData = new MutableLiveData<>(); + private MutableLiveData>>> mOptions3ItemsData = new MutableLiveData<>(); + private MutableLiveData mBooleanData = new MutableLiveData<>(); + + + public MutableLiveData> getOptions1ItemsData() { + return mOptions1ItemsData; + } + + public MutableLiveData>> getOptions2ItemsData() { + return mOptions2ItemsData; + } + + public MutableLiveData>>> getOptions3ItemsData() { + return mOptions3ItemsData; + } + + public MutableLiveData getBooleanData() { + return mBooleanData; + } + + private MutableLiveData mGeoResultData = new MutableLiveData<>(); + private MutableLiveData mLocationData = new MutableLiveData<>(); + private MutableLiveData mWeatherNowData = new MutableLiveData<>(); + private MutableLiveData mWeatherDailyData = new MutableLiveData<>(); + + + public MutableLiveData getGeoResultData() { + return mGeoResultData; + } + + public MutableLiveData getLocationData() { + return mLocationData; + } + + public MutableLiveData getWeatherNowData() { + return mWeatherNowData; + } + + public MutableLiveData getWeatherDailyData() { + return mWeatherDailyData; + } + + + public void loadProvince() { + Observable.create(new ObservableOnSubscribe>() { + @Override + public void subscribe(@NonNull ObservableEmitter> emitter) throws Throwable { + Log.e("loadProvince", "subscribe: "); + String JsonData = new GetJsonDataUtil().getJson(getCtx(), "province.json");//获取assets目录下的json文件数据 + ArrayList detail = new ArrayList<>(); + JSONArray data = new JSONArray(JsonData); + Gson gson = new Gson(); + for (int i = 0; i < data.length(); i++) { + JsonBean entity = gson.fromJson(data.optJSONObject(i).toString(), JsonBean.class); + detail.add(entity); + } + emitter.onNext(detail); + } + }).subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("loadProvince", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull ArrayList jsonBeans) { + Log.e("loadProvince", "onNext: "); + mOptions1ItemsData.setValue(jsonBeans); + + ArrayList> options2Items = new ArrayList<>(); + ArrayList>> options3Items = new ArrayList<>(); + + for (int i = 0; i < jsonBeans.size(); i++) {//遍历省份 + ArrayList cityList = new ArrayList<>();//该省的城市列表(第二级) + ArrayList> province_AreaList = new ArrayList<>();//该省的所有地区列表(第三极) + + for (int c = 0; c < jsonBeans.get(i).getCityList().size(); c++) {//遍历该省份的所有城市 + String cityName = jsonBeans.get(i).getCityList().get(c).getName(); + cityList.add(cityName);//添加城市 + ArrayList city_AreaList = new ArrayList<>();//该城市的所有地区列表 + + //如果无地区数据,建议添加空字符串,防止数据为null 导致三个选项长度不匹配造成崩溃 + /*if (jsonBean.get(i).getCityList().get(c).getArea() == null + || jsonBean.get(i).getCityList().get(c).getArea().size() == 0) { + city_AreaList.add(""); + } else { + city_AreaList.addAll(jsonBean.get(i).getCityList().get(c).getArea()); + }*/ + city_AreaList.addAll(jsonBeans.get(i).getCityList().get(c).getArea()); + province_AreaList.add(city_AreaList);//添加该省所有地区数据 + } + options2Items.add(cityList); + /** + * 添加地区数据 + */ + options3Items.add(province_AreaList); + } + mOptions2ItemsData.setValue(options2Items); + mOptions3ItemsData.setValue(options3Items); + mBooleanData.setValue(true); + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("loadProvince", "onError: " + e.getMessage()); + mBooleanData.setValue(false); + } + + @Override + public void onComplete() { + Log.e("loadProvince", "onComplete: "); + } + }); + } + + public void decodeGeo(String address) { + Log.e(TAG, "decodeGeo: " + address); + NetInterfaceManager.getInstance().getGeoObservable(address) + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("decodeGeo", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull MapGeoBean mapGeoBean) { + Log.e("decodeGeo", "onNext: " + mapGeoBean); + if (mapGeoBean.getStatus() == 0) { + mGeoResultData.setValue(mapGeoBean.getResult()); + } else { + mGeoResultData.setValue(null); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("decodeGeo", "onError: " + e.getMessage()); + mGeoResultData.setValue(null); + onComplete(); + } + + @Override + public void onComplete() { + Log.e("decodeGeo", "onComplete: "); + } + }); + } + + + public void getWeatherCache() { + Log.e(TAG, "getWeatherCache: "); + String nowJsonString = mMMKV.decodeString(CommonConfig.WEATHER_NOW_KEY, ""); + Type nowType = new TypeToken() { + }.getType(); + try { + WeatherNowBean weatherNowBean = new Gson().fromJson(nowJsonString, nowType); + mWeatherNowData.setValue(weatherNowBean); + } catch (Exception e) { + Log.e(TAG, "getWeatherCache: now = " + e.getMessage()); + } + + + String jsonString = mMMKV.decodeString(CommonConfig.WEATHER_DAILY_KEY, ""); + Type type = new TypeToken() { + }.getType(); + try { + WeatherDailyBean weatherDailyBean = new Gson().fromJson(jsonString, type); + mWeatherDailyData.setValue(weatherDailyBean); + } catch (Exception e) { + Log.e(TAG, "getWeatherCache: Daily = " + e.getMessage()); + } + } + + public void getLocation() { + String location = RemoteManager.getInstance().getDistrict(); + mLocationData.setValue(location); + } + + public void getWeatherNow(String locationTude) { + Log.e(TAG, "getweather: " + locationTude); + /** + * 实况天气数据 + * @param location 所查询的地区,可通过该地区名称、ID、IP和经纬度进行查询经纬度格式:经度,纬度 + * (英文,分隔,十进制格式,北纬东经为正,南纬西经为负) + * @param lang (选填)多语言,可以不使用该参数,默认为简体中文 + * @param unit (选填)单位选择,公制(m)或英制(i),默认为公制单位 + * @param listener 网络访问结果回调 + */ + QWeather.getWeatherNow(getCtx(), locationTude, Lang.ZH_HANS, Unit.METRIC, new QWeather.OnResultWeatherNowListener() { + @Override + public void onError(Throwable e) { + Log.e("getWeatherNow", "onError: " + e); + mWeatherNowData.setValue(null); + } + + @Override + public void onSuccess(WeatherNowBean weatherBean) { + Log.d("getWeatherNow", "onSuccess: " + new Gson().toJson(weatherBean)); + String jsonString = new Gson().toJson(weatherBean); + mMMKV.encode(CommonConfig.WEATHER_NOW_KEY, jsonString); + mWeatherNowData.setValue(weatherBean); + } + }); + } + + public void getWeather7D(String locationTude) { + QWeather.getWeather7D(getCtx(), locationTude, new QWeather.OnResultWeatherDailyListener() { + @Override + public void onError(Throwable throwable) { + Log.e("getWeather", "onError: " + throwable.getMessage()); +// mWeatherDailyData.setValue(null); + } + + @Override + public void onSuccess(WeatherDailyBean weatherDailyBean) { + String jsonString = new Gson().toJson(weatherDailyBean); + Log.d("getWeather", "onSuccess: " + jsonString); + mMMKV.encode(CommonConfig.WEATHER_DAILY_KEY, jsonString); + mWeatherDailyData.setValue(weatherDailyBean); + } + }); + } + +} diff --git a/app/src/main/java/com/uiuios/aios/activity/wifi/WiFiContact.java b/app/src/main/java/com/uiuios/aios/activity/wifi/WiFiContact.java index 80235df..ce94a3f 100644 --- a/app/src/main/java/com/uiuios/aios/activity/wifi/WiFiContact.java +++ b/app/src/main/java/com/uiuios/aios/activity/wifi/WiFiContact.java @@ -1,7 +1,7 @@ package com.uiuios.aios.activity.wifi; -import com.uiuios.aios.base.BasePresenter; -import com.uiuios.aios.base.BaseView; +import com.uiuios.aios.base.mvp.BasePresenter; +import com.uiuios.aios.base.mvp.BaseView; import com.uiuios.aios.bean.WiFiInfo; import java.util.List; diff --git a/app/src/main/java/com/uiuios/aios/activity/wifi/WiFiManagerActivity.java b/app/src/main/java/com/uiuios/aios/activity/wifi/WiFiManagerActivity.java index 355d0ed..f85b5ce 100644 --- a/app/src/main/java/com/uiuios/aios/activity/wifi/WiFiManagerActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/wifi/WiFiManagerActivity.java @@ -16,7 +16,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.uiuios.aios.R; import com.uiuios.aios.adapter.AvailableWiFiAdapter; import com.uiuios.aios.adapter.SavedWiFiAdapter; -import com.uiuios.aios.base.BaseLightActivity; +import com.uiuios.aios.base.BaseActivity; import com.uiuios.aios.bean.WiFiInfo; import com.uiuios.aios.utils.ToastUtil; import com.uiuios.aios.view.HorizontalItemDecoration; @@ -26,7 +26,7 @@ import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; -public class WiFiManagerActivity extends BaseLightActivity implements WiFiContact.WiFiView { +public class WiFiManagerActivity extends BaseActivity implements WiFiContact.WiFiView { @BindView(R.id.iv_close) @@ -49,12 +49,22 @@ public class WiFiManagerActivity extends BaseLightActivity implements WiFiContac return R.layout.activity_wifi_manager; } + @Override + protected boolean setNightMode() { + return true; + } + + @Override + protected boolean setfitWindow() { + return true; + } + @Override public void initView() { ButterKnife.bind(this); mPresenter = new WiFiPresenter(this); mPresenter.attachView(this); - mPresenter.setLifecycle(lifecycleSubject); + mPresenter.setLifecycle(getLifecycleSubject()); iv_close.setOnClickListener(new View.OnClickListener() { @Override diff --git a/app/src/main/java/com/uiuios/aios/adapter/WeatherDayApdapterPort.java b/app/src/main/java/com/uiuios/aios/adapter/WeatherDayApdapterPort.java new file mode 100644 index 0000000..1cf2e67 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/adapter/WeatherDayApdapterPort.java @@ -0,0 +1,102 @@ +package com.uiuios.aios.adapter; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.qweather.sdk.bean.weather.WeatherDailyBean; +import com.uiuios.aios.R; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +public class WeatherDayApdapterPort extends RecyclerView.Adapter { + private static final String TAG = WeatherDayApdapterPort.class.getSimpleName(); + private List mDailyBeans; + private Context mContext; + + public void setDailyBeans(List dailyBeans) { + this.mDailyBeans = dailyBeans; + notifyDataSetChanged(); + } + + @NonNull + @Override + public WeatherHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + mContext = parent.getContext(); + return new WeatherHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_weather_port, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull WeatherHolder holder, int position) { + WeatherDailyBean.DailyBean dailyBean = mDailyBeans.get(position); + String dateString; + switch (position) { +// case 0: +// dateString = "今天"; +// break; +// case 1: +// dateString = "明天"; +// break; +// case 2: +// dateString = "后天"; +// break; + default: + dateString = dailyBean.getFxDate(); + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Date date = sdf.parse(dailyBean.getFxDate()); + SimpleDateFormat now = new SimpleDateFormat("MM月dd日"); + dateString = now.format(date); + } catch (ParseException e) { + e.printStackTrace(); + } + } + holder.tv_date.setText(dateString); + holder.tv_temp.setText(dailyBean.getTempMin() + "℃ / " + dailyBean.getTempMax() + "℃"); + holder.tv_weather.setText(dailyBean.getTextDay()); + String iconDay = dailyBean.getIconDay(); + + holder.iv_weather.setImageDrawable(getWeatherDrawable(iconDay)); + } + + private Drawable getWeatherDrawable(String iconName) { + int resID = mContext.getResources().getIdentifier("he" + iconName, "drawable", "com.uiui.aios"); + if (resID == 0) { + Log.e(TAG, "getView: not found src : " + iconName); + return mContext.getResources().getDrawable(R.drawable.he100); + } else { + return mContext.getResources().getDrawable(resID); + } + } + + @Override + public int getItemCount() { + return mDailyBeans == null ? 0 : mDailyBeans.size(); + } + + static class WeatherHolder extends RecyclerView.ViewHolder { + TextView tv_date; + ImageView iv_weather; + TextView tv_weather; + TextView tv_temp; + + public WeatherHolder(@NonNull View itemView) { + super(itemView); + tv_date = itemView.findViewById(R.id.tv_date); + iv_weather = itemView.findViewById(R.id.iv_weather); + tv_weather = itemView.findViewById(R.id.tv_weather); + tv_temp = itemView.findViewById(R.id.tv_temp); + } + } +} diff --git a/app/src/main/java/com/uiuios/aios/alarm/PortAlarmAdapter.java b/app/src/main/java/com/uiuios/aios/alarm/PortAlarmAdapter.java new file mode 100644 index 0000000..db8c1be --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/alarm/PortAlarmAdapter.java @@ -0,0 +1,287 @@ +package com.uiuios.aios.alarm; + +import android.graphics.Bitmap; +import android.media.AudioAttributes; +import android.media.MediaPlayer; +import android.text.TextUtils; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.resource.bitmap.RoundedCorners; +import com.bumptech.glide.request.RequestOptions; +import com.uiuios.aios.R; +import com.uiuios.aios.utils.FFmpegUtils; +import com.uiuios.aios.utils.ScreenUtils; +import com.uiuios.aios.utils.Utils; +import com.uiuios.aios.view.JzvdStdRound; +import com.uiuios.aios.view.ToggleButton; + +import java.io.File; +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.regex.Pattern; + +import io.reactivex.rxjava3.core.Observer; +import io.reactivex.rxjava3.disposables.Disposable; + +public class PortAlarmAdapter extends RecyclerView.Adapter { + + private FragmentActivity mContext; + private List mAlarmClockData; + private OnLongClickListener mOnLongClickListener; + + public void setAlarmClockData(List alarmClockData) { + this.mAlarmClockData = alarmClockData; + notifyDataSetChanged(); + } + + public void setOnLongClickListener(OnLongClickListener onLongClickListener) { + this.mOnLongClickListener = onLongClickListener; + } + + public interface OnLongClickListener { + void onLongClick(AlarmClockData alarmClockData); + } + + @NonNull + @Override + public holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + mContext = (FragmentActivity) parent.getContext(); + return new PortAlarmAdapter.holder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_alarm_port, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull holder holder, int position) { + AlarmClockData alarmClockData = mAlarmClockData.get(position); + switch (alarmClockData.getType()) { + case AlarmUtils.ONCE: + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + Date date = sdf.parse(alarmClockData.getTime()); + SimpleDateFormat hours = new SimpleDateFormat("HH:mm"); + String time = hours.format(date); + holder.tv_time.setText(time); + } catch (ParseException e) { + e.printStackTrace(); + } + holder.tv_remind_type.setText("一次"); + holder.tv_remind_type.setBackgroundResource(R.drawable.tv_times_bg_once); + break; + case AlarmUtils.LOOP: + holder.tv_time.setText(alarmClockData.getTime()); + holder.tv_remind_type.setText("每天"); + holder.tv_remind_type.setBackgroundResource(R.drawable.tv_times_bg_loop); + break; + case AlarmUtils.WORKING_DAY: + holder.tv_time.setText(alarmClockData.getTime()); + holder.tv_remind_type.setText("周一至周五"); + holder.tv_remind_type.setBackgroundResource(R.drawable.tv_times_bg_work); + break; + case AlarmUtils.OFF_DAY: + holder.tv_time.setText(alarmClockData.getTime()); + holder.tv_remind_type.setText("周六至周日"); + holder.tv_remind_type.setBackgroundResource(R.drawable.tv_times_bg_offday); + break; + default: + } + String title = alarmClockData.getTitle(); + if (TextUtils.isEmpty(title)) { + holder.tv_title.setText("无标题"); + } else { + holder.tv_title.setText(title); + } + int is_onoff = alarmClockData.getIs_onoff(); + holder.toggleButton2.setDisable(true); + if (is_onoff == 1) { + holder.tv_status.setText("已开启"); + holder.toggleButton2.setToggleOn(false); + } else { + holder.tv_status.setText("已关闭"); + holder.toggleButton2.setToggleOff(false); + } + int type = alarmClockData.getClazz(); + switch (type){ + case 1: + default: + holder.iv_type.setImageDrawable(mContext.getDrawable(R.drawable.icon_alarm_medicine_pressed)); + break; + case 2: + holder.iv_type.setImageDrawable(mContext.getDrawable(R.drawable.icon_alarm_look_pressed)); + break; + case 3: + holder.iv_type.setImageDrawable(mContext.getDrawable(R.drawable.icon_alarm_reserve_pressed)); + break; + } + String voice = alarmClockData.getVoice(); + if (TextUtils.isEmpty(voice)) { + holder.cl_voice.setVisibility(View.GONE); + } else { + holder.cl_voice.setVisibility(View.VISIBLE); + MediaPlayer mMediaPlayer = new MediaPlayer(); + mMediaPlayer.setAudioAttributes( + new AudioAttributes.Builder() + .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) + .build() + ); + mMediaPlayer.setOnCompletionListener(mp -> Log.e("setOnCompletionListener", "onCompletion: ")); + mMediaPlayer.setOnPreparedListener(mp -> Log.e("setOnPreparedListener", "onPrepared: ")); + mMediaPlayer.setOnErrorListener((mp, what, extra) -> false); + //设置音频文件到MediaPlayer对象中 + try { + mMediaPlayer.setDataSource(voice); + } catch (IOException e) { + e.printStackTrace(); + } + //让MediaPlayer对象准备,用这个方法防止加载时耗时导致anr + mMediaPlayer.prepareAsync(); + FFmpegUtils.getDurationInMilliseconds(voice, new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + + } + + @Override + public void onNext(@NonNull Integer integer) { + holder.tv_voice.setText(integer + "秒"); + } + + @Override + public void onError(@NonNull Throwable e) { + + } + + @Override + public void onComplete() { + + } + }); + holder.cl_voice.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mMediaPlayer.start(); + } + }); + } + String fileUrl = alarmClockData.getFile(); + if (TextUtils.isEmpty(fileUrl)) { + holder.cl_vp.setVisibility(View.GONE); + } else { + holder.cl_vp.setVisibility(View.VISIBLE); + if (isImgUrl(fileUrl)) { + holder.imageView.setVisibility(View.VISIBLE); + holder.jz_video.setVisibility(View.GONE); + if (!mContext.isDestroyed()) { + RequestOptions options = new RequestOptions().transform(new RoundedCorners(ScreenUtils.dip2px(mContext, 16F))); + Glide.with(mContext).load(fileUrl).apply(options).into(holder.imageView); + } + } else { + holder.imageView.setVisibility(View.GONE); + holder.jz_video.setVisibility(View.VISIBLE); + String fileName = Utils.getFileNamefromURL(fileUrl); + File file = new File(Utils.getDownLoadPath(mContext) + fileName); + String path; + if (file.exists() && !file.isDirectory()) { + path = file.getAbsolutePath(); + } else { + path = fileUrl; + } + holder.jz_video.setUp(path, ""); + holder.jz_video.startButton.setImageDrawable(mContext.getDrawable(R.drawable.play)); + FFmpegUtils.loadVideoScreenshot(path, new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + + } + + @Override + public void onNext(@NonNull Bitmap bitmap) { + if (!mContext.isDestroyed()) { + RequestOptions options = new RequestOptions().transform(new RoundedCorners(ScreenUtils.dip2px(mContext, 16F))); + Glide.with(mContext).load(bitmap).apply(options).into(holder.jz_video.posterImageView); +// Glide.with(mContext).load(bitmap).into(holder.imageView); + } + holder.jz_video.startButton.setImageDrawable(mContext.getDrawable(R.drawable.play)); + } + + @Override + public void onError(@NonNull Throwable e) { + + } + + @Override + public void onComplete() { + + } + }); + + } + } + holder.root.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View view) { + mOnLongClickListener.onLongClick(alarmClockData); + return false; + } + }); + holder.root.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { +// Intent intent = new Intent(mContext, AlarmClockEditActivity.class); +// intent.putExtra("id", alarmClockData.getId()); +// mContext.startActivity(intent); + } + }); + + } + + private Pattern mCompile = Pattern.compile(".*?(gif|jpeg|png|jpg|bmp|webp)"); + + private boolean isImgUrl(String url) { + if (TextUtils.isEmpty(url) || url.trim().length() == 0) { + return false; + } + return mCompile.matcher(url).matches(); + } + + @Override + public int getItemCount() { + return mAlarmClockData == null ? 0 : mAlarmClockData.size(); + } + + class holder extends RecyclerView.ViewHolder { + TextView tv_time, tv_remind_type, tv_title, tv_voice, tv_status; + ConstraintLayout cl_voice, cl_vp, root; + JzvdStdRound jz_video; + ImageView imageView,iv_type; + ToggleButton toggleButton2; + + public holder(@NonNull View itemView) { + super(itemView); + tv_time = itemView.findViewById(R.id.tv_time); + tv_remind_type = itemView.findViewById(R.id.tv_remind_type); + tv_title = itemView.findViewById(R.id.tv_title); + tv_voice = itemView.findViewById(R.id.tv_voice); + cl_voice = itemView.findViewById(R.id.cl_voice); + cl_vp = itemView.findViewById(R.id.cl_vp); + root = itemView.findViewById(R.id.root); + jz_video = itemView.findViewById(R.id.jz_video); + imageView = itemView.findViewById(R.id.imageView); + iv_type = itemView.findViewById(R.id.iv_type); + tv_status = itemView.findViewById(R.id.tv_status); + toggleButton2 = itemView.findViewById(R.id.toggleButton2); + } + } +} diff --git a/app/src/main/java/com/uiuios/aios/base/BaseActivity.java b/app/src/main/java/com/uiuios/aios/base/BaseActivity.java index 37e8ad3..5f0bc2b 100644 --- a/app/src/main/java/com/uiuios/aios/base/BaseActivity.java +++ b/app/src/main/java/com/uiuios/aios/base/BaseActivity.java @@ -3,127 +3,30 @@ package com.uiuios.aios.base; import android.os.Bundle; import androidx.annotation.CallSuper; -import androidx.annotation.CheckResult; -import androidx.annotation.ContentView; -import androidx.annotation.LayoutRes; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; -import com.trello.rxlifecycle4.LifecycleProvider; -import com.trello.rxlifecycle4.LifecycleTransformer; -import com.trello.rxlifecycle4.RxLifecycle; -import com.trello.rxlifecycle4.android.ActivityEvent; -import com.trello.rxlifecycle4.android.RxLifecycleAndroid; -import com.uiuios.aios.R; -import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX; - -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.subjects.BehaviorSubject; - - -public abstract class BaseActivity extends AppCompatActivity implements LifecycleProvider { - public final BehaviorSubject lifecycleSubject = BehaviorSubject.create(); +public abstract class BaseActivity extends BaseTransparentActivity { public BaseActivity() { super(); } - @ContentView - public BaseActivity(@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); -// StatusBarUtil.init(this); - UltimateBarX.statusBar(this) - .transparent() - .colorRes(R.color.colorPrimaryDark) -// .light(true) - .apply(); - UltimateBarX.navigationBar(this) - .transparent() - .colorRes(R.color.colorPrimaryDark) -// .light(true) - .apply(); - setContentView(this.getLayoutId()); + setContentView(getLayoutId()); initView(); initData(); } - /** - * 设置布局 - */ - public abstract int getLayoutId(); - /** * 初始化视图 */ - public abstract void initView(); - + protected 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(); - } -} + protected abstract void initData(); +} \ No newline at end of file diff --git a/app/src/main/java/com/uiuios/aios/base/BaseDataBindingActivity.java b/app/src/main/java/com/uiuios/aios/base/BaseDataBindingActivity.java index 5f88113..fcad6cc 100644 --- a/app/src/main/java/com/uiuios/aios/base/BaseDataBindingActivity.java +++ b/app/src/main/java/com/uiuios/aios/base/BaseDataBindingActivity.java @@ -3,121 +3,29 @@ package com.uiuios.aios.base; import android.os.Bundle; import androidx.annotation.CallSuper; -import androidx.annotation.CheckResult; -import androidx.annotation.ContentView; -import androidx.annotation.LayoutRes; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; -import com.trello.rxlifecycle4.LifecycleProvider; -import com.trello.rxlifecycle4.LifecycleTransformer; -import com.trello.rxlifecycle4.RxLifecycle; -import com.trello.rxlifecycle4.android.ActivityEvent; -import com.trello.rxlifecycle4.android.RxLifecycleAndroid; -import com.uiuios.aios.R; -import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX; - -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.subjects.BehaviorSubject; - -public abstract class BaseDataBindingActivity extends AppCompatActivity implements LifecycleProvider { - public final BehaviorSubject lifecycleSubject = BehaviorSubject.create(); +public abstract class BaseDataBindingActivity extends BaseTransparentActivity { public BaseDataBindingActivity() { super(); } - @ContentView - public BaseDataBindingActivity(@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); -// StatusBarUtil.init(this); - UltimateBarX.statusBar(this) - .transparent() - .colorRes(R.color.colorPrimaryDark) - .light(true) - .apply(); - UltimateBarX.navigationBar(this) - .transparent() - .colorRes(R.color.colorPrimaryDark) - .light(true) - .apply(); initView(); initData(); } - /** * 初始化视图 */ - public abstract void initView(); - + protected 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(); - } -} + protected abstract void initData(); +} \ No newline at end of file diff --git a/app/src/main/java/com/uiuios/aios/base/BaseLifecycleActivity.java b/app/src/main/java/com/uiuios/aios/base/BaseLifecycleActivity.java deleted file mode 100644 index fe530da..0000000 --- a/app/src/main/java/com/uiuios/aios/base/BaseLifecycleActivity.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.uiuios.aios.base; - -import android.os.Bundle; - -import androidx.annotation.CallSuper; -import androidx.annotation.CheckResult; -import androidx.annotation.ContentView; -import androidx.annotation.LayoutRes; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; - -import com.trello.rxlifecycle4.LifecycleProvider; -import com.trello.rxlifecycle4.LifecycleTransformer; -import com.trello.rxlifecycle4.RxLifecycle; -import com.trello.rxlifecycle4.android.ActivityEvent; -import com.trello.rxlifecycle4.android.RxLifecycleAndroid; - -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.subjects.BehaviorSubject; - - -public abstract class BaseLifecycleActivity extends AppCompatActivity implements LifecycleProvider { - public final BehaviorSubject lifecycleSubject = BehaviorSubject.create(); - - public BaseLifecycleActivity() { - super(); - } - - @ContentView - public BaseLifecycleActivity(@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); - setContentView(this.getLayoutId()); - initView(); - initData(); - } - - /** - * 设置布局 - */ - public abstract int getLayoutId(); - - /** - * 初始化视图 - */ - 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/base/BaseLightActivity.java b/app/src/main/java/com/uiuios/aios/base/BaseLightActivity.java deleted file mode 100644 index eea5aed..0000000 --- a/app/src/main/java/com/uiuios/aios/base/BaseLightActivity.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.uiuios.aios.base; - -import android.os.Bundle; - -import androidx.annotation.CallSuper; -import androidx.annotation.CheckResult; -import androidx.annotation.ContentView; -import androidx.annotation.LayoutRes; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; - -import com.trello.rxlifecycle4.LifecycleProvider; -import com.trello.rxlifecycle4.LifecycleTransformer; -import com.trello.rxlifecycle4.RxLifecycle; -import com.trello.rxlifecycle4.android.ActivityEvent; -import com.trello.rxlifecycle4.android.RxLifecycleAndroid; -import com.uiuios.aios.R; -import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX; - -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.subjects.BehaviorSubject; - - -public abstract class BaseLightActivity extends AppCompatActivity implements LifecycleProvider { - public final BehaviorSubject lifecycleSubject = BehaviorSubject.create(); - - public BaseLightActivity() { - super(); - } - - @ContentView - public BaseLightActivity(@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); -// StatusBarUtil.init(this); - UltimateBarX.statusBar(this) - .transparent() - .colorRes(R.color.colorPrimaryDark) - .light(true) - .apply(); - UltimateBarX.navigationBar(this) - .transparent() - .colorRes(R.color.colorPrimaryDark) - .light(true) - .apply(); - setContentView(this.getLayoutId()); - initView(); - initData(); - } - - /** - * 设置布局 - */ - public abstract int getLayoutId(); - - /** - * 初始化视图 - */ - 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/base/BasePresenter.java b/app/src/main/java/com/uiuios/aios/base/BasePresenter.java deleted file mode 100644 index 29ff126..0000000 --- a/app/src/main/java/com/uiuios/aios/base/BasePresenter.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.uiuios.aios.base; - -import androidx.annotation.NonNull; - -public interface BasePresenter { - - void attachView(@NonNull V view); - - void detachView(); -} diff --git a/app/src/main/java/com/uiuios/aios/base/DataBindingActivity.java b/app/src/main/java/com/uiuios/aios/base/BaseRxActivity.java similarity index 73% rename from app/src/main/java/com/uiuios/aios/base/DataBindingActivity.java rename to app/src/main/java/com/uiuios/aios/base/BaseRxActivity.java index 48a05df..001cef2 100644 --- a/app/src/main/java/com/uiuios/aios/base/DataBindingActivity.java +++ b/app/src/main/java/com/uiuios/aios/base/BaseRxActivity.java @@ -4,8 +4,6 @@ import android.os.Bundle; import androidx.annotation.CallSuper; import androidx.annotation.CheckResult; -import androidx.annotation.ContentView; -import androidx.annotation.LayoutRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; @@ -15,22 +13,19 @@ import com.trello.rxlifecycle4.LifecycleTransformer; import com.trello.rxlifecycle4.RxLifecycle; import com.trello.rxlifecycle4.android.ActivityEvent; import com.trello.rxlifecycle4.android.RxLifecycleAndroid; -import com.uiuios.aios.R; -import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX; import io.reactivex.rxjava3.core.Observable; import io.reactivex.rxjava3.subjects.BehaviorSubject; -public abstract class DataBindingActivity extends AppCompatActivity implements LifecycleProvider { - public final BehaviorSubject lifecycleSubject = BehaviorSubject.create(); +/** + * {@link com.trello.rxlifecycle4.components.RxActivity} + * copied form RxActivity} + */ +public abstract class BaseRxActivity extends AppCompatActivity implements LifecycleProvider { + private final BehaviorSubject lifecycleSubject = BehaviorSubject.create(); - public DataBindingActivity() { - super(); - } - - @ContentView - public DataBindingActivity(@LayoutRes int contentLayoutId) { - super(contentLayoutId); + public BehaviorSubject getLifecycleSubject() { + return lifecycleSubject; } @Override @@ -59,22 +54,8 @@ public abstract class DataBindingActivity extends AppCompatActivity implements L 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() { @@ -110,3 +91,4 @@ public abstract class DataBindingActivity extends AppCompatActivity implements L super.onDestroy(); } } + diff --git a/app/src/main/java/com/uiuios/aios/base/BaseTransparentActivity.java b/app/src/main/java/com/uiuios/aios/base/BaseTransparentActivity.java new file mode 100644 index 0000000..fa9bc71 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/base/BaseTransparentActivity.java @@ -0,0 +1,50 @@ +package com.uiuios.aios.base; + +import android.os.Bundle; + +import androidx.annotation.CallSuper; +import androidx.annotation.Nullable; + +import com.uiuios.aios.R; +import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX; + +public abstract class BaseTransparentActivity extends BaseRxActivity { + + public BaseTransparentActivity() { + super(); + } + + @Override + @CallSuper + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); +// StatusBarUtil.init(this); + UltimateBarX.statusBar(this) + .transparent() + .colorRes(R.color.colorPrimaryDark) + .light(setNightMode()) + .fitWindow(setfitWindow()) + .apply(); + UltimateBarX.navigationBar(this) + .transparent() + .colorRes(R.color.colorPrimaryDark) + .light(setNightMode()) + .fitWindow(setfitWindow()) + .apply(); + } + + /** + * 设置布局 + */ + protected abstract int getLayoutId(); + + /** + * @return 是否是黑色状态栏 + */ + protected abstract boolean setNightMode(); + + /** + * @return 是否是入侵 + */ + protected abstract boolean setfitWindow(); +} \ No newline at end of file diff --git a/app/src/main/java/com/uiuios/aios/base/BaseView.java b/app/src/main/java/com/uiuios/aios/base/BaseView.java deleted file mode 100644 index 0fef6e2..0000000 --- a/app/src/main/java/com/uiuios/aios/base/BaseView.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.uiuios.aios.base; - -public interface BaseView { -} diff --git a/app/src/main/java/com/uiuios/aios/base/mvp/BaseMvpActivity.java b/app/src/main/java/com/uiuios/aios/base/mvp/BaseMvpActivity.java new file mode 100644 index 0000000..ed3350e --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/base/mvp/BaseMvpActivity.java @@ -0,0 +1,34 @@ +package com.uiuios.aios.base.mvp; + +import android.os.Bundle; + +import androidx.annotation.CallSuper; +import androidx.annotation.Nullable; + +import com.uiuios.aios.base.BaseTransparentActivity; + +public abstract class BaseMvpActivity extends BaseTransparentActivity { + + public BaseMvpActivity() { + super(); + } + + @Override + @CallSuper + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(getLayoutId()); + initView(); + initData(); + } + + /** + * 初始化视图 + */ + protected abstract void initView(); + + /** + * 初始化数据 + */ + protected abstract void initData(); +} diff --git a/app/src/main/java/com/uiuios/aios/base/mvp/BasePresenter.java b/app/src/main/java/com/uiuios/aios/base/mvp/BasePresenter.java new file mode 100644 index 0000000..75d7426 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/base/mvp/BasePresenter.java @@ -0,0 +1,7 @@ +package com.uiuios.aios.base.mvp; + +public interface BasePresenter { + void attachView(V view); + + void detachView(); +} \ No newline at end of file diff --git a/app/src/main/java/com/uiuios/aios/base/mvp/BaseView.java b/app/src/main/java/com/uiuios/aios/base/mvp/BaseView.java new file mode 100644 index 0000000..e4a67d1 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/base/mvp/BaseView.java @@ -0,0 +1,5 @@ +package com.uiuios.aios.base.mvp; + +public interface BaseView { + +} \ No newline at end of file diff --git a/app/src/main/java/com/uiuios/aios/base/mvvm/BaseMvvmActivity.java b/app/src/main/java/com/uiuios/aios/base/mvvm/BaseMvvmActivity.java new file mode 100644 index 0000000..ede9309 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/base/mvvm/BaseMvvmActivity.java @@ -0,0 +1,54 @@ +package com.uiuios.aios.base.mvvm; + +import android.os.Bundle; +import android.util.Log; + +import androidx.annotation.Nullable; +import androidx.databinding.DataBindingUtil; +import androidx.databinding.ViewDataBinding; +import androidx.lifecycle.ViewModel; +import androidx.lifecycle.ViewModelProvider; + +import com.uiuios.aios.base.BaseTransparentActivity; + +import java.lang.reflect.Modifier; +import java.lang.reflect.ParameterizedType; + +public abstract class BaseMvvmActivity extends BaseTransparentActivity { + + private static final String TAG = BaseMvvmActivity.class.getSimpleName(); + + protected VM mViewModel; + protected VDB mViewDataBinding; + protected Class vmClass; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + //ViewDataBinding + mViewDataBinding = DataBindingUtil.setContentView(this, getLayoutId()); + mViewDataBinding.setLifecycleOwner(this); + //ViewModel + vmClass = (Class) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]; + boolean isAbstract = Modifier.isAbstract(vmClass.getModifiers()); + Log.e(TAG, "isLocalClass:" + vmClass.getSimpleName().equals(ViewModel.class.getSimpleName()) + " isAbstract:" + isAbstract); + if (!isAbstract) {//不是一个抽象类 + mViewModel = new ViewModelProvider(this).get(vmClass); + } + initDataBinding(); + initView(); + initData(); + } + + protected abstract void initDataBinding(); + + /** + * 初始化视图 + */ + protected abstract void initView(); + + /** + * 初始化数据 + */ + protected abstract void initData(); +} diff --git a/app/src/main/java/com/uiuios/aios/base/mvvm/BaseViewModel.java b/app/src/main/java/com/uiuios/aios/base/mvvm/BaseViewModel.java new file mode 100644 index 0000000..3415461 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/base/mvvm/BaseViewModel.java @@ -0,0 +1,73 @@ +package com.uiuios.aios.base.mvvm; + +import android.content.Context; + +import androidx.databinding.ViewDataBinding; +import androidx.lifecycle.ViewModel; + +import com.trello.rxlifecycle4.android.ActivityEvent; + +import java.lang.ref.WeakReference; + +import io.reactivex.rxjava3.subjects.BehaviorSubject; + +/** + * 所有viewmodel的基类 + */ +public abstract class BaseViewModel extends ViewModel implements ViewDataBindingCallback { + + /** + * 当前viewmodel对应的页面binding + */ + protected VDB binding; + + @Override + public void setVDBinding(ViewDataBinding vdBinding) { + + binding = (VDB)vdBinding; + } + + @Override + public VDB getVDBinding() { + if (binding == null) { + throw new NullPointerException("BaseViewModel >> getVDBinding >> null!!!"); + } + return binding; + } + + + /** + * 上下文 + */ + private WeakReference ctx; + + @Override + public void setCtx(Context context) { + if(ctx == null) { + ctx = new WeakReference<>(context); + } + } + + @Override + public Context getCtx() { + if (ctx == null) { + throw new NullPointerException("BaseViewModel >> getCtx >> null!!!"); + } + return ctx.get(); + } + + + public abstract void onDestroy(); + + private BehaviorSubject mBehaviorSubject; + + @Override + public void setLifecycle(BehaviorSubject subject) { + this.mBehaviorSubject =subject; + } + + @Override + public BehaviorSubject getLifecycle() { + return mBehaviorSubject; + } +} diff --git a/app/src/main/java/com/uiuios/aios/base/mvvm/ViewDataBindingCallback.java b/app/src/main/java/com/uiuios/aios/base/mvvm/ViewDataBindingCallback.java new file mode 100644 index 0000000..aa6660a --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/base/mvvm/ViewDataBindingCallback.java @@ -0,0 +1,26 @@ +package com.uiuios.aios.base.mvvm; + +import android.content.Context; + +import androidx.databinding.ViewDataBinding; + +import com.trello.rxlifecycle4.android.ActivityEvent; + +import io.reactivex.rxjava3.subjects.BehaviorSubject; + +public interface ViewDataBindingCallback { + + + void setVDBinding(VDB binding); + + VDB getVDBinding() throws NullPointerException; + + + void setCtx(Context context); + + Context getCtx() throws NullPointerException; + + void setLifecycle(BehaviorSubject subject); + + BehaviorSubject getLifecycle(); +} 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 c9572a2..cde96bb 100644 --- a/app/src/main/java/com/uiuios/aios/config/CommonConfig.java +++ b/app/src/main/java/com/uiuios/aios/config/CommonConfig.java @@ -34,8 +34,12 @@ public class CommonConfig { public static final String MANUALLY_SELECT_LOCATION_ADDRESS = "map_manually_select_location"; /*手动选择位置 区*/ public static final String MANUALLY_SELECT_LOCATION_DISTRICT = "map_manually_select_district"; + /*默认地址北京*/ + public static final String DEFAULT_LOCATION_DISTRICT = "北京"; /*手动选择位置 经纬度*/ public static final String MANUALLY_SELECT_LOCATION_TUDE = "map_manually_select_tude"; + /*默认北京原点*/ + public static final String DEFAULT_LOCATION_TUDE = "116.40529,39.90499"; /*默认地址id*/ @@ -43,4 +47,8 @@ public class CommonConfig { /*默认地址json*/ public static final String MAP_DEFAULT_ADDRESS_JSON_KEY = "amap_default_address_json_key"; + + + public static final String WEATHER_NOW_KEY = "WEATHER_NOW_JSON_STRING"; + public static final String WEATHER_DAILY_KEY = "WEATHER_DAILY_JSON_STRING"; } diff --git a/app/src/main/java/com/uiuios/aios/fragment/custom/CustomContact.java b/app/src/main/java/com/uiuios/aios/fragment/custom/CustomContact.java index f79b142..f485b70 100644 --- a/app/src/main/java/com/uiuios/aios/fragment/custom/CustomContact.java +++ b/app/src/main/java/com/uiuios/aios/fragment/custom/CustomContact.java @@ -1,8 +1,7 @@ package com.uiuios.aios.fragment.custom; -import com.uiuios.aios.base.BasePresenter; -import com.uiuios.aios.base.BaseView; -import com.uiuios.aios.bean.SnInfo; +import com.uiuios.aios.base.mvp.BasePresenter; +import com.uiuios.aios.base.mvp.BaseView; import com.uiuios.aios.bean.UserAvatarInfo; public class CustomContact { diff --git a/app/src/main/java/com/uiuios/aios/fragment/custom/CustomFragment.java b/app/src/main/java/com/uiuios/aios/fragment/custom/CustomFragment.java index 9f431f2..be0a7d3 100644 --- a/app/src/main/java/com/uiuios/aios/fragment/custom/CustomFragment.java +++ b/app/src/main/java/com/uiuios/aios/fragment/custom/CustomFragment.java @@ -52,16 +52,15 @@ import com.uiuios.aios.R; import com.uiuios.aios.activity.ControlActivity; import com.uiuios.aios.activity.EmergencyActivity; import com.uiuios.aios.activity.QuickAppActivity; -import com.uiuios.aios.activity.alarm.AlarmActivity; +import com.uiuios.aios.activity.alarm.port.PortAlarmActivity; import com.uiuios.aios.activity.code.FamilySpaceActivity; import com.uiuios.aios.activity.contact.ContactActivity; import com.uiuios.aios.activity.weather.WeatherActivity; -import com.uiuios.aios.activity.weather.WeatherPresenter; import com.uiuios.aios.adapter.NotificationAdapter; import com.uiuios.aios.adapter.SOSNnmberAdapter; +import com.uiuios.aios.alarm.AlarmClockData; import com.uiuios.aios.alarm.AlarmUtils; import com.uiuios.aios.base.BaseFragment; -import com.uiuios.aios.alarm.AlarmClockData; import com.uiuios.aios.bean.AlarmItem; import com.uiuios.aios.bean.Contact; import com.uiuios.aios.bean.HealthCode; @@ -883,7 +882,7 @@ public class CustomFragment extends BaseFragment implements CustomContact.Custom } private void getAlarm() { - startActivity(new Intent(mContext, AlarmActivity.class)); + startActivity(new Intent(mContext, PortAlarmActivity.class)); // NetInterfaceManager.getInstance().getAlarmClock(new NetInterfaceManager.AlarmClockCallback() { // @Override // public void setAlarmClock(List alarmClockList) { @@ -1086,7 +1085,7 @@ public class CustomFragment extends BaseFragment implements CustomContact.Custom public void onSuccess(WeatherDailyBean weatherDailyBean) { String jsonString = new Gson().toJson(weatherDailyBean); Log.d("getWeather", "onSuccess: " + jsonString); - mMMKV.encode(WeatherPresenter.WEATHER_DAILY_KEY, jsonString); + mMMKV.encode(CommonConfig.WEATHER_DAILY_KEY, jsonString); List dailyBeans = weatherDailyBean.getDaily(); if (dailyBeans != null && dailyBeans.size() != 0) { WeatherDailyBean.DailyBean dailyBean = weatherDailyBean.getDaily().get(0); diff --git a/app/src/main/java/com/uiuios/aios/fragment/home/HomeContact.java b/app/src/main/java/com/uiuios/aios/fragment/home/HomeContact.java index 97fff91..2a59203 100644 --- a/app/src/main/java/com/uiuios/aios/fragment/home/HomeContact.java +++ b/app/src/main/java/com/uiuios/aios/fragment/home/HomeContact.java @@ -1,8 +1,8 @@ package com.uiuios.aios.fragment.home; import com.uiuios.aios.alarm.AlarmClockData; -import com.uiuios.aios.base.BasePresenter; -import com.uiuios.aios.base.BaseView; +import com.uiuios.aios.base.mvp.BasePresenter; +import com.uiuios.aios.base.mvp.BaseView; import com.uiuios.aios.bean.DesktopIcon; import java.util.ArrayList; diff --git a/app/src/main/java/com/uiuios/aios/fragment/home/HomeFragment.java b/app/src/main/java/com/uiuios/aios/fragment/home/HomeFragment.java index 36d0c17..4c227d2 100644 --- a/app/src/main/java/com/uiuios/aios/fragment/home/HomeFragment.java +++ b/app/src/main/java/com/uiuios/aios/fragment/home/HomeFragment.java @@ -35,10 +35,9 @@ import com.tencent.mmkv.MMKV; import com.uiuios.aios.BuildConfig; import com.uiuios.aios.R; import com.uiuios.aios.activity.EmergencyActivity; -import com.uiuios.aios.activity.alarm.AlarmActivity; +import com.uiuios.aios.activity.alarm.port.PortAlarmActivity; import com.uiuios.aios.activity.contact.ContactActivity; import com.uiuios.aios.activity.weather.WeatherActivity; -import com.uiuios.aios.activity.weather.WeatherPresenter; import com.uiuios.aios.adapter.HomeAppAdapter; import com.uiuios.aios.adapter.NotificationAdapter; import com.uiuios.aios.alarm.AlarmClockData; @@ -292,7 +291,7 @@ public class HomeFragment extends BaseFragment implements HomeContact.PrecisionV iv_note_nodata.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - startActivity(new Intent(mContext, AlarmActivity.class)); + startActivity(new Intent(mContext, PortAlarmActivity.class)); } }); } @@ -400,7 +399,7 @@ public class HomeFragment extends BaseFragment implements HomeContact.PrecisionV } private void getAlarm() { - startActivity(new Intent(mContext, AlarmActivity.class)); + startActivity(new Intent(mContext, PortAlarmActivity.class)); } private void checkSosNumber() { @@ -617,7 +616,7 @@ public class HomeFragment extends BaseFragment implements HomeContact.PrecisionV public void onSuccess(WeatherDailyBean weatherDailyBean) { String jsonString = new Gson().toJson(weatherDailyBean); Log.d("getWeather", "onSuccess: " + jsonString); - mMMKV.encode(WeatherPresenter.WEATHER_DAILY_KEY, jsonString); + mMMKV.encode(CommonConfig.WEATHER_DAILY_KEY, jsonString); List dailyBeans = weatherDailyBean.getDaily(); if (dailyBeans != null && dailyBeans.size() != 0) { WeatherDailyBean.DailyBean dailyBean = weatherDailyBean.getDaily().get(0); diff --git a/app/src/main/java/com/uiuios/aios/fragment/second/SecondContact.java b/app/src/main/java/com/uiuios/aios/fragment/second/SecondContact.java index 00d09db..62890c4 100644 --- a/app/src/main/java/com/uiuios/aios/fragment/second/SecondContact.java +++ b/app/src/main/java/com/uiuios/aios/fragment/second/SecondContact.java @@ -1,8 +1,8 @@ package com.uiuios.aios.fragment.second; import com.uiui.video.bean.VideoInfo; -import com.uiuios.aios.base.BasePresenter; -import com.uiuios.aios.base.BaseView; +import com.uiuios.aios.base.mvp.BasePresenter; +import com.uiuios.aios.base.mvp.BaseView; import com.uiuios.aios.bean.ArticleInfo; import com.uiuios.aios.bean.GoodsInfo; diff --git a/app/src/main/java/com/uiuios/aios/service/main/MainSContact.java b/app/src/main/java/com/uiuios/aios/service/main/MainSContact.java index 55573e6..9b7ab3b 100644 --- a/app/src/main/java/com/uiuios/aios/service/main/MainSContact.java +++ b/app/src/main/java/com/uiuios/aios/service/main/MainSContact.java @@ -1,8 +1,8 @@ package com.uiuios.aios.service.main; -import com.uiuios.aios.base.BasePresenter; -import com.uiuios.aios.base.BaseView; import com.uiuios.aios.alarm.AlarmClockData; +import com.uiuios.aios.base.mvp.BasePresenter; +import com.uiuios.aios.base.mvp.BaseView; import java.util.List; diff --git a/app/src/main/java/com/uiuios/aios/utils/DataUtil.java b/app/src/main/java/com/uiuios/aios/utils/DataUtil.java new file mode 100644 index 0000000..3ab573c --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/utils/DataUtil.java @@ -0,0 +1,42 @@ +package com.uiuios.aios.utils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * 作者 mjsheng + * 日期 2018/8/31 09:50 + * 邮箱 501802639@qq.com + * 来自: + */ + +public class DataUtil { + private static SimpleDateFormat day = new SimpleDateFormat("MM月dd日"); + private static SimpleDateFormat hour = new SimpleDateFormat("HH:mm"); + private static SimpleDateFormat minute = new SimpleDateFormat("mm"); + + /** + * 格式化日期(精确到天) + */ + public static String formatDateDay() { + return day.format(new Date()); + } + + public static String formatDateTime() { + return hour.format(new Date()); + } + + /** + * 格式化日期(hour) + */ + public static String formatDateHour() { + return hour.format(new Date()); + } + + /** + * 格式化日期(minute) + */ + public static String formatDateMinute() { + return minute.format(new Date()); + } +} diff --git a/app/src/main/java/com/uiuios/aios/utils/GlideLoadUtils.java b/app/src/main/java/com/uiuios/aios/utils/GlideLoadUtils.java index 02828be..d8e0cc9 100644 --- a/app/src/main/java/com/uiuios/aios/utils/GlideLoadUtils.java +++ b/app/src/main/java/com/uiuios/aios/utils/GlideLoadUtils.java @@ -43,11 +43,19 @@ public class GlideLoadUtils { * @param context * @param url 加载图片的url地址 String * @param imageView 加载图片的ImageView 控件 - * @param default_image 图片展示错误的本地图片 id + * @param defaultImage 图片展示错误的本地图片 id */ - public void glideLoad(Context context, String url, ImageView imageView, int default_image) { + public void glideLoad(Context context, String url, ImageView imageView, int defaultImage) { if (context != null) { - Glide.with(context).load(url).centerCrop().error(default_image).into(imageView); + Glide.with(context).load(url).centerCrop().error(defaultImage).into(imageView); + } else { + Log.i(TAG, "Picture loading failed,context is null"); + } + } + + public void glideLoad(Context context, int resId, ImageView imageView, int defaultImage) { + if (context != null) { + Glide.with(context).load(resId).centerCrop().error(defaultImage).into(imageView); } else { Log.i(TAG, "Picture loading failed,context is null"); } @@ -90,7 +98,7 @@ public class GlideLoadUtils { if (fragment != null && fragment.getActivity() != null) { Glide.with(fragment).load(url).centerCrop().error(default_image).into(imageView); } else { - Log.i(TAG, "Picture loading failed,android.app.SecondFragment is null"); + Log.i(TAG, "Picture loading failed,android.app.Fragment is null"); } } } diff --git a/app/src/main/java/com/uiuios/aios/utils/TimeUtils.java b/app/src/main/java/com/uiuios/aios/utils/TimeUtils.java index b850326..34e7a9d 100644 --- a/app/src/main/java/com/uiuios/aios/utils/TimeUtils.java +++ b/app/src/main/java/com/uiuios/aios/utils/TimeUtils.java @@ -8,6 +8,7 @@ import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.util.Calendar; import java.util.Date; public class TimeUtils { @@ -46,4 +47,17 @@ public class TimeUtils { String timeString = String.format("%02d:%02d:%02d", hours, minutes, seconds); return timeString; } + + // 根据日期取得星期几 + public static String getWeek() { + Date date = new Date(); + String[] weeks = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"}; + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + int weekIndex = cal.get(Calendar.DAY_OF_WEEK) - 1; + if (weekIndex < 0) { + weekIndex = 0; + } + return weeks[weekIndex]; + } } diff --git a/app/src/main/java/com/uiuios/aios/view/FAB_Float_on_Scroll.java b/app/src/main/java/com/uiuios/aios/view/FAB_Float_on_Scroll.java new file mode 100644 index 0000000..6a65856 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/view/FAB_Float_on_Scroll.java @@ -0,0 +1,38 @@ +package com.uiuios.aios.view; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.view.animation.LinearInterpolator; + +import androidx.coordinatorlayout.widget.CoordinatorLayout; +import androidx.core.view.ViewCompat; + +import com.google.android.material.floatingactionbutton.FloatingActionButton; + +public class FAB_Float_on_Scroll extends FloatingActionButton.Behavior { + + public FAB_Float_on_Scroll(Context context, AttributeSet attrs) { + super(); + } + + @Override + public void onNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) { + super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed); + + //child -> Floating Action Button + if (dyConsumed > 0) { + CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) child.getLayoutParams(); + int fab_bottomMargin = layoutParams.bottomMargin; + child.animate().translationY(child.getHeight() + fab_bottomMargin).setInterpolator(new LinearInterpolator()).start(); + } else if (dyConsumed < 0) { + child.animate().translationY(0).setInterpolator(new LinearInterpolator()).start(); + } + } + + @Override + public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View directTargetChild, View target, int nestedScrollAxes) { + return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL; + } +} + diff --git a/app/src/main/java/com/uiuios/aios/view/ImageViewAdapter.java b/app/src/main/java/com/uiuios/aios/view/ImageViewAdapter.java index fd442db..85abf75 100644 --- a/app/src/main/java/com/uiuios/aios/view/ImageViewAdapter.java +++ b/app/src/main/java/com/uiuios/aios/view/ImageViewAdapter.java @@ -1,51 +1,38 @@ package com.uiuios.aios.view; +import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; +import android.text.TextUtils; import android.widget.ImageView; import android.widget.TextView; import androidx.databinding.BindingAdapter; import com.bumptech.glide.Glide; +import com.uiuios.aios.R; +import com.uiuios.aios.utils.GlideLoadUtils; import com.uiuios.aios.utils.TimeUtils; public class ImageViewAdapter { -// @BindingAdapter("android:src") -// public static void setSrc(ImageView view, Bitmap bitmap) { -// view.setImageBitmap(bitmap); -// } -// -// @BindingAdapter("android:src") -// public static void setSrc(ImageView view, int resId) { -// view.setImageResource(resId); -// } -// -// @BindingAdapter("imageUrl") -// public static void setSrc(ImageView imageView, String url) { -// Glide.with(imageView.getContext()) -// .load(url) -// .error(R.mipmap.ic_launcher) -// .into(imageView); -// } -// -// @BindingAdapter({"app:imageUrl", "app:placeHolder", "app:error"}) -// public static void loadImage(ImageView imageView, String url, Drawable holderDrawable, Drawable errorDrawable) { -// Glide.with(imageView.getContext()) -// .load(url) -// .placeholder(holderDrawable) -// .error(errorDrawable) -// .into(imageView); -// } -// -// @BindingAdapter({"app:imageUrl", "app:errorDrawableId", "app:placeDrawableId"}) -// public static void loadImage(ImageView imageView, String url, int errorDrawableId, int placeDrawableId) { -// Glide.with(imageView.getContext()) -// .load(url) -// .error(errorDrawableId) -// .placeholder(placeDrawableId) -// .into(imageView); -// } + @BindingAdapter("android:src") + public static void setSrc(ImageView view, Bitmap bitmap) { + view.setImageBitmap(bitmap); + } + + @BindingAdapter("android:src") + public static void setSrc(ImageView view, int resId) { + view.setImageResource(resId); + } + + @BindingAdapter("imageUrl") + public static void setSrc(ImageView imageView, String url) { + Glide.with(imageView.getContext()) + .load(url) + .error(R.mipmap.ic_launcher) + .centerCrop() + .into(imageView); + } /** * 自定义设置图片属性 - 在匹配时自定义命名空间会被忽略 @@ -57,10 +44,26 @@ public class ImageViewAdapter { .error(error) .into(imageView); } + @BindingAdapter({"setTime"}) public static void setTime(TextView textView, long timestamp) { textView.setText(TimeUtils.transferSecondgToDate(timestamp)); } + @BindingAdapter({"setTemp"}) + public static void setTemp(TextView textView, String temp) { + if (TextUtils.isEmpty(temp)) { + textView.setText("N/A ℃"); + } else { + textView.setText(temp + " ℃"); + } + } + @BindingAdapter({"setTempIcon"}) + public static void setTempIcon(ImageView imageView, String code) { + String imageName = "he" + code; + Context context = imageView.getContext(); + int resId = context.getResources().getIdentifier(imageName, "drawable", context.getPackageName()); + GlideLoadUtils.getInstance().glideLoad(context, resId, imageView, R.drawable.he999); + } } \ No newline at end of file diff --git a/app/src/main/res/drawable-xhdpi/com_android_appstore2.png b/app/src/main/res/drawable-hdpi/com_android_appstore2.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/com_android_appstore2.png rename to app/src/main/res/drawable-hdpi/com_android_appstore2.png diff --git a/app/src/main/res/drawable-xhdpi/com_android_aweme2.png b/app/src/main/res/drawable-hdpi/com_android_aweme2.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/com_android_aweme2.png rename to app/src/main/res/drawable-hdpi/com_android_aweme2.png diff --git a/app/src/main/res/drawable-xhdpi/com_android_browser2.png b/app/src/main/res/drawable-hdpi/com_android_browser2.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/com_android_browser2.png rename to app/src/main/res/drawable-hdpi/com_android_browser2.png diff --git a/app/src/main/res/drawable-xhdpi/com_android_camera2.png b/app/src/main/res/drawable-hdpi/com_android_camera2.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/com_android_camera2.png rename to app/src/main/res/drawable-hdpi/com_android_camera2.png diff --git a/app/src/main/res/drawable-xhdpi/com_android_dialer2.png b/app/src/main/res/drawable-hdpi/com_android_dialer2.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/com_android_dialer2.png rename to app/src/main/res/drawable-hdpi/com_android_dialer2.png diff --git a/app/src/main/res/drawable-xhdpi/com_android_gallery3d_app2.png b/app/src/main/res/drawable-hdpi/com_android_gallery3d_app2.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/com_android_gallery3d_app2.png rename to app/src/main/res/drawable-hdpi/com_android_gallery3d_app2.png diff --git a/app/src/main/res/drawable-xhdpi/com_android_mms_ui2.png b/app/src/main/res/drawable-hdpi/com_android_mms_ui2.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/com_android_mms_ui2.png rename to app/src/main/res/drawable-hdpi/com_android_mms_ui2.png diff --git a/app/src/main/res/drawable-xhdpi/com_android_news2.png b/app/src/main/res/drawable-hdpi/com_android_news2.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/com_android_news2.png rename to app/src/main/res/drawable-hdpi/com_android_news2.png diff --git a/app/src/main/res/drawable-xhdpi/com_android_settings2.png b/app/src/main/res/drawable-hdpi/com_android_settings2.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/com_android_settings2.png rename to app/src/main/res/drawable-hdpi/com_android_settings2.png diff --git a/app/src/main/res/drawable-xhdpi/com_tencent_mm2.png b/app/src/main/res/drawable-hdpi/com_tencent_mm2.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/com_tencent_mm2.png rename to app/src/main/res/drawable-hdpi/com_tencent_mm2.png diff --git a/app/src/main/res/drawable-xhdpi/com_uiui_sn2.png b/app/src/main/res/drawable-hdpi/com_uiui_sn2.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/com_uiui_sn2.png rename to app/src/main/res/drawable-hdpi/com_uiui_sn2.png diff --git a/app/src/main/res/drawable-xhdpi/com_uiui_weather2.png b/app/src/main/res/drawable-hdpi/com_uiui_weather2.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/com_uiui_weather2.png rename to app/src/main/res/drawable-hdpi/com_uiui_weather2.png diff --git a/app/src/main/res/drawable-hdpi/fb_alarm_add.png b/app/src/main/res/drawable-hdpi/fb_alarm_add.png new file mode 100644 index 0000000..7d3f513 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/fb_alarm_add.png differ diff --git a/app/src/main/res/drawable-hdpi/icon_add.png b/app/src/main/res/drawable-hdpi/icon_add.png index f952fc5..0ee1422 100644 Binary files a/app/src/main/res/drawable-hdpi/icon_add.png and b/app/src/main/res/drawable-hdpi/icon_add.png differ diff --git a/app/src/main/res/drawable-hdpi/icon_exit.png b/app/src/main/res/drawable-hdpi/icon_exit.png new file mode 100644 index 0000000..a84eb0e Binary files /dev/null and b/app/src/main/res/drawable-hdpi/icon_exit.png differ diff --git a/app/src/main/res/drawable-xhdpi/weather2.png b/app/src/main/res/drawable-hdpi/weather2.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/weather2.png rename to app/src/main/res/drawable-hdpi/weather2.png diff --git a/app/src/main/res/drawable-xxhdpi/he100.png b/app/src/main/res/drawable-xxhdpi/he100.png new file mode 100644 index 0000000..faf04c8 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he100.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he101.png b/app/src/main/res/drawable-xxhdpi/he101.png new file mode 100644 index 0000000..17841e4 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he101.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he102.png b/app/src/main/res/drawable-xxhdpi/he102.png new file mode 100644 index 0000000..51bc5a8 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he102.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he103.png b/app/src/main/res/drawable-xxhdpi/he103.png new file mode 100644 index 0000000..5fd9957 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he103.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he104.png b/app/src/main/res/drawable-xxhdpi/he104.png new file mode 100644 index 0000000..9628fbd Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he104.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he150.png b/app/src/main/res/drawable-xxhdpi/he150.png new file mode 100644 index 0000000..eaee769 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he150.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he153.png b/app/src/main/res/drawable-xxhdpi/he153.png new file mode 100644 index 0000000..346a2c2 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he153.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he154.png b/app/src/main/res/drawable-xxhdpi/he154.png new file mode 100644 index 0000000..358be1a Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he154.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he300.png b/app/src/main/res/drawable-xxhdpi/he300.png new file mode 100644 index 0000000..24ba9bc Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he300.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he301.png b/app/src/main/res/drawable-xxhdpi/he301.png new file mode 100644 index 0000000..ad65de8 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he301.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he302.png b/app/src/main/res/drawable-xxhdpi/he302.png new file mode 100644 index 0000000..4a018ee Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he302.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he303.png b/app/src/main/res/drawable-xxhdpi/he303.png new file mode 100644 index 0000000..aa8d273 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he303.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he304.png b/app/src/main/res/drawable-xxhdpi/he304.png new file mode 100644 index 0000000..3155a49 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he304.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he305.png b/app/src/main/res/drawable-xxhdpi/he305.png new file mode 100644 index 0000000..f76f6e3 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he305.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he306.png b/app/src/main/res/drawable-xxhdpi/he306.png new file mode 100644 index 0000000..ffb6804 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he306.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he307.png b/app/src/main/res/drawable-xxhdpi/he307.png new file mode 100644 index 0000000..1e33073 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he307.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he308.png b/app/src/main/res/drawable-xxhdpi/he308.png new file mode 100644 index 0000000..2586187 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he308.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he309.png b/app/src/main/res/drawable-xxhdpi/he309.png new file mode 100644 index 0000000..9beebe3 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he309.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he310.png b/app/src/main/res/drawable-xxhdpi/he310.png new file mode 100644 index 0000000..624b04e Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he310.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he311.png b/app/src/main/res/drawable-xxhdpi/he311.png new file mode 100644 index 0000000..5fcc3fc Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he311.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he312.png b/app/src/main/res/drawable-xxhdpi/he312.png new file mode 100644 index 0000000..0e93ff7 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he312.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he313.png b/app/src/main/res/drawable-xxhdpi/he313.png new file mode 100644 index 0000000..ba783d6 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he313.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he314.png b/app/src/main/res/drawable-xxhdpi/he314.png new file mode 100644 index 0000000..9e93846 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he314.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he315.png b/app/src/main/res/drawable-xxhdpi/he315.png new file mode 100644 index 0000000..527e6fe Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he315.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he316.png b/app/src/main/res/drawable-xxhdpi/he316.png new file mode 100644 index 0000000..8309afb Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he316.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he317.png b/app/src/main/res/drawable-xxhdpi/he317.png new file mode 100644 index 0000000..2e9a702 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he317.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he318.png b/app/src/main/res/drawable-xxhdpi/he318.png new file mode 100644 index 0000000..b99b851 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he318.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he350.png b/app/src/main/res/drawable-xxhdpi/he350.png new file mode 100644 index 0000000..a9a0c52 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he350.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he351.png b/app/src/main/res/drawable-xxhdpi/he351.png new file mode 100644 index 0000000..f7bdda3 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he351.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he399.png b/app/src/main/res/drawable-xxhdpi/he399.png new file mode 100644 index 0000000..321233b Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he399.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he400.png b/app/src/main/res/drawable-xxhdpi/he400.png new file mode 100644 index 0000000..532879b Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he400.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he401.png b/app/src/main/res/drawable-xxhdpi/he401.png new file mode 100644 index 0000000..4a92fc7 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he401.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he402.png b/app/src/main/res/drawable-xxhdpi/he402.png new file mode 100644 index 0000000..ccc2dab Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he402.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he403.png b/app/src/main/res/drawable-xxhdpi/he403.png new file mode 100644 index 0000000..da32ebe Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he403.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he404.png b/app/src/main/res/drawable-xxhdpi/he404.png new file mode 100644 index 0000000..99a3d9d Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he404.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he405.png b/app/src/main/res/drawable-xxhdpi/he405.png new file mode 100644 index 0000000..c3ac8d4 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he405.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he406.png b/app/src/main/res/drawable-xxhdpi/he406.png new file mode 100644 index 0000000..01348b1 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he406.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he407.png b/app/src/main/res/drawable-xxhdpi/he407.png new file mode 100644 index 0000000..37cdd78 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he407.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he408.png b/app/src/main/res/drawable-xxhdpi/he408.png new file mode 100644 index 0000000..f8d216c Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he408.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he409.png b/app/src/main/res/drawable-xxhdpi/he409.png new file mode 100644 index 0000000..e7e729b Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he409.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he410.png b/app/src/main/res/drawable-xxhdpi/he410.png new file mode 100644 index 0000000..3e4dcf2 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he410.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he456.png b/app/src/main/res/drawable-xxhdpi/he456.png new file mode 100644 index 0000000..1b080c7 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he456.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he457.png b/app/src/main/res/drawable-xxhdpi/he457.png new file mode 100644 index 0000000..1b610d2 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he457.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he499.png b/app/src/main/res/drawable-xxhdpi/he499.png new file mode 100644 index 0000000..c486a59 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he499.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he500.png b/app/src/main/res/drawable-xxhdpi/he500.png new file mode 100644 index 0000000..dcecc31 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he500.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he501.png b/app/src/main/res/drawable-xxhdpi/he501.png new file mode 100644 index 0000000..41fba52 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he501.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he502.png b/app/src/main/res/drawable-xxhdpi/he502.png new file mode 100644 index 0000000..6ffda43 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he502.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he503.png b/app/src/main/res/drawable-xxhdpi/he503.png new file mode 100644 index 0000000..f7e2296 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he503.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he504.png b/app/src/main/res/drawable-xxhdpi/he504.png new file mode 100644 index 0000000..b26ea7b Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he504.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he507.png b/app/src/main/res/drawable-xxhdpi/he507.png new file mode 100644 index 0000000..43b1e6e Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he507.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he508.png b/app/src/main/res/drawable-xxhdpi/he508.png new file mode 100644 index 0000000..f932cd9 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he508.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he509.png b/app/src/main/res/drawable-xxhdpi/he509.png new file mode 100644 index 0000000..b1a8adb Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he509.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he510.png b/app/src/main/res/drawable-xxhdpi/he510.png new file mode 100644 index 0000000..eecaf5d Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he510.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he511.png b/app/src/main/res/drawable-xxhdpi/he511.png new file mode 100644 index 0000000..b0bcd8e Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he511.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he512.png b/app/src/main/res/drawable-xxhdpi/he512.png new file mode 100644 index 0000000..0d98a13 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he512.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he513.png b/app/src/main/res/drawable-xxhdpi/he513.png new file mode 100644 index 0000000..e1128ff Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he513.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he514.png b/app/src/main/res/drawable-xxhdpi/he514.png new file mode 100644 index 0000000..cb9adbc Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he514.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he515.png b/app/src/main/res/drawable-xxhdpi/he515.png new file mode 100644 index 0000000..2faa917 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he515.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he900.png b/app/src/main/res/drawable-xxhdpi/he900.png new file mode 100644 index 0000000..cbdb3e7 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he900.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he901.png b/app/src/main/res/drawable-xxhdpi/he901.png new file mode 100644 index 0000000..bc6d105 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he901.png differ diff --git a/app/src/main/res/drawable-xxhdpi/he999.png b/app/src/main/res/drawable-xxhdpi/he999.png new file mode 100644 index 0000000..4ce8569 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/he999.png differ diff --git a/app/src/main/res/drawable/tv_add_alarm_background.xml b/app/src/main/res/drawable/tv_add_alarm_background.xml new file mode 100644 index 0000000..435a83c --- /dev/null +++ b/app/src/main/res/drawable/tv_add_alarm_background.xml @@ -0,0 +1,16 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/weather_background.xml b/app/src/main/res/drawable/weather_background.xml new file mode 100644 index 0000000..ef61d8e --- /dev/null +++ b/app/src/main/res/drawable/weather_background.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/weather_background_day.xml b/app/src/main/res/drawable/weather_background_day.xml new file mode 100644 index 0000000..3f5fd03 --- /dev/null +++ b/app/src/main/res/drawable/weather_background_day.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/weather_background_night.xml b/app/src/main/res/drawable/weather_background_night.xml new file mode 100644 index 0000000..98fd85f --- /dev/null +++ b/app/src/main/res/drawable/weather_background_night.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-land/activity_weather.xml b/app/src/main/res/layout-land/activity_weather.xml deleted file mode 100644 index 4f310e0..0000000 --- a/app/src/main/res/layout-land/activity_weather.xml +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout-port/activity_weather.xml b/app/src/main/res/layout-port/activity_weather.xml deleted file mode 100644 index 50a2526..0000000 --- a/app/src/main/res/layout-port/activity_weather.xml +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_alarm_port.xml b/app/src/main/res/layout/activity_add_alarm_port.xml new file mode 100644 index 0000000..ab430ab --- /dev/null +++ b/app/src/main/res/layout/activity_add_alarm_port.xml @@ -0,0 +1,432 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_alarm_port.xml b/app/src/main/res/layout/activity_alarm_port.xml new file mode 100644 index 0000000..49ceab0 --- /dev/null +++ b/app/src/main/res/layout/activity_alarm_port.xml @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_notice_info.xml b/app/src/main/res/layout/activity_notice_info.xml index c8f7e93..8aaafad 100644 --- a/app/src/main/res/layout/activity_notice_info.xml +++ b/app/src/main/res/layout/activity_notice_info.xml @@ -21,10 +21,10 @@ @@ -67,10 +67,10 @@ + android:src="@drawable/icon_nodata" />