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) {