diff --git a/app/build.gradle b/app/build.gradle
index aa77f6a..770f2ff 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -16,8 +16,8 @@ android {
applicationId "com.uiuios.aios"
minSdkVersion 24
targetSdkVersion 29
- versionCode 22
- versionName "3.1"
+ versionCode 23
+ versionName "3.2"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@@ -203,6 +203,8 @@ dependencies {
//bindView
implementation 'com.jakewharton:butterknife:10.2.3'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3'
+
+ implementation 'com.facebook.rebound:rebound:0.3.8'
//百度地图
// implementation 'com.baidu.lbsyun:BaiduMapSDK_Location:9.1.8'
//MMKV
@@ -225,6 +227,8 @@ dependencies {
implementation 'cn.jzvd:jiaozivideoplayer:7.7.2.3300'
implementation 'com.github.wseemann:FFmpegMediaMetadataRetriever-core:1.0.16'
implementation 'com.github.wseemann:FFmpegMediaMetadataRetriever-native:1.0.16'
+ //图片选择
+ implementation 'io.github.lucksiege:pictureselector:v3.10.8'
}
preBuild {
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index ea7b6d8..b47a74a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -105,6 +105,15 @@
+
+
+
diff --git a/app/src/main/java/com/uiuios/aios/activity/EmergencyActivity.java b/app/src/main/java/com/uiuios/aios/activity/EmergencyActivity.java
index 42b71ed..5f76b53 100644
--- a/app/src/main/java/com/uiuios/aios/activity/EmergencyActivity.java
+++ b/app/src/main/java/com/uiuios/aios/activity/EmergencyActivity.java
@@ -21,7 +21,7 @@ import com.uiuios.aios.bean.Contact;
import com.uiuios.aios.config.CommonConfig;
import com.uiuios.aios.disklrucache.CacheHelper;
import com.uiuios.aios.network.NetInterfaceManager;
-import com.uiuios.aios.network.URLAddress;
+import com.uiuios.aios.network.UrlAddress;
import com.uiuios.aios.receiver.BootReceiver;
import com.uiuios.aios.utils.ToastUtil;
@@ -71,7 +71,7 @@ public class EmergencyActivity extends AppCompatActivity {
// return;
// }
- String jsonString = mCacheHelper.getAsString(URLAddress.GET_MAIL_LIST);
+ String jsonString = mCacheHelper.getAsString(UrlAddress.GET_MAIL_LIST);
//为 "" 是已经请求成功的
if (jsonString == null) {
return;
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
new file mode 100644
index 0000000..ef5b8fa
--- /dev/null
+++ b/app/src/main/java/com/uiuios/aios/activity/contact/AddContactActivity.java
@@ -0,0 +1,266 @@
+package com.uiuios.aios.activity.contact;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.provider.MediaStore;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.ImageView;
+
+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.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.GlideEngine;
+import com.uiuios.aios.bean.BaseResponse;
+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;
+import java.io.FileOutputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import io.reactivex.rxjava3.annotations.NonNull;
+import io.reactivex.rxjava3.core.Observer;
+import io.reactivex.rxjava3.disposables.Disposable;
+import okhttp3.MediaType;
+import okhttp3.MultipartBody;
+import okhttp3.RequestBody;
+
+public class AddContactActivity extends BaseLightActivity {
+ private static final String TAG = AddContactActivity.class.getSimpleName();
+
+ @BindView(R.id.iv_cancel)
+ ImageView iv_cancel;
+ @BindView(R.id.iv_confirm)
+ ImageView iv_confirm;
+ @BindView(R.id.nv_avatar)
+ NiceImageView nv_avatar;
+ @BindView(R.id.et_name)
+ EditText et_name;
+ @BindView(R.id.et_phone)
+ EditText et_phone;
+ @BindView(R.id.toggleButton)
+ ToggleButton toggleButton;
+
+
+ private String avatarFilePath;
+ private boolean urgent = false;
+
+ @Override
+ public int getLayoutId() {
+ return R.layout.activity_add_contact;
+ }
+
+ @Override
+ public void initView() {
+ ButterKnife.bind(this);
+
+ }
+
+ @Override
+ public void initData() {
+ nv_avatar.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ selectPicture();
+ }
+ });
+ iv_cancel.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ finish();
+ }
+ });
+ iv_confirm.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ checkContact();
+ }
+ });
+ iv_confirm.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ checkContact();
+ }
+ });
+ }
+
+ private void selectPicture() {
+ PictureSelector.create(this)
+ .openGallery(SelectMimeType.ofImage())
+ .setSelectionMode(1)
+ .setImageEngine(GlideEngine.createGlideEngine())
+ .forResult(new OnResultCallbackListener() {
+ @Override
+ public void onResult(ArrayList result) {
+ avatarFilePath = result.get(0).getPath();
+ Log.e("selectPicture", "onResult: " + avatarFilePath);
+ GlideLoadUtils.getInstance().glideLoad(AddContactActivity.this, avatarFilePath, nv_avatar, R.drawable.default_avatar);
+ }
+
+ @Override
+ public void onCancel() {
+
+ }
+ });
+ }
+
+
+ private void checkContact() {
+ String name = et_name.getText().toString();
+ if (TextUtils.isEmpty(name)) {
+ ToastUtil.show("请输入联系人姓名");
+ return;
+ }
+ String phone = et_phone.getText().toString();
+ if (TextUtils.isEmpty(phone)) {
+ ToastUtil.show("请输入手机号码");
+ return;
+ }
+ File avatarFile;
+ Log.e("checkContact", "avatarFilePath: " + avatarFilePath);
+ if (TextUtils.isEmpty(avatarFilePath)) {
+ avatarFile = drawableToFile(R.drawable.default_avatar, "avatar");
+ } else {
+ Uri uri = Uri.parse(avatarFilePath);
+ avatarFile = uriToFile(uri, AddContactActivity.this);
+ }
+ MediaType mediaType = MediaType.Companion.parse("image/png");
+ RequestBody requestBody = RequestBody.Companion.create(avatarFile, mediaType);
+ MultipartBody.Part body = MultipartBody.Part.createFormData("avatar", avatarFile.getName(), requestBody);
+ Map params = new HashMap<>();
+ params.put("sn", Utils.getSerial());
+ params.put("name", name);
+ params.put("mobile", phone);
+ params.put("is_urgent", String.valueOf(toggleButton.isToggleOn()));
+ NetInterfaceManager.getInstance()
+ .getMailListAddObservable(params, body)
+ .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY))
+ .subscribe(new Observer() {
+ @Override
+ public void onSubscribe(@NonNull Disposable d) {
+ Log.e("checkContact", "onSubscribe: ");
+ }
+
+ @Override
+ public void onNext(@NonNull BaseResponse baseResponse) {
+ Log.e("checkContact", "onNext: " + baseResponse);
+ if (baseResponse.code == 200) {
+ ToastUtil.show("已添加");
+ finish();
+ } else {
+ ToastUtil.show(baseResponse.msg);
+ }
+ }
+
+ @Override
+ public void onError(@NonNull Throwable e) {
+ Log.e("checkContact", "onError: " + e.getMessage());
+ }
+
+ @Override
+ public void onComplete() {
+ Log.e("checkContact", "onComplete: ");
+ }
+ });
+
+ }
+
+ /**
+ * drawable转为file
+ *
+ * @param drawableId drawable的ID
+ * @param fileName 转换后的文件名
+ * @return
+ */
+ public File drawableToFile(int drawableId, String fileName) {
+// InputStream is = view.getContext().getResources().openRawResource(R.drawable.logo);
+ Bitmap bitmap = BitmapFactory.decodeResource(getResources(), drawableId);
+// Bitmap bitmap = BitmapFactory.decodeStream(is);
+ String defaultPath = getFilesDir().getAbsolutePath() + "/defaultGoodInfo";
+ File file = new File(defaultPath);
+ if (!file.exists()) {
+ file.mkdirs();
+ }
+ String defaultImgPath = defaultPath + "/" + fileName;
+ file = new File(defaultImgPath);
+ try {
+ file.createNewFile();
+ FileOutputStream fOut = new FileOutputStream(file);
+ bitmap.compress(Bitmap.CompressFormat.PNG, 20, fOut);
+// is.close();
+ fOut.flush();
+ fOut.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return file;
+ }
+
+
+ public static File uriToFile(Uri uri, Context context) {
+ String path = null;
+ if ("file".equals(uri.getScheme())) {
+ path = uri.getEncodedPath();
+ if (path != null) {
+ path = Uri.decode(path);
+ ContentResolver cr = context.getContentResolver();
+ StringBuffer buff = new StringBuffer();
+ buff.append("(").append(MediaStore.Images.ImageColumns.DATA).append("=").append("'" + path + "'").append(")");
+ Cursor cur = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Images.ImageColumns._ID, MediaStore.Images.ImageColumns.DATA}, buff.toString(), null, null);
+ int index = 0;
+ int dataIdx = 0;
+ for (cur.moveToFirst(); !cur.isAfterLast(); cur.moveToNext()) {
+ index = cur.getColumnIndex(MediaStore.Images.ImageColumns._ID);
+ index = cur.getInt(index);
+ dataIdx = cur.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
+ path = cur.getString(dataIdx);
+ }
+ cur.close();
+ if (index == 0) {
+ } else {
+ Uri u = Uri.parse("content://media/external/images/media/" + index);
+ System.out.println("temp uri is :" + u);
+ }
+ }
+ if (path != null) {
+ return new File(path);
+ }
+ } else if ("content".equals(uri.getScheme())) {
+ // 4.2.2以后
+ String[] proj = {MediaStore.Images.Media.DATA};
+ Cursor cursor = context.getContentResolver().query(uri, proj, null, null, null);
+ if (cursor.moveToFirst()) {
+ int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
+ path = cursor.getString(columnIndex);
+ }
+ cursor.close();
+
+ return new File(path);
+ } else {
+ //Log.i(TAG, "Uri Scheme:" + uri.getScheme());
+ }
+ return null;
+ }
+
+}
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 2ba5687..db0d452 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
@@ -1,5 +1,6 @@
package com.uiuios.aios.activity.contact;
+import android.content.Intent;
import android.content.res.Configuration;
import android.view.View;
import android.widget.ImageView;
@@ -26,6 +27,8 @@ public class ContactActivity extends BaseActivity implements ContactContact.Cont
TextView tv_people;
@BindView(R.id.iv_back)
ImageView iv_back;
+ @BindView(R.id.tv_add)
+ TextView tv_add;
@OnClick({R.id.iv_back})
public void onClick(View view) {
@@ -58,10 +61,23 @@ public class ContactActivity extends BaseActivity implements ContactContact.Cont
rv_contact.setLayoutManager(new GridLayoutManager(this, 2));
}
rv_contact.setAdapter(mContactAdapter);
+ tv_add.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ Intent intent = new Intent(ContactActivity.this, AddContactActivity.class);
+ startActivity(intent);
+ }
+ });
}
@Override
public void initData() {
+
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
mContactPresenter.getContact();
}
diff --git a/app/src/main/java/com/uiuios/aios/activity/contact/ContactPresenter.java b/app/src/main/java/com/uiuios/aios/activity/contact/ContactPresenter.java
index 30e898c..f6b948b 100644
--- a/app/src/main/java/com/uiuios/aios/activity/contact/ContactPresenter.java
+++ b/app/src/main/java/com/uiuios/aios/activity/contact/ContactPresenter.java
@@ -12,7 +12,7 @@ import com.uiuios.aios.bean.BaseResponse;
import com.uiuios.aios.bean.Contact;
import com.uiuios.aios.config.CommonConfig;
import com.uiuios.aios.network.NetInterfaceManager;
-import com.uiuios.aios.network.URLAddress;
+import com.uiuios.aios.network.UrlAddress;
import com.uiuios.aios.utils.GsonUtils;
import java.lang.reflect.Type;
@@ -68,10 +68,10 @@ public class ContactPresenter implements ContactContact.Presenter {
public void onNext(@NonNull BaseResponse> listBaseResponse) {
Log.e("getContactList", "onNext: " + listBaseResponse);
if (listBaseResponse.code == 200) {
- mMMKV.putString(URLAddress.GET_MAIL_LIST, GsonUtils.toJsonString(listBaseResponse.data));
+ mMMKV.putString(UrlAddress.GET_MAIL_LIST, GsonUtils.toJsonString(listBaseResponse.data));
mView.setContact(listBaseResponse.data);
} else {
- mMMKV.putString(URLAddress.GET_MAIL_LIST, "");
+ mMMKV.putString(UrlAddress.GET_MAIL_LIST, "");
mView.setContact(new ArrayList<>());
}
}
@@ -79,7 +79,7 @@ public class ContactPresenter implements ContactContact.Presenter {
@Override
public void onError(@NonNull Throwable e) {
Log.e("getContactList", "onError: " + e.getMessage());
- String jsonString = mMMKV.getString(URLAddress.GET_MAIL_LIST, null);
+ String jsonString = mMMKV.getString(UrlAddress.GET_MAIL_LIST, null);
Gson gson = new Gson();
Type type = new TypeToken>() {
}.getType();
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
new file mode 100644
index 0000000..4f6c4d0
--- /dev/null
+++ b/app/src/main/java/com/uiuios/aios/activity/dialer/DialerActivity.java
@@ -0,0 +1,218 @@
+package com.uiuios.aios.activity.dialer;
+
+import android.content.Intent;
+import android.media.AudioAttributes;
+import android.media.SoundPool;
+import android.net.Uri;
+import android.text.TextUtils;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.constraintlayout.widget.ConstraintLayout;
+
+import com.shehuan.niv.NiceImageView;
+import com.uiuios.aios.R;
+import com.uiuios.aios.activity.contact.ContactActivity;
+import com.uiuios.aios.base.BaseActivity;
+
+import java.util.HashMap;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+
+public class DialerActivity extends BaseActivity {
+
+ @BindView(R.id.et_phone)
+ EditText et_phone;
+ @BindView(R.id.iv_delete)
+ ImageView iv_delete;
+ @BindView(R.id.nv_dialer)
+ NiceImageView nv_dialer;
+ @BindView(R.id.iv_contact)
+ ImageView iv_contact;
+ @BindView(R.id.tv_contact)
+ TextView tv_contact;
+ @BindView(R.id.cl_0)
+ ConstraintLayout cl_0;
+ @BindView(R.id.cl_1)
+ ConstraintLayout cl_1;
+ @BindView(R.id.cl_2)
+ ConstraintLayout cl_2;
+ @BindView(R.id.cl_3)
+ ConstraintLayout cl_3;
+ @BindView(R.id.cl_4)
+ ConstraintLayout cl_4;
+ @BindView(R.id.cl_5)
+ ConstraintLayout cl_5;
+ @BindView(R.id.cl_6)
+ ConstraintLayout cl_6;
+ @BindView(R.id.cl_7)
+ ConstraintLayout cl_7;
+ @BindView(R.id.cl_8)
+ ConstraintLayout cl_8;
+ @BindView(R.id.cl_9)
+ ConstraintLayout cl_9;
+ @BindView(R.id.cl_11)
+ ConstraintLayout cl_11;
+ @BindView(R.id.cl_12)
+ ConstraintLayout cl_12;
+
+ private SoundPool soundPool;
+ private HashMap soundMap = new HashMap<>();
+
+ @Override
+ public int getLayoutId() {
+ return R.layout.activity_dialer;
+ }
+
+ @Override
+ public void initView() {
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
+ ButterKnife.bind(this);
+ AudioAttributes attr = new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_GAME) // 设置音效使用场景
+ .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).build(); // 设置音效的类型
+ soundPool = new SoundPool.Builder().setAudioAttributes(attr) // 设置音效池的属性
+ .setMaxStreams(12) // 设置最多可容纳10个音频流
+ .build(); // ①
+ // load方法加载指定音频文件,并返回所加载的音效ID
+ // 此处使用HashMap来管理这些音频流
+ soundMap.put(0, soundPool.load(this, R.raw.s_0, 1));
+ soundMap.put(1, soundPool.load(this, R.raw.s_1, 1));
+ soundMap.put(2, soundPool.load(this, R.raw.s_2, 1));
+ soundMap.put(3, soundPool.load(this, R.raw.s_3, 1));
+ soundMap.put(4, soundPool.load(this, R.raw.s_4, 1));
+ soundMap.put(5, soundPool.load(this, R.raw.s_5, 1));
+ soundMap.put(6, soundPool.load(this, R.raw.s_6, 1));
+ soundMap.put(7, soundPool.load(this, R.raw.s_7, 1));
+ soundMap.put(8, soundPool.load(this, R.raw.s_8, 1));
+ soundMap.put(9, soundPool.load(this, R.raw.s_9, 1));
+ soundMap.put(10, soundPool.load(this, R.raw.s_x, 1));
+ soundMap.put(11, soundPool.load(this, R.raw.s_j, 1));
+ }
+
+ @Override
+ public void initData() {
+ cl_0.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ addNumber("0", 0);
+ }
+ });
+ cl_1.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ addNumber("1", 1);
+ }
+ });
+ cl_2.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ addNumber("2", 2);
+ }
+ });
+ cl_3.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ addNumber("3", 3);
+ }
+ });
+ cl_4.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ addNumber("4", 4);
+ }
+ });
+ cl_5.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ addNumber("5", 5);
+ }
+ });
+ cl_6.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ addNumber("6", 6);
+ }
+ });
+ cl_7.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ addNumber("7", 7);
+ }
+ });
+ cl_8.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ addNumber("8", 8);
+ }
+ });
+ cl_9.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ addNumber("9", 9);
+ }
+ });
+ cl_11.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ addNumber("*", 10);
+ }
+ });
+ cl_12.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ addNumber("#", 11);
+ }
+ });
+ nv_dialer.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ String phone = et_phone.getText().toString();
+ Intent dialIntent = new Intent(Intent.ACTION_CALL);
+ Uri data = Uri.parse("tel:" + phone);
+ dialIntent.setData(data);
+ startActivity(dialIntent);
+ }
+ });
+ iv_delete.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ String tmp = et_phone.getText().toString();
+ if (TextUtils.isEmpty(tmp)) {
+ et_phone.setText("");
+ } else {
+ et_phone.setText(tmp.substring(0, tmp.length() - 1));
+ }
+ }
+ });
+ iv_contact.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ Intent intent = new Intent(DialerActivity.this, ContactActivity.class);
+ startActivity(intent);
+ }
+ });
+ tv_contact.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ Intent intent = new Intent(DialerActivity.this, ContactActivity.class);
+ startActivity(intent);
+ }
+ });
+ }
+
+
+ private void addNumber(String number, int position) {
+ String tmp = et_phone.getText().toString();
+ if (TextUtils.isEmpty(tmp)) {
+ et_phone.setText(number);
+ } else {
+ et_phone.setText(tmp + number);
+ }
+ soundPool.play(soundMap.get(position), 1, 1, 0, 0, 1);
+ }
+
+}
diff --git a/app/src/main/java/com/uiuios/aios/activity/records/RecordsActivity.java b/app/src/main/java/com/uiuios/aios/activity/records/RecordsActivity.java
new file mode 100644
index 0000000..6a8b888
--- /dev/null
+++ b/app/src/main/java/com/uiuios/aios/activity/records/RecordsActivity.java
@@ -0,0 +1,167 @@
+package com.uiuios.aios.activity.records;
+
+import android.content.ContentResolver;
+import android.content.Intent;
+import android.database.Cursor;
+import android.os.Bundle;
+import android.provider.CallLog;
+import android.util.Log;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.shehuan.niv.NiceImageView;
+import com.uiuios.aios.R;
+import com.uiuios.aios.activity.dialer.DialerActivity;
+import com.uiuios.aios.adapter.CallRecordAdapter;
+import com.uiuios.aios.bean.RecordsInfo;
+import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+
+public class RecordsActivity extends AppCompatActivity {
+ private static final String TAG = RecordsActivity.class.getSimpleName();
+
+ @BindView(R.id.recyclerView)
+ RecyclerView recyclerView;
+ @BindView(R.id.iv_cancel)
+ ImageView iv_cancel;
+ @BindView(R.id.iv_clear)
+ ImageView iv_clear;
+ @BindView(R.id.nv_dialer)
+ NiceImageView nv_dialer;
+ @BindView(R.id.tv_nodata)
+ TextView tv_nodata;
+
+ private CallRecordAdapter mCallRecordAdapter;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_records);
+ UltimateBarX.statusBarOnly(this)
+ .colorRes(R.color.default_blue)
+ .fitWindow(true)
+ .apply();
+ ButterKnife.bind(this);
+ Log.e(TAG, "initData: " + dataList);
+ mCallRecordAdapter = new CallRecordAdapter();
+ LinearLayoutManager linearLayoutManager = new LinearLayoutManager(RecordsActivity.this);
+ linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
+ recyclerView.setLayoutManager(linearLayoutManager);
+ recyclerView.setAdapter(mCallRecordAdapter);
+
+ iv_cancel.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ finish();
+ }
+ });
+ nv_dialer.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ startActivity(new Intent(RecordsActivity.this, DialerActivity.class));
+ }
+ });
+ iv_clear.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ for (RecordsInfo recordsInfo : dataList) {
+ String queryString = "NUMBER=" + recordsInfo.getNumber();
+ getContentResolver().delete(CallLog.Calls.CONTENT_URI, queryString, null);
+ }
+ getData();
+ }
+ });
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ getData();
+ }
+
+ private void getData() {
+ dataList = getDataList();
+ if (dataList.size() == 0) {
+ tv_nodata.setVisibility(View.VISIBLE);
+ recyclerView.setVisibility(View.GONE);
+ } else {
+ tv_nodata.setVisibility(View.GONE);
+ recyclerView.setVisibility(View.VISIBLE);
+ }
+ mCallRecordAdapter.setRecordsInfoList(dataList);
+ }
+
+ private List dataList;
+
+ /**
+ * 读取数据
+ *
+ * @return 读取到的数据
+ */
+ private List getDataList() {
+ // 1.获得ContentResolver
+ ContentResolver resolver = getContentResolver();
+ // 2.利用ContentResolver的query方法查询通话记录数据库
+ /**
+ * @param uri 需要查询的URI,(这个URI是ContentProvider提供的)
+ * @param projection 需要查询的字段
+ * @param selection sql语句where之后的语句
+ * @param selectionArgs ?占位符代表的数据
+ * @param sortOrder 排序方式
+ *
+ */
+ Cursor cursor = resolver.query(CallLog.Calls.CONTENT_URI, // 查询通话记录的URI
+ new String[]{CallLog.Calls.CACHED_NAME// 通话记录的联系人
+ , CallLog.Calls.NUMBER// 通话记录的电话号码
+ , CallLog.Calls.DATE// 通话记录的日期
+ , CallLog.Calls.DURATION// 通话时长
+ , CallLog.Calls.TYPE}// 通话类型
+ , null, null, CallLog.Calls.DEFAULT_SORT_ORDER// 按照时间逆序排列,最近打的最先显示
+ );
+ // 3.通过Cursor获得数据
+ List list = new ArrayList<>();
+ while (cursor.moveToNext()) {
+ String name = cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME));
+ String number = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER));
+ long dateLong = cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DATE));
+// String date = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss").format(new Date(dateLong));
+ int duration = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.DURATION));
+ int type = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.TYPE));
+
+ RecordsInfo recordsInfo = new RecordsInfo();
+ recordsInfo.setName(name);
+ recordsInfo.setNumber(number);
+ recordsInfo.setDate(dateLong);
+ recordsInfo.setDuration(duration);
+ recordsInfo.setType(type);
+ list.add(recordsInfo);
+
+ String typeString = "";
+ switch (type) {
+ case CallLog.Calls.INCOMING_TYPE:
+ typeString = "打入";
+ break;
+ case CallLog.Calls.OUTGOING_TYPE:
+ typeString = "打出";
+ break;
+ case CallLog.Calls.MISSED_TYPE:
+ typeString = "未接";
+ break;
+ default:
+ break;
+ }
+ }
+ return list;
+ }
+}
diff --git a/app/src/main/java/com/uiuios/aios/adapter/CallRecordAdapter.java b/app/src/main/java/com/uiuios/aios/adapter/CallRecordAdapter.java
new file mode 100644
index 0000000..2618e0f
--- /dev/null
+++ b/app/src/main/java/com/uiuios/aios/adapter/CallRecordAdapter.java
@@ -0,0 +1,77 @@
+package com.uiuios.aios.adapter;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+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.recyclerview.widget.RecyclerView;
+
+import com.uiuios.aios.R;
+import com.uiuios.aios.bean.RecordsInfo;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+public class CallRecordAdapter extends RecyclerView.Adapter {
+
+ private Context mContext;
+ private List mRecordsInfoList;
+ private SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat("HH:mm");
+
+ public void setRecordsInfoList(List recordsInfoList) {
+ this.mRecordsInfoList = recordsInfoList;
+ notifyDataSetChanged();
+ }
+
+ @NonNull
+ @Override
+ public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ mContext = parent.getContext();
+ return new Holder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_call_record, parent, false));
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull Holder holder, int position) {
+ RecordsInfo recordsInfo = mRecordsInfoList.get(position);
+ String phone = recordsInfo.getNumber();
+ holder.tv_phone.setText(phone);
+ holder.tv_time.setText(mSimpleDateFormat.format(new Date(recordsInfo.getDate())));
+ holder.root.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ Intent dialIntent = new Intent(Intent.ACTION_CALL);
+ Uri data = Uri.parse("tel:" + phone);
+ dialIntent.setData(data);
+ mContext.startActivity(dialIntent);
+ }
+ });
+ }
+
+ @Override
+ public int getItemCount() {
+ return mRecordsInfoList == null ? 0 : mRecordsInfoList.size();
+ }
+
+ class Holder extends RecyclerView.ViewHolder {
+ ConstraintLayout root;
+ ImageView iv_avatar;
+ TextView tv_phone;
+ TextView tv_time;
+
+ public Holder(@NonNull View itemView) {
+ super(itemView);
+ root = itemView.findViewById(R.id.root);
+ iv_avatar = itemView.findViewById(R.id.iv_avatar);
+ tv_phone = itemView.findViewById(R.id.tv_phone);
+ tv_time = itemView.findViewById(R.id.tv_time);
+ }
+ }
+}
diff --git a/app/src/main/java/com/uiuios/aios/adapter/ContactAdapter.java b/app/src/main/java/com/uiuios/aios/adapter/ContactAdapter.java
index 9fbfa81..1f1ae19 100644
--- a/app/src/main/java/com/uiuios/aios/adapter/ContactAdapter.java
+++ b/app/src/main/java/com/uiuios/aios/adapter/ContactAdapter.java
@@ -3,7 +3,6 @@ package com.uiuios.aios.adapter;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
-import android.provider.Settings;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
@@ -17,6 +16,8 @@ import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.shehuan.niv.NiceImageView;
import com.uiuios.aios.R;
+import com.uiuios.aios.activity.contact.AddContactActivity;
+import com.uiuios.aios.activity.records.RecordsActivity;
import com.uiuios.aios.bean.Contact;
import com.uiuios.aios.utils.ToastUtil;
@@ -27,6 +28,7 @@ public class ContactAdapter extends RecyclerView.Adapter contactList) {
this.mContactList = contactList;
@@ -46,45 +48,59 @@ public class ContactAdapter extends RecyclerView.Adapter {
+ 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/GlideEngine.java b/app/src/main/java/com/uiuios/aios/base/GlideEngine.java
new file mode 100644
index 0000000..1cede65
--- /dev/null
+++ b/app/src/main/java/com/uiuios/aios/base/GlideEngine.java
@@ -0,0 +1,118 @@
+package com.uiuios.aios.base;
+
+import android.content.Context;
+import android.widget.ImageView;
+
+import androidx.annotation.NonNull;
+
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.load.resource.bitmap.CenterCrop;
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
+import com.luck.picture.lib.engine.ImageEngine;
+import com.luck.picture.lib.utils.ActivityCompatHelper;
+import com.uiuios.aios.R;
+
+/**
+ * @author:luck
+ * @date:2019-11-13 17:02
+ * @describe:Glide加载引擎
+ */
+public class GlideEngine implements ImageEngine {
+
+ /**
+ * 加载图片
+ *
+ * @param context 上下文
+ * @param url 资源url
+ * @param imageView 图片承载控件
+ */
+ @Override
+ public void loadImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return;
+ }
+ Glide.with(context)
+ .load(url)
+ .into(imageView);
+ }
+
+ @Override
+ public void loadImage(Context context, ImageView imageView, String url, int maxWidth, int maxHeight) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return;
+ }
+ Glide.with(context)
+ .load(url)
+ .override(maxWidth, maxHeight)
+ .into(imageView);
+ }
+
+ /**
+ * 加载相册目录封面
+ *
+ * @param context 上下文
+ * @param url 图片路径
+ * @param imageView 承载图片ImageView
+ */
+ @Override
+ public void loadAlbumCover(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return;
+ }
+ Glide.with(context)
+ .asBitmap()
+ .load(url)
+ .override(180, 180)
+ .sizeMultiplier(0.5f)
+ .transform(new CenterCrop(), new RoundedCorners(8))
+ .placeholder(R.drawable.ps_image_placeholder)
+ .into(imageView);
+ }
+
+
+ /**
+ * 加载图片列表图片
+ *
+ * @param context 上下文
+ * @param url 图片路径
+ * @param imageView 承载图片ImageView
+ */
+ @Override
+ public void loadGridImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return;
+ }
+ Glide.with(context)
+ .load(url)
+ .override(200, 200)
+ .centerCrop()
+ .placeholder(R.drawable.ps_image_placeholder)
+ .into(imageView);
+ }
+
+ @Override
+ public void pauseRequests(Context context) {
+ Glide.with(context).pauseRequests();
+ }
+
+ @Override
+ public void resumeRequests(Context context) {
+ Glide.with(context).resumeRequests();
+ }
+
+ private GlideEngine() {
+ }
+
+ private static GlideEngine instance;
+
+ public static GlideEngine createGlideEngine() {
+ if (null == instance) {
+ synchronized (GlideEngine.class) {
+ if (null == instance) {
+ instance = new GlideEngine();
+ }
+ }
+ }
+ return instance;
+ }
+}
diff --git a/app/src/main/java/com/uiuios/aios/bean/RecordsInfo.java b/app/src/main/java/com/uiuios/aios/bean/RecordsInfo.java
new file mode 100644
index 0000000..ebcea5f
--- /dev/null
+++ b/app/src/main/java/com/uiuios/aios/bean/RecordsInfo.java
@@ -0,0 +1,64 @@
+package com.uiuios.aios.bean;
+
+import androidx.annotation.NonNull;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonParser;
+
+import java.io.Serializable;
+
+public class RecordsInfo implements Serializable {
+ private static final long serialVersionUID = -8677336093725878416L;
+
+ String name;
+ String number;
+ long date;
+ int duration;
+ int type;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getNumber() {
+ return number;
+ }
+
+ public void setNumber(String number) {
+ this.number = number;
+ }
+
+ public long getDate() {
+ return date;
+ }
+
+ public void setDate(long date) {
+ this.date = date;
+ }
+
+ public int getDuration() {
+ return duration;
+ }
+
+ public void setDuration(int duration) {
+ this.duration = duration;
+ }
+
+ public int getType() {
+ return type;
+ }
+
+ public void setType(int type) {
+ this.type = type;
+ }
+
+ @NonNull
+ @Override
+ public String toString() {
+ return JsonParser.parseString(new Gson().toJson(this)).getAsJsonObject().toString();
+ }
+}
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 e8a2270..d7676e2 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
@@ -71,9 +71,8 @@ import com.uiuios.aios.dialog.SingleDialog;
import com.uiuios.aios.disklrucache.CacheHelper;
import com.uiuios.aios.manager.RemoteManager;
import com.uiuios.aios.network.NetInterfaceManager;
-import com.uiuios.aios.network.URLAddress;
+import com.uiuios.aios.network.UrlAddress;
import com.uiuios.aios.push.PushManager;
-import com.uiuios.aios.push.tpush.MessageReceiver;
import com.uiuios.aios.utils.ApkUtils;
import com.uiuios.aios.utils.AppUtil;
import com.uiuios.aios.utils.BitmapUtils;
@@ -793,7 +792,7 @@ public class CustomFragment extends BaseFragment implements CustomContact.Custom
}
public void setSosNumber() {
- String jsonString = mCacheHelper.getAsString(URLAddress.GET_SETTINGS);
+ String jsonString = mCacheHelper.getAsString(UrlAddress.GET_SETTINGS);
//为 "" 是已经请求成功的
if (jsonString == null) {
// rv_sos.setVisibility(View.GONE);
@@ -854,7 +853,7 @@ public class CustomFragment extends BaseFragment implements CustomContact.Custom
}
private void getAlarmCache() {
- String jsonString = mCacheHelper.getAsString(URLAddress.GET_ALARM_CLOCK);
+ String jsonString = mCacheHelper.getAsString(UrlAddress.GET_ALARM_CLOCK);
Gson gson = new Gson();
Type type = new TypeToken>() {
}.getType();
diff --git a/app/src/main/java/com/uiuios/aios/network/NetInterfaceManager.java b/app/src/main/java/com/uiuios/aios/network/NetInterfaceManager.java
index b60469e..a7cd82f 100644
--- a/app/src/main/java/com/uiuios/aios/network/NetInterfaceManager.java
+++ b/app/src/main/java/com/uiuios/aios/network/NetInterfaceManager.java
@@ -39,6 +39,7 @@ import com.uiuios.aios.network.api.GetMailList;
import com.uiuios.aios.network.api.GetUserIDApi;
import com.uiuios.aios.network.api.GoodsListApi;
import com.uiuios.aios.network.api.HealthCodeApi;
+import com.uiuios.aios.network.api.MailListAddApi;
import com.uiuios.aios.network.api.RunNewApp;
import com.uiuios.aios.network.api.SNInfoApi;
import com.uiuios.aios.network.api.SOSRecordApi;
@@ -55,6 +56,7 @@ import com.uiuios.aios.utils.Utils;
import java.io.File;
import java.lang.reflect.Type;
import java.util.List;
+import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -68,6 +70,7 @@ import io.reactivex.rxjava3.schedulers.Schedulers;
import io.reactivex.rxjava3.subjects.BehaviorSubject;
import okhttp3.Cache;
import okhttp3.Headers;
+import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import retrofit2.Retrofit;
@@ -116,7 +119,7 @@ public class NetInterfaceManager {
if (mRetrofit == null) {
mRetrofit = new Retrofit.Builder()
.client(okHttpClient)
- .baseUrl(URLAddress.ROOT_URL)
+ .baseUrl(UrlAddress.ROOT_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava3CallAdapterFactory.create())
.build();
@@ -264,6 +267,12 @@ public class NetInterfaceManager {
.observeOn(AndroidSchedulers.mainThread());
}
+ public Observable getMailListAddObservable(Map params, MultipartBody.Part body) {
+ return mRetrofit.create(MailListAddApi.class)
+ .addMailList(params, body)
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread());
+ }
public interface onCompleteCallback {
void onComplete();
@@ -312,10 +321,10 @@ public class NetInterfaceManager {
Log.e("getUserID", "onNext: " + userIdBaseResponse);
if (userIdBaseResponse.code == 200) {
UserId userId = userIdBaseResponse.data;
- mCacheHelper.put(URLAddress.GET_USER_ID, GsonUtils.toJsonString(userId));
+ mCacheHelper.put(UrlAddress.GET_USER_ID, GsonUtils.toJsonString(userId));
mMMKV.encode("USER_ID", userId.getUser_id());
} else {
- mCacheHelper.put(URLAddress.GET_USER_ID, -1);
+ mCacheHelper.put(UrlAddress.GET_USER_ID, -1);
}
}
@@ -358,10 +367,10 @@ public class NetInterfaceManager {
if (refresh) {
connectMode = ConnectMode.ONE_MINUTE;
}
- if (ConnectManager.getInstance().isNeedConnect(URLAddress.GET_ACTIVITY_LIST, connectMode)) {
+ if (ConnectManager.getInstance().isNeedConnect(UrlAddress.GET_ACTIVITY_LIST, connectMode)) {
getActivityList(lifecycle, callback);
} else {
- String jsonString = mCacheHelper.getAsString(URLAddress.GET_ACTIVITY_LIST);
+ String jsonString = mCacheHelper.getAsString(UrlAddress.GET_ACTIVITY_LIST);
//为 "" 是已经请求成功的
if (jsonString == null) {
getActivityList(lifecycle, callback);
@@ -409,14 +418,14 @@ public class NetInterfaceManager {
if (listBaseResponse.code == 200) {
List activityBeans = listBaseResponse.data;
if (activityBeans == null || activityBeans.size() == 0) {
- mCacheHelper.put(URLAddress.GET_ACTIVITY_LIST, "");
+ mCacheHelper.put(UrlAddress.GET_ACTIVITY_LIST, "");
if (callback != null) callback.noData();
} else {
- mCacheHelper.put(URLAddress.GET_ACTIVITY_LIST, GsonUtils.toJsonString(activityBeans));
+ mCacheHelper.put(UrlAddress.GET_ACTIVITY_LIST, GsonUtils.toJsonString(activityBeans));
if (callback != null) callback.setActivitiesList(activityBeans);
}
} else {
- mCacheHelper.put(URLAddress.GET_ACTIVITY_LIST, "");
+ mCacheHelper.put(UrlAddress.GET_ACTIVITY_LIST, "");
if (callback != null) callback.noData();
}
}
@@ -424,7 +433,7 @@ public class NetInterfaceManager {
@Override
public void onError(@NonNull Throwable e) {
Log.e("getActivityListObserver", "onError: " + e.getMessage());
- String jsonString = mCacheHelper.getAsString(URLAddress.GET_ACTIVITY_LIST);
+ String jsonString = mCacheHelper.getAsString(UrlAddress.GET_ACTIVITY_LIST);
Gson gson = new Gson();
Type type = new TypeToken>() {
}.getType();
@@ -468,10 +477,10 @@ public class NetInterfaceManager {
if (refresh) {
connectMode = ConnectMode.ONE_MINUTE;
}
- if (ConnectManager.getInstance().isNeedConnect(URLAddress.GET_DEMAND_LIST, connectMode)) {
+ if (ConnectManager.getInstance().isNeedConnect(UrlAddress.GET_DEMAND_LIST, connectMode)) {
getDemandList(lifecycle, callback);
} else {
- String jsonString = mCacheHelper.getAsString(URLAddress.GET_DEMAND_LIST);
+ String jsonString = mCacheHelper.getAsString(UrlAddress.GET_DEMAND_LIST);
//为 "" 是已经请求成功的
if (jsonString == null) {
getDemandList(lifecycle, callback);
@@ -520,14 +529,14 @@ public class NetInterfaceManager {
if (listBaseResponse.code == 200) {
List demandBeans = listBaseResponse.data;
if (demandBeans == null || demandBeans.size() == 0) {
- mCacheHelper.put(URLAddress.GET_DEMAND_LIST, "");
+ mCacheHelper.put(UrlAddress.GET_DEMAND_LIST, "");
if (callback != null) callback.noData();
} else {
- mCacheHelper.put(URLAddress.GET_DEMAND_LIST, GsonUtils.toJsonString(demandBeans));
+ mCacheHelper.put(UrlAddress.GET_DEMAND_LIST, GsonUtils.toJsonString(demandBeans));
if (callback != null) callback.setDemandList(demandBeans);
}
} else {
- mCacheHelper.put(URLAddress.GET_DEMAND_LIST, "");
+ mCacheHelper.put(UrlAddress.GET_DEMAND_LIST, "");
if (callback != null) callback.noData();
}
}
@@ -535,7 +544,7 @@ public class NetInterfaceManager {
@Override
public void onError(@NonNull Throwable e) {
Log.e("getDemandListObserver", "onError: " + e.getMessage());
- String jsonString = mCacheHelper.getAsString(URLAddress.GET_DEMAND_LIST);
+ String jsonString = mCacheHelper.getAsString(UrlAddress.GET_DEMAND_LIST);
Gson gson = new Gson();
Type type = new TypeToken>() {
}.getType();
@@ -586,10 +595,10 @@ public class NetInterfaceManager {
if (refresh) {
connectMode = ConnectMode.ONE_MINUTE;
}
- if (ConnectManager.getInstance().isNeedConnect(URLAddress.GET_HEALTH_CODE, connectMode)) {
+ if (ConnectManager.getInstance().isNeedConnect(UrlAddress.GET_HEALTH_CODE, connectMode)) {
getHealthCode(lifecycle, callback);
} else {
- String jsonString = mCacheHelper.getAsString(URLAddress.GET_HEALTH_CODE);
+ String jsonString = mCacheHelper.getAsString(UrlAddress.GET_HEALTH_CODE);
//为 "" 是已经请求成功的
if (jsonString == null) {
getHealthCode(lifecycle, callback);
@@ -641,10 +650,10 @@ public class NetInterfaceManager {
Log.e("getHealthCode", "onNext: " + listBaseResponse);
if (listBaseResponse.code == 200) {
List healthCodeList = listBaseResponse.data;
- mCacheHelper.put(URLAddress.GET_HEALTH_CODE, GsonUtils.toJsonString(healthCodeList));
+ mCacheHelper.put(UrlAddress.GET_HEALTH_CODE, GsonUtils.toJsonString(healthCodeList));
callback.setHealthCode(healthCodeList);
} else {
- mCacheHelper.put(URLAddress.GET_HEALTH_CODE, "");
+ mCacheHelper.put(UrlAddress.GET_HEALTH_CODE, "");
callback.noData();
}
}
@@ -652,7 +661,7 @@ public class NetInterfaceManager {
@Override
public void onError(@NonNull Throwable e) {
Log.e("getHealthCode", "onError: ");
- String jsonString = mCacheHelper.getAsString(URLAddress.GET_HEALTH_CODE);
+ String jsonString = mCacheHelper.getAsString(UrlAddress.GET_HEALTH_CODE);
Gson gson = new Gson();
Type type = new TypeToken>() {
}.getType();
@@ -687,7 +696,7 @@ public class NetInterfaceManager {
// if (refresh) {
// connectMode = ConnectMode.DEFAULT;
// }
-// if (ConnectManager.getInstance().isNeedConnect(URLAddress.GET_ALARM_CLOCK, connectMode)) {
+// if (ConnectManager.getInstance().isNeedConnect(UrlAddress.GET_ALARM_CLOCK, connectMode)) {
getAlarmClock(lifecycle, callback);
// } else {
// getAlarmClockCache(lifecycle, callback);
@@ -695,7 +704,7 @@ public class NetInterfaceManager {
}
public void getAlarmClockCache(BehaviorSubject lifecycle, AlarmClockCallback callback) {
- String jsonString = mCacheHelper.getAsString(URLAddress.GET_ALARM_CLOCK);
+ String jsonString = mCacheHelper.getAsString(UrlAddress.GET_ALARM_CLOCK);
//为 "" 是已经请求成功的
if (jsonString == null) {
getAlarmClock(lifecycle, callback);
@@ -748,11 +757,11 @@ public class NetInterfaceManager {
AlarmUtils.getInstance().setAlarmClockData(null);
if (callback != null) callback.setAlarmClockEmpty();
}
- mCacheHelper.put(URLAddress.GET_ALARM_CLOCK, GsonUtils.toJsonString(alarmClockData));
+ mCacheHelper.put(UrlAddress.GET_ALARM_CLOCK, GsonUtils.toJsonString(alarmClockData));
} else {
AlarmUtils.getInstance().deleteAllAlarmClock();
AlarmUtils.getInstance().setAlarmClockData(null);
- mCacheHelper.put(URLAddress.GET_ALARM_CLOCK, "");
+ mCacheHelper.put(UrlAddress.GET_ALARM_CLOCK, "");
if (callback != null) callback.setAlarmClockEmpty();
}
}
@@ -760,7 +769,7 @@ public class NetInterfaceManager {
@Override
public void onError(@NonNull Throwable e) {
Log.e("getAlarmClockObserver", "onError: " + e.getMessage());
- String jsonString = mCacheHelper.getAsString(URLAddress.GET_ALARM_CLOCK);
+ String jsonString = mCacheHelper.getAsString(UrlAddress.GET_ALARM_CLOCK);
Gson gson = new Gson();
Type type = new TypeToken>() {
}.getType();
@@ -828,10 +837,10 @@ public class NetInterfaceManager {
if (refresh) {
connectMode = ConnectMode.DEFAULT;
}
- if (ConnectManager.getInstance().isNeedConnect(URLAddress.GET_SETTINGS, connectMode)) {
+ if (ConnectManager.getInstance().isNeedConnect(UrlAddress.GET_SETTINGS, connectMode)) {
getSystemSettings(lifecycle, callback);
} else {
- String jsonString = mCacheHelper.getAsString(URLAddress.GET_SETTINGS);
+ String jsonString = mCacheHelper.getAsString(UrlAddress.GET_SETTINGS);
//为 "" 是已经请求成功的
if (jsonString == null) {
getSystemSettings(lifecycle, callback);
@@ -883,18 +892,18 @@ public class NetInterfaceManager {
mMMKV.encode("is_info", systemSettings.getIs_info());
List setting_sos = systemSettings.getSetting_sos();
if (setting_sos == null || setting_sos.size() == 0) {
- mCacheHelper.put(URLAddress.GET_SETTINGS, "");
+ mCacheHelper.put(UrlAddress.GET_SETTINGS, "");
if (callback != null) callback.setEmpty();
} else {
List emergencyContact = setting_sos.stream().filter(contact -> contact.getIs_urgent() == 1).collect(Collectors.toList());
- mCacheHelper.put(URLAddress.GET_SETTINGS, GsonUtils.toJsonString(setting_sos));
+ mCacheHelper.put(UrlAddress.GET_SETTINGS, GsonUtils.toJsonString(setting_sos));
if (callback != null) {
callback.setContact(setting_sos);
callback.setEmergencyContact(emergencyContact);
}
}
} else {
- mCacheHelper.put(URLAddress.GET_SETTINGS, "");
+ mCacheHelper.put(UrlAddress.GET_SETTINGS, "");
if (callback != null) callback.setEmpty();
}
}
@@ -902,7 +911,7 @@ public class NetInterfaceManager {
@Override
public void onError(@NonNull Throwable e) {
Log.e("getSystemSettings", "onError: " + e.getMessage());
- String jsonString = mCacheHelper.getAsString(URLAddress.GET_SETTINGS);
+ String jsonString = mCacheHelper.getAsString(UrlAddress.GET_SETTINGS);
//为 "" 是已经请求成功的
if (jsonString == null) {
if (callback != null) callback.setEmpty();
@@ -935,10 +944,10 @@ public class NetInterfaceManager {
if (refresh) {
connectMode = ConnectMode.DEFAULT;
}
- if (ConnectManager.getInstance().isNeedConnect(URLAddress.GET_MAIL_LIST, connectMode)) {
+ if (ConnectManager.getInstance().isNeedConnect(UrlAddress.GET_MAIL_LIST, connectMode)) {
getContactList(lifecycle, callback);
} else {
- String jsonString = mCacheHelper.getAsString(URLAddress.GET_MAIL_LIST);
+ String jsonString = mCacheHelper.getAsString(UrlAddress.GET_MAIL_LIST);
//为 "" 是已经请求成功的
if (jsonString == null) {
getContactList(lifecycle, callback);
@@ -986,10 +995,10 @@ public class NetInterfaceManager {
if (listBaseResponse.code == 200) {
List contactList = listBaseResponse.data;
if (contactList == null || contactList.size() == 0) {
- mCacheHelper.put(URLAddress.GET_MAIL_LIST, "");
+ mCacheHelper.put(UrlAddress.GET_MAIL_LIST, "");
if (callback != null) callback.setEmpty();
} else {
- mCacheHelper.put(URLAddress.GET_MAIL_LIST, GsonUtils.toJsonString(contactList));
+ mCacheHelper.put(UrlAddress.GET_MAIL_LIST, GsonUtils.toJsonString(contactList));
List emergencyContact = contactList.stream().filter(contact -> contact.getIs_urgent() == 1).collect(Collectors.toList());
if (callback != null) {
callback.setContact(contactList);
@@ -997,7 +1006,7 @@ public class NetInterfaceManager {
}
}
} else {
- mCacheHelper.put(URLAddress.GET_MAIL_LIST, "");
+ mCacheHelper.put(UrlAddress.GET_MAIL_LIST, "");
if (callback != null) callback.setEmpty();
}
}
@@ -1022,10 +1031,10 @@ public class NetInterfaceManager {
if (refresh) {
connectMode = ConnectMode.DEFAULT;
}
- if (ConnectManager.getInstance().isNeedConnect(URLAddress.GET_ADMIN_SN_SETTING, connectMode)) {
+ if (ConnectManager.getInstance().isNeedConnect(UrlAddress.GET_ADMIN_SN_SETTING, connectMode)) {
getAdminSnSetting(lifecycle, callback);
} else {
- String jsonString = mCacheHelper.getAsString(URLAddress.GET_ADMIN_SN_SETTING);
+ String jsonString = mCacheHelper.getAsString(UrlAddress.GET_ADMIN_SN_SETTING);
//为 "" 是已经请求成功的
if (jsonString == null) {
getAdminSnSetting(lifecycle, callback);
diff --git a/app/src/main/java/com/uiuios/aios/network/URLAddress.java b/app/src/main/java/com/uiuios/aios/network/UrlAddress.java
similarity index 72%
rename from app/src/main/java/com/uiuios/aios/network/URLAddress.java
rename to app/src/main/java/com/uiuios/aios/network/UrlAddress.java
index 8d23067..2b13a13 100644
--- a/app/src/main/java/com/uiuios/aios/network/URLAddress.java
+++ b/app/src/main/java/com/uiuios/aios/network/UrlAddress.java
@@ -1,13 +1,11 @@
package com.uiuios.aios.network;
-public class URLAddress {
+public class UrlAddress {
public static final String ROOT_URL = "https://led.zuoyepad.com/android/";
/*设备信息接口*/
public static final String SNINFO = "sn/getSnInfo";
/*获取用户头像和信息*/
public static final String GET_USER_AVATAR_INFO = "sn/getUserAvatarInfo";
- /*获取闹钟*/
- public static final String GET_ALARM_CLOCK = "getAlarmClock";
/*应用使用记录*/
public static final String APP_USAGE_RECORD = "appUsageRecord";
/*正在运行的应用*/
@@ -38,13 +36,32 @@ public class URLAddress {
public static final String GET_DEMAND_LIST = "demandList";
/*获取健康吗*/
public static final String GET_HEALTH_CODE = "getHealthCode";
- /*获取联系人*/
- public static final String GET_MAIL_LIST = "Control/getMailList";
/*获取负二屏开关*/
public static final String GET_ADMIN_SN_SETTING = "getAdminSnSetting";
/*更新app隐藏或者显示状态*/
public static final String APP_ICON_UPDATE = "Control/appIconUpdate";
+ /*获取联系人*/
+ public static final String GET_MAIL_LIST = "Control/getMailList";
+ /*添加联系人*/
+ public static final String MAIL_LIST_ADD = "MailList/mailListAdd";
+ /*编辑联系人*/
+ public static final String MAIL_LIST_EDIT = "MailList/mailListEdit";
+ /*删除联系人*/
+ public static final String MAIL_LIST_DELETE = "MailList/mailListDelete";
+ /*编号查询联系人*/
+ public static final String MAIL_LIST_BY_ID = "MailList/mailListById";
+
+ /*获取闹钟*/
+ public static final String GET_ALARM_CLOCK = "getAlarmClock";
+ /*添加闹钟*/
+ public static final String ALARM_CLOCK_ADD = "AlarmClock/alarmClockAdd";
+ /*编辑闹钟*/
+ public static final String ALARM_CLOCK_EDIT = "AlarmClock/alarmClockEdit";
+ /*编号查询闹钟*/
+ public static final String ALARM_CLOCK_BY_ID = "AlarmClock/alarmClockById";
+ /*删除闹钟*/
+ public static final String ALARM_CLOCK_DELETE = "AlarmClock/alarmClockDelete";
public static final String GET_USER_ID = "getUserId";
diff --git a/app/src/main/java/com/uiuios/aios/network/api/ActivityListApi.java b/app/src/main/java/com/uiuios/aios/network/api/ActivityListApi.java
index ef8cbfe..0799df4 100644
--- a/app/src/main/java/com/uiuios/aios/network/api/ActivityListApi.java
+++ b/app/src/main/java/com/uiuios/aios/network/api/ActivityListApi.java
@@ -2,7 +2,7 @@ package com.uiuios.aios.network.api;
import com.uiuios.aios.bean.ActivityBean;
import com.uiuios.aios.bean.BaseResponse;
-import com.uiuios.aios.network.URLAddress;
+import com.uiuios.aios.network.UrlAddress;
import java.util.List;
@@ -11,7 +11,7 @@ import retrofit2.http.GET;
import retrofit2.http.Query;
public interface ActivityListApi {
- @GET(URLAddress.GET_ACTIVITY_LIST)
+ @GET(UrlAddress.GET_ACTIVITY_LIST)
Observable>> getActivityList(
@Query("sn") String sn,
@Query("startSize") int startSize,
diff --git a/app/src/main/java/com/uiuios/aios/network/api/AlarmClockApi.java b/app/src/main/java/com/uiuios/aios/network/api/AlarmClockApi.java
index a76abf9..0604529 100644
--- a/app/src/main/java/com/uiuios/aios/network/api/AlarmClockApi.java
+++ b/app/src/main/java/com/uiuios/aios/network/api/AlarmClockApi.java
@@ -2,7 +2,7 @@ package com.uiuios.aios.network.api;
import com.uiuios.aios.bean.AlarmClockData;
import com.uiuios.aios.bean.BaseResponse;
-import com.uiuios.aios.network.URLAddress;
+import com.uiuios.aios.network.UrlAddress;
import java.util.List;
@@ -11,7 +11,7 @@ import retrofit2.http.GET;
import retrofit2.http.Query;
public interface AlarmClockApi {
- @GET(URLAddress.GET_ALARM_CLOCK)
+ @GET(UrlAddress.GET_ALARM_CLOCK)
Observable>> getAlarmClockApiApi(
@Query("sn") String sn
);
diff --git a/app/src/main/java/com/uiuios/aios/network/api/AppUsageRecordApi.java b/app/src/main/java/com/uiuios/aios/network/api/AppUsageRecordApi.java
index edb3646..1e24617 100644
--- a/app/src/main/java/com/uiuios/aios/network/api/AppUsageRecordApi.java
+++ b/app/src/main/java/com/uiuios/aios/network/api/AppUsageRecordApi.java
@@ -1,7 +1,7 @@
package com.uiuios.aios.network.api;
import com.uiuios.aios.bean.BaseResponse;
-import com.uiuios.aios.network.URLAddress;
+import com.uiuios.aios.network.UrlAddress;
import io.reactivex.rxjava3.core.Observable;
import retrofit2.http.Field;
@@ -10,7 +10,7 @@ import retrofit2.http.POST;
public interface AppUsageRecordApi {
@FormUrlEncoded
- @POST(URLAddress.APP_USAGE_RECORD)
+ @POST(UrlAddress.APP_USAGE_RECORD)
Observable sendappUsageRecord(
@Field("sn") String sn,
@Field("app_name") String app_name,
diff --git a/app/src/main/java/com/uiuios/aios/network/api/ArticleDetailsApi.java b/app/src/main/java/com/uiuios/aios/network/api/ArticleDetailsApi.java
index 038daf2..a7cc634 100644
--- a/app/src/main/java/com/uiuios/aios/network/api/ArticleDetailsApi.java
+++ b/app/src/main/java/com/uiuios/aios/network/api/ArticleDetailsApi.java
@@ -2,14 +2,14 @@ package com.uiuios.aios.network.api;
import com.uiuios.aios.bean.ArticleDetails;
import com.uiuios.aios.bean.BaseResponse;
-import com.uiuios.aios.network.URLAddress;
+import com.uiuios.aios.network.UrlAddress;
import io.reactivex.rxjava3.core.Observable;
import retrofit2.http.GET;
import retrofit2.http.Query;
public interface ArticleDetailsApi {
- @GET(URLAddress.GET_ARTICLE_DETAILS)
+ @GET(UrlAddress.GET_ARTICLE_DETAILS)
Observable> getArticleDetails(
@Query("id") int id
);
diff --git a/app/src/main/java/com/uiuios/aios/network/api/ArticleListApi.java b/app/src/main/java/com/uiuios/aios/network/api/ArticleListApi.java
index 37f1e10..981d929 100644
--- a/app/src/main/java/com/uiuios/aios/network/api/ArticleListApi.java
+++ b/app/src/main/java/com/uiuios/aios/network/api/ArticleListApi.java
@@ -2,7 +2,7 @@ package com.uiuios.aios.network.api;
import com.uiuios.aios.bean.ArticleInfo;
import com.uiuios.aios.bean.BaseResponse;
-import com.uiuios.aios.network.URLAddress;
+import com.uiuios.aios.network.UrlAddress;
import java.util.List;
@@ -11,7 +11,7 @@ import retrofit2.http.GET;
import retrofit2.http.Query;
public interface ArticleListApi {
- @GET(URLAddress.GET_ARTICLE_LIST)
+ @GET(UrlAddress.GET_ARTICLE_LIST)
Observable>> getArticleList(
@Query("sn") String sn
);
diff --git a/app/src/main/java/com/uiuios/aios/network/api/DemandListApi.java b/app/src/main/java/com/uiuios/aios/network/api/DemandListApi.java
index 64843de..6c86f19 100644
--- a/app/src/main/java/com/uiuios/aios/network/api/DemandListApi.java
+++ b/app/src/main/java/com/uiuios/aios/network/api/DemandListApi.java
@@ -2,7 +2,7 @@ package com.uiuios.aios.network.api;
import com.uiuios.aios.bean.BaseResponse;
import com.uiuios.aios.bean.DemandBean;
-import com.uiuios.aios.network.URLAddress;
+import com.uiuios.aios.network.UrlAddress;
import java.util.List;
@@ -11,7 +11,7 @@ import retrofit2.http.GET;
import retrofit2.http.Query;
public interface DemandListApi {
- @GET(URLAddress.GET_DEMAND_LIST)
+ @GET(UrlAddress.GET_DEMAND_LIST)
Observable>> getDemandList(
@Query("sn") String sn,
@Query("startSize") int startSize,
diff --git a/app/src/main/java/com/uiuios/aios/network/api/GetAdminSnSettingApi.java b/app/src/main/java/com/uiuios/aios/network/api/GetAdminSnSettingApi.java
index 16cf0b3..9d8a90a 100644
--- a/app/src/main/java/com/uiuios/aios/network/api/GetAdminSnSettingApi.java
+++ b/app/src/main/java/com/uiuios/aios/network/api/GetAdminSnSettingApi.java
@@ -1,14 +1,14 @@
package com.uiuios.aios.network.api;
import com.uiuios.aios.bean.BaseResponse;
-import com.uiuios.aios.network.URLAddress;
+import com.uiuios.aios.network.UrlAddress;
import io.reactivex.rxjava3.core.Observable;
import retrofit2.http.GET;
import retrofit2.http.Query;
public interface GetAdminSnSettingApi {
- @GET(URLAddress.GET_ADMIN_SN_SETTING)
+ @GET(UrlAddress.GET_ADMIN_SN_SETTING)
Observable getAdminSnSetting(
@Query("sn") String sn
);
diff --git a/app/src/main/java/com/uiuios/aios/network/api/GetDesktopApi.java b/app/src/main/java/com/uiuios/aios/network/api/GetDesktopApi.java
index 5eef4e3..9fc3923 100644
--- a/app/src/main/java/com/uiuios/aios/network/api/GetDesktopApi.java
+++ b/app/src/main/java/com/uiuios/aios/network/api/GetDesktopApi.java
@@ -2,7 +2,7 @@ package com.uiuios.aios.network.api;
import com.uiuios.aios.bean.BaseResponse;
import com.uiuios.aios.bean.NetDesktopIcon;
-import com.uiuios.aios.network.URLAddress;
+import com.uiuios.aios.network.UrlAddress;
import java.util.List;
@@ -11,7 +11,7 @@ import retrofit2.http.GET;
import retrofit2.http.Query;
public interface GetDesktopApi {
- @GET(URLAddress.GET_DESKTOP_LAYOUT)
+ @GET(UrlAddress.GET_DESKTOP_LAYOUT)
Observable>> getDesktopLayout(
@Query("sn") String sn
);
diff --git a/app/src/main/java/com/uiuios/aios/network/api/GetMailList.java b/app/src/main/java/com/uiuios/aios/network/api/GetMailList.java
index e637554..bbbc3c6 100644
--- a/app/src/main/java/com/uiuios/aios/network/api/GetMailList.java
+++ b/app/src/main/java/com/uiuios/aios/network/api/GetMailList.java
@@ -2,7 +2,7 @@ package com.uiuios.aios.network.api;
import com.uiuios.aios.bean.BaseResponse;
import com.uiuios.aios.bean.Contact;
-import com.uiuios.aios.network.URLAddress;
+import com.uiuios.aios.network.UrlAddress;
import java.util.List;
@@ -11,7 +11,7 @@ import retrofit2.http.GET;
import retrofit2.http.Query;
public interface GetMailList {
- @GET(URLAddress.GET_MAIL_LIST)
+ @GET(UrlAddress.GET_MAIL_LIST)
Observable>> getContact(
@Query("sn") String sn
);
diff --git a/app/src/main/java/com/uiuios/aios/network/api/GetUserIDApi.java b/app/src/main/java/com/uiuios/aios/network/api/GetUserIDApi.java
index 1273c6b..d845005 100644
--- a/app/src/main/java/com/uiuios/aios/network/api/GetUserIDApi.java
+++ b/app/src/main/java/com/uiuios/aios/network/api/GetUserIDApi.java
@@ -2,14 +2,14 @@ package com.uiuios.aios.network.api;
import com.uiuios.aios.bean.BaseResponse;
import com.uiuios.aios.bean.UserId;
-import com.uiuios.aios.network.URLAddress;
+import com.uiuios.aios.network.UrlAddress;
import io.reactivex.rxjava3.core.Observable;
import retrofit2.http.GET;
import retrofit2.http.Query;
public interface GetUserIDApi {
- @GET(URLAddress.GET_USER_ID)
+ @GET(UrlAddress.GET_USER_ID)
Observable> getUserID(
@Query("sn") String sn
);
diff --git a/app/src/main/java/com/uiuios/aios/network/api/GoodsDetailsApi.java b/app/src/main/java/com/uiuios/aios/network/api/GoodsDetailsApi.java
index ba17978..3e8d241 100644
--- a/app/src/main/java/com/uiuios/aios/network/api/GoodsDetailsApi.java
+++ b/app/src/main/java/com/uiuios/aios/network/api/GoodsDetailsApi.java
@@ -2,14 +2,14 @@ package com.uiuios.aios.network.api;
import com.uiuios.aios.bean.BaseResponse;
import com.uiuios.aios.bean.GoodsDetails;
-import com.uiuios.aios.network.URLAddress;
+import com.uiuios.aios.network.UrlAddress;
import io.reactivex.rxjava3.core.Observable;
import retrofit2.http.GET;
import retrofit2.http.Query;
public interface GoodsDetailsApi {
- @GET(URLAddress.GET_GOODS_DETAILS)
+ @GET(UrlAddress.GET_GOODS_DETAILS)
Observable> getGoodsDetails(
@Query("id") int id
);
diff --git a/app/src/main/java/com/uiuios/aios/network/api/GoodsListApi.java b/app/src/main/java/com/uiuios/aios/network/api/GoodsListApi.java
index e4f11d1..abcaa8e 100644
--- a/app/src/main/java/com/uiuios/aios/network/api/GoodsListApi.java
+++ b/app/src/main/java/com/uiuios/aios/network/api/GoodsListApi.java
@@ -2,7 +2,7 @@ package com.uiuios.aios.network.api;
import com.uiuios.aios.bean.BaseResponse;
import com.uiuios.aios.bean.GoodsInfo;
-import com.uiuios.aios.network.URLAddress;
+import com.uiuios.aios.network.UrlAddress;
import java.util.List;
@@ -11,7 +11,7 @@ import retrofit2.http.GET;
import retrofit2.http.Query;
public interface GoodsListApi {
- @GET(URLAddress.GET_GOODS_LIST)
+ @GET(UrlAddress.GET_GOODS_LIST)
Observable>> getGoodsList(
@Query("sn") String sn
);
diff --git a/app/src/main/java/com/uiuios/aios/network/api/HealthCodeApi.java b/app/src/main/java/com/uiuios/aios/network/api/HealthCodeApi.java
index e47310e..a6ccaf1 100644
--- a/app/src/main/java/com/uiuios/aios/network/api/HealthCodeApi.java
+++ b/app/src/main/java/com/uiuios/aios/network/api/HealthCodeApi.java
@@ -2,7 +2,7 @@ package com.uiuios.aios.network.api;
import com.uiuios.aios.bean.BaseResponse;
import com.uiuios.aios.bean.HealthCode;
-import com.uiuios.aios.network.URLAddress;
+import com.uiuios.aios.network.UrlAddress;
import java.util.List;
@@ -11,7 +11,7 @@ import retrofit2.http.GET;
import retrofit2.http.Query;
public interface HealthCodeApi {
- @GET(URLAddress.GET_HEALTH_CODE)
+ @GET(UrlAddress.GET_HEALTH_CODE)
Observable>> getArticleDetails(
@Query("sn") String sn
);
diff --git a/app/src/main/java/com/uiuios/aios/network/api/MailListAddApi.java b/app/src/main/java/com/uiuios/aios/network/api/MailListAddApi.java
new file mode 100644
index 0000000..10bade2
--- /dev/null
+++ b/app/src/main/java/com/uiuios/aios/network/api/MailListAddApi.java
@@ -0,0 +1,22 @@
+package com.uiuios.aios.network.api;
+
+import com.uiuios.aios.bean.BaseResponse;
+import com.uiuios.aios.network.UrlAddress;
+
+import java.util.Map;
+
+import io.reactivex.rxjava3.core.Observable;
+import okhttp3.MultipartBody;
+import retrofit2.http.Multipart;
+import retrofit2.http.POST;
+import retrofit2.http.Part;
+import retrofit2.http.QueryMap;
+
+public interface MailListAddApi {
+ @Multipart
+ @POST(UrlAddress.MAIL_LIST_ADD)
+ Observable addMailList(
+ @QueryMap Map params,
+ @Part MultipartBody.Part body
+ );
+}
diff --git a/app/src/main/java/com/uiuios/aios/network/api/RunNewApp.java b/app/src/main/java/com/uiuios/aios/network/api/RunNewApp.java
index 35820a6..ce2ca4a 100644
--- a/app/src/main/java/com/uiuios/aios/network/api/RunNewApp.java
+++ b/app/src/main/java/com/uiuios/aios/network/api/RunNewApp.java
@@ -1,7 +1,7 @@
package com.uiuios.aios.network.api;
import com.uiuios.aios.bean.BaseResponse;
-import com.uiuios.aios.network.URLAddress;
+import com.uiuios.aios.network.UrlAddress;
import io.reactivex.rxjava3.core.Observable;
import retrofit2.http.Field;
@@ -10,7 +10,7 @@ import retrofit2.http.POST;
public interface RunNewApp {
@FormUrlEncoded
- @POST(URLAddress.RUN_NEW_APP)
+ @POST(UrlAddress.RUN_NEW_APP)
Observable sendRunningInfo(
@Field("sn") String sn,
@Field("app") String app
diff --git a/app/src/main/java/com/uiuios/aios/network/api/SNInfoApi.java b/app/src/main/java/com/uiuios/aios/network/api/SNInfoApi.java
index 3fcb47a..9b9cc80 100644
--- a/app/src/main/java/com/uiuios/aios/network/api/SNInfoApi.java
+++ b/app/src/main/java/com/uiuios/aios/network/api/SNInfoApi.java
@@ -2,14 +2,14 @@ package com.uiuios.aios.network.api;
import com.uiuios.aios.bean.BaseResponse;
import com.uiuios.aios.bean.SnInfo;
-import com.uiuios.aios.network.URLAddress;
+import com.uiuios.aios.network.UrlAddress;
import io.reactivex.rxjava3.core.Observable;
import retrofit2.http.GET;
import retrofit2.http.Query;
public interface SNInfoApi {
- @GET(URLAddress.SNINFO)
+ @GET(UrlAddress.SNINFO)
Observable> getsninfo(
@Query("sn") String sn
);
diff --git a/app/src/main/java/com/uiuios/aios/network/api/SOSRecordApi.java b/app/src/main/java/com/uiuios/aios/network/api/SOSRecordApi.java
index 6fda567..83cfdce 100644
--- a/app/src/main/java/com/uiuios/aios/network/api/SOSRecordApi.java
+++ b/app/src/main/java/com/uiuios/aios/network/api/SOSRecordApi.java
@@ -1,7 +1,7 @@
package com.uiuios.aios.network.api;
import com.uiuios.aios.bean.BaseResponse;
-import com.uiuios.aios.network.URLAddress;
+import com.uiuios.aios.network.UrlAddress;
import io.reactivex.rxjava3.core.Observable;
import retrofit2.http.Field;
@@ -10,7 +10,7 @@ import retrofit2.http.POST;
public interface SOSRecordApi {
@FormUrlEncoded
- @POST(URLAddress.SOS_RECORD)
+ @POST(UrlAddress.SOS_RECORD)
Observable sendSOSRecord(
@Field("sn") String sn,
@Field("longitude") String longitude,
diff --git a/app/src/main/java/com/uiuios/aios/network/api/SendScreenshotApi.java b/app/src/main/java/com/uiuios/aios/network/api/SendScreenshotApi.java
index 09311dc..bae92ad 100644
--- a/app/src/main/java/com/uiuios/aios/network/api/SendScreenshotApi.java
+++ b/app/src/main/java/com/uiuios/aios/network/api/SendScreenshotApi.java
@@ -2,7 +2,7 @@ package com.uiuios.aios.network.api;
import com.uiuios.aios.bean.BaseResponse;
-import com.uiuios.aios.network.URLAddress;
+import com.uiuios.aios.network.UrlAddress;
import io.reactivex.rxjava3.core.Observable;
import okhttp3.MultipartBody;
@@ -13,7 +13,7 @@ import retrofit2.http.Query;
public interface SendScreenshotApi {
@Multipart
- @POST(URLAddress.SEND_SCREENSHOT)
+ @POST(UrlAddress.SEND_SCREENSHOT)
Observable sendScreenshot(
@Query("sn") String sn,
@Part MultipartBody.Part file
diff --git a/app/src/main/java/com/uiuios/aios/network/api/Setting.java b/app/src/main/java/com/uiuios/aios/network/api/Setting.java
index eed2b1a..2a9e599 100644
--- a/app/src/main/java/com/uiuios/aios/network/api/Setting.java
+++ b/app/src/main/java/com/uiuios/aios/network/api/Setting.java
@@ -2,14 +2,14 @@ package com.uiuios.aios.network.api;
import com.uiuios.aios.bean.BaseResponse;
import com.uiuios.aios.bean.SystemSettings;
-import com.uiuios.aios.network.URLAddress;
+import com.uiuios.aios.network.UrlAddress;
import io.reactivex.rxjava3.core.Observable;
import retrofit2.http.GET;
import retrofit2.http.Query;
public interface Setting {
- @GET(URLAddress.GET_SETTINGS)
+ @GET(UrlAddress.GET_SETTINGS)
Observable> getSetting(
@Query("sn") String sn
);
diff --git a/app/src/main/java/com/uiuios/aios/network/api/UpdateAlarmClockApi.java b/app/src/main/java/com/uiuios/aios/network/api/UpdateAlarmClockApi.java
index edebc3b..15558c6 100644
--- a/app/src/main/java/com/uiuios/aios/network/api/UpdateAlarmClockApi.java
+++ b/app/src/main/java/com/uiuios/aios/network/api/UpdateAlarmClockApi.java
@@ -1,7 +1,7 @@
package com.uiuios.aios.network.api;
import com.uiuios.aios.bean.BaseResponse;
-import com.uiuios.aios.network.URLAddress;
+import com.uiuios.aios.network.UrlAddress;
import io.reactivex.rxjava3.core.Observable;
import retrofit2.http.Field;
@@ -10,7 +10,7 @@ import retrofit2.http.POST;
public interface UpdateAlarmClockApi {
@FormUrlEncoded
- @POST(URLAddress.UPDATE_ALARM_CLOCK)
+ @POST(UrlAddress.UPDATE_ALARM_CLOCK)
Observable updateAlarm(
@Field("sn") String sn,
@Field("id") int id
diff --git a/app/src/main/java/com/uiuios/aios/network/api/UpdateAppIconApi.java b/app/src/main/java/com/uiuios/aios/network/api/UpdateAppIconApi.java
index 64be9ab..3257b45 100644
--- a/app/src/main/java/com/uiuios/aios/network/api/UpdateAppIconApi.java
+++ b/app/src/main/java/com/uiuios/aios/network/api/UpdateAppIconApi.java
@@ -1,7 +1,7 @@
package com.uiuios.aios.network.api;
import com.uiuios.aios.bean.BaseResponse;
-import com.uiuios.aios.network.URLAddress;
+import com.uiuios.aios.network.UrlAddress;
import io.reactivex.rxjava3.core.Observable;
import retrofit2.http.Field;
@@ -10,7 +10,7 @@ import retrofit2.http.POST;
public interface UpdateAppIconApi {
@FormUrlEncoded
- @POST(URLAddress.APP_ICON_UPDATE)
+ @POST(UrlAddress.APP_ICON_UPDATE)
Observable appIconUpdate(
@Field("sn") String sn,
@Field("app_package") String app_package,
diff --git a/app/src/main/java/com/uiuios/aios/network/api/UpdateDesktopApi.java b/app/src/main/java/com/uiuios/aios/network/api/UpdateDesktopApi.java
index 8c9ca5a..2e0ea08 100644
--- a/app/src/main/java/com/uiuios/aios/network/api/UpdateDesktopApi.java
+++ b/app/src/main/java/com/uiuios/aios/network/api/UpdateDesktopApi.java
@@ -1,7 +1,7 @@
package com.uiuios.aios.network.api;
import com.uiuios.aios.bean.BaseResponse;
-import com.uiuios.aios.network.URLAddress;
+import com.uiuios.aios.network.UrlAddress;
import io.reactivex.rxjava3.core.Observable;
import retrofit2.http.Field;
@@ -10,7 +10,7 @@ import retrofit2.http.POST;
public interface UpdateDesktopApi {
@FormUrlEncoded
- @POST(URLAddress.UPDATE_DESKTOP_LAYOUT)
+ @POST(UrlAddress.UPDATE_DESKTOP_LAYOUT)
Observable updateLayout(
@Field("sn") String sn,
@Field("app") String app
diff --git a/app/src/main/java/com/uiuios/aios/network/api/UserInfoControl.java b/app/src/main/java/com/uiuios/aios/network/api/UserInfoControl.java
index b0f5492..77c0e3d 100644
--- a/app/src/main/java/com/uiuios/aios/network/api/UserInfoControl.java
+++ b/app/src/main/java/com/uiuios/aios/network/api/UserInfoControl.java
@@ -3,7 +3,7 @@ package com.uiuios.aios.network.api;
import com.uiuios.aios.bean.BaseResponse;
import com.uiuios.aios.bean.UserAvatarInfo;
-import com.uiuios.aios.network.URLAddress;
+import com.uiuios.aios.network.UrlAddress;
import io.reactivex.rxjava3.core.Observable;
import retrofit2.http.Field;
@@ -12,7 +12,7 @@ import retrofit2.http.POST;
public interface UserInfoControl {
@FormUrlEncoded
- @POST(URLAddress.GET_USER_AVATAR_INFO)
+ @POST(UrlAddress.GET_USER_AVATAR_INFO)
Observable> getUserAvatarInfo(
@Field("sn") String sn
);
diff --git a/app/src/main/java/com/uiuios/aios/view/ToggleButton.java b/app/src/main/java/com/uiuios/aios/view/ToggleButton.java
new file mode 100644
index 0000000..df1c6e9
--- /dev/null
+++ b/app/src/main/java/com/uiuios/aios/view/ToggleButton.java
@@ -0,0 +1,347 @@
+package com.uiuios.aios.view;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.RectF;
+import android.util.AttributeSet;
+import android.util.TypedValue;
+import android.view.View;
+
+import com.facebook.rebound.SimpleSpringListener;
+import com.facebook.rebound.Spring;
+import com.facebook.rebound.SpringConfig;
+import com.facebook.rebound.SpringSystem;
+import com.facebook.rebound.SpringUtil;
+import com.uiuios.aios.R;
+
+public class ToggleButton extends View {
+ private SpringSystem springSystem;
+ private Spring spring;
+ /**
+ *
+ */
+ private float radius;
+ /**
+ * 开启颜色
+ */
+ private int onColor = Color.parseColor("#f62626");
+ /**
+ * 关闭颜色
+ */
+ private int offBorderColor = Color.parseColor("#e7e4e4");
+ /**
+ * 灰色带颜色
+ */
+ private int offColor = Color.parseColor("#ffffff");
+ /**
+ * 手柄颜色
+ */
+ private int spotColor = Color.parseColor("#ffffff");
+ /**
+ * 边框颜色
+ */
+ private int borderColor = offBorderColor;
+ /**
+ * 画笔
+ */
+ private Paint paint;
+ /**
+ * 开关状态
+ */
+ private boolean toggleOn = false;
+ /**
+ * 边框大小
+ */
+ private int borderWidth = 2;
+ /**
+ * 垂直中心
+ */
+ private float centerY;
+ /**
+ * 按钮的开始和结束位置
+ */
+ private float startX, endX;
+ /**
+ * 手柄X位置的最小和最大值
+ */
+ private float spotMinX, spotMaxX;
+ /**
+ * 手柄大小
+ */
+ private int spotSize;
+ /**
+ * 手柄X位置
+ */
+ private float spotX;
+ /**
+ * 关闭时内部灰色带高度
+ */
+ private float offLineWidth;
+ /**
+ *
+ */
+ private RectF rect = new RectF();
+ /**
+ * 默认使用动画
+ */
+ private boolean defaultAnimate = true;
+ /**
+ * 是否默认处于打开状态
+ */
+ private boolean isDefaultOn = false;
+ /**
+ * 禁止点击
+ */
+ private boolean disable = false;
+
+ private OnToggleChanged listener;
+
+ public void setDisable(boolean dis) {
+ this.disable = dis;
+ }
+
+ private ToggleButton(Context context) {
+ super(context);
+ }
+
+ public ToggleButton(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ setup(attrs);
+ }
+
+ public ToggleButton(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ setup(attrs);
+ }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ spring.removeListener(springListener);
+ }
+
+ @Override
+ public void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ spring.addListener(springListener);
+ }
+
+ public void setup(AttributeSet attrs) {
+ paint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ paint.setStyle(Paint.Style.FILL);
+ paint.setStrokeCap(Paint.Cap.ROUND);
+ springSystem = SpringSystem.create();
+ spring = springSystem.createSpring();
+ spring.setSpringConfig(SpringConfig.fromOrigamiTensionAndFriction(50, 7));
+ this.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View arg0) {
+ if (disable) {
+
+ } else {
+ toggle(defaultAnimate);
+ }
+ }
+ });
+ TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.ToggleButton);
+ offBorderColor = typedArray.getColor(R.styleable.ToggleButton_tbOffBorderColor, offBorderColor);
+ onColor = typedArray.getColor(R.styleable.ToggleButton_tbOnColor, onColor);
+ spotColor = typedArray.getColor(R.styleable.ToggleButton_tbSpotColor, spotColor);
+ offColor = typedArray.getColor(R.styleable.ToggleButton_tbOffColor, offColor);
+ borderWidth = typedArray.getDimensionPixelSize(R.styleable.ToggleButton_tbBorderWidth, borderWidth);
+ defaultAnimate = typedArray.getBoolean(R.styleable.ToggleButton_tbAnimate, defaultAnimate);
+ isDefaultOn = typedArray.getBoolean(R.styleable.ToggleButton_tbAsDefaultOn, isDefaultOn);
+ typedArray.recycle();
+ borderColor = offBorderColor;
+ if (isDefaultOn) {
+ toggleOn();
+ }
+ }
+
+ public void toggle() {
+ toggle(true);
+ }
+
+ public void toggle(boolean animate) {
+ toggleOn = !toggleOn;
+ takeEffect(animate);
+ if (listener != null) {
+ listener.onToggle(toggleOn);
+ }
+ }
+
+ public void toggleOn() {
+ setToggleOn();
+ if (listener != null) {
+ listener.onToggle(toggleOn);
+ }
+ }
+
+ public void toggleOff() {
+ setToggleOff();
+ if (listener != null) {
+ listener.onToggle(toggleOn);
+ }
+ }
+
+ /**
+ * 设置显示成打开样式,不会触发toggle事件
+ */
+ public void setToggleOn() {
+ setToggleOn(true);
+ }
+
+ /**
+ * @param animate asd
+ */
+ public void setToggleOn(boolean animate) {
+ toggleOn = true;
+ takeEffect(animate);
+ }
+
+ /**
+ * 设置显示成关闭样式,不会触发toggle事件
+ */
+ public void setToggleOff() {
+ setToggleOff(true);
+ }
+
+ public void setToggleOff(boolean animate) {
+ toggleOn = false;
+ takeEffect(animate);
+ }
+
+ public int isToggleOn() {
+ return toggleOn ? 1 : 0;
+ }
+
+ private void takeEffect(boolean animate) {
+ if (animate) {
+ spring.setEndValue(toggleOn ? 1 : 0);
+ } else {
+//这里没有调用spring,所以spring里的当前值没有变更,这里要设置一下,同步两边的当前值
+ spring.setCurrentValue(toggleOn ? 1 : 0);
+ calculateEffect(toggleOn ? 1 : 0);
+ }
+ }
+
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
+ final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
+ int widthSize = MeasureSpec.getSize(widthMeasureSpec);
+ int heightSize = MeasureSpec.getSize(heightMeasureSpec);
+ Resources r = Resources.getSystem();
+ if (widthMode == MeasureSpec.UNSPECIFIED || widthMode == MeasureSpec.AT_MOST) {
+ widthSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, r.getDisplayMetrics());
+ widthMeasureSpec = MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY);
+ }
+ if (heightMode == MeasureSpec.UNSPECIFIED || heightSize == MeasureSpec.AT_MOST) {
+ heightSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 30, r.getDisplayMetrics());
+ heightMeasureSpec = MeasureSpec.makeMeasureSpec(heightSize, MeasureSpec.EXACTLY);
+ }
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right,
+ int bottom) {
+ super.onLayout(changed, left, top, right, bottom);
+ final int width = getWidth();
+ final int height = getHeight();
+ radius = Math.min(width, height) * 0.5f;
+ centerY = radius;
+ startX = radius;
+ endX = width - radius;
+ spotMinX = startX + borderWidth;
+ spotMaxX = endX - borderWidth;
+ spotSize = height - 4 * borderWidth;
+ spotX = toggleOn ? spotMaxX : spotMinX;
+ offLineWidth = 0;
+ }
+
+ SimpleSpringListener springListener = new SimpleSpringListener() {
+ @Override
+ public void onSpringUpdate(Spring spring) {
+ final double value = spring.getCurrentValue();
+ calculateEffect(value);
+ }
+ };
+
+ private int clamp(int value, int low, int high) {
+ return Math.min(Math.max(value, low), high);
+ }
+
+ @Override
+ public void draw(Canvas canvas) {
+//
+ super.draw(canvas);
+ rect.set(0, 0, getWidth(), getHeight());
+ paint.setColor(borderColor);
+ canvas.drawRoundRect(rect, radius, radius, paint);
+ if (offLineWidth > 0) {
+ final float cy = offLineWidth * 0.5f;
+ rect.set(spotX - cy, centerY - cy, endX + cy, centerY + cy);
+// paint.setColor(offColor);
+ canvas.drawRoundRect(rect, cy, cy, paint);
+ }
+ rect.set(spotX - 1 - radius, centerY - radius, spotX + 1.1f + radius, centerY + radius);
+ paint.setColor(borderColor);
+ canvas.drawRoundRect(rect, radius, radius, paint);
+ final float spotR = spotSize * 0.5f;
+ rect.set(spotX - spotR, centerY - spotR, spotX + spotR, centerY + spotR);
+ paint.setColor(spotColor);
+ canvas.drawRoundRect(rect, spotR, spotR, paint);
+ }
+
+ /**
+ * @param value
+ */
+ private void calculateEffect(final double value) {
+ final float mapToggleX = (float) SpringUtil.mapValueFromRangeToRange(value, 0, 1, spotMinX, spotMaxX);
+ spotX = mapToggleX;
+ float mapOffLineWidth = (float) SpringUtil.mapValueFromRangeToRange(1 - value, 0, 1, 10, spotSize);
+ offLineWidth = mapOffLineWidth;
+ final int fb = Color.blue(onColor);
+ final int fr = Color.red(onColor);
+ final int fg = Color.green(onColor);
+ final int tb = Color.blue(offBorderColor);
+ final int tr = Color.red(offBorderColor);
+ final int tg = Color.green(offBorderColor);
+ int sb = (int) SpringUtil.mapValueFromRangeToRange(1 - value, 0, 1, fb, tb);
+ int sr = (int) SpringUtil.mapValueFromRangeToRange(1 - value, 0, 1, fr, tr);
+ int sg = (int) SpringUtil.mapValueFromRangeToRange(1 - value, 0, 1, fg, tg);
+ sb = clamp(sb, 0, 255);
+ sr = clamp(sr, 0, 255);
+ sg = clamp(sg, 0, 255);
+ borderColor = Color.rgb(sr, sg, sb);
+ postInvalidate();
+ }
+
+ /**
+ * @author ThinkPad
+ */
+ public interface OnToggleChanged {
+ /**
+ * @param on = =
+ */
+ public void onToggle(boolean on);
+ }
+
+ public void setOnToggleChanged(OnToggleChanged onToggleChanged) {
+ listener = onToggleChanged;
+ }
+
+ public boolean isAnimate() {
+ return defaultAnimate;
+ }
+
+ public void setAnimate(boolean animate) {
+ this.defaultAnimate = animate;
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-hdpi/contact_edit_contact_def_face.png b/app/src/main/res/drawable-hdpi/contact_edit_contact_def_face.png
new file mode 100644
index 0000000..079225c
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/contact_edit_contact_def_face.png differ
diff --git a/app/src/main/res/drawable-hdpi/control_background.png b/app/src/main/res/drawable-hdpi/control_background.png
index 85e9ea7..d0408b5 100644
Binary files a/app/src/main/res/drawable-hdpi/control_background.png and b/app/src/main/res/drawable-hdpi/control_background.png differ
diff --git a/app/src/main/res/drawable-hdpi/default_avatar.png b/app/src/main/res/drawable-hdpi/default_avatar.png
new file mode 100644
index 0000000..ffb5e8e
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/default_avatar.png differ
diff --git a/app/src/main/res/drawable-hdpi/home_dialer_cion_circle.png b/app/src/main/res/drawable-hdpi/home_dialer_cion_circle.png
new file mode 100644
index 0000000..741109a
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/home_dialer_cion_circle.png differ
diff --git a/app/src/main/res/drawable-hdpi/home_dialer_icon.png b/app/src/main/res/drawable-hdpi/home_dialer_icon.png
new file mode 100644
index 0000000..0995d58
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/home_dialer_icon.png differ
diff --git a/app/src/main/res/drawable-hdpi/icon_avatar.png b/app/src/main/res/drawable-hdpi/icon_avatar.png
new file mode 100644
index 0000000..fd47ad5
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/icon_avatar.png differ
diff --git a/app/src/main/res/drawable-hdpi/icon_confirm.png b/app/src/main/res/drawable-hdpi/icon_confirm.png
new file mode 100644
index 0000000..008109b
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/icon_confirm.png differ
diff --git a/app/src/main/res/drawable-hdpi/icon_contact_add.png b/app/src/main/res/drawable-hdpi/icon_contact_add.png
new file mode 100644
index 0000000..7815b55
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/icon_contact_add.png differ
diff --git a/app/src/main/res/drawable-hdpi/icon_delete.png b/app/src/main/res/drawable-hdpi/icon_delete.png
new file mode 100644
index 0000000..08842de
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/icon_delete.png differ
diff --git a/app/src/main/res/drawable-hdpi/icon_phone.png b/app/src/main/res/drawable-hdpi/icon_phone.png
new file mode 100644
index 0000000..d3dfc23
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/icon_phone.png differ
diff --git a/app/src/main/res/drawable-hdpi/icon_return.png b/app/src/main/res/drawable-hdpi/icon_return.png
new file mode 100644
index 0000000..bfc8339
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/icon_return.png differ
diff --git a/app/src/main/res/drawable-hdpi/number_0.png b/app/src/main/res/drawable-hdpi/number_0.png
new file mode 100644
index 0000000..60e1ba2
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/number_0.png differ
diff --git a/app/src/main/res/drawable-hdpi/number_1.png b/app/src/main/res/drawable-hdpi/number_1.png
new file mode 100644
index 0000000..f0d0dd1
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/number_1.png differ
diff --git a/app/src/main/res/drawable-hdpi/number_11.png b/app/src/main/res/drawable-hdpi/number_11.png
new file mode 100644
index 0000000..2ae684c
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/number_11.png differ
diff --git a/app/src/main/res/drawable-hdpi/number_12.png b/app/src/main/res/drawable-hdpi/number_12.png
new file mode 100644
index 0000000..fde38b1
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/number_12.png differ
diff --git a/app/src/main/res/drawable-hdpi/number_2.png b/app/src/main/res/drawable-hdpi/number_2.png
new file mode 100644
index 0000000..2da9ede
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/number_2.png differ
diff --git a/app/src/main/res/drawable-hdpi/number_3.png b/app/src/main/res/drawable-hdpi/number_3.png
new file mode 100644
index 0000000..b8548c2
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/number_3.png differ
diff --git a/app/src/main/res/drawable-hdpi/number_4.png b/app/src/main/res/drawable-hdpi/number_4.png
new file mode 100644
index 0000000..d464bdb
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/number_4.png differ
diff --git a/app/src/main/res/drawable-hdpi/number_5.png b/app/src/main/res/drawable-hdpi/number_5.png
new file mode 100644
index 0000000..96c21dc
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/number_5.png differ
diff --git a/app/src/main/res/drawable-hdpi/number_6.png b/app/src/main/res/drawable-hdpi/number_6.png
new file mode 100644
index 0000000..d50ba38
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/number_6.png differ
diff --git a/app/src/main/res/drawable-hdpi/number_7.png b/app/src/main/res/drawable-hdpi/number_7.png
new file mode 100644
index 0000000..a1d8d87
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/number_7.png differ
diff --git a/app/src/main/res/drawable-hdpi/number_8.png b/app/src/main/res/drawable-hdpi/number_8.png
new file mode 100644
index 0000000..ec3fe93
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/number_8.png differ
diff --git a/app/src/main/res/drawable-hdpi/number_9.png b/app/src/main/res/drawable-hdpi/number_9.png
new file mode 100644
index 0000000..7f517a9
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/number_9.png differ
diff --git a/app/src/main/res/drawable-hdpi/number_delete.png b/app/src/main/res/drawable-hdpi/number_delete.png
new file mode 100644
index 0000000..84bb9ce
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/number_delete.png differ
diff --git a/app/src/main/res/drawable/add_contact_background.xml b/app/src/main/res/drawable/add_contact_background.xml
new file mode 100644
index 0000000..c42196d
--- /dev/null
+++ b/app/src/main/res/drawable/add_contact_background.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bt_dialer_bottomleft_normnl.xml b/app/src/main/res/drawable/bt_dialer_bottomleft_normnl.xml
new file mode 100644
index 0000000..16c3fad
--- /dev/null
+++ b/app/src/main/res/drawable/bt_dialer_bottomleft_normnl.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bt_dialer_bottomleft_pressed.xml b/app/src/main/res/drawable/bt_dialer_bottomleft_pressed.xml
new file mode 100644
index 0000000..c1858e7
--- /dev/null
+++ b/app/src/main/res/drawable/bt_dialer_bottomleft_pressed.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bt_dialer_bottomleft_selector.xml b/app/src/main/res/drawable/bt_dialer_bottomleft_selector.xml
new file mode 100644
index 0000000..c635999
--- /dev/null
+++ b/app/src/main/res/drawable/bt_dialer_bottomleft_selector.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bt_dialer_bottomright_normnl.xml b/app/src/main/res/drawable/bt_dialer_bottomright_normnl.xml
new file mode 100644
index 0000000..a632b5e
--- /dev/null
+++ b/app/src/main/res/drawable/bt_dialer_bottomright_normnl.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bt_dialer_bottomright_pressed.xml b/app/src/main/res/drawable/bt_dialer_bottomright_pressed.xml
new file mode 100644
index 0000000..6441415
--- /dev/null
+++ b/app/src/main/res/drawable/bt_dialer_bottomright_pressed.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bt_dialer_bottomright_selector.xml b/app/src/main/res/drawable/bt_dialer_bottomright_selector.xml
new file mode 100644
index 0000000..dd1f5cd
--- /dev/null
+++ b/app/src/main/res/drawable/bt_dialer_bottomright_selector.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bt_dialer_normnl.xml b/app/src/main/res/drawable/bt_dialer_normnl.xml
new file mode 100644
index 0000000..235af19
--- /dev/null
+++ b/app/src/main/res/drawable/bt_dialer_normnl.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bt_dialer_pressed.xml b/app/src/main/res/drawable/bt_dialer_pressed.xml
new file mode 100644
index 0000000..c8ea057
--- /dev/null
+++ b/app/src/main/res/drawable/bt_dialer_pressed.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bt_dialer_selector.xml b/app/src/main/res/drawable/bt_dialer_selector.xml
new file mode 100644
index 0000000..7b7914c
--- /dev/null
+++ b/app/src/main/res/drawable/bt_dialer_selector.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bt_dialer_topleft_normnl.xml b/app/src/main/res/drawable/bt_dialer_topleft_normnl.xml
new file mode 100644
index 0000000..6e24772
--- /dev/null
+++ b/app/src/main/res/drawable/bt_dialer_topleft_normnl.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bt_dialer_topleft_pressed.xml b/app/src/main/res/drawable/bt_dialer_topleft_pressed.xml
new file mode 100644
index 0000000..0c0a07a
--- /dev/null
+++ b/app/src/main/res/drawable/bt_dialer_topleft_pressed.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bt_dialer_topleft_selector.xml b/app/src/main/res/drawable/bt_dialer_topleft_selector.xml
new file mode 100644
index 0000000..d51182c
--- /dev/null
+++ b/app/src/main/res/drawable/bt_dialer_topleft_selector.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bt_dialer_topright_normnl.xml b/app/src/main/res/drawable/bt_dialer_topright_normnl.xml
new file mode 100644
index 0000000..7f5cff3
--- /dev/null
+++ b/app/src/main/res/drawable/bt_dialer_topright_normnl.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bt_dialer_topright_pressed.xml b/app/src/main/res/drawable/bt_dialer_topright_pressed.xml
new file mode 100644
index 0000000..53f4360
--- /dev/null
+++ b/app/src/main/res/drawable/bt_dialer_topright_pressed.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bt_dialer_topright_selector.xml b/app/src/main/res/drawable/bt_dialer_topright_selector.xml
new file mode 100644
index 0000000..c05028b
--- /dev/null
+++ b/app/src/main/res/drawable/bt_dialer_topright_selector.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/contact_bg.xml b/app/src/main/res/drawable/contact_bg.xml
new file mode 100644
index 0000000..e0f6d34
--- /dev/null
+++ b/app/src/main/res/drawable/contact_bg.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/dialer_number_bg.xml b/app/src/main/res/drawable/dialer_number_bg.xml
new file mode 100644
index 0000000..e0f6d34
--- /dev/null
+++ b/app/src/main/res/drawable/dialer_number_bg.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout-land/activity_contact.xml b/app/src/main/res/layout-land/activity_contact.xml
index a719674..d93a0a8 100644
--- a/app/src/main/res/layout-land/activity_contact.xml
+++ b/app/src/main/res/layout-land/activity_contact.xml
@@ -17,9 +17,9 @@
+
+
diff --git a/app/src/main/res/layout-land/activity_dialer.xml b/app/src/main/res/layout-land/activity_dialer.xml
new file mode 100644
index 0000000..497cbb7
--- /dev/null
+++ b/app/src/main/res/layout-land/activity_dialer.xml
@@ -0,0 +1,465 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout-port/activity_contact.xml b/app/src/main/res/layout-port/activity_contact.xml
index 8cf0b7c..d93a0a8 100644
--- a/app/src/main/res/layout-port/activity_contact.xml
+++ b/app/src/main/res/layout-port/activity_contact.xml
@@ -17,9 +17,9 @@
+
+
+ app:layout_constraintTop_toTopOf="parent" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_add_contact.xml b/app/src/main/res/layout/activity_add_contact.xml
new file mode 100644
index 0000000..e813a93
--- /dev/null
+++ b/app/src/main/res/layout/activity_add_contact.xml
@@ -0,0 +1,207 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_records.xml b/app/src/main/res/layout/activity_records.xml
new file mode 100644
index 0000000..3af15bb
--- /dev/null
+++ b/app/src/main/res/layout/activity_records.xml
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_call_record.xml b/app/src/main/res/layout/item_call_record.xml
new file mode 100644
index 0000000..bd2e74d
--- /dev/null
+++ b/app/src/main/res/layout/item_call_record.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_contact.xml b/app/src/main/res/layout/item_contact.xml
index 3ad474e..0147bbb 100644
--- a/app/src/main/res/layout/item_contact.xml
+++ b/app/src/main/res/layout/item_contact.xml
@@ -9,59 +9,80 @@
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_100"
- android:layout_margin="@dimen/dp_4"
- android:background="@drawable/background_weather_rain"
+ android:layout_margin="@dimen/dp_8"
+ android:background="@drawable/contact_bg"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
-
-
+ android:id="@+id/cl_contact"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
-
+ app:layout_constraintVertical_bias="0.5" />
-
+ android:layout_marginStart="@dimen/dp_8"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toEndOf="@+id/iv_head"
+ app:layout_constraintTop_toTopOf="parent">
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/raw/s_0.wav b/app/src/main/res/raw/s_0.wav
new file mode 100644
index 0000000..c3c3944
Binary files /dev/null and b/app/src/main/res/raw/s_0.wav differ
diff --git a/app/src/main/res/raw/s_1.wav b/app/src/main/res/raw/s_1.wav
new file mode 100644
index 0000000..79ffac7
Binary files /dev/null and b/app/src/main/res/raw/s_1.wav differ
diff --git a/app/src/main/res/raw/s_2.wav b/app/src/main/res/raw/s_2.wav
new file mode 100644
index 0000000..b91ccd5
Binary files /dev/null and b/app/src/main/res/raw/s_2.wav differ
diff --git a/app/src/main/res/raw/s_3.wav b/app/src/main/res/raw/s_3.wav
new file mode 100644
index 0000000..9559e11
Binary files /dev/null and b/app/src/main/res/raw/s_3.wav differ
diff --git a/app/src/main/res/raw/s_4.wav b/app/src/main/res/raw/s_4.wav
new file mode 100644
index 0000000..8e1b8e3
Binary files /dev/null and b/app/src/main/res/raw/s_4.wav differ
diff --git a/app/src/main/res/raw/s_5.wav b/app/src/main/res/raw/s_5.wav
new file mode 100644
index 0000000..f4c8fa9
Binary files /dev/null and b/app/src/main/res/raw/s_5.wav differ
diff --git a/app/src/main/res/raw/s_6.wav b/app/src/main/res/raw/s_6.wav
new file mode 100644
index 0000000..e9e1902
Binary files /dev/null and b/app/src/main/res/raw/s_6.wav differ
diff --git a/app/src/main/res/raw/s_7.wav b/app/src/main/res/raw/s_7.wav
new file mode 100644
index 0000000..9ac18d0
Binary files /dev/null and b/app/src/main/res/raw/s_7.wav differ
diff --git a/app/src/main/res/raw/s_8.wav b/app/src/main/res/raw/s_8.wav
new file mode 100644
index 0000000..57aa9e3
Binary files /dev/null and b/app/src/main/res/raw/s_8.wav differ
diff --git a/app/src/main/res/raw/s_9.wav b/app/src/main/res/raw/s_9.wav
new file mode 100644
index 0000000..8c82ae6
Binary files /dev/null and b/app/src/main/res/raw/s_9.wav differ
diff --git a/app/src/main/res/raw/s_j.wav b/app/src/main/res/raw/s_j.wav
new file mode 100644
index 0000000..0075b84
Binary files /dev/null and b/app/src/main/res/raw/s_j.wav differ
diff --git a/app/src/main/res/raw/s_x.wav b/app/src/main/res/raw/s_x.wav
new file mode 100644
index 0000000..ce49e77
Binary files /dev/null and b/app/src/main/res/raw/s_x.wav differ
diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml
index e44bce3..0a3c5fe 100644
--- a/app/src/main/res/values/attrs.xml
+++ b/app/src/main/res/values/attrs.xml
@@ -33,10 +33,21 @@
- 1.15
- 1.30
+
- "默认"
- "大"
- "最大"
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 5268c11..d6ae17c 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -5,6 +5,7 @@
#454347
#ffffff
+ #EDECEC
#FFFFFF
#00FFFFFF
#000000