diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b7d3be5..e50918d 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -117,6 +117,10 @@
android:resource="@xml/provider_paths" />
+
+
diff --git a/app/src/main/java/com/ttstd/elderlyassistant/activity/write/WriteMessageActivity.java b/app/src/main/java/com/ttstd/elderlyassistant/activity/write/WriteMessageActivity.java
index d0e288f..777bbbb 100644
--- a/app/src/main/java/com/ttstd/elderlyassistant/activity/write/WriteMessageActivity.java
+++ b/app/src/main/java/com/ttstd/elderlyassistant/activity/write/WriteMessageActivity.java
@@ -12,7 +12,6 @@ import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.Ndef;
-import android.os.Bundle;
import android.provider.MediaStore;
import android.text.Editable;
import android.text.TextUtils;
@@ -24,13 +23,10 @@ import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
-import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;
-import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.Observer;
-import androidx.lifecycle.ViewModelProvider;
import com.bumptech.glide.Glide;
import com.google.gson.Gson;
@@ -38,6 +34,7 @@ import com.google.gson.reflect.TypeToken;
import com.hjq.toast.Toaster;
import com.ttstd.elderlyassistant.BuildConfig;
import com.ttstd.elderlyassistant.R;
+import com.ttstd.elderlyassistant.base.mvvm.BaseMvvmActivity;
import com.ttstd.elderlyassistant.bean.ContactInfo;
import com.ttstd.elderlyassistant.databinding.ActivityWriteMessageBinding;
import com.ttstd.elderlyassistant.gson.GsonUtils;
@@ -52,8 +49,7 @@ import java.io.IOException;
import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets;
-
-public class WriteMessageActivity extends AppCompatActivity {
+public class WriteMessageActivity extends BaseMvvmActivity {
private static final String TAG = "WriteMessageActivity";
private static final int REQUEST_PERMISSION_CODE = 1234;
private static final int REQUEST_CAMERA = 1111;
@@ -61,9 +57,6 @@ public class WriteMessageActivity extends AppCompatActivity {
private static final int REQUEST_CROP = 3333;
- private ActivityWriteMessageBinding mBinding;
- private WriteMessageViewModel mViewModel;
-
private Gson mGson = new Gson();
private NfcAdapter mNfcAdapter;
@@ -74,15 +67,20 @@ public class WriteMessageActivity extends AppCompatActivity {
private String mUploadImageUrl;
@Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-// setContentView(R.layout.activity_write_message);
- mBinding = DataBindingUtil.setContentView(this, R.layout.activity_write_message);
- mBinding.setLifecycleOwner(this);
- mBinding.setClick(new BtnClick());
- mViewModel = new ViewModelProvider(this).get(WriteMessageViewModel.class);
- mBinding.setViewModel(mViewModel);
+ protected int getLayoutId() {
+ return R.layout.activity_write_message;
+ }
+ @Override
+ protected void initDataBinding() {
+ mViewModel.setContext(this);
+ mViewModel.setVDBinding(mViewDataBinding);
+ mViewModel.setLifecycle(getLifecycleSubject());
+ mViewDataBinding.setClick(new BtnClick());
+ }
+
+ @Override
+ protected void initView() {
Log.e(TAG, "onCreate: getDataDir = " + getDataDir().getAbsolutePath());
Log.e(TAG, "onCreate: getExternalFilesDir = " + getExternalFilesDir(null));
Log.e(TAG, "onCreate: getFilesDir = " + getFilesDir());
@@ -108,6 +106,11 @@ public class WriteMessageActivity extends AppCompatActivity {
});
}
+ @Override
+ protected void initData() {
+
+ }
+
@Override
protected void onStart() {
super.onStart();
@@ -157,7 +160,7 @@ public class WriteMessageActivity extends AppCompatActivity {
//2.获取Ndef的实例
Ndef ndef = Ndef.get(mTag);
String id = HexUtils.bytesToHexString(mTag.getId());
- mBinding.tvId.setText("已连接: " + id);
+ mViewDataBinding.tvId.setText("已连接: " + id);
Log.e(TAG, "onNewIntent: id = " + id);
if (ndef != null) {
Log.e(TAG, "onNewIntent: type = " + ndef.getType());
@@ -201,7 +204,7 @@ public class WriteMessageActivity extends AppCompatActivity {
switch (path) {
case "/contactInfo":
- mBinding.rbNoEncryption.setChecked(true);
+ mViewDataBinding.rbNoEncryption.setChecked(true);
try {
ContactInfo contactInfo = mGson.fromJson(detail, listType);
setContactInfo(contactInfo);
@@ -210,7 +213,7 @@ public class WriteMessageActivity extends AppCompatActivity {
}
break;
case "/encrypted":
- mBinding.rbEncryption.setChecked(true);
+ mViewDataBinding.rbEncryption.setChecked(true);
try {
String trimString = detail.trim();
String decryptedString = AESUtil.decrypt(trimString);
@@ -236,11 +239,11 @@ public class WriteMessageActivity extends AppCompatActivity {
private void setContactInfo(ContactInfo contactInfo) {
mUploadImageUrl = contactInfo.getAvatar();
- mBinding.setContactInfo(contactInfo);
+ mViewDataBinding.setContactInfo(contactInfo);
Glide.with(this)
.load(contactInfo.getAvatar())
.error(R.drawable.ic_default_avatar)
- .into(mBinding.ivAvatar);
+ .into(mViewDataBinding.ivAvatar);
}
@Override
@@ -264,7 +267,7 @@ public class WriteMessageActivity extends AppCompatActivity {
} else if (requestCode == REQUEST_CROP) {
Bitmap bitmap = data.getParcelableExtra("data");
if (bitmap != null) {
- mBinding.ivAvatar.setImageBitmap(bitmap);
+ mViewDataBinding.ivAvatar.setImageBitmap(bitmap);
File file = BitmapUtils.createImageFile(WriteMessageActivity.this, "crop_avatar_" + System.currentTimeMillis() + ".jpg");
BitmapUtils.saveBitmapToFile(bitmap, file);
mViewModel.uploadAvatar(file);
@@ -296,7 +299,7 @@ public class WriteMessageActivity extends AppCompatActivity {
ActivityCompat.requestPermissions(WriteMessageActivity.this, permissions, REQUEST_PERMISSION_CODE);
} else {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
- File photoFile = new File(getExternalCacheDir(), "temp_avatar_" + System.currentTimeMillis() + ".jpg");
+ File photoFile = new File(FileUtils.getCacheDir(WriteMessageActivity.this), "temp_avatar_" + System.currentTimeMillis() + ".jpg");
imageUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".FileProvider", photoFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, REQUEST_CAMERA);
@@ -332,11 +335,11 @@ public class WriteMessageActivity extends AppCompatActivity {
Toaster.showLong("NFC卡片未连接");
return;
}
- Editable nameEditable = mBinding.etName.getText();
- Editable phoneEditable = mBinding.etPhone.getText();
- Editable wxidEditable = mBinding.etWxid.getText();
- Editable qqEditable = mBinding.etQq.getText();
- Editable tagEditable = mBinding.etTag.getText();
+ Editable nameEditable = mViewDataBinding.etName.getText();
+ Editable phoneEditable = mViewDataBinding.etPhone.getText();
+ Editable wxidEditable = mViewDataBinding.etWxid.getText();
+ Editable qqEditable = mViewDataBinding.etQq.getText();
+ Editable tagEditable = mViewDataBinding.etTag.getText();
if (TextUtils.isEmpty(nameEditable)) {
Toaster.showLong("请输入姓名或昵称");
@@ -348,10 +351,10 @@ public class WriteMessageActivity extends AppCompatActivity {
String qq = qqEditable.toString();
String tag = tagEditable.toString();
- int checkedId = mBinding.rgOperation.getCheckedRadioButtonId();
+ int checkedId = mViewDataBinding.rgOperation.getCheckedRadioButtonId();
if (checkedId != -1) {
- View checkedView = mBinding.rgOperation.findViewById(checkedId);
- int index = mBinding.rgOperation.indexOfChild(checkedView);
+ View checkedView = mViewDataBinding.rgOperation.findViewById(checkedId);
+ int index = mViewDataBinding.rgOperation.indexOfChild(checkedView);
Log.d("SelectedIndex", "位置: " + index); // 输出索引(从0开始)
mOperationId = index + 1;
} else {
@@ -369,7 +372,7 @@ public class WriteMessageActivity extends AppCompatActivity {
contactInfo.setAvatar(mUploadImageUrl);
- if (mBinding.rbEncryption.isChecked()) {
+ if (mViewDataBinding.rbEncryption.isChecked()) {
try {
String jsonString = GsonUtils.toJSONString(contactInfo);
String encryptedString = AESUtil.encrypt(jsonString.trim());
diff --git a/app/src/main/java/com/ttstd/elderlyassistant/activity/write/WriteMessageViewModel.java b/app/src/main/java/com/ttstd/elderlyassistant/activity/write/WriteMessageViewModel.java
index 0442be7..28d336a 100644
--- a/app/src/main/java/com/ttstd/elderlyassistant/activity/write/WriteMessageViewModel.java
+++ b/app/src/main/java/com/ttstd/elderlyassistant/activity/write/WriteMessageViewModel.java
@@ -3,9 +3,12 @@ package com.ttstd.elderlyassistant.activity.write;
import android.util.Log;
import androidx.lifecycle.MutableLiveData;
-import androidx.lifecycle.ViewModel;
+import com.trello.rxlifecycle4.RxLifecycle;
+import com.trello.rxlifecycle4.android.ActivityEvent;
+import com.ttstd.elderlyassistant.base.mvvm.BaseViewModel;
import com.ttstd.elderlyassistant.bean.UploadImageResponse;
+import com.ttstd.elderlyassistant.databinding.ActivityWriteMessageBinding;
import com.ttstd.elderlyassistant.network.NetInterfaceManager;
import java.io.File;
@@ -14,15 +17,14 @@ import io.reactivex.rxjava3.annotations.NonNull;
import io.reactivex.rxjava3.core.Observer;
import io.reactivex.rxjava3.disposables.Disposable;
-public class WriteMessageViewModel extends ViewModel {
+public class WriteMessageViewModel extends BaseViewModel {
private static final String TAG = "WriteMessageViewModel";
public MutableLiveData mUploadImageUrlData = new MutableLiveData<>();
-
public void uploadAvatar(File file) {
NetInterfaceManager.getInstance().getDevicesLockedStateObservable(file)
-// .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
+ .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
.subscribe(new Observer() {
@Override
public void onSubscribe(@NonNull Disposable d) {
diff --git a/app/src/main/java/com/ttstd/elderlyassistant/annotations/CustomGlideModule.java b/app/src/main/java/com/ttstd/elderlyassistant/annotations/CustomGlideModule.java
new file mode 100644
index 0000000..612daa0
--- /dev/null
+++ b/app/src/main/java/com/ttstd/elderlyassistant/annotations/CustomGlideModule.java
@@ -0,0 +1,30 @@
+package com.ttstd.elderlyassistant.annotations;
+
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+
+import com.bumptech.glide.GlideBuilder;
+import com.bumptech.glide.annotation.GlideModule;
+import com.bumptech.glide.load.engine.bitmap_recycle.LruBitmapPool;
+import com.bumptech.glide.load.engine.cache.InternalCacheDiskCacheFactory;
+import com.bumptech.glide.load.engine.cache.LruResourceCache;
+import com.bumptech.glide.module.AppGlideModule;
+
+@GlideModule
+public class CustomGlideModule extends AppGlideModule {
+ @Override
+ public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) {
+ super.applyOptions(context, builder);
+ //内存缓存
+ int memoryCacheSizeBytes = 1024 * 1024 * 32; // 20mb
+ builder.setMemoryCache(new LruResourceCache(memoryCacheSizeBytes));
+ //Bitmap 池
+ int bitmapPoolSizeBytes = 1024 * 1024 * 64; // 30mb
+ builder.setBitmapPool(new LruBitmapPool(bitmapPoolSizeBytes));
+ //磁盘缓存
+ int diskCacheSizeBytes = 1024 * 1024 * 128; // 100MB
+ builder.setDiskCache(new InternalCacheDiskCacheFactory(context, diskCacheSizeBytes));
+
+ }
+}
diff --git a/app/src/main/java/com/ttstd/elderlyassistant/base/BaseApplication.java b/app/src/main/java/com/ttstd/elderlyassistant/base/BaseApplication.java
index 22770dd..ba32769 100644
--- a/app/src/main/java/com/ttstd/elderlyassistant/base/BaseApplication.java
+++ b/app/src/main/java/com/ttstd/elderlyassistant/base/BaseApplication.java
@@ -3,6 +3,7 @@ package com.ttstd.elderlyassistant.base;
import android.app.Application;
import android.util.Log;
+import com.bumptech.glide.Glide;
import com.hjq.toast.Toaster;
import com.tencent.mmkv.MMKV;
import com.ttstd.elderlyassistant.network.NetInterfaceManager;
@@ -20,18 +21,20 @@ public class BaseApplication extends Application {
NetInterfaceManager.init(this);
}
- @Override
- public void onTerminate() {
- super.onTerminate();
- }
-
@Override
public void onLowMemory() {
super.onLowMemory();
+ Glide.get(this).onLowMemory();
}
@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
+ Glide.get(this).trimMemory(level);
+ }
+
+ @Override
+ public void onTerminate() {
+ super.onTerminate();
}
}
diff --git a/app/src/main/java/com/ttstd/elderlyassistant/base/BaseTransparentActivity.java b/app/src/main/java/com/ttstd/elderlyassistant/base/BaseTransparentActivity.java
new file mode 100644
index 0000000..1277bab
--- /dev/null
+++ b/app/src/main/java/com/ttstd/elderlyassistant/base/BaseTransparentActivity.java
@@ -0,0 +1,39 @@
+package com.ttstd.elderlyassistant.base;
+
+import com.ttstd.elderlyassistant.base.rx.BaseRxActivity;
+
+import me.jessyan.autosize.AutoSizeCompat;
+
+public abstract class BaseTransparentActivity extends BaseRxActivity {
+
+ /**
+ * 修补autozie RecyclerView item大小不一致
+ */
+ @Override
+ protected void onResume() {
+ super.onResume();
+ AutoSizeCompat.autoConvertDensityOfGlobal(getResources());
+ }
+
+ /**
+ * 设置布局
+ */
+ protected abstract int getLayoutId();
+
+ /**
+ * @return 是否是黑色状态栏
+ */
+// protected abstract boolean setNightMode();
+ public boolean setNightMode() {
+ return false;
+ }
+
+ /**
+ * @return 是否是入侵
+ */
+// protected abstract boolean setNightMode();
+ public boolean setfitWindow() {
+ return false;
+ }
+
+}
diff --git a/app/src/main/java/com/ttstd/elderlyassistant/base/mvvm/BaseMvvmActivity.java b/app/src/main/java/com/ttstd/elderlyassistant/base/mvvm/BaseMvvmActivity.java
new file mode 100644
index 0000000..a17a7ce
--- /dev/null
+++ b/app/src/main/java/com/ttstd/elderlyassistant/base/mvvm/BaseMvvmActivity.java
@@ -0,0 +1,56 @@
+package com.ttstd.elderlyassistant.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.ttstd.elderlyassistant.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);
+ mViewDataBinding = DataBindingUtil.setContentView(this, getLayoutId());
+ mViewDataBinding.setLifecycleOwner(this);
+
+ 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/ttstd/elderlyassistant/base/mvvm/BaseViewModel.java b/app/src/main/java/com/ttstd/elderlyassistant/base/mvvm/BaseViewModel.java
new file mode 100644
index 0000000..1187427
--- /dev/null
+++ b/app/src/main/java/com/ttstd/elderlyassistant/base/mvvm/BaseViewModel.java
@@ -0,0 +1,54 @@
+package com.ttstd.elderlyassistant.base.mvvm;
+
+import android.content.Context;
+
+import androidx.databinding.ViewDataBinding;
+import androidx.lifecycle.ViewModel;
+
+import java.lang.ref.WeakReference;
+
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+
+public abstract class BaseViewModel extends ViewModel {
+
+ /**
+ * 当前viewmodel对应的页面binding
+ */
+ protected VDB binding;
+
+ public void setVDBinding(ViewDataBinding vdBinding) {
+ binding = (VDB) vdBinding;
+ }
+
+ public VDB getVDBinding() {
+ if (binding == null) {
+ throw new NullPointerException("BaseViewModel >> getVDBinding >> null!!!");
+ }
+ return binding;
+ }
+
+ private WeakReference weakContext;
+
+ public void setContext(Context context) {
+ if (weakContext == null) {
+ weakContext = new WeakReference<>(context.getApplicationContext());
+ }
+ }
+
+ public Context getSafeContext() {
+ if (weakContext == null) {
+ throw new NullPointerException("BaseViewModel >> getCtx >> null!!!");
+ }
+ return weakContext.get();
+ }
+
+ private BehaviorSubject mBehaviorSubject;
+
+ public void setLifecycle(BehaviorSubject subject) {
+ this.mBehaviorSubject = (BehaviorSubject) subject;
+ }
+
+ public BehaviorSubject getLifecycle() {
+ return mBehaviorSubject;
+ }
+}
diff --git a/app/src/main/java/com/ttstd/elderlyassistant/base/rx/BaseRxActivity.java b/app/src/main/java/com/ttstd/elderlyassistant/base/rx/BaseRxActivity.java
new file mode 100644
index 0000000..371b899
--- /dev/null
+++ b/app/src/main/java/com/ttstd/elderlyassistant/base/rx/BaseRxActivity.java
@@ -0,0 +1,94 @@
+package com.ttstd.elderlyassistant.base.rx;
+
+import android.os.Bundle;
+
+import androidx.annotation.CallSuper;
+import androidx.annotation.CheckResult;
+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;
+
+/**
+ * {@link com.trello.rxlifecycle4.components.RxActivity}
+ * copied form RxActivity}
+ */
+public abstract class BaseRxActivity extends AppCompatActivity implements LifecycleProvider {
+ private final BehaviorSubject lifecycleSubject = BehaviorSubject.create();
+
+ public BehaviorSubject getLifecycleSubject() {
+ return lifecycleSubject;
+ }
+
+ @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);
+ }
+
+ @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/ttstd/elderlyassistant/base/rx/BaseRxFragment.java b/app/src/main/java/com/ttstd/elderlyassistant/base/rx/BaseRxFragment.java
new file mode 100644
index 0000000..06abea0
--- /dev/null
+++ b/app/src/main/java/com/ttstd/elderlyassistant/base/rx/BaseRxFragment.java
@@ -0,0 +1,123 @@
+package com.ttstd.elderlyassistant.base.rx;
+
+import android.os.Bundle;
+import android.view.View;
+
+import androidx.annotation.CallSuper;
+import androidx.annotation.CheckResult;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.trello.rxlifecycle4.LifecycleProvider;
+import com.trello.rxlifecycle4.LifecycleTransformer;
+import com.trello.rxlifecycle4.RxLifecycle;
+import com.trello.rxlifecycle4.android.FragmentEvent;
+import com.trello.rxlifecycle4.android.RxLifecycleAndroid;
+
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+
+/**
+ * {@link com.trello.rxlifecycle4.components.RxFragment}
+ * copied form RxFragment}
+ */
+public class BaseRxFragment extends Fragment implements LifecycleProvider {
+ private final BehaviorSubject lifecycleSubject = BehaviorSubject.create();
+
+ public BehaviorSubject getLifecycleSubject() {
+ return lifecycleSubject;
+ }
+
+ @Override
+ @NonNull
+ @CheckResult
+ public final Observable lifecycle() {
+ return lifecycleSubject.hide();
+ }
+
+ @Override
+ @NonNull
+ @CheckResult
+ public final LifecycleTransformer bindUntilEvent(@NonNull FragmentEvent event) {
+ return RxLifecycle.bindUntilEvent(lifecycleSubject, event);
+ }
+
+ @Override
+ @NonNull
+ @CheckResult
+ public final LifecycleTransformer bindToLifecycle() {
+ return RxLifecycleAndroid.bindFragment(lifecycleSubject);
+ }
+
+ @Override
+ @CallSuper
+ public void onAttach(android.app.Activity activity) {
+ super.onAttach(activity);
+ lifecycleSubject.onNext(FragmentEvent.ATTACH);
+ }
+
+ @Override
+ @CallSuper
+ public void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ lifecycleSubject.onNext(FragmentEvent.CREATE);
+ }
+
+ @Override
+ @CallSuper
+ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ lifecycleSubject.onNext(FragmentEvent.CREATE_VIEW);
+ }
+
+ @Override
+ @CallSuper
+ public void onStart() {
+ super.onStart();
+ lifecycleSubject.onNext(FragmentEvent.START);
+ }
+
+ @Override
+ @CallSuper
+ public void onResume() {
+ super.onResume();
+ lifecycleSubject.onNext(FragmentEvent.RESUME);
+ }
+
+ @Override
+ @CallSuper
+ public void onPause() {
+ lifecycleSubject.onNext(FragmentEvent.PAUSE);
+ super.onPause();
+ }
+
+ @Override
+ @CallSuper
+ public void onStop() {
+ lifecycleSubject.onNext(FragmentEvent.STOP);
+ super.onStop();
+ }
+
+ @Override
+ @CallSuper
+ public void onDestroyView() {
+ lifecycleSubject.onNext(FragmentEvent.DESTROY_VIEW);
+ super.onDestroyView();
+ }
+
+ @Override
+ @CallSuper
+ public void onDestroy() {
+ lifecycleSubject.onNext(FragmentEvent.DESTROY);
+ super.onDestroy();
+ }
+
+ @Override
+ @CallSuper
+ public void onDetach() {
+ lifecycleSubject.onNext(FragmentEvent.DETACH);
+ super.onDetach();
+ }
+}
+
diff --git a/app/src/main/java/com/ttstd/elderlyassistant/base/rx/BaseRxService.java b/app/src/main/java/com/ttstd/elderlyassistant/base/rx/BaseRxService.java
new file mode 100644
index 0000000..102f13e
--- /dev/null
+++ b/app/src/main/java/com/ttstd/elderlyassistant/base/rx/BaseRxService.java
@@ -0,0 +1,62 @@
+package com.ttstd.elderlyassistant.base.rx;
+
+import android.app.Service;
+import android.content.Intent;
+
+import androidx.annotation.CheckResult;
+import androidx.annotation.NonNull;
+
+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 BaseRxService extends Service implements LifecycleProvider {
+ private final BehaviorSubject lifecycleSubject = BehaviorSubject.create();
+
+ public BehaviorSubject getLifecycleSubject() {
+ return lifecycleSubject;
+ }
+
+ @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
+ public void onCreate() {
+ super.onCreate();
+ lifecycleSubject.onNext(ActivityEvent.CREATE);
+ }
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ return super.onStartCommand(intent, flags, startId);
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ lifecycleSubject.onNext(ActivityEvent.STOP);
+ }
+}
diff --git a/app/src/main/java/com/ttstd/elderlyassistant/network/NetInterfaceManager.java b/app/src/main/java/com/ttstd/elderlyassistant/network/NetInterfaceManager.java
index 58380d1..ee61fb0 100644
--- a/app/src/main/java/com/ttstd/elderlyassistant/network/NetInterfaceManager.java
+++ b/app/src/main/java/com/ttstd/elderlyassistant/network/NetInterfaceManager.java
@@ -7,6 +7,7 @@ import android.util.Log;
import com.ttstd.elderlyassistant.bean.UploadImageResponse;
import com.ttstd.elderlyassistant.network.api.UploadPictrueApi;
import com.ttstd.elderlyassistant.network.interceptor.RepeatRequestInterceptor;
+import com.ttstd.elderlyassistant.utils.FileUtils;
import org.jetbrains.annotations.NotNull;
@@ -64,8 +65,8 @@ public class NetInterfaceManager {
builder.dispatcher(dispatcher);
builder.connectionPool(new ConnectionPool(20, 1, TimeUnit.SECONDS));
// 设置缓存文件路径
- String cacheDirectory = mContext.getExternalCacheDir().getAbsolutePath() + "/OkHttpCache";
- Cache cache = new Cache(new File(cacheDirectory), CACHE_SIZE);
+ File cacheDirectory = new File(FileUtils.getCacheDir(mContext), "OkHttpCache");
+ Cache cache = new Cache(cacheDirectory, CACHE_SIZE);
builder.cache(cache);// 设置缓存
mOkHttpClient = builder.build();
@@ -95,8 +96,8 @@ public class NetInterfaceManager {
}
}).setLevel(HttpLoggingInterceptor.Level.BASIC));
// 设置缓存文件路径
- String cacheDirectory = mContext.getExternalCacheDir().getAbsolutePath() + "/OkHttpCache";
- Cache cache = new Cache(new File(cacheDirectory), CACHE_SIZE);
+ File cacheDirectory = new File(FileUtils.getCacheDir(mContext), "OkHttpCache");
+ Cache cache = new Cache(cacheDirectory, CACHE_SIZE);
builder.cache(cache);// 设置缓存
mScdnClient = builder.build();
}
diff --git a/app/src/main/java/com/ttstd/elderlyassistant/utils/FileUtils.java b/app/src/main/java/com/ttstd/elderlyassistant/utils/FileUtils.java
index 486767d..350f75c 100644
--- a/app/src/main/java/com/ttstd/elderlyassistant/utils/FileUtils.java
+++ b/app/src/main/java/com/ttstd/elderlyassistant/utils/FileUtils.java
@@ -5,6 +5,7 @@ import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
+import android.os.Environment;
import android.provider.MediaStore;
import android.provider.OpenableColumns;
import android.util.Log;
@@ -16,6 +17,25 @@ import java.io.InputStream;
import java.io.OutputStream;
public class FileUtils {
+ private static final String TAG = "FileUtils";
+
+ public static String getCacheDir(Context context) {
+ String cachePath;
+ if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
+ || !Environment.isExternalStorageRemovable()) {
+ if (context.getExternalCacheDir() != null) {
+ cachePath = context.getExternalCacheDir().getPath();
+ } else if (context.getExternalFilesDir("cache") != null) {
+ cachePath = context.getExternalFilesDir("cache").getPath();
+ } else {
+ cachePath = context.getCacheDir().getPath();
+ }
+ } else {
+ cachePath = context.getCacheDir().getPath();
+ }
+ Log.e(TAG, "getCacheDir: " + cachePath);
+ return cachePath;
+ }
public static File uriToFile(Context context, Uri uri) throws IOException {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {