增加databinding 基类
This commit is contained in:
@@ -117,6 +117,10 @@
|
||||
android:resource="@xml/provider_paths" />
|
||||
</provider>
|
||||
|
||||
<meta-data
|
||||
android:name="com.ttstd.elderlyassistant.annotations.CustomGlideModule"
|
||||
android:value="AppGlideModule" />
|
||||
|
||||
<meta-data
|
||||
android:name="design_width_in_dp"
|
||||
android:value="360" />
|
||||
|
||||
@@ -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<WriteMessageViewModel, ActivityWriteMessageBinding> {
|
||||
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());
|
||||
|
||||
@@ -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<ActivityWriteMessageBinding, ActivityEvent> {
|
||||
private static final String TAG = "WriteMessageViewModel";
|
||||
|
||||
public MutableLiveData<String> 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<UploadImageResponse>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
|
||||
@@ -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));
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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<VM extends ViewModel, VDB extends ViewDataBinding> extends BaseTransparentActivity {
|
||||
private static final String TAG = BaseMvvmActivity.class.getSimpleName();
|
||||
|
||||
protected VM mViewModel;
|
||||
protected VDB mViewDataBinding;
|
||||
protected Class<VM> vmClass;
|
||||
|
||||
@Override
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
mViewDataBinding = DataBindingUtil.setContentView(this, getLayoutId());
|
||||
mViewDataBinding.setLifecycleOwner(this);
|
||||
|
||||
vmClass = (Class<VM>) ((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();
|
||||
|
||||
|
||||
}
|
||||
@@ -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<VDB extends ViewDataBinding, T> 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<Context> 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<T> mBehaviorSubject;
|
||||
|
||||
public void setLifecycle(BehaviorSubject subject) {
|
||||
this.mBehaviorSubject = (BehaviorSubject<T>) subject;
|
||||
}
|
||||
|
||||
public BehaviorSubject<T> getLifecycle() {
|
||||
return mBehaviorSubject;
|
||||
}
|
||||
}
|
||||
@@ -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<ActivityEvent> {
|
||||
private final BehaviorSubject<ActivityEvent> lifecycleSubject = BehaviorSubject.create();
|
||||
|
||||
public BehaviorSubject<ActivityEvent> getLifecycleSubject() {
|
||||
return lifecycleSubject;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
@CheckResult
|
||||
public final Observable<ActivityEvent> lifecycle() {
|
||||
return lifecycleSubject.hide();
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
@CheckResult
|
||||
public final <T> LifecycleTransformer<T> bindUntilEvent(@NonNull ActivityEvent event) {
|
||||
return RxLifecycle.bindUntilEvent(lifecycleSubject, event);
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
@CheckResult
|
||||
public final <T> LifecycleTransformer<T> 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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<FragmentEvent> {
|
||||
private final BehaviorSubject<FragmentEvent> lifecycleSubject = BehaviorSubject.create();
|
||||
|
||||
public BehaviorSubject<FragmentEvent> getLifecycleSubject() {
|
||||
return lifecycleSubject;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
@CheckResult
|
||||
public final Observable<FragmentEvent> lifecycle() {
|
||||
return lifecycleSubject.hide();
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
@CheckResult
|
||||
public final <T> LifecycleTransformer<T> bindUntilEvent(@NonNull FragmentEvent event) {
|
||||
return RxLifecycle.bindUntilEvent(lifecycleSubject, event);
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
@CheckResult
|
||||
public final <T> LifecycleTransformer<T> 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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<ActivityEvent> {
|
||||
private final BehaviorSubject<ActivityEvent> lifecycleSubject = BehaviorSubject.create();
|
||||
|
||||
public BehaviorSubject<ActivityEvent> getLifecycleSubject() {
|
||||
return lifecycleSubject;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
@CheckResult
|
||||
public final Observable<ActivityEvent> lifecycle() {
|
||||
return lifecycleSubject.hide();
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
@CheckResult
|
||||
public final <T> LifecycleTransformer<T> bindUntilEvent(@NonNull ActivityEvent event) {
|
||||
return RxLifecycle.bindUntilEvent(lifecycleSubject, event);
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
@CheckResult
|
||||
public final <T> LifecycleTransformer<T> 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);
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user