version:3.2

fix:
update:增加拨号,添加联系人,通话记录
This commit is contained in:
2023-04-28 10:52:38 +08:00
parent dee497c0a2
commit 2a0fa9f4dc
104 changed files with 3170 additions and 177 deletions

View File

@@ -105,6 +105,15 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".activity.contact.AddContactActivity"
android:launchMode="singleTask"
android:screenOrientation="userPortrait" />
<activity android:name=".activity.records.RecordsActivity"></activity>
<activity
android:name=".activity.dialer.DialerActivity"
android:configChanges="keyboardHidden"
android:launchMode="singleTask" />
<activity
android:name=".activity.DailyAppActivity"
android:launchMode="singleTask" />

View File

@@ -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;

View File

@@ -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<LocalMedia>() {
@Override
public void onResult(ArrayList<LocalMedia> 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<String, String> 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<BaseResponse>() {
@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;
}
}

View File

@@ -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();
}

View File

@@ -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<List<Contact>> 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<List<Contact>>() {
}.getType();

View File

@@ -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<Integer, Integer> 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);
}
}

View File

@@ -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<RecordsInfo> dataList;
/**
* 读取数据
*
* @return 读取到的数据
*/
private List<RecordsInfo> 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<RecordsInfo> 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;
}
}

View File

@@ -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<CallRecordAdapter.Holder> {
private Context mContext;
private List<RecordsInfo> mRecordsInfoList;
private SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat("HH:mm");
public void setRecordsInfoList(List<RecordsInfo> 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);
}
}
}

View File

@@ -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<ContactAdapter.ContactH
private Context mContext;
public static final String DIALER_PACKAGE = "com.android.dialer";
public static final String DIALER_ADD_CONTACT = "com.uiui.aios.contact.add";
public void setContactList(List<Contact> contactList) {
this.mContactList = contactList;
@@ -46,45 +48,59 @@ public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ContactH
contactHolder.root.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// int aole_call_forbid = Settings.System.getInt(mContext.getContentResolver(), "aole_call_forbid", 0);
// if (aole_call_forbid == 1) {
// int qch_call_forbid = Settings.System.getInt(mContext.getContentResolver(), "qch_call_forbid", 0);
// if (qch_call_forbid == 1) {
// ToastUtil.show("电话功能被禁用");
// return;
// icon_return;
// }
Intent intent1 = new Intent(Intent.ACTION_CALL);
Intent dialIntent = new Intent(Intent.ACTION_CALL);
String phone = contact.getMobile();
if (DIALER_PACKAGE.equals(phone)) {
mContext.startActivity(new Intent(Intent.ACTION_DIAL));
try {
// mContext.startActivity(new Intent(Intent.ACTION_DIAL));
// mContext.startActivity(new Intent(mContext, DialerActivity.class));
mContext.startActivity(new Intent(mContext, RecordsActivity.class));
} catch (Exception e) {
ToastUtil.show("无法打开电话功能");
}
} else if (DIALER_ADD_CONTACT.equals(contact.getMobile())) {
Intent intent = new Intent(mContext, AddContactActivity.class);
mContext.startActivity(intent);
} else if (!TextUtils.isEmpty(phone)) {
Uri data = Uri.parse("tel:" + phone);
intent1.setData(data);
mContext.startActivity(intent1);
dialIntent.setData(data);
mContext.startActivity(dialIntent);
}
}
});
contactHolder.tv_name.setText(contact.getName());
if (DIALER_PACKAGE.equals(contact.getMobile())) {
contactHolder.cl_contact.setVisibility(View.GONE);
contactHolder.iv_head2.setVisibility(View.VISIBLE);
contactHolder.tv_phone.setText("");
Glide.with(contactHolder.iv_head).load(R.drawable.icon_dialer).error(R.drawable.icon_dialer).into(contactHolder.iv_head);
Glide.with(contactHolder.iv_head).load(R.drawable.home_dialer_cion_circle).error(R.drawable.home_dialer_cion_circle).into(contactHolder.iv_head);
} else if (DIALER_ADD_CONTACT.equals(contact.getMobile())) {
Glide.with(contactHolder.iv_head).load(R.drawable.icon_contact_add).error(R.drawable.icon_contact_add).into(contactHolder.iv_head);
} else {
contactHolder.cl_contact.setVisibility(View.VISIBLE);
contactHolder.iv_head2.setVisibility(View.GONE);
contactHolder.tv_phone.setText(contact.getMobile());
Glide.with(contactHolder.iv_head).load(contact.getAvatar()).error(R.drawable.default_head).into(contactHolder.iv_head);
}
int index = position % 3;
switch (index) {
case 0:
contactHolder.root.setBackground(mContext.getDrawable(R.drawable.contact_bg1));
break;
case 1:
contactHolder.root.setBackground(mContext.getDrawable(R.drawable.contact_bg2));
break;
case 2:
contactHolder.root.setBackground(mContext.getDrawable(R.drawable.contact_bg3));
break;
default:
contactHolder.root.setBackground(mContext.getDrawable(R.drawable.contact_bg1));
Glide.with(contactHolder.iv_head).load(contact.getAvatar()).error(R.drawable.default_avatar).into(contactHolder.iv_head);
}
// int index = position % 3;
// switch (index) {
// case 0:
// contactHolder.root.setBackground(mContext.getDrawable(R.drawable.background_weather_rain));
// break;
// case 1:
// contactHolder.root.setBackground(mContext.getDrawable(R.drawable.background_weather_sun));
// break;
// case 2:
// contactHolder.root.setBackground(mContext.getDrawable(R.drawable.background_weather_sunny));
// break;
// default:
// contactHolder.root.setBackground(mContext.getDrawable(R.drawable.background_weather_rain));
// }
}
@Override
@@ -94,14 +110,18 @@ public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ContactH
static class ContactHolder extends RecyclerView.ViewHolder {
ConstraintLayout root;
ConstraintLayout cl_contact;
NiceImageView iv_head;
NiceImageView iv_head2;
TextView tv_name;
TextView tv_phone;
public ContactHolder(@NonNull View itemView) {
super(itemView);
root = itemView.findViewById(R.id.root);
cl_contact = itemView.findViewById(R.id.cl_contact);
iv_head = itemView.findViewById(R.id.iv_head);
iv_head2 = itemView.findViewById(R.id.iv_head2);
tv_name = itemView.findViewById(R.id.tv_name);
tv_phone = itemView.findViewById(R.id.tv_phone);
}

View File

@@ -0,0 +1,129 @@
package com.uiuios.aios.base;
import android.os.Bundle;
import androidx.annotation.CallSuper;
import androidx.annotation.CheckResult;
import androidx.annotation.ContentView;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.trello.rxlifecycle4.LifecycleProvider;
import com.trello.rxlifecycle4.LifecycleTransformer;
import com.trello.rxlifecycle4.RxLifecycle;
import com.trello.rxlifecycle4.android.ActivityEvent;
import com.trello.rxlifecycle4.android.RxLifecycleAndroid;
import com.uiuios.aios.R;
import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.subjects.BehaviorSubject;
public abstract class BaseLightActivity extends AppCompatActivity implements LifecycleProvider<ActivityEvent> {
public final BehaviorSubject<ActivityEvent> lifecycleSubject = BehaviorSubject.create();
public BaseLightActivity() {
super();
}
@ContentView
public BaseLightActivity(@LayoutRes int contentLayoutId) {
super(contentLayoutId);
}
@Override
@NonNull
@CheckResult
public final Observable<ActivityEvent> lifecycle() {
return lifecycleSubject.hide();
}
@Override
@NonNull
@CheckResult
public final <T> LifecycleTransformer<T> bindUntilEvent(@NonNull ActivityEvent event) {
return RxLifecycle.bindUntilEvent(lifecycleSubject, event);
}
@Override
@NonNull
@CheckResult
public final <T> LifecycleTransformer<T> bindToLifecycle() {
return RxLifecycleAndroid.bindActivity(lifecycleSubject);
}
@Override
@CallSuper
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
lifecycleSubject.onNext(ActivityEvent.CREATE);
// 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();
}
}

View File

@@ -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;
/**
* @authorluck
* @date2019-11-13 17:02
* @describeGlide加载引擎
*/
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;
}
}

View File

@@ -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();
}
}

View File

@@ -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<List<AlarmClockData>>() {
}.getType();

View File

@@ -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<BaseResponse> getMailListAddObservable(Map<String, String> 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<ActivityBean> 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<List<ActivityBean>>() {
}.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<DemandBean> 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<List<DemandBean>>() {
}.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<HealthCode> 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<List<HealthCode>>() {
}.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<ActivityEvent> 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<List<AlarmClockData>>() {
}.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<Contact> 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<Contact> 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<Contact> 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<Contact> 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);

View File

@@ -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";

View File

@@ -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<BaseResponse<List<ActivityBean>>> getActivityList(
@Query("sn") String sn,
@Query("startSize") int startSize,

View File

@@ -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<BaseResponse<List<AlarmClockData>>> getAlarmClockApiApi(
@Query("sn") String sn
);

View File

@@ -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<BaseResponse> sendappUsageRecord(
@Field("sn") String sn,
@Field("app_name") String app_name,

View File

@@ -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<BaseResponse<ArticleDetails>> getArticleDetails(
@Query("id") int id
);

View File

@@ -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<BaseResponse<List<ArticleInfo>>> getArticleList(
@Query("sn") String sn
);

View File

@@ -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<BaseResponse<List<DemandBean>>> getDemandList(
@Query("sn") String sn,
@Query("startSize") int startSize,

View File

@@ -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<BaseResponse> getAdminSnSetting(
@Query("sn") String sn
);

View File

@@ -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<BaseResponse<List<NetDesktopIcon>>> getDesktopLayout(
@Query("sn") String sn
);

View File

@@ -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<BaseResponse<List<Contact>>> getContact(
@Query("sn") String sn
);

View File

@@ -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<BaseResponse<UserId>> getUserID(
@Query("sn") String sn
);

View File

@@ -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<BaseResponse<GoodsDetails>> getGoodsDetails(
@Query("id") int id
);

View File

@@ -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<BaseResponse<List<GoodsInfo>>> getGoodsList(
@Query("sn") String sn
);

View File

@@ -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<BaseResponse<List<HealthCode>>> getArticleDetails(
@Query("sn") String sn
);

View File

@@ -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<BaseResponse> addMailList(
@QueryMap Map<String, String> params,
@Part MultipartBody.Part body
);
}

View File

@@ -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<BaseResponse> sendRunningInfo(
@Field("sn") String sn,
@Field("app") String app

View File

@@ -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<BaseResponse<SnInfo>> getsninfo(
@Query("sn") String sn
);

View File

@@ -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<BaseResponse> sendSOSRecord(
@Field("sn") String sn,
@Field("longitude") String longitude,

View File

@@ -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<BaseResponse> sendScreenshot(
@Query("sn") String sn,
@Part MultipartBody.Part file

View File

@@ -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<BaseResponse<SystemSettings>> getSetting(
@Query("sn") String sn
);

View File

@@ -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<BaseResponse> updateAlarm(
@Field("sn") String sn,
@Field("id") int id

View File

@@ -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<BaseResponse> appIconUpdate(
@Field("sn") String sn,
@Field("app_package") String app_package,

View File

@@ -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<BaseResponse> updateLayout(
@Field("sn") String sn,
@Field("app") String app

View File

@@ -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<BaseResponse<UserAvatarInfo>> getUserAvatarInfo(
@Field("sn") String sn
);

View File

@@ -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;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 223 KiB

After

Width:  |  Height:  |  Size: 403 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1002 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 内部颜色 -->
<solid android:color="@color/white" />
<!-- 圆角的幅度 -->
<corners android:radius="@dimen/dp_8" />
<!-- <padding-->
<!-- android:bottom="0dp"-->
<!-- android:left="8dp"-->
<!-- android:right="8dp"-->
<!-- android:top="0dp" />-->
</shape>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 内部颜色 -->
<solid android:color="@color/white" />
<corners android:bottomLeftRadius="@dimen/dp_8" />
</shape>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 内部颜色 -->
<solid android:color="#E8E8E8" />
<corners android:bottomLeftRadius="@dimen/dp_8" />
</shape>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 没有焦点时的背景颜色 -->
<item android:drawable="@drawable/bt_dialer_bottomleft_normnl" android:state_window_focused="false" />
<!-- 非触摸模式下获得焦点并单击时的背景颜色 -->
<item android:drawable="@drawable/bt_dialer_bottomleft_pressed" android:state_focused="true" android:state_pressed="true" />
<!-- 触摸模式下单击时的背景颜色 -->
<item android:drawable="@drawable/bt_dialer_bottomleft_pressed" android:state_focused="false" android:state_pressed="true" />
<!-- 选中时的背景颜色 -->
<item android:drawable="@drawable/bt_dialer_bottomleft_normnl" android:state_selected="true" />
<!-- 获得焦点时的背景 颜色 -->
<item android:drawable="@drawable/bt_dialer_bottomleft_normnl" android:state_focused="true" />
</selector>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 内部颜色 -->
<solid android:color="@color/white" />
<corners android:bottomRightRadius="@dimen/dp_8" />
</shape>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 内部颜色 -->
<solid android:color="#E8E8E8" />
<corners android:bottomRightRadius="@dimen/dp_8" />
</shape>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 没有焦点时的背景颜色 -->
<item android:drawable="@drawable/bt_dialer_bottomright_normnl" android:state_window_focused="false" />
<!-- 非触摸模式下获得焦点并单击时的背景颜色 -->
<item android:drawable="@drawable/bt_dialer_bottomright_pressed" android:state_focused="true" android:state_pressed="true" />
<!-- 触摸模式下单击时的背景颜色 -->
<item android:drawable="@drawable/bt_dialer_bottomright_pressed" android:state_focused="false" android:state_pressed="true" />
<!-- 选中时的背景颜色 -->
<item android:drawable="@drawable/bt_dialer_bottomright_normnl" android:state_selected="true" />
<!-- 获得焦点时的背景 颜色 -->
<item android:drawable="@drawable/bt_dialer_bottomright_normnl" android:state_focused="true" />
</selector>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 内部颜色 -->
<solid android:color="@color/white" />
</shape>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 内部颜色 -->
<solid android:color="#E8E8E8" />
</shape>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 没有焦点时的背景颜色 -->
<item android:drawable="@drawable/bt_dialer_normnl" android:state_window_focused="false" />
<!-- 非触摸模式下获得焦点并单击时的背景颜色 -->
<item android:drawable="@drawable/bt_dialer_pressed" android:state_focused="true" android:state_pressed="true" />
<!-- 触摸模式下单击时的背景颜色 -->
<item android:drawable="@drawable/bt_dialer_pressed" android:state_focused="false" android:state_pressed="true" />
<!-- 选中时的背景颜色 -->
<item android:drawable="@drawable/bt_dialer_normnl" android:state_selected="true" />
<!-- 获得焦点时的背景 颜色 -->
<item android:drawable="@drawable/bt_dialer_normnl" android:state_focused="true" />
</selector>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 内部颜色 -->
<solid android:color="@color/white" />
<corners android:topLeftRadius="@dimen/dp_8" />
</shape>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 内部颜色 -->
<solid android:color="#E8E8E8" />
<corners android:topLeftRadius="@dimen/dp_8" />
</shape>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 没有焦点时的背景颜色 -->
<item android:drawable="@drawable/bt_dialer_topleft_normnl" android:state_window_focused="false" />
<!-- 非触摸模式下获得焦点并单击时的背景颜色 -->
<item android:drawable="@drawable/bt_dialer_topleft_pressed" android:state_focused="true" android:state_pressed="true" />
<!-- 触摸模式下单击时的背景颜色 -->
<item android:drawable="@drawable/bt_dialer_topleft_pressed" android:state_focused="false" android:state_pressed="true" />
<!-- 选中时的背景颜色 -->
<item android:drawable="@drawable/bt_dialer_topleft_normnl" android:state_selected="true" />
<!-- 获得焦点时的背景 颜色 -->
<item android:drawable="@drawable/bt_dialer_topleft_normnl" android:state_focused="true" />
</selector>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 内部颜色 -->
<solid android:color="@color/white" />
<corners android:topRightRadius="@dimen/dp_8" />
</shape>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 内部颜色 -->
<solid android:color="#E8E8E8" />
<corners android:topRightRadius="@dimen/dp_8" />
</shape>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 没有焦点时的背景颜色 -->
<item android:drawable="@drawable/bt_dialer_topright_normnl" android:state_window_focused="false" />
<!-- 非触摸模式下获得焦点并单击时的背景颜色 -->
<item android:drawable="@drawable/bt_dialer_topright_pressed" android:state_focused="true" android:state_pressed="true" />
<!-- 触摸模式下单击时的背景颜色 -->
<item android:drawable="@drawable/bt_dialer_topright_pressed" android:state_focused="false" android:state_pressed="true" />
<!-- 选中时的背景颜色 -->
<item android:drawable="@drawable/bt_dialer_topright_normnl" android:state_selected="true" />
<!-- 获得焦点时的背景 颜色 -->
<item android:drawable="@drawable/bt_dialer_topright_normnl" android:state_focused="true" />
</selector>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 内部颜色 -->
<solid android:color="#33FFFFFF" />
<!-- 圆角的幅度 -->
<corners android:radius="@dimen/dp_8" />
<!-- <padding-->
<!-- android:bottom="0dp"-->
<!-- android:left="8dp"-->
<!-- android:right="8dp"-->
<!-- android:top="0dp" />-->
</shape>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 内部颜色 -->
<solid android:color="#33FFFFFF" />
<!-- 圆角的幅度 -->
<corners android:radius="@dimen/dp_8" />
<!-- <padding-->
<!-- android:bottom="0dp"-->
<!-- android:left="8dp"-->
<!-- android:right="8dp"-->
<!-- android:top="0dp" />-->
</shape>

View File

@@ -17,9 +17,9 @@
<ImageView
android:id="@+id/iv_back"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginStart="8dp"
android:layout_width="@dimen/dp_20"
android:layout_height="@dimen/dp_20"
android:layout_marginStart="@dimen/dp_8"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/back_white"
@@ -28,9 +28,10 @@
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView21"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:layout_marginStart="@dimen/dp_8"
android:text="通讯录"
android:textColor="@color/white"
android:textSize="@dimen/sp_18"
@@ -42,11 +43,23 @@
android:id="@+id/tv_people"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_16"
android:layout_marginStart="@dimen/dp_8"
android:text="0人"
android:textColor="@color/white"
android:textSize="@dimen/sp_18"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/textView21"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_8"
android:text="添加联系人"
android:textColor="@color/white"
android:textSize="@dimen/sp_12"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,465 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/control_background"
tools:context=".activity.dialer.DialerActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_16"
android:layout_marginTop="@dimen/dp_32"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/iv_contact"
android:layout_width="@dimen/dp_32"
android:layout_height="@dimen/dp_32"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/contact_edit_contact_def_face"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_contact"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_8"
android:text="联系人"
android:textColor="@color/white"
android:textSize="@dimen/sp_17"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/iv_contact"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout9"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_48"
android:layout_marginStart="@dimen/dp_16"
android:layout_marginEnd="@dimen/dp_16"
android:background="@drawable/dialer_number_bg"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent">
<EditText
android:id="@+id/et_phone"
android:layout_width="0dp"
android:layout_height="match_parent"
android:background="@null"
android:cursorVisible="true"
android:gravity="center"
android:inputType="phone"
android:letterSpacing="0.1"
android:maxLength="11"
android:paddingStart="@dimen/dp_8"
android:textColor="@color/white"
android:textSize="@dimen/sp_18"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/iv_delete"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="123456789000" />
<ImageView
android:id="@+id/iv_delete"
android:layout_width="@dimen/dp_32"
android:layout_height="@dimen/dp_32"
android:layout_marginEnd="@dimen/dp_8"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/number_delete"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<com.shehuan.niv.NiceImageView
android:id="@+id/nv_dialer"
android:layout_width="@dimen/dp_64"
android:layout_height="@dimen/dp_64"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/home_dialer_cion_circle"
app:is_circle="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/constraintLayout9" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="@dimen/dp_32"
android:background="@drawable/add_contact_background">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_1"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/bt_dialer_topleft_selector"
android:clickable="true"
android:focusable="true">
<ImageView
android:layout_width="@dimen/dp_26"
android:layout_height="@dimen/dp_26"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/number_1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:layout_width="1px"
android:layout_height="match_parent"
android:background="@color/noti_font_color" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_2"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/bt_dialer_selector"
android:clickable="true"
android:focusable="true">
<ImageView
android:layout_width="@dimen/dp_26"
android:layout_height="@dimen/dp_26"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/number_2"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:layout_width="1px"
android:layout_height="match_parent"
android:background="@color/noti_font_color" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_3"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/bt_dialer_topright_selector"
android:clickable="true"
android:focusable="true">
<ImageView
android:layout_width="@dimen/dp_26"
android:layout_height="@dimen/dp_26"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/number_3"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@color/noti_font_color" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_4"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/bt_dialer_selector"
android:clickable="true"
android:focusable="true">
<ImageView
android:layout_width="@dimen/dp_26"
android:layout_height="@dimen/dp_26"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/number_4"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:layout_width="1px"
android:layout_height="match_parent"
android:background="@color/noti_font_color" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_5"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/bt_dialer_selector"
android:clickable="true"
android:focusable="true">
<ImageView
android:layout_width="@dimen/dp_26"
android:layout_height="@dimen/dp_26"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/number_5"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:layout_width="1px"
android:layout_height="match_parent"
android:background="@color/noti_font_color" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_6"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/bt_dialer_selector"
android:clickable="true"
android:focusable="true">
<ImageView
android:layout_width="@dimen/dp_26"
android:layout_height="@dimen/dp_26"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/number_6"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@color/noti_font_color" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_7"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/bt_dialer_selector"
android:clickable="true"
android:focusable="true">
<ImageView
android:layout_width="@dimen/dp_26"
android:layout_height="@dimen/dp_26"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/number_7"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:layout_width="1px"
android:layout_height="match_parent"
android:background="@color/noti_font_color" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_8"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/bt_dialer_selector"
android:clickable="true"
android:focusable="true">
<ImageView
android:layout_width="@dimen/dp_26"
android:layout_height="@dimen/dp_26"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/number_8"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:layout_width="1px"
android:layout_height="match_parent"
android:background="@color/noti_font_color" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_9"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/bt_dialer_selector"
android:clickable="true"
android:focusable="true">
<ImageView
android:layout_width="@dimen/dp_26"
android:layout_height="@dimen/dp_26"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/number_9"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@color/noti_font_color" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_11"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/bt_dialer_bottomleft_selector"
android:clickable="true"
android:focusable="true">
<ImageView
android:layout_width="@dimen/dp_26"
android:layout_height="@dimen/dp_26"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/number_11"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:layout_width="1px"
android:layout_height="match_parent"
android:background="@color/noti_font_color" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_0"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/bt_dialer_selector"
android:clickable="true"
android:focusable="true">
<ImageView
android:layout_width="@dimen/dp_26"
android:layout_height="@dimen/dp_26"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/number_0"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:layout_width="1px"
android:layout_height="match_parent"
android:background="@color/noti_font_color" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_12"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/bt_dialer_bottomright_selector"
android:clickable="true"
android:focusable="true">
<ImageView
android:layout_width="@dimen/dp_26"
android:layout_height="@dimen/dp_26"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/number_12"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -17,9 +17,9 @@
<ImageView
android:id="@+id/iv_back"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginStart="8dp"
android:layout_width="@dimen/dp_20"
android:layout_height="@dimen/dp_20"
android:layout_marginStart="@dimen/dp_8"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/back_white"
@@ -28,9 +28,10 @@
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView21"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:layout_marginStart="@dimen/dp_8"
android:text="通讯录"
android:textColor="@color/white"
android:textSize="@dimen/sp_18"
@@ -42,14 +43,25 @@
android:id="@+id/tv_people"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_16"
android:layout_marginStart="@dimen/dp_8"
android:text="0人"
android:textColor="@color/white"
android:textSize="@dimen/sp_18"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/textView21"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_8"
android:text="添加联系人"
android:textColor="@color/white"
android:textSize="@dimen/sp_12"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.615" />
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.recyclerview.widget.RecyclerView

View File

@@ -0,0 +1,458 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/control_background"
tools:context=".activity.dialer.DialerActivity">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout10"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_32"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/iv_contact"
android:layout_width="@dimen/dp_32"
android:layout_height="@dimen/dp_32"
android:layout_marginStart="@dimen/dp_32"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/contact_edit_contact_def_face"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_contact"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_8"
android:text="联系人"
android:textColor="@color/white"
android:textSize="@dimen/sp_17"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/iv_contact"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/et_phone"
android:layout_width="0dp"
android:layout_height="match_parent"
android:background="@null"
android:cursorVisible="true"
android:gravity="center"
android:inputType="phone"
android:letterSpacing="0.1"
android:maxLength="11"
android:paddingStart="@dimen/dp_8"
android:textColor="@color/white"
android:textSize="@dimen/sp_18"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/iv_delete"
app:layout_constraintStart_toEndOf="@+id/iv_contact"
app:layout_constraintTop_toTopOf="parent"
tools:text="123456789000" />
<ImageView
android:id="@+id/iv_delete"
android:layout_width="@dimen/dp_32"
android:layout_height="@dimen/dp_32"
android:layout_marginEnd="@dimen/dp_32"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/number_delete"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout8"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_margin="@dimen/dp_36"
android:background="@drawable/add_contact_background"
app:layout_constraintBottom_toTopOf="@+id/constraintLayout11"
app:layout_constraintTop_toBottomOf="@+id/constraintLayout10">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_1"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/bt_dialer_topleft_selector"
android:clickable="true"
android:focusable="true">
<ImageView
android:layout_width="@dimen/dp_26"
android:layout_height="@dimen/dp_26"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/number_1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:layout_width="1px"
android:layout_height="match_parent"
android:background="@color/noti_font_color" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_2"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/bt_dialer_selector"
android:clickable="true"
android:focusable="true">
<ImageView
android:layout_width="@dimen/dp_26"
android:layout_height="@dimen/dp_26"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/number_2"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:layout_width="1px"
android:layout_height="match_parent"
android:background="@color/noti_font_color" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_3"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/bt_dialer_topright_selector"
android:clickable="true"
android:focusable="true">
<ImageView
android:layout_width="@dimen/dp_26"
android:layout_height="@dimen/dp_26"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/number_3"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@color/noti_font_color" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_4"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/bt_dialer_selector"
android:clickable="true"
android:focusable="true">
<ImageView
android:layout_width="@dimen/dp_26"
android:layout_height="@dimen/dp_26"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/number_4"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:layout_width="1px"
android:layout_height="match_parent"
android:background="@color/noti_font_color" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_5"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/bt_dialer_selector"
android:clickable="true"
android:focusable="true">
<ImageView
android:layout_width="@dimen/dp_26"
android:layout_height="@dimen/dp_26"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/number_5"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:layout_width="1px"
android:layout_height="match_parent"
android:background="@color/noti_font_color" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_6"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/bt_dialer_selector"
android:clickable="true"
android:focusable="true">
<ImageView
android:layout_width="@dimen/dp_26"
android:layout_height="@dimen/dp_26"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/number_6"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@color/noti_font_color" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_7"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/bt_dialer_selector"
android:clickable="true"
android:focusable="true">
<ImageView
android:layout_width="@dimen/dp_26"
android:layout_height="@dimen/dp_26"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/number_7"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:layout_width="1px"
android:layout_height="match_parent"
android:background="@color/noti_font_color" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_8"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/bt_dialer_selector"
android:clickable="true"
android:focusable="true">
<ImageView
android:layout_width="@dimen/dp_26"
android:layout_height="@dimen/dp_26"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/number_8"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:layout_width="1px"
android:layout_height="match_parent"
android:background="@color/noti_font_color" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_9"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/bt_dialer_selector"
android:clickable="true"
android:focusable="true">
<ImageView
android:layout_width="@dimen/dp_26"
android:layout_height="@dimen/dp_26"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/number_9"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@color/noti_font_color" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_11"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/bt_dialer_bottomleft_selector"
android:clickable="true"
android:focusable="true">
<ImageView
android:layout_width="@dimen/dp_26"
android:layout_height="@dimen/dp_26"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/number_11"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:layout_width="1px"
android:layout_height="match_parent"
android:background="@color/noti_font_color" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_0"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/bt_dialer_selector"
android:clickable="true"
android:focusable="true">
<ImageView
android:layout_width="@dimen/dp_26"
android:layout_height="@dimen/dp_26"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/number_0"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:layout_width="1px"
android:layout_height="match_parent"
android:background="@color/noti_font_color" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_12"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/bt_dialer_bottomright_selector"
android:clickable="true"
android:focusable="true">
<ImageView
android:layout_width="@dimen/dp_26"
android:layout_height="@dimen/dp_26"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/number_12"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout11"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_48"
android:layout_marginBottom="@dimen/dp_32"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<com.shehuan.niv.NiceImageView
android:id="@+id/nv_dialer"
android:layout_width="@dimen/dp_48"
android:layout_height="@dimen/dp_48"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/home_dialer_cion_circle"
app:corner_radius="@dimen/dp_4"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,207 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/default_gray"
tools:context=".activity.contact.AddContactActivity">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout3"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_48"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/iv_cancel"
android:layout_width="@dimen/dp_24"
android:layout_height="@dimen/dp_24"
android:layout_marginStart="@dimen/dp_8"
android:adjustViewBounds="true"
android:scaleType="centerInside"
android:src="@drawable/icon_return"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_16"
android:text="新建联系人"
android:textColor="@color/default_text_color"
android:textSize="@dimen/sp_16"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/iv_cancel"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/iv_confirm"
android:layout_width="@dimen/dp_24"
android:layout_height="@dimen/dp_24"
android:layout_marginEnd="@dimen/dp_8"
android:adjustViewBounds="true"
android:scaleType="centerInside"
android:src="@drawable/icon_confirm"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/constraintLayout3">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.shehuan.niv.NiceImageView
android:id="@+id/nv_avatar"
android:layout_width="@dimen/dp_88"
android:layout_height="@dimen/dp_88"
android:layout_gravity="center"
android:layout_marginTop="@dimen/dp_16"
android:src="@drawable/default_avatar"
app:is_circle="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="@dimen/dp_48"
android:layout_margin="@dimen/dp_8">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="保存至本机"
android:textColor="@color/default_text_color"
android:textSize="@dimen/sp_14"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="@dimen/dp_48"
android:layout_margin="@dimen/dp_8"
android:background="@drawable/add_contact_background">
<ImageView
android:id="@+id/imageView7"
android:layout_width="@dimen/dp_28"
android:layout_height="@dimen/dp_28"
android:layout_marginStart="@dimen/dp_8"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/icon_avatar"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/et_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_8"
android:layout_marginEnd="@dimen/dp_8"
android:background="@null"
android:ellipsize="end"
android:hint="姓名"
android:inputType="text"
android:maxLines="1"
android:singleLine="true"
android:textColor="@color/default_text_color"
android:textSize="@dimen/sp_15"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/imageView7"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="@dimen/dp_48"
android:layout_margin="@dimen/dp_8"
android:background="@drawable/add_contact_background">
<ImageView
android:id="@+id/imageView8"
android:layout_width="@dimen/dp_28"
android:layout_height="@dimen/dp_28"
android:layout_marginStart="@dimen/dp_8"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/icon_phone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/et_phone"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_8"
android:layout_marginEnd="@dimen/dp_8"
android:background="@null"
android:ellipsize="end"
android:hint="号码"
android:inputType="phone"
android:maxLines="1"
android:singleLine="true"
android:textColor="@color/default_text_color"
android:textSize="@dimen/sp_15"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/imageView8"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="@dimen/dp_48"
android:layout_margin="@dimen/dp_8"
android:background="@drawable/add_contact_background">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_24"
android:text="设为紧急联系人"
android:textColor="@color/default_text_color"
android:textSize="@dimen/sp_15"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.uiuios.aios.view.ToggleButton
android:id="@+id/toggleButton"
android:layout_width="@dimen/dp_34"
android:layout_height="@dimen/dp_18"
android:layout_marginEnd="@dimen/dp_32"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,102 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
tools:context=".activity.records.RecordsActivity">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout3"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_48"
android:background="@color/default_blue"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/iv_cancel"
android:layout_width="@dimen/dp_24"
android:layout_height="@dimen/dp_24"
android:layout_marginStart="@dimen/dp_8"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/back_white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_16"
android:text="通话记录"
android:textColor="@color/white"
android:textSize="@dimen/sp_16"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/iv_clear"
android:layout_width="@dimen/dp_24"
android:layout_height="@dimen/dp_24"
android:layout_marginEnd="@dimen/dp_8"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/icon_delete"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/constraintLayout11"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/constraintLayout3" />
<TextView
android:id="@+id/tv_nodata"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="没有最近通话记录"
android:textColor="@color/black"
android:textSize="@dimen/sp_17"
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@+id/constraintLayout11"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/constraintLayout3" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout11"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_48"
android:layout_marginBottom="@dimen/dp_8"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<com.shehuan.niv.NiceImageView
android:id="@+id/nv_dialer"
android:layout_width="@dimen/dp_48"
android:layout_height="@dimen/dp_48"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/home_dialer_cion_circle"
app:corner_radius="@dimen/dp_4"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_48"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/iv_avatar"
android:layout_width="@dimen/dp_36"
android:layout_height="@dimen/dp_36"
android:layout_marginStart="@dimen/dp_12"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/default_avatar"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_phone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_12"
android:textColor="@color/black"
android:textSize="@dimen/sp_14"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/iv_avatar"
app:layout_constraintTop_toTopOf="parent"
tools:text="12345665432" />
<TextView
android:id="@+id/tv_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_16"
android:textColor="@color/noti_font_color"
android:textSize="@dimen/sp_14"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="12:00" />
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@color/gray"
app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -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">
<com.shehuan.niv.NiceImageView
android:id="@+id/iv_head"
android:layout_width="@dimen/dp_44"
android:layout_height="@dimen/dp_44"
android:layout_marginStart="@dimen/dp_4"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/default_head"
app:is_circle="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.5" />
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_4"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/iv_head"
app:layout_constraintTop_toTopOf="parent">
android:id="@+id/cl_contact"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="1"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="@dimen/sp_14"
<com.shehuan.niv.NiceImageView
android:id="@+id/iv_head"
android:layout_width="@dimen/dp_44"
android:layout_height="@dimen/dp_44"
android:layout_marginStart="@dimen/dp_8"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/default_avatar"
app:is_circle="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="姓名" />
app:layout_constraintVertical_bias="0.5" />
<TextView
android:id="@+id/tv_phone"
android:layout_marginTop="@dimen/dp_4"
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="1"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="@dimen/sp_12"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_name"
tools:text="phone" />
android:layout_marginStart="@dimen/dp_8"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/iv_head"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="1"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="@dimen/sp_14"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="姓名" />
<TextView
android:id="@+id/tv_phone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_4"
android:maxLines="1"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="@dimen/sp_12"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_name"
tools:text="phone" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
<com.shehuan.niv.NiceImageView
android:id="@+id/iv_head2"
android:layout_width="@dimen/dp_44"
android:layout_height="@dimen/dp_44"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/home_dialer_cion_circle"
android:visibility="gone"
app:is_circle="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More