From 0fb5b366a7b205a52a6695c7f22e6177bedc3ddc Mon Sep 17 00:00:00 2001
From: linminjie <1004644107@qq.com>
Date: Wed, 24 May 2023 18:02:47 +0800
Subject: [PATCH] =?UTF-8?q?=E6=89=8B=E6=9C=BA=E5=8F=B7=E7=99=BB=E5=BD=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 46 --
app/build.gradle | 13 +-
app/src/main/AndroidManifest.xml | 2 +-
.../com/unionmed/unionmedtv/api/GetCodeApi.java | 36 ++
.../unionmed/unionmedtv/api/MobileLoginApi.java | 490 +++++++++++++++++++++
.../com/unionmed/unionmedtv/dialog/TipDialog.java | 64 +++
.../unionmedtv/fragment/ContentFragment.java | 27 +-
.../unionmedtv/login/activity/LoginActivity.java | 21 +
.../activity/fragment/LoginAccountFragment.java | 83 ++++
.../activity/fragment/LoginPhoneFragment.java | 178 ++++++++
.../unionmedtv/presenter/TypeDoctorPresenter.java | 65 ++-
.../com/unionmed/unionmedtv/utils/CacheUtil.java | 118 +++++
.../com/unionmed/unionmedtv/utils/ToastUtils.java | 13 +
.../unionmedtv/widgets/CornerTextView.java | 143 ++++++
.../unionmedtv/widgets/ImgConstraintLayout.java | 2 +-
.../main/res/drawable/account_password_select.xml | 8 +
.../main/res/drawable/bg_btn_50616d_border5.xml | 8 +
.../main/res/drawable/bg_btn_50616d_radius_18.xml | 6 +
.../main/res/drawable/bg_btn_border_radius_18.xml | 14 +
.../main/res/drawable/bg_btn_border_radius_5.xml | 14 +
.../main/res/drawable/bg_btn_c1fcff_border5.xml | 8 +
app/src/main/res/drawable/bg_btn_contact_visit.xml | 5 +
app/src/main/res/drawable/bg_btn_grey9_border5.xml | 8 +
.../res/drawable/bg_white_border_radius_20.xml | 9 +
app/src/main/res/drawable/btn_code_select.xml | 8 +
app/src/main/res/drawable/btn_select.xml | 8 +
app/src/main/res/drawable/edit_phone_select.xml | 8 +
app/src/main/res/drawable/ic_unionmed_logo.png | Bin 0 -> 23387 bytes
.../res/drawable/shape_corner15_color_9a9a9a.xml | 6 +
app/src/main/res/layout/activity_login.xml | 12 +
app/src/main/res/layout/dialog_tip.xml | 49 +++
app/src/main/res/layout/fragment_account_login.xml | 82 ++++
app/src/main/res/layout/fragment_phone_login.xml | 121 +++++
.../main/res/layout/item_type_doctor_layout.xml | 26 +-
.../main/res/mipmap-xhdpi/icon_default_offline.png | Bin 0 -> 5436 bytes
.../main/res/mipmap-xhdpi/icon_default_online.png | Bin 0 -> 6484 bytes
app/src/main/res/values/attrs_corner_text_view.xml | 11 +
app/src/main/res/values/strings.xml | 10 +
38 files changed, 1644 insertions(+), 78 deletions(-)
delete mode 100644 README.md
create mode 100644 app/src/main/java/com/unionmed/unionmedtv/api/GetCodeApi.java
create mode 100644 app/src/main/java/com/unionmed/unionmedtv/api/MobileLoginApi.java
create mode 100644 app/src/main/java/com/unionmed/unionmedtv/dialog/TipDialog.java
create mode 100644 app/src/main/java/com/unionmed/unionmedtv/login/activity/LoginActivity.java
create mode 100644 app/src/main/java/com/unionmed/unionmedtv/login/activity/fragment/LoginAccountFragment.java
create mode 100644 app/src/main/java/com/unionmed/unionmedtv/login/activity/fragment/LoginPhoneFragment.java
create mode 100644 app/src/main/java/com/unionmed/unionmedtv/utils/CacheUtil.java
create mode 100644 app/src/main/java/com/unionmed/unionmedtv/utils/ToastUtils.java
create mode 100644 app/src/main/java/com/unionmed/unionmedtv/widgets/CornerTextView.java
create mode 100644 app/src/main/res/drawable/account_password_select.xml
create mode 100644 app/src/main/res/drawable/bg_btn_50616d_border5.xml
create mode 100644 app/src/main/res/drawable/bg_btn_50616d_radius_18.xml
create mode 100644 app/src/main/res/drawable/bg_btn_border_radius_18.xml
create mode 100644 app/src/main/res/drawable/bg_btn_border_radius_5.xml
create mode 100644 app/src/main/res/drawable/bg_btn_c1fcff_border5.xml
create mode 100644 app/src/main/res/drawable/bg_btn_contact_visit.xml
create mode 100644 app/src/main/res/drawable/bg_btn_grey9_border5.xml
create mode 100644 app/src/main/res/drawable/bg_white_border_radius_20.xml
create mode 100644 app/src/main/res/drawable/btn_code_select.xml
create mode 100644 app/src/main/res/drawable/btn_select.xml
create mode 100644 app/src/main/res/drawable/edit_phone_select.xml
create mode 100644 app/src/main/res/drawable/ic_unionmed_logo.png
create mode 100644 app/src/main/res/drawable/shape_corner15_color_9a9a9a.xml
create mode 100644 app/src/main/res/layout/activity_login.xml
create mode 100644 app/src/main/res/layout/dialog_tip.xml
create mode 100644 app/src/main/res/layout/fragment_account_login.xml
create mode 100644 app/src/main/res/layout/fragment_phone_login.xml
create mode 100644 app/src/main/res/mipmap-xhdpi/icon_default_offline.png
create mode 100644 app/src/main/res/mipmap-xhdpi/icon_default_online.png
create mode 100644 app/src/main/res/values/attrs_corner_text_view.xml
diff --git a/README.md b/README.md
deleted file mode 100644
index 6ea72fd..0000000
--- a/README.md
+++ /dev/null
@@ -1,46 +0,0 @@
-LeanbackTvSample
-=====
-
-[![简书](https://img.shields.io/badge/%E7%AE%80%E4%B9%A6-iSuperRed-brightgreen.svg)](http://www.jianshu.com/u/c2e31017da0e)
-| [简体中文文档][1]
-
-LeanbackTvSample is a smart TV desktop application based on the Android platform written by Google's open source framework Leanback.
-
-
-
-
-
-效果图
--------
-
-
-
-
-
-
-
-License
--------
-```
-Copyright (c) 2019 iSuperRed
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-```
-
-[1]: https://www.jianshu.com/p/b286e087b074
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 21df5a1..237748d 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -60,10 +60,21 @@ dependencies {
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
-
// 网络请求框架:https://github.com/getActivity/EasyHttp
implementation 'com.github.getActivity:EasyHttp:11.2'
implementation 'com.squareup.okhttp3:okhttp:3.12.13'
implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.github.getActivity:GsonFactory:6.2'
+
+ implementation 'com.github.li-xiaojun:XPopup:2.9.19'
+ implementation 'com.google.android.material:material:1.4.0'
+ implementation 'androidx.recyclerview:recyclerview:1.2.1'
+
+ //工具类
+ implementation 'com.blankj:utilcodex:1.30.6'
+ //微信开源项目,替代SP
+ implementation 'com.tencent:mmkv:1.0.22'
+ //拼音库
+ implementation 'com.github.SilenceDut:jpinyin:v1.0'
+
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 00bf821..19e9151 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -43,7 +43,7 @@
android:name="com.unionmed.unionmedtv.activity.AppInstalledActivity"
android:screenOrientation="landscape" />
diff --git a/app/src/main/java/com/unionmed/unionmedtv/api/GetCodeApi.java b/app/src/main/java/com/unionmed/unionmedtv/api/GetCodeApi.java
new file mode 100644
index 0000000..1cc6656
--- /dev/null
+++ b/app/src/main/java/com/unionmed/unionmedtv/api/GetCodeApi.java
@@ -0,0 +1,36 @@
+package com.unionmed.unionmedtv.api;
+
+
+import androidx.annotation.NonNull;
+
+import com.hjq.http.config.IRequestApi;
+import com.hjq.http.config.IRequestType;
+import com.hjq.http.model.BodyType;
+
+import java.util.List;
+
+/**
+ * desc : 发送短信验证码
+ */
+public final class GetCodeApi implements IRequestApi, IRequestType {
+
+ @NonNull
+ @Override
+ public BodyType getBodyType() {
+ return BodyType.JSON;
+ }
+
+ @NonNull
+ @Override
+ public String getApi() {
+ return "/index/sendMessageCode";
+ }
+
+ private String mobile;
+ private int type;
+
+ public GetCodeApi(String mobile, int type) {
+ this.mobile = mobile;
+ this.type = type;
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/unionmed/unionmedtv/api/MobileLoginApi.java b/app/src/main/java/com/unionmed/unionmedtv/api/MobileLoginApi.java
new file mode 100644
index 0000000..3c2e271
--- /dev/null
+++ b/app/src/main/java/com/unionmed/unionmedtv/api/MobileLoginApi.java
@@ -0,0 +1,490 @@
+package com.unionmed.unionmedtv.api;
+
+
+import androidx.annotation.NonNull;
+
+import com.github.stuxuhai.jpinyin.PinyinException;
+import com.github.stuxuhai.jpinyin.PinyinHelper;
+import com.hjq.http.config.IRequestApi;
+import com.hjq.http.config.IRequestType;
+import com.hjq.http.model.BodyType;
+
+import java.util.Objects;
+
+/**
+ * desc : 发送短信验证码
+ */
+public final class MobileLoginApi implements IRequestApi, IRequestType {
+
+ @NonNull
+ @Override
+ public BodyType getBodyType() {
+ return BodyType.JSON;
+ }
+
+ @NonNull
+ @Override
+ public String getApi() {
+ return "/index/sendMessageCode";
+ }
+
+ private String mobile;
+ private String code;
+
+ public MobileLoginApi(String mobile, String code) {
+ this.mobile = mobile;
+ this.code = code;
+ }
+
+ public final static class TokenBean {
+
+ /**
+ * name : 林瑞金
+ * headImg : null
+ * mobile : 15905997060
+ * preRegion : {"pkey":"15","ip":"47.118.51.167","port":"8065","fmsvr":"rtmp://10.120.224.5/livepkgr/","msgsvr":"http://120.195.56.245:3190/msg_server","ipsvr":"https://mobile.union-med.net/app/appintegrate/v1.8","msgip":"120.195.56.245","oder_num":4,"memo":"福州","svalue":"rtmp://10.120.224.5/livepkgr/","filesvr":"http://47.118.51.167:8999/eleand/"}
+ * isAtuh : 1
+ * isuse : null
+ * online : null
+ * faceAuthFlag : 1
+ * upkey : 4262
+ * pkey : null
+ * identity_id : 350500199107135035
+ * isSetPsw : 0
+ * im_useraccount : 4262
+ * im_password : null
+ * im_token : aMoc5MIihofCrtEW13iC7YL9uCPhRbbiDN4O4yV6HZC1i+9NneL2fU4Qn0g=
+ * currentAddress : {"addressKey":"435","pkey":"4262","name":"拒绝","sex":null,"mobile":"15905997060","address":"福建省福州市鼓楼区白马北路201-207号一号3号楼","detailAddress":"12","isCurrent":"1","isDefault":"1","xzqh":"3501","createTime":"1682577679","isDelete":"0"}
+ * userType : null
+ * token : c6011b69-cb6d-410f-a24f-75806cebcca0
+ */
+
+ private String name;
+ private Object headImg;
+ private String mobile;
+ private City preRegion;
+ private String isAtuh;
+ private Object isuse;
+ private Object online;
+ private int faceAuthFlag;
+ private String upkey;
+ private Object pkey;
+ private String identity_id;
+ private String isSetPsw;
+ private String im_useraccount;
+ private String im_password;
+ private String im_token;
+ private CurrentAddressBean currentAddress;
+ private Object userType;
+ private String token;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Object getHeadImg() {
+ return headImg;
+ }
+
+ public void setHeadImg(Object headImg) {
+ this.headImg = headImg;
+ }
+
+ public String getMobile() {
+ return mobile;
+ }
+
+ public void setMobile(String mobile) {
+ this.mobile = mobile;
+ }
+
+ public City getPreRegion() {
+ return preRegion;
+ }
+
+ public void setPreRegion(City preRegion) {
+ this.preRegion = preRegion;
+ }
+
+ public String getIsAtuh() {
+ return isAtuh;
+ }
+
+ public void setIsAtuh(String isAtuh) {
+ this.isAtuh = isAtuh;
+ }
+
+ public Object getIsuse() {
+ return isuse;
+ }
+
+ public void setIsuse(Object isuse) {
+ this.isuse = isuse;
+ }
+
+ public Object getOnline() {
+ return online;
+ }
+
+ public void setOnline(Object online) {
+ this.online = online;
+ }
+
+ public int getFaceAuthFlag() {
+ return faceAuthFlag;
+ }
+
+ public void setFaceAuthFlag(int faceAuthFlag) {
+ this.faceAuthFlag = faceAuthFlag;
+ }
+
+ public String getUpkey() {
+ return upkey;
+ }
+
+ public void setUpkey(String upkey) {
+ this.upkey = upkey;
+ }
+
+ public Object getPkey() {
+ return pkey;
+ }
+
+ public void setPkey(Object pkey) {
+ this.pkey = pkey;
+ }
+
+ public String getIdentity_id() {
+ return identity_id;
+ }
+
+ public void setIdentity_id(String identity_id) {
+ this.identity_id = identity_id;
+ }
+
+ public String getIsSetPsw() {
+ return isSetPsw;
+ }
+
+ public void setIsSetPsw(String isSetPsw) {
+ this.isSetPsw = isSetPsw;
+ }
+
+ public String getIm_useraccount() {
+ return im_useraccount;
+ }
+
+ public void setIm_useraccount(String im_useraccount) {
+ this.im_useraccount = im_useraccount;
+ }
+
+ public String getIm_password() {
+ return im_password;
+ }
+
+ public void setIm_password(String im_password) {
+ this.im_password = im_password;
+ }
+
+ public String getIm_token() {
+ return im_token;
+ }
+
+ public void setIm_token(String im_token) {
+ this.im_token = im_token;
+ }
+
+ public CurrentAddressBean getCurrentAddress() {
+ return currentAddress;
+ }
+
+ public void setCurrentAddress(CurrentAddressBean currentAddress) {
+ this.currentAddress = currentAddress;
+ }
+
+ public Object getUserType() {
+ return userType;
+ }
+
+ public void setUserType(Object userType) {
+ this.userType = userType;
+ }
+
+ public String getToken() {
+ return token;
+ }
+
+ public void setToken(String token) {
+ this.token = token;
+ }
+
+ public static class City implements Comparable{
+ /**
+ * pkey : 15
+ * ip : 47.118.51.167
+ * port : 8065
+ * fmsvr : rtmp://10.120.224.5/livepkgr/
+ * msgsvr : http://120.195.56.245:3190/msg_server
+ * ipsvr : https://mobile.union-med.net/app/appintegrate/v1.8
+ * msgip : 120.195.56.245
+ * oder_num : 4
+ * memo : 福州
+ * svalue : rtmp://10.120.224.5/livepkgr/
+ * filesvr : http://47.118.51.167:8999/eleand/
+ */
+
+ private String pkey;
+ private String ip;
+ private String port;
+ private String fmsvr;
+ private String msgsvr;
+ private String ipsvr;
+ private String msgip;
+ private int oder_num;
+ private String memo;
+ private String svalue;
+ private String filesvr;
+
+ public String getPkey() {
+ return pkey;
+ }
+
+ public void setPkey(String pkey) {
+ this.pkey = pkey;
+ }
+
+ public String getIp() {
+ return ip;
+ }
+
+ public void setIp(String ip) {
+ this.ip = ip;
+ }
+
+ public String getPort() {
+ return port;
+ }
+
+ public void setPort(String port) {
+ this.port = port;
+ }
+
+ public String getFmsvr() {
+ return fmsvr;
+ }
+
+ public void setFmsvr(String fmsvr) {
+ this.fmsvr = fmsvr;
+ }
+
+ public String getMsgsvr() {
+ return msgsvr;
+ }
+
+ public void setMsgsvr(String msgsvr) {
+ this.msgsvr = msgsvr;
+ }
+
+ public String getIpsvr() {
+ return ipsvr;
+ }
+
+ public void setIpsvr(String ipsvr) {
+ this.ipsvr = ipsvr;
+ }
+
+ public String getMsgip() {
+ return msgip;
+ }
+
+ public void setMsgip(String msgip) {
+ this.msgip = msgip;
+ }
+
+ public int getOder_num() {
+ return oder_num;
+ }
+
+ public void setOder_num(int oder_num) {
+ this.oder_num = oder_num;
+ }
+
+ public String getMemo() {
+ return memo;
+ }
+
+ public void setMemo(String memo) {
+ this.memo = memo;
+ }
+
+ public String getSvalue() {
+ return svalue;
+ }
+
+ public void setSvalue(String svalue) {
+ this.svalue = svalue;
+ }
+
+ public String getFilesvr() {
+ return filesvr;
+ }
+
+ public void setFilesvr(String filesvr) {
+ this.filesvr = filesvr;
+ }
+
+ @Override
+ public int compareTo(City city) {
+ try {
+ return PinyinHelper.getShortPinyin(this.memo)
+ .compareTo(PinyinHelper.getShortPinyin(city.memo));
+ } catch (PinyinException e) {
+ e.printStackTrace();
+ }
+ return 0;
+ }
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ City city = (City) o;
+ return memo.equals(city.memo);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(memo);
+ }
+ }
+
+ public static class CurrentAddressBean {
+ /**
+ * addressKey : 435
+ * pkey : 4262
+ * name : 拒绝
+ * sex : null
+ * mobile : 15905997060
+ * address : 福建省福州市鼓楼区白马北路201-207号一号3号楼
+ * detailAddress : 12
+ * isCurrent : 1
+ * isDefault : 1
+ * xzqh : 3501
+ * createTime : 1682577679
+ * isDelete : 0
+ */
+
+ private String addressKey;
+ private String pkey;
+ private String name;
+ private Object sex;
+ private String mobile;
+ private String address;
+ private String detailAddress;
+ private String isCurrent;
+ private String isDefault;
+ private String xzqh;
+ private String createTime;
+ private String isDelete;
+
+ public String getAddressKey() {
+ return addressKey;
+ }
+
+ public void setAddressKey(String addressKey) {
+ this.addressKey = addressKey;
+ }
+
+ public String getPkey() {
+ return pkey;
+ }
+
+ public void setPkey(String pkey) {
+ this.pkey = pkey;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Object getSex() {
+ return sex;
+ }
+
+ public void setSex(Object sex) {
+ this.sex = sex;
+ }
+
+ public String getMobile() {
+ return mobile;
+ }
+
+ public void setMobile(String mobile) {
+ this.mobile = mobile;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public String getDetailAddress() {
+ return detailAddress;
+ }
+
+ public void setDetailAddress(String detailAddress) {
+ this.detailAddress = detailAddress;
+ }
+
+ public String getIsCurrent() {
+ return isCurrent;
+ }
+
+ public void setIsCurrent(String isCurrent) {
+ this.isCurrent = isCurrent;
+ }
+
+ public String getIsDefault() {
+ return isDefault;
+ }
+
+ public void setIsDefault(String isDefault) {
+ this.isDefault = isDefault;
+ }
+
+ public String getXzqh() {
+ return xzqh;
+ }
+
+ public void setXzqh(String xzqh) {
+ this.xzqh = xzqh;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getIsDelete() {
+ return isDelete;
+ }
+
+ public void setIsDelete(String isDelete) {
+ this.isDelete = isDelete;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/unionmed/unionmedtv/dialog/TipDialog.java b/app/src/main/java/com/unionmed/unionmedtv/dialog/TipDialog.java
new file mode 100644
index 0000000..6329924
--- /dev/null
+++ b/app/src/main/java/com/unionmed/unionmedtv/dialog/TipDialog.java
@@ -0,0 +1,64 @@
+package com.unionmed.unionmedtv.dialog;
+
+import android.content.Context;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+
+import com.lxj.xpopup.core.CenterPopupView;
+import com.unionmed.unionmedtv.R;
+
+public class TipDialog extends CenterPopupView {
+ private TextView tv_cancel;
+ private TextView tv_title;
+ private TextView tv_confirm;
+ private String title;
+ private DialogClick dialogClick;
+
+ public TipDialog(@NonNull Context context, String title, DialogClick dialogClick) {
+ super(context);
+ this.title = title;
+ this.dialogClick = dialogClick;
+ }
+
+ @Override
+ protected int getImplLayoutId() {
+ return R.layout.dialog_tip;
+ }
+
+ @Override
+ protected void onCreate() {
+ super.onCreate();
+ tv_cancel = findViewById(R.id.tv_cancel);
+ tv_cancel.requestFocus();
+ tv_cancel.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ if (dialogClick != null) {
+ dialogClick.cancel();
+ }
+ dialog.dismiss();
+ }
+ });
+ tv_title = findViewById(R.id.tv_title);
+ tv_confirm = findViewById(R.id.tv_confirm);
+ tv_confirm.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ if (dialogClick != null) {
+ dialogClick.confirm();
+ }
+ dialog.dismiss();
+ }
+ });
+ tv_title = findViewById(R.id.tv_title);
+ tv_title.setText(title);
+ }
+
+ public interface DialogClick {
+ void cancel();
+
+ void confirm();
+ }
+}
diff --git a/app/src/main/java/com/unionmed/unionmedtv/fragment/ContentFragment.java b/app/src/main/java/com/unionmed/unionmedtv/fragment/ContentFragment.java
index 3bc29e4..0aed556 100644
--- a/app/src/main/java/com/unionmed/unionmedtv/fragment/ContentFragment.java
+++ b/app/src/main/java/com/unionmed/unionmedtv/fragment/ContentFragment.java
@@ -92,7 +92,7 @@ public class ContentFragment extends BaseLazyLoadFragment {
Content.DataBean dataBean = dataBeans.get(i);
addItem(dataBean);
}
-// addFooter();
+ addFooter();
mPbLoading.setVisibility(View.GONE);
mVerticalGridView.setVisibility(View.VISIBLE);
break;
@@ -252,12 +252,11 @@ public class ContentFragment extends BaseLazyLoadFragment {
@Override
public void onSucceed(HttpData> stringHttpData) {
LogUtils.e("成功:" + stringHttpData);
- if(stringHttpData.getCode()==200){
+ if(stringHttpData.getData().getCode()==200){
List doctorInfo = stringHttpData.getData().getData().getMember();
if (doctorInfo == null) {
return;
}
-
mAdapter.setItems(doctorInfo,null);
mPbLoading.setVisibility(View.GONE);
mVerticalGridView.setVisibility(View.VISIBLE);
@@ -306,17 +305,17 @@ public class ContentFragment extends BaseLazyLoadFragment {
break;
}
-// if (json == null) {
-// return;
-// }
-// Content content = LocalJsonResolutionUtil.JsonToObject(json, Content.class);
-// final Message msg = Message.obtain();
-// msg.what = MSG_ADD_ITEM;
-// Bundle b = new Bundle();
-// b.putParcelable(MSG_BUNDLE_KEY_ADD_ITEM, content);
-// msg.setData(b);
-// //延迟1秒模拟加载数据过程
-// mHandler.sendMessageDelayed(msg, 1000);
+ if (json == null) {
+ return;
+ }
+ Content content = LocalJsonResolutionUtil.JsonToObject(json, Content.class);
+ final Message msg = Message.obtain();
+ msg.what = MSG_ADD_ITEM;
+ Bundle b = new Bundle();
+ b.putParcelable(MSG_BUNDLE_KEY_ADD_ITEM, content);
+ msg.setData(b);
+ //延迟1秒模拟加载数据过程
+ mHandler.sendMessageDelayed(msg, 1000);
}
});
diff --git a/app/src/main/java/com/unionmed/unionmedtv/login/activity/LoginActivity.java b/app/src/main/java/com/unionmed/unionmedtv/login/activity/LoginActivity.java
new file mode 100644
index 0000000..5d52f52
--- /dev/null
+++ b/app/src/main/java/com/unionmed/unionmedtv/login/activity/LoginActivity.java
@@ -0,0 +1,21 @@
+package com.unionmed.unionmedtv.login.activity;
+
+import android.os.Bundle;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.FragmentActivity;
+
+import com.unionmed.unionmedtv.R;
+import com.unionmed.unionmedtv.login.activity.fragment.LoginPhoneFragment;
+
+public class LoginActivity extends FragmentActivity {
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_login);
+ if (savedInstanceState == null) {
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.main_browse_fragment, new LoginPhoneFragment())
+ .commitNow();
+ }
+ }
+}
diff --git a/app/src/main/java/com/unionmed/unionmedtv/login/activity/fragment/LoginAccountFragment.java b/app/src/main/java/com/unionmed/unionmedtv/login/activity/fragment/LoginAccountFragment.java
new file mode 100644
index 0000000..57188ed
--- /dev/null
+++ b/app/src/main/java/com/unionmed/unionmedtv/login/activity/fragment/LoginAccountFragment.java
@@ -0,0 +1,83 @@
+package com.unionmed.unionmedtv.login.activity.fragment;
+
+import android.app.Dialog;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import androidx.fragment.app.Fragment;
+
+import com.lxj.xpopup.XPopup;
+import com.lxj.xpopup.core.BasePopupView;
+import com.lxj.xpopup.interfaces.OnConfirmListener;
+import com.unionmed.unionmedtv.R;
+import com.unionmed.unionmedtv.dialog.TipDialog;
+
+public class LoginAccountFragment extends Fragment implements View.OnClickListener {
+ private static final String ARG_PARAM1 = "param1";
+ private static final String ARG_PARAM2 = "param2";
+
+ private String mParam1;
+ private String mParam2;
+ private View mRootView;
+ private TextView tv_scan_code_login;
+
+ public LoginAccountFragment() {
+ // Required empty public constructor
+ }
+
+ public static LoginAccountFragment newInstance(String param1, String param2) {
+ LoginAccountFragment fragment = new LoginAccountFragment();
+ Bundle args = new Bundle();
+ args.putString(ARG_PARAM1, param1);
+ args.putString(ARG_PARAM2, param2);
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (getArguments() != null) {
+ mParam1 = getArguments().getString(ARG_PARAM1);
+ mParam2 = getArguments().getString(ARG_PARAM2);
+ }
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ if (mRootView == null) {
+ mRootView = inflater.inflate(R.layout.fragment_account_login, container, false);
+ initView(mRootView);
+ }
+ return mRootView;
+ }
+
+ public void initView(View view) {
+ tv_scan_code_login = view.findViewById(R.id.tv_scan_code_login);
+ tv_scan_code_login.setOnClickListener(this);
+ }
+
+ @Override
+ public void onClick(View view) {
+ if (view.getId() == R.id.tv_scan_code_login) {
+// new XPopup.Builder(getContext()).isRequestFocus(true).asCustom(new TipDialog(getActivity(), "我是一个title", new TipDialog.DialogClick() {
+// @Override
+// public void cancel() {
+//
+// }
+//
+// @Override
+// public void confirm() {
+//
+// }
+// })).show();
+ getActivity().getSupportFragmentManager().beginTransaction()
+ .replace(R.id.main_browse_fragment, new LoginPhoneFragment())
+ .commitNow();
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/unionmed/unionmedtv/login/activity/fragment/LoginPhoneFragment.java b/app/src/main/java/com/unionmed/unionmedtv/login/activity/fragment/LoginPhoneFragment.java
new file mode 100644
index 0000000..bd876a9
--- /dev/null
+++ b/app/src/main/java/com/unionmed/unionmedtv/login/activity/fragment/LoginPhoneFragment.java
@@ -0,0 +1,178 @@
+package com.unionmed.unionmedtv.login.activity.fragment;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.CountDownTimer;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.EditText;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.fragment.app.Fragment;
+
+import com.hjq.http.EasyHttp;
+import com.hjq.http.listener.OnHttpListener;
+import com.unionmed.unionmedtv.R;
+import com.unionmed.unionmedtv.activity.MainActivity;
+import com.unionmed.unionmedtv.api.GetCodeApi;
+import com.unionmed.unionmedtv.api.GetNearDoctorApi;
+import com.unionmed.unionmedtv.api.MobileLoginApi;
+import com.unionmed.unionmedtv.network.ApiResponse;
+import com.unionmed.unionmedtv.network.HttpData;
+import com.unionmed.unionmedtv.utils.CacheUtil;
+import com.unionmed.unionmedtv.utils.ToastUtils;
+
+import java.util.List;
+
+import me.jessyan.autosize.utils.LogUtils;
+
+
+public class LoginPhoneFragment extends Fragment implements View.OnClickListener {
+ private static final String ARG_PARAM1 = "param1";
+ private static final String ARG_PARAM2 = "param2";
+
+ private String mParam1;
+ private String mParam2;
+ private View mRootView;
+ private TextView tv_account_login;
+ private EditText edit_phone;
+ private EditText edit_code;
+ private TextView tv_getVerification;
+ private TextView tv_login;
+
+ public LoginPhoneFragment() {
+ // Required empty public constructor
+ }
+
+ public static LoginPhoneFragment newInstance(String param1, String param2) {
+ LoginPhoneFragment fragment = new LoginPhoneFragment();
+ Bundle args = new Bundle();
+ args.putString(ARG_PARAM1, param1);
+ args.putString(ARG_PARAM2, param2);
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (getArguments() != null) {
+ mParam1 = getArguments().getString(ARG_PARAM1);
+ mParam2 = getArguments().getString(ARG_PARAM2);
+ }
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ if (mRootView == null) {
+ mRootView = inflater.inflate(R.layout.fragment_phone_login, container, false);
+ initView(mRootView);
+ }
+ return mRootView;
+ }
+
+ public void initView(View view) {
+ tv_account_login = view.findViewById(R.id.tv_account_login);
+ tv_account_login.setOnClickListener(this);
+ edit_phone = view.findViewById(R.id.edit_phone);
+ edit_code = view.findViewById(R.id.edit_code);
+ tv_getVerification = view.findViewById(R.id.tv_getVerification);
+ tv_getVerification.setOnClickListener(this);
+ tv_login = view.findViewById(R.id.tv_login);
+ tv_login.setOnClickListener(this);
+ }
+
+ @Override
+ public void onClick(View view) {
+ if (view.getId() == R.id.tv_account_login) {//切换登录方式
+ getActivity().getSupportFragmentManager().beginTransaction()
+ .replace(R.id.main_browse_fragment, new LoginAccountFragment())
+ .commitNow();
+ } else if (view.getId() == R.id.tv_getVerification) {//获取验证码
+ if (TextUtils.isEmpty(edit_phone.getText())) {
+ ToastUtils.s(getActivity(), "请输入手机号");
+ return;
+ }
+ getCode(edit_phone.getText().toString());
+ } else if (view.getId() == R.id.tv_login) {//登录
+ if (TextUtils.isEmpty(edit_phone.getText())) {
+ ToastUtils.s(getActivity(), "请输入手机号");
+ return;
+ }
+ if (TextUtils.isEmpty(edit_code.getText())) {
+ ToastUtils.s(getActivity(), "请输入验证码");
+ return;
+ }
+
+ MobileLogin(edit_phone.getText().toString(), edit_code.getText().toString());
+ }
+ }
+
+ //获取验证码
+ public void getCode(String phone) {
+ EasyHttp.post(getActivity())
+ .api(new GetCodeApi(phone, 11))
+ .request(new OnHttpListener>>() {
+
+ @Override
+ public void onSucceed(HttpData> apiResponseHttpData) {
+ LogUtils.e("成功:" + apiResponseHttpData);
+ ToastUtils.s(getActivity(), "获取验证码成功");
+ if (apiResponseHttpData.getData().getCode() == 200) {
+ tv_getVerification.setEnabled(false);
+ new CountDownTimer(60 * 1000, 1000) {
+ @Override
+ public void onTick(long l) {
+ tv_getVerification.setText("已发送(" + (l / 1001) + ") s");
+ }
+
+ @Override
+ public void onFinish() {
+ tv_getVerification.setText("获取验证码");
+ tv_getVerification.setEnabled(true);
+ }
+ }.start();
+ }
+ }
+
+ @Override
+ public void onFail(Exception e) {
+ ToastUtils.s(getActivity(), "获取验证码失败");
+ LogUtils.e("失败:" + e);
+ }
+ });
+ }
+
+ //手机号登录
+ public void MobileLogin(String mobile, String code) {
+ EasyHttp.post(getActivity())
+ .api(new MobileLoginApi(mobile, code))
+ .request(new OnHttpListener>>() {
+
+ @Override
+ public void onSucceed(HttpData> apiResponseHttpData) {
+ LogUtils.e("成功:" + apiResponseHttpData);
+ if (apiResponseHttpData.getData().getCode() == 200) {
+ MobileLoginApi.TokenBean tokenBean=apiResponseHttpData.getData().getData();
+ CacheUtil.setToken(tokenBean);
+ CacheUtil.setAccountNumber(tokenBean.getMobile());
+ CacheUtil.saveImUserAccount(tokenBean.getIm_useraccount());
+ CacheUtil.saveImUserPwd(tokenBean.getIm_password());
+ CacheUtil.saveImTokenRong(tokenBean.getIm_token());
+ Intent intent=new Intent(getActivity(),MainActivity.class);
+ getActivity().startActivity(intent);
+ }
+ }
+
+ @Override
+ public void onFail(Exception e) {
+ ToastUtils.s(getActivity(), "获取验证码失败");
+ LogUtils.e("失败:" + e);
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/unionmed/unionmedtv/presenter/TypeDoctorPresenter.java b/app/src/main/java/com/unionmed/unionmedtv/presenter/TypeDoctorPresenter.java
index 12c497e..33c56b0 100644
--- a/app/src/main/java/com/unionmed/unionmedtv/presenter/TypeDoctorPresenter.java
+++ b/app/src/main/java/com/unionmed/unionmedtv/presenter/TypeDoctorPresenter.java
@@ -1,5 +1,6 @@
package com.unionmed.unionmedtv.presenter;
+import android.annotation.SuppressLint;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
@@ -14,6 +15,7 @@ import com.bumptech.glide.request.RequestOptions;
import com.unionmed.unionmedtv.R;
import com.unionmed.unionmedtv.api.GetNearDoctorApi;
import com.unionmed.unionmedtv.bean.Content;
+import com.unionmed.unionmedtv.widgets.CornerTextView;
public class TypeDoctorPresenter extends Presenter {
private Context mContext;
@@ -30,26 +32,65 @@ public class TypeDoctorPresenter extends Presenter {
return new ViewHolder(view);
}
+ @SuppressLint("SetTextI18n")
@Override
public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
if (item instanceof GetNearDoctorApi.DoctorInfo.MemberBean) {
+ GetNearDoctorApi.DoctorInfo.MemberBean memberBean= (GetNearDoctorApi.DoctorInfo.MemberBean) item;
ViewHolder vh = (ViewHolder) viewHolder;
+ int drawable;
+ if (memberBean.getOnline().equals("1")) {
+ vh.tv_online_status.setText("在线");
+ vh.tv_online_status.setBackground(mContext.getResources().getDrawable(R.drawable.shape_corner15_color_0bbac6));
+ drawable = R.mipmap.icon_default_online;
+ } else {
+ vh.tv_online_status.setText("离线");
+ drawable = R.mipmap.icon_default_offline;
+ vh.tv_online_status.setBackground(mContext.getResources().getDrawable(R.drawable.shape_corner15_color_9a9a9a));
+ }
Glide.with(mContext)
- .load( ((GetNearDoctorApi.DoctorInfo.MemberBean) item).getPhoto())
+ .load(memberBean.getPhoto())
.apply(new RequestOptions()
.circleCrop()
- .placeholder(R.drawable.bg_shape_default)
- .circleCrop())
+ .placeholder(drawable)
+ .circleCrop())
.into(vh.iv_photo);
- vh.tv_name.setText(((GetNearDoctorApi.DoctorInfo.MemberBean) item).getName());
- if(((GetNearDoctorApi.DoctorInfo.MemberBean) item).getOnline().equals("1")) {
- vh.tv_online_status.setText("在线");
- }else{
- vh.tv_online_status.setText("离线");
+ vh.tv_name.setText(memberBean.getName());
+ if (!memberBean.getPersoninfo().isEmpty()) {
+ if (!memberBean.getPersoninfo().get(0).getDepartment().isEmpty()
+ && !memberBean.getPersoninfo().get(0).getZc().isEmpty()) {//部门职称都不为null
+ vh.tv_dept.setText(memberBean.getPersoninfo().get(0).getDepartment()
+ + " | " + memberBean.getPersoninfo().get(0).getZc());
+ } else if (memberBean.getPersoninfo().get(0).getDepartment().isEmpty()
+ && memberBean.getPersoninfo().get(0).getZc().isEmpty()) {//部门职称都为null
+ vh.tv_dept.setText("- -");
+ } else if (!memberBean.getPersoninfo().get(0).getDepartment().isEmpty()
+ && memberBean.getPersoninfo().get(0).getZc().isEmpty()) {//部门不为null,职称为null
+ vh.tv_dept.setText(memberBean.getPersoninfo().get(0).getDepartment());
+ } else if (memberBean.getPersoninfo().get(0).getDepartment().isEmpty()
+ && !memberBean.getPersoninfo().get(0).getZc().isEmpty()) {//部门为null,职称不为null
+ vh.tv_dept.setText(memberBean.getPersoninfo().get(0).getZc());
+ }
+
+ vh.tv_hospital.setText(memberBean.getPersoninfo().get(0).getChosname());
+ } else {
+ vh.tv_dept.setText("- -");
+ vh.tv_dept.setText("- -");
+ }
+ if (memberBean.getSex().equals("男")) {
+ vh.iv_sex.setImageDrawable(mContext.getResources().getDrawable(R.drawable.icon_sex_boy));
+ } else {
+ vh.iv_sex.setImageDrawable(mContext.getResources().getDrawable(R.drawable.icon_sex_girl));
+ }
+ if (memberBean.getDistance().isEmpty()) {
+ vh.tv_distance.setVisibility(View.GONE);
+ }else {
+ vh.tv_distance.setVisibility(View.VISIBLE);
+ vh.tv_distance.setText(memberBean.getDistance());
}
- vh.tv_dept.setText(((GetNearDoctorApi.DoctorInfo.MemberBean) item).getPersoninfo().get(0).getDepartment());
- vh.tv_hospital.setText(((GetNearDoctorApi.DoctorInfo.MemberBean) item).getPersoninfo().get(0).getChosname());
+
+
}
}
@@ -63,18 +104,22 @@ public class TypeDoctorPresenter extends Presenter {
private final ImageView mIvTypeThreePoster;
TextView tv_name;
ImageView iv_photo;
+ ImageView iv_sex;
TextView tv_online_status;
TextView tv_dept;
TextView tv_hospital;
+ CornerTextView tv_distance;
public ViewHolder(View view) {
super(view);
mIvTypeThreePoster = view.findViewById(R.id.iv_type_three_poster);
tv_name = view.findViewById(R.id.tv_name);
iv_photo = view.findViewById(R.id.iv_photo);
+ iv_sex = view.findViewById(R.id.iv_sex);
tv_online_status = view.findViewById(R.id.tv_online_status);
tv_dept = view.findViewById(R.id.tv_dept);
tv_hospital = view.findViewById(R.id.tv_hospital);
+ tv_distance = view.findViewById(R.id.tv_distance);
}
}
}
diff --git a/app/src/main/java/com/unionmed/unionmedtv/utils/CacheUtil.java b/app/src/main/java/com/unionmed/unionmedtv/utils/CacheUtil.java
new file mode 100644
index 0000000..b7343d2
--- /dev/null
+++ b/app/src/main/java/com/unionmed/unionmedtv/utils/CacheUtil.java
@@ -0,0 +1,118 @@
+package com.unionmed.unionmedtv.utils;
+
+import android.text.TextUtils;
+
+import com.blankj.utilcode.util.StringUtils;
+import com.google.gson.Gson;
+import com.tencent.mmkv.MMKV;
+import com.unionmed.unionmedtv.R;
+import com.unionmed.unionmedtv.api.MobileLoginApi;
+
+public class CacheUtil {
+ private static MMKV kv = MMKV.mmkvWithID(StringUtils.getString(R.string.mmap_id));
+
+ /**
+ * 获取保存的用户信息
+ */
+ public static MobileLoginApi.TokenBean getToken() {
+ String tokenStr = kv.decodeString(StringUtils.getString(R.string.token_id));
+ if (TextUtils.isEmpty(tokenStr)) {
+ return null;
+ } else {
+ return new Gson().fromJson(tokenStr, MobileLoginApi.TokenBean.class);
+ }
+ }
+
+ /**
+ * 设置用户信息
+ */
+ public static void setToken(MobileLoginApi.TokenBean token) {
+ if (token == null) {
+ kv.encode(StringUtils.getString(R.string.token_id), "");
+ setIsLogin(false);
+ } else {
+ kv.encode(StringUtils.getString(R.string.token_id), new Gson().toJson(token));
+ setIsLogin(true);
+ }
+ }
+
+ /**
+ * 获取保存的账号
+ */
+ public static String getAccountNumber() {
+ return kv.decodeString(StringUtils.getString(R.string.account_number), "");
+ }
+
+ /**
+ * 设置账号
+ */
+ public static void setAccountNumber(String account) {
+ if (TextUtils.isEmpty(account)) {
+ kv.encode(StringUtils.getString(R.string.account_number), "");
+ } else {
+ kv.encode(StringUtils.getString(R.string.account_number), account);
+ }
+ }
+
+ /**
+ * 保存当前登录账号的IM账号
+ */
+ public static void saveImUserAccount(String imAccount) {
+ if (TextUtils.isEmpty(imAccount)) {
+ kv.encode(StringUtils.getString(R.string.im_user_account), "");
+ } else {
+ kv.encode(StringUtils.getString(R.string.im_user_account), imAccount);
+ }
+ }
+
+ /**
+ * 获取当前登录账号的IM账号
+ */
+ public static String getImUserAccount() {
+ return kv.decodeString(StringUtils.getString(R.string.im_user_account), "");
+ }
+
+ /**
+ * 保存当前登录账号的IM账号,对应的密码
+ */
+ public static void saveImUserPwd(String imPwd) {
+ if (TextUtils.isEmpty(imPwd)) {
+ kv.encode(StringUtils.getString(R.string.im_user_pwd), "");
+ } else {
+ kv.encode(StringUtils.getString(R.string.im_user_pwd), imPwd);
+ }
+ }
+
+ /**
+ * 获取当前登录账号的IM账号,对应的密码
+ */
+ public static String getImUserPwd() {
+ return kv.decodeString(StringUtils.getString(R.string.im_user_pwd), "");
+ }
+
+ /**
+ * 融云im_token
+ */
+ public static void saveImTokenRong(String imToken) {
+ if (TextUtils.isEmpty(imToken)) {
+ kv.encode(StringUtils.getString(R.string.im_token), "");
+ } else {
+ kv.encode(StringUtils.getString(R.string.im_token), imToken);
+ }
+ }
+
+ /**
+ * 获取融云im_token
+ */
+ public static String getImTokenRong() {
+ return kv.decodeString(StringUtils.getString(R.string.im_token), "");
+ }
+
+
+ /**
+ * 设置是否已经登录
+ */
+ private static void setIsLogin(Boolean isLogin) {
+ kv.encode(StringUtils.getString(R.string.is_login), isLogin);
+ }
+}
diff --git a/app/src/main/java/com/unionmed/unionmedtv/utils/ToastUtils.java b/app/src/main/java/com/unionmed/unionmedtv/utils/ToastUtils.java
new file mode 100644
index 0000000..b2b0999
--- /dev/null
+++ b/app/src/main/java/com/unionmed/unionmedtv/utils/ToastUtils.java
@@ -0,0 +1,13 @@
+package com.unionmed.unionmedtv.utils;
+
+import android.content.Context;
+import android.widget.Toast;
+
+public final class ToastUtils {
+ public static void s(Context mContext, String s) {
+ if (mContext == null) {
+ return;
+ }
+ Toast.makeText(mContext.getApplicationContext(), s, Toast.LENGTH_SHORT).show();
+ }
+}
diff --git a/app/src/main/java/com/unionmed/unionmedtv/widgets/CornerTextView.java b/app/src/main/java/com/unionmed/unionmedtv/widgets/CornerTextView.java
new file mode 100644
index 0000000..980dc5b
--- /dev/null
+++ b/app/src/main/java/com/unionmed/unionmedtv/widgets/CornerTextView.java
@@ -0,0 +1,143 @@
+package com.unionmed.unionmedtv.widgets;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.util.AttributeSet;
+import android.widget.TextView;
+
+import com.unionmed.unionmedtv.R;
+
+public class CornerTextView extends TextView {
+ private static final float ANGEL_RIGHT_TOP = 45f;
+ private static final float ANGEL_LEFT_TOP = -45f;
+ private static final float DISTANCE_DEFAULT = 120f;
+ private static final float STROKE_WIDTH_DEFAULT = 0f;
+ private static final int CORNER_BACKGROUND_COLOR_DEFAULT = 0xFF00B94D;
+ //根号2
+ private static final float REAGAN_TWO = (float) Math.sqrt(2);
+
+ /**
+ * 显示在右上角还是左上角
+ */
+ private Gravity gravity;
+ /**
+ * 有边角的距离
+ */
+ private float distance = DISTANCE_DEFAULT;
+ /**
+ * 文字与色带的边距
+ */
+ private float strokeWidth;
+ /**
+ * 色带颜色
+ */
+ private int beltColor;
+
+ // 文字底部到边角顶点的距离
+ private float disToBottom;
+ Paint mBgPaint;
+ private Path path;
+ // 背景色带的高度*根号2
+ private float beltHeight;
+
+ public CornerTextView(Context context) {
+ super(context);
+ init(null, 0);
+ }
+
+ public CornerTextView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init(attrs, 0);
+ }
+
+ public CornerTextView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ init(attrs, defStyle);
+ }
+
+ private void init(AttributeSet attrs, int defStyle) {
+ setGravity(android.view.Gravity.CENTER);
+
+ final TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.CornerTextView, defStyle, 0);
+
+ int gravityInt = a.getInt(R.styleable.CornerTextView_gravity, 0);
+ if (gravityInt == 0) {
+ gravity = Gravity.RIGHT_TOP;
+ } else {
+ gravity = Gravity.LEFT_TOP;
+ }
+ distance = a.getDimension(R.styleable.CornerTextView_distance, DISTANCE_DEFAULT);
+ strokeWidth = a.getDimension(R.styleable.CornerTextView_strokeWidth, STROKE_WIDTH_DEFAULT);
+ beltColor = a.getColor(R.styleable.CornerTextView_beltColor, CORNER_BACKGROUND_COLOR_DEFAULT);
+
+ a.recycle();
+
+ //绘制斜条用
+ mBgPaint = new Paint();
+ mBgPaint.setAntiAlias(true);
+ mBgPaint.setColor(beltColor);
+ mBgPaint.setStyle(Paint.Style.FILL);
+
+ path = new Path();
+
+ invalidateTextPaintAndMeasurements();
+ }
+
+ private void invalidateTextPaintAndMeasurements() {
+ Paint.FontMetrics fm = getPaint().getFontMetrics();
+
+ float mTextHeight = (float) Math.ceil(fm.bottom - fm.top);
+
+ disToBottom = (float) (1.5 * mTextHeight + distance + strokeWidth);
+ beltHeight = (mTextHeight + 2 * strokeWidth) * REAGAN_TWO;
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
+ int width = (int) (disToBottom * REAGAN_TWO);
+ int height = (int) (disToBottom * REAGAN_TWO);
+
+ path.reset();
+ if (gravity == Gravity.RIGHT_TOP) {
+ path.moveTo(0, 0);
+ path.lineTo(beltHeight * REAGAN_TWO, 0);
+ path.lineTo(width, height - beltHeight * REAGAN_TWO);
+ path.lineTo(width, height);
+ } else {
+ path.moveTo(0, height);
+ path.lineTo(0, height - beltHeight * REAGAN_TWO);
+ path.lineTo(width - beltHeight * REAGAN_TWO, 0);
+ path.lineTo(width, 0);
+ }
+ path.close();
+
+ setMeasuredDimension(width & MEASURED_SIZE_MASK, height & MEASURED_SIZE_MASK);
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ canvas.drawPath(path, mBgPaint);
+
+ canvas.save();
+ if (gravity == Gravity.RIGHT_TOP) {
+ canvas.translate(beltHeight / REAGAN_TWO / 2, -beltHeight / REAGAN_TWO / 2);
+ canvas.rotate(ANGEL_RIGHT_TOP, this.getWidth() / 2f, this.getHeight() / 2f);
+ } else {
+ canvas.translate(-beltHeight / REAGAN_TWO / 2, -beltHeight / REAGAN_TWO / 2);
+ canvas.rotate(ANGEL_LEFT_TOP, this.getWidth() / 2f, this.getHeight() / 2f);
+ }
+
+ super.onDraw(canvas);
+
+ canvas.restore();
+ }
+
+ public enum Gravity {
+ LEFT_TOP, RIGHT_TOP
+ }
+}
diff --git a/app/src/main/java/com/unionmed/unionmedtv/widgets/ImgConstraintLayout.java b/app/src/main/java/com/unionmed/unionmedtv/widgets/ImgConstraintLayout.java
index 5e70849..55115d8 100644
--- a/app/src/main/java/com/unionmed/unionmedtv/widgets/ImgConstraintLayout.java
+++ b/app/src/main/java/com/unionmed/unionmedtv/widgets/ImgConstraintLayout.java
@@ -52,7 +52,7 @@ public class ImgConstraintLayout extends ConstraintLayout implements View.OnFocu
private void move(final View view) {
view.bringToFront();
- final int width = getWidth();
+ final int width = getWidth()-230;
valueAnimator = ValueAnimator.ofFloat(((Integer) (-width - 30)).floatValue(), ((Integer) (width + 30)).floatValue());
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
diff --git a/app/src/main/res/drawable/account_password_select.xml b/app/src/main/res/drawable/account_password_select.xml
new file mode 100644
index 0000000..b3a3a0b
--- /dev/null
+++ b/app/src/main/res/drawable/account_password_select.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/bg_btn_50616d_border5.xml b/app/src/main/res/drawable/bg_btn_50616d_border5.xml
new file mode 100644
index 0000000..8b6edee
--- /dev/null
+++ b/app/src/main/res/drawable/bg_btn_50616d_border5.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_btn_50616d_radius_18.xml b/app/src/main/res/drawable/bg_btn_50616d_radius_18.xml
new file mode 100644
index 0000000..90191fe
--- /dev/null
+++ b/app/src/main/res/drawable/bg_btn_50616d_radius_18.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_btn_border_radius_18.xml b/app/src/main/res/drawable/bg_btn_border_radius_18.xml
new file mode 100644
index 0000000..2561c74
--- /dev/null
+++ b/app/src/main/res/drawable/bg_btn_border_radius_18.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/bg_btn_border_radius_5.xml b/app/src/main/res/drawable/bg_btn_border_radius_5.xml
new file mode 100644
index 0000000..58d2362
--- /dev/null
+++ b/app/src/main/res/drawable/bg_btn_border_radius_5.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/bg_btn_c1fcff_border5.xml b/app/src/main/res/drawable/bg_btn_c1fcff_border5.xml
new file mode 100644
index 0000000..4efc8a0
--- /dev/null
+++ b/app/src/main/res/drawable/bg_btn_c1fcff_border5.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_btn_contact_visit.xml b/app/src/main/res/drawable/bg_btn_contact_visit.xml
new file mode 100644
index 0000000..296084f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_btn_contact_visit.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_btn_grey9_border5.xml b/app/src/main/res/drawable/bg_btn_grey9_border5.xml
new file mode 100644
index 0000000..9e5c2df
--- /dev/null
+++ b/app/src/main/res/drawable/bg_btn_grey9_border5.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_white_border_radius_20.xml b/app/src/main/res/drawable/bg_white_border_radius_20.xml
new file mode 100644
index 0000000..af3d899
--- /dev/null
+++ b/app/src/main/res/drawable/bg_white_border_radius_20.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/btn_code_select.xml b/app/src/main/res/drawable/btn_code_select.xml
new file mode 100644
index 0000000..c5f3b24
--- /dev/null
+++ b/app/src/main/res/drawable/btn_code_select.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/btn_select.xml b/app/src/main/res/drawable/btn_select.xml
new file mode 100644
index 0000000..3197182
--- /dev/null
+++ b/app/src/main/res/drawable/btn_select.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/edit_phone_select.xml b/app/src/main/res/drawable/edit_phone_select.xml
new file mode 100644
index 0000000..7c200e1
--- /dev/null
+++ b/app/src/main/res/drawable/edit_phone_select.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_unionmed_logo.png b/app/src/main/res/drawable/ic_unionmed_logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..d5a02eb703bc20bbeb3a4909ef19ecf7a827050a
GIT binary patch
literal 23387
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
literal 0
HcmV?d00001
diff --git a/app/src/main/res/drawable/shape_corner15_color_9a9a9a.xml b/app/src/main/res/drawable/shape_corner15_color_9a9a9a.xml
new file mode 100644
index 0000000..1cdd936
--- /dev/null
+++ b/app/src/main/res/drawable/shape_corner15_color_9a9a9a.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..0529a26
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/dialog_tip.xml b/app/src/main/res/layout/dialog_tip.xml
new file mode 100644
index 0000000..ccb666e
--- /dev/null
+++ b/app/src/main/res/layout/dialog_tip.xml
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_account_login.xml b/app/src/main/res/layout/fragment_account_login.xml
new file mode 100644
index 0000000..66d1c05
--- /dev/null
+++ b/app/src/main/res/layout/fragment_account_login.xml
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_phone_login.xml b/app/src/main/res/layout/fragment_phone_login.xml
new file mode 100644
index 0000000..8d97917
--- /dev/null
+++ b/app/src/main/res/layout/fragment_phone_login.xml
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_type_doctor_layout.xml b/app/src/main/res/layout/item_type_doctor_layout.xml
index 55b725f..dfce122 100644
--- a/app/src/main/res/layout/item_type_doctor_layout.xml
+++ b/app/src/main/res/layout/item_type_doctor_layout.xml
@@ -4,10 +4,25 @@
xmlns:tools="http://schemas.android.com/tools"
style="@style/FocusStyle"
android:layout_width="170dp"
- android:layout_height="212dp"
+ android:layout_height="232dp"
android:background="@drawable/shape_corners10_color_1b4765">
-
-
+
+
+
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