From e407dd1f335aa9c716b89b3152bf363b898d28fa Mon Sep 17 00:00:00 2001
From: Runt <qingingrunt2010@qq.com>
Date: Sun, 29 May 2022 11:29:56 +0000
Subject: [PATCH] 接口请求框架 注册接口
---
app/src/main/java/com/auto/lyric/base/fragments/BaseLoadPageFragment.java | 33 -
app/src/main/java/com/auto/lyric/retrofit/utils/RetrofitUtils.java | 3
app/src/main/java/com/auto/lyric/ui/collect/Collect.java | 9
app/src/main/java/com/auto/lyric/base/activities/BaseLoadPageActivity.java | 33 -
app/src/main/java/com/auto/lyric/util/PreferencesUtils.java | 234 ++--------
app/src/main/res/layout/activity_collect.xml | 31 +
app/src/main/java/com/auto/lyric/base/activities/BaseActivity.java | 125 ++++++
app/src/main/java/com/auto/lyric/util/DeviceIdUtils.java | 124 ++++++
app/src/main/java/com/auto/lyric/base/model/BaseViewModel.java | 6
app/src/main/java/com/auto/lyric/data/ActiveResult.java | 9
app/src/main/java/com/auto/lyric/ui/collect/CollectListResult.java | 14
app/src/main/java/com/auto/lyric/ui/collect/CollectActivity.java | 16
app/src/main/java/com/auto/lyric/data/ActiveBean.java | 9
app/src/main/java/com/auto/lyric/retrofit/Interceptor/HttpLoggingInterceptor.java | 57 +-
app/src/main/res/layout/activity_main.xml | 44 +
app/src/main/java/com/auto/lyric/ui/collect/CollectViewModel.java | 15
app/src/main/java/com/auto/lyric/base/fragments/BaseFragment.java | 5
app/src/main/res/mipmap-xhdpi/icon_white_back.png | 0
app/src/main/res/drawable-v21/bg_white_divider.xml | 38 +
app/build.gradle | 2
app/src/main/java/com/auto/lyric/retrofit/converter/DecryptGsonResponseBodyConverter.java | 15
app/src/main/java/com/auto/lyric/data/BaseApiResult.java | 17
app/src/main/java/com/auto/lyric/util/SHA1UTIL.java | 64 +++
app/src/main/java/com/auto/lyric/vm/MainViewModel.java | 43 ++
app/src/main/res/mipmap-xxhdpi/icon_white_back.png | 0
app/src/main/AndroidManifest.xml | 1
app/src/main/java/com/auto/lyric/retrofit/observable/HttpObserver.java | 64 ++-
app/src/main/java/com/auto/lyric/data/BasePageResult.java | 2
app/src/main/java/com/auto/lyric/service/FloatingWindowService.java | 12
app/src/main/java/com/auto/lyric/retrofit/observable/LoadingHttpObserver.java | 36 +
app/src/main/java/com/auto/lyric/MainActivity.java | 52 ++
app/src/main/res/mipmap-xxxhdpi/icon_white_back.png | 0
app/src/main/java/com/auto/lyric/retrofit/api/CommonApiCenter.java | 2
app/src/main/java/com/auto/lyric/base/fragments/BaseTabFragment.java | 4
app/src/main/java/com/auto/lyric/data/ApkUpGradeResult.java | 2
app/src/main/java/com/auto/lyric/retrofit/api/CollectApiCenter.java | 79 +++
36 files changed, 881 insertions(+), 319 deletions(-)
diff --git a/app/build.gradle b/app/build.gradle
index 73137dd..947103f 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -18,11 +18,13 @@
buildTypes {
debug {
minifyEnabled false
+ buildConfigField 'String','HOST_IP_ADDR','"https://test1.mydetao.cn/"'
resValue "string", "app_name", "歌词工具测试"
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
release {
minifyEnabled false
+ buildConfigField 'String','HOST_IP_ADDR','"https://test1.mydetao.cn/"'
resValue "string", "app_name", "歌词工具"
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 3d7d703..611afe8 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -33,6 +33,7 @@
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
+ android:networkSecurityConfig="@xml/network_security_config"
android:theme="@style/Theme.AutoLyric">
<activity
android:name=".MainActivity"
diff --git a/app/src/main/java/com/auto/lyric/MainActivity.java b/app/src/main/java/com/auto/lyric/MainActivity.java
index e0ac153..fa1f3cf 100644
--- a/app/src/main/java/com/auto/lyric/MainActivity.java
+++ b/app/src/main/java/com/auto/lyric/MainActivity.java
@@ -6,27 +6,79 @@
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
+import android.view.ViewGroup;
+import android.widget.EditText;
+import android.widget.LinearLayout;
import android.widget.Toast;
+import androidx.appcompat.app.AlertDialog;
+
import com.auto.lyric.base.activities.BaseActivity;
+import com.auto.lyric.data.ActiveResult;
import com.auto.lyric.data.LyricServer;
import com.auto.lyric.data.TextBean;
import com.auto.lyric.databinding.ActivityMainBinding;
+import com.auto.lyric.retrofit.observable.LoadingHttpObserver;
import com.auto.lyric.service.AutoInputService;
import com.auto.lyric.service.FloatingWindowService;
+import com.auto.lyric.util.DeviceUtil;
import com.auto.lyric.vm.MainViewModel;
+import com.google.gson.Gson;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Date;
import java.util.regex.Pattern;
public class MainActivity extends BaseActivity<ActivityMainBinding, MainViewModel> {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
@Override
public void initViews() {
Intent floatService = new Intent(getApplicationContext(), FloatingWindowService.class);
+ String key = getStringProjectPrefrence("activeKey");
+ ActiveResult result = new Gson().fromJson(key,ActiveResult.class);
+ try {
+ if(TextUtils.isEmpty(key) || TextUtils.isEmpty(result.validDate)||
+ new Date().getTime() > dateFormat.parse(result.validDate).getTime()){
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setTitle("软件尚未激活或已过期");
+ EditText editText = new EditText(this);
+ editText.setHint("请输入激活码");
+ ViewGroup.MarginLayoutParams params = new ViewGroup.MarginLayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+ params.setMargins(DeviceUtil.convertDpToPixel(30,this),DeviceUtil.convertDpToPixel(20,this),DeviceUtil.convertDpToPixel(30,this),0);
+ editText.setLayoutParams(params);
+ LinearLayout lin = new LinearLayout(this);
+ lin.addView(editText);
+ builder.setView(lin);
+ builder.setCancelable(false);
+ AlertDialog dialg = builder.create();
+ dialg.setButton(AlertDialog.BUTTON_NEGATIVE,"激活", (dialog, which) -> {
+ viewModel.checkActive(editText.getText().toString().trim(),new LoadingHttpObserver<ActiveResult>(this) {
+
+ @Override
+ public void onError(ActiveResult error) {
+ super.onError(error);
+ dialg.show();
+ }
+
+ @Override
+ public void onComplete(ActiveResult result) {
+
+ }
+ });
+ });
+ dialg.setButton(AlertDialog.BUTTON_POSITIVE,"退出程序",(dialog,which) ->{
+ System.exit(0);
+ });
+ dialg.show();
+ }
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+
binding.button.setOnClickListener(v -> {
if(binding.edit.getText().toString().trim().length() == 0){
diff --git a/app/src/main/java/com/auto/lyric/base/activities/BaseActivity.java b/app/src/main/java/com/auto/lyric/base/activities/BaseActivity.java
index df0058d..23a5cac 100644
--- a/app/src/main/java/com/auto/lyric/base/activities/BaseActivity.java
+++ b/app/src/main/java/com/auto/lyric/base/activities/BaseActivity.java
@@ -25,10 +25,12 @@
import com.auto.lyric.R;
import com.auto.lyric.base.model.BaseViewModel;
import com.auto.lyric.base.model.ViewModelFactory;
+import com.auto.lyric.util.PreferencesUtils;
import java.io.File;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
+import java.util.Set;
import dmax.dialog.SpotsDialog;
@@ -93,6 +95,7 @@
}
Class<VM> vmClass = (Class<VM>) type.getActualTypeArguments()[1];
viewModel = new ViewModelProvider(this,getViewModelFactory()).get(vmClass);
+ viewModel.onCreate(this);
setContentView(binding.getRoot());
mContext = this;
try {
@@ -288,4 +291,126 @@
return false;
}
+ public boolean getBooleanUserPrefrence(String key){
+ return PreferencesUtils.getBoolean(this,key,false,PreferencesUtils.USER);
+ }
+
+ public boolean getBooleanProjectPrefrence(String key){
+ return PreferencesUtils.getBoolean(this,key,false,PreferencesUtils.PROJECT);
+ }
+
+ public String getStringUserPrefrence(String key){
+ return PreferencesUtils.getString(this,key,"",PreferencesUtils.USER);
+ }
+
+ public String getStringProjectPrefrence(String key){
+ return PreferencesUtils.getString(this,key,"",PreferencesUtils.PROJECT);
+ }
+
+ public Integer getIntProjectPrefrence(String key){
+ return PreferencesUtils.getInt(this,key,0,PreferencesUtils.PROJECT);
+ }
+
+ public Long getLongProjectPrefrence(String key){
+ return PreferencesUtils.getLong(this,key,0,PreferencesUtils.PROJECT);
+ }
+
+ public float getFloatProjectPrefrence(String key){
+ return PreferencesUtils.getFloat(this,key,0,PreferencesUtils.PROJECT);
+ }
+
+ public Set getStringSetProjectPrefrence(String key){
+ return PreferencesUtils.getStringSet(this,key,PreferencesUtils.PROJECT);
+ }
+
+ public Integer getIntUserPrefrence(String key){
+ return PreferencesUtils.getInt(this,key,0,PreferencesUtils.USER);
+ }
+
+ public Long getLongUserPrefrence(String key){
+ return PreferencesUtils.getLong(this,key,0,PreferencesUtils.USER);
+ }
+
+ public float getFloatUserPrefrence(String key){
+ return PreferencesUtils.getFloat(this,key,0,PreferencesUtils.USER);
+ }
+
+ public Set getStringSetUserPrefrence(String key){
+ return PreferencesUtils.getStringSet(this,key,PreferencesUtils.USER);
+ }
+
+
+ public void putBooleanUserPrefrence(String key ,Boolean value){
+ PreferencesUtils.putBoolean(this,key,value,PreferencesUtils.USER);
+ }
+
+ public void putBooleanProjectPrefrence(String key,Boolean value){
+ PreferencesUtils.putBoolean(this,key,value,PreferencesUtils.PROJECT);
+ }
+
+ public void putStringUserPrefrence(String key,String value){
+ PreferencesUtils.putString(this,key,value,PreferencesUtils.USER);
+ }
+
+ public void putStringProjectPrefrence(String key,String value){
+ PreferencesUtils.putString(this,key,value,PreferencesUtils.PROJECT);
+ }
+
+ public void putIntProjectPrefrence(String key,int value){
+ PreferencesUtils.putInt(this,key,value,PreferencesUtils.PROJECT);
+ }
+
+ public void putLongProjectPrefrence(String key,long value){
+ PreferencesUtils.putLong(this,key,value,PreferencesUtils.PROJECT);
+ }
+
+ public void putFloatProjectPrefrence(String key,float value){
+ PreferencesUtils.putFloat(this,key,value,PreferencesUtils.PROJECT);
+ }
+
+ public void putStringSetProjectPrefrence(String key, Set value){
+ PreferencesUtils.putStringSet(this,key,value,PreferencesUtils.PROJECT);
+ }
+
+ public void putIntUserPrefrence(String key,int value){
+ PreferencesUtils.putInt(this,key,value,PreferencesUtils.USER);
+ }
+
+ public void putLongUserPrefrence(String key,long value){
+ PreferencesUtils.putLong(this,key,value,PreferencesUtils.USER);
+ }
+
+ public void putFloatUserPrefrence(String key,float value){
+ PreferencesUtils.putFloat(this,key,value,PreferencesUtils.USER);
+ }
+
+ public void putStringSetUserPrefrence(String key, Set value){
+ PreferencesUtils.putStringSet(this,key,value,PreferencesUtils.USER);
+ }
+
+
+ public void removeUserKey(String key){
+ PreferencesUtils.removeKey(this,key,PreferencesUtils.USER);
+ }
+
+ public void removeProjectKey(String key){
+ PreferencesUtils.removeKey(this,key,PreferencesUtils.PROJECT);
+ }
+
+ public void removeUserValue(String Value){
+ PreferencesUtils.removeValue(this,Value,PreferencesUtils.USER);
+ }
+
+ public void removeProjectValue(String Value){
+ PreferencesUtils.removeValue(this,Value,PreferencesUtils.PROJECT);
+ }
+
+
+ public void clearProjectData(){
+ PreferencesUtils.clearData(this,PreferencesUtils.PROJECT);
+ }
+ public void clearUserData(){
+ PreferencesUtils.clearData(this,PreferencesUtils.USER);
+ }
+
}
diff --git a/app/src/main/java/com/auto/lyric/base/activities/BaseLoadPageActivity.java b/app/src/main/java/com/auto/lyric/base/activities/BaseLoadPageActivity.java
index 5fa07b2..528ef38 100644
--- a/app/src/main/java/com/auto/lyric/base/activities/BaseLoadPageActivity.java
+++ b/app/src/main/java/com/auto/lyric/base/activities/BaseLoadPageActivity.java
@@ -65,27 +65,20 @@
}
private void finishFreshLoadmore(D result){
- if(result.code == 200){
-
- smartRefresh.setEnableRefresh(true);
- smartRefresh.finishRefresh();
- if(page == 1){
- adapter.getData().clear();
- adapter.setData(result.rows);
- }else{
- adapter.getData().addAll(result.rows);
- adapter.notifyDataSetChanged();
- }
- if(result.total <= adapter.getData().size()// 总数是否已经加载完
- || result.rows.size() < SIZE // 最后一页数据的数量一般不满size
- ){//判断是否没有数据了
- smartRefresh.finishLoadMoreWithNoMoreData();
- }else {
- smartRefresh.finishLoadMore();
- }
+ smartRefresh.setEnableRefresh(true);
+ smartRefresh.finishRefresh();
+ if(page == 1){
+ adapter.getData().clear();
+ adapter.setData(result.rows);
}else{
- smartRefresh.setEnableRefresh(true);
- smartRefresh.finishRefresh();
+ adapter.getData().addAll(result.rows);
+ adapter.notifyDataSetChanged();
+ }
+ if(result.total <= adapter.getData().size()// 总数是否已经加载完
+ || result.rows.size() < SIZE // 最后一页数据的数量一般不满size
+ ){//判断是否没有数据了
+ smartRefresh.finishLoadMoreWithNoMoreData();
+ }else {
smartRefresh.finishLoadMore();
}
}
diff --git a/app/src/main/java/com/auto/lyric/base/fragments/BaseFragment.java b/app/src/main/java/com/auto/lyric/base/fragments/BaseFragment.java
index 9825d55..629490d 100644
--- a/app/src/main/java/com/auto/lyric/base/fragments/BaseFragment.java
+++ b/app/src/main/java/com/auto/lyric/base/fragments/BaseFragment.java
@@ -7,11 +7,11 @@
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
-import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import androidx.viewbinding.ViewBinding;
import com.auto.lyric.base.activities.BaseActivity;
+import com.auto.lyric.base.model.BaseViewModel;
import com.auto.lyric.base.model.ViewModelFactory;
import java.lang.reflect.Method;
@@ -21,7 +21,7 @@
* fragment 封装
* Created by Administrator on 2021/10/28 0028.
*/
-public abstract class BaseFragment<B extends ViewBinding,VM extends ViewModel> extends Fragment {
+public abstract class BaseFragment<B extends ViewBinding,VM extends BaseViewModel> extends Fragment {
protected BaseActivity activity;
protected B binding;
@@ -52,6 +52,7 @@
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
activity = (BaseActivity) getActivity();
+ viewModel.onCreate(activity);
initViews();
}
diff --git a/app/src/main/java/com/auto/lyric/base/fragments/BaseLoadPageFragment.java b/app/src/main/java/com/auto/lyric/base/fragments/BaseLoadPageFragment.java
index 82093f3..23d28bd 100644
--- a/app/src/main/java/com/auto/lyric/base/fragments/BaseLoadPageFragment.java
+++ b/app/src/main/java/com/auto/lyric/base/fragments/BaseLoadPageFragment.java
@@ -77,27 +77,20 @@
}
private void finishFreshLoadmore(D result){
- if(result.code == 200){
-
- smartRefresh.setEnableRefresh(true);
- smartRefresh.finishRefresh();
- if(page == 1){
- adapter.getData().clear();
- adapter.setData(result.rows);
- }else{
- adapter.getData().addAll(result.rows);
- adapter.notifyDataSetChanged();
- }
- if(result.total <= adapter.getData().size()// 总数是否已经加载完
- || result.rows.size() < SIZE // 最后一页数据的数量一般不满size
- ){//判断是否没有数据了
- smartRefresh.finishLoadMoreWithNoMoreData();
- }else {
- smartRefresh.finishLoadMore();
- }
+ smartRefresh.setEnableRefresh(true);
+ smartRefresh.finishRefresh();
+ if(page == 1){
+ adapter.getData().clear();
+ adapter.setData(result.rows);
}else{
- smartRefresh.setEnableRefresh(true);
- smartRefresh.finishRefresh();
+ adapter.getData().addAll(result.rows);
+ adapter.notifyDataSetChanged();
+ }
+ if(result.total <= adapter.getData().size()// 总数是否已经加载完
+ || result.rows.size() < SIZE // 最后一页数据的数量一般不满size
+ ){//判断是否没有数据了
+ smartRefresh.finishLoadMoreWithNoMoreData();
+ }else {
smartRefresh.finishLoadMore();
}
}
diff --git a/app/src/main/java/com/auto/lyric/base/fragments/BaseTabFragment.java b/app/src/main/java/com/auto/lyric/base/fragments/BaseTabFragment.java
index 23485de..3c21308 100644
--- a/app/src/main/java/com/auto/lyric/base/fragments/BaseTabFragment.java
+++ b/app/src/main/java/com/auto/lyric/base/fragments/BaseTabFragment.java
@@ -1,10 +1,10 @@
package com.auto.lyric.base.fragments;
-import androidx.lifecycle.ViewModel;
import androidx.viewbinding.ViewBinding;
import androidx.viewpager2.widget.ViewPager2;
import com.auto.lyric.base.adapter.FragmentAdapter;
+import com.auto.lyric.base.model.BaseViewModel;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;
@@ -16,7 +16,7 @@
* 带有tablayout fragment封装
* Created by Administrator on 2021/11/3 0003.
*/
-public abstract class BaseTabFragment<B extends ViewBinding,VM extends ViewModel> extends BaseFragment<B,VM> {
+public abstract class BaseTabFragment<B extends ViewBinding,VM extends BaseViewModel> extends BaseFragment<B,VM> {
TabLayout tabLayout;
FragmentAdapter fragmentAdapter;
diff --git a/app/src/main/java/com/auto/lyric/base/model/BaseViewModel.java b/app/src/main/java/com/auto/lyric/base/model/BaseViewModel.java
index bbc4039..83badfd 100644
--- a/app/src/main/java/com/auto/lyric/base/model/BaseViewModel.java
+++ b/app/src/main/java/com/auto/lyric/base/model/BaseViewModel.java
@@ -2,6 +2,7 @@
import androidx.lifecycle.ViewModel;
+import com.auto.lyric.base.activities.BaseActivity;
import com.auto.lyric.retrofit.AndroidScheduler;
import com.auto.lyric.retrofit.observable.HttpObserver;
@@ -13,6 +14,11 @@
*/
public class BaseViewModel extends ViewModel {
+ protected BaseActivity activity;
+
+ public void onCreate(BaseActivity activity){
+ this.activity = activity;
+ }
/**
* 网络请求观察
diff --git a/app/src/main/java/com/auto/lyric/data/ActiveBean.java b/app/src/main/java/com/auto/lyric/data/ActiveBean.java
new file mode 100644
index 0000000..a40382c
--- /dev/null
+++ b/app/src/main/java/com/auto/lyric/data/ActiveBean.java
@@ -0,0 +1,9 @@
+package com.auto.lyric.data;
+
+/**
+ * Created by Runt (qingingrunt2010@qq.com) on 2022/5/29.
+ */
+public class ActiveBean {
+ public String activeKey, ip, phoneID, random,sign;
+ public long timeStamp ; public int userId;
+}
diff --git a/app/src/main/java/com/auto/lyric/data/ActiveResult.java b/app/src/main/java/com/auto/lyric/data/ActiveResult.java
new file mode 100644
index 0000000..5311e27
--- /dev/null
+++ b/app/src/main/java/com/auto/lyric/data/ActiveResult.java
@@ -0,0 +1,9 @@
+package com.auto.lyric.data;
+
+/**
+ * Created by Runt (qingingrunt2010@qq.com) on 2022/5/29.
+ */
+public class ActiveResult extends BaseApiResult{
+ public String userID,userClassName,validDate,permission;
+ public int userClass;
+}
diff --git a/app/src/main/java/com/auto/lyric/data/ApkUpGradeResult.java b/app/src/main/java/com/auto/lyric/data/ApkUpGradeResult.java
index 2e1e710..708adb2 100644
--- a/app/src/main/java/com/auto/lyric/data/ApkUpGradeResult.java
+++ b/app/src/main/java/com/auto/lyric/data/ApkUpGradeResult.java
@@ -3,7 +3,7 @@
/**
* Created by Administrator on 2021/11/15 0015.
*/
-public class ApkUpGradeResult extends BaseApiResult<ApkUpGradeResult.AppInfo>{
+public class ApkUpGradeResult extends BaseApiResult{
public class AppInfo {
//以下为声明的参数
diff --git a/app/src/main/java/com/auto/lyric/data/BaseApiResult.java b/app/src/main/java/com/auto/lyric/data/BaseApiResult.java
index 7156b95..424f901 100644
--- a/app/src/main/java/com/auto/lyric/data/BaseApiResult.java
+++ b/app/src/main/java/com/auto/lyric/data/BaseApiResult.java
@@ -5,19 +5,6 @@
/**
* Created by Administrator on 2021/10/28 0028.
*/
-public class BaseApiResult<D extends Object> implements Serializable {
- public String msg;
- public int code = 200;
- public D data;
-
-
- @Override
- public String toString() {
- return "BaseApiData{" +
- "msg='" + msg + '\'' +
- ", code=" + code +
- ", data=" + data +
- '}';
- }
-
+public class BaseApiResult implements Serializable {
+ public String result,reason,errorInfo;
}
diff --git a/app/src/main/java/com/auto/lyric/data/BasePageResult.java b/app/src/main/java/com/auto/lyric/data/BasePageResult.java
index e5af862..f091fb7 100644
--- a/app/src/main/java/com/auto/lyric/data/BasePageResult.java
+++ b/app/src/main/java/com/auto/lyric/data/BasePageResult.java
@@ -5,7 +5,7 @@
/**
* Created by Administrator on 2021/10/28 0028.
*/
-public class BasePageResult<T> extends BaseApiResult<String>{
+public class BasePageResult<T> extends BaseApiResult{
public int pages;
public int total;
public int pageNum;
diff --git a/app/src/main/java/com/auto/lyric/retrofit/Interceptor/HttpLoggingInterceptor.java b/app/src/main/java/com/auto/lyric/retrofit/Interceptor/HttpLoggingInterceptor.java
index d75056a..c567957 100644
--- a/app/src/main/java/com/auto/lyric/retrofit/Interceptor/HttpLoggingInterceptor.java
+++ b/app/src/main/java/com/auto/lyric/retrofit/Interceptor/HttpLoggingInterceptor.java
@@ -5,7 +5,6 @@
import com.auto.lyric.retrofit.net.NetWorkCost;
import com.auto.lyric.retrofit.net.NetWorkListenear;
import com.auto.lyric.retrofit.utils.HttpPrintUtils;
-import com.auto.lyric.util.GsonUtils;
import org.json.JSONObject;
@@ -111,33 +110,37 @@
charset = contentType.charset(UTF8);
}
HashMap param = new HashMap();
- if(requestBody instanceof MultipartBody){
- logArrays.add("---------->REQUEST BODY[MultipartBody]<----------");
- MultipartBody body = (MultipartBody) requestBody;
- for(MultipartBody.Part part:body.parts()){
- Buffer buffer1 = new Buffer();
- part.body().writeTo(buffer1);
- String str=buffer1.readString(charset).replaceAll("%(?![0-9a-fA-F]{2})","%25");
- param.put(part.headers().get(part.headers().name(0)),URLDecoder.decode(str, "UTF-8"));
+ try {
+ if(requestBody instanceof MultipartBody){
+ logArrays.add("---------->REQUEST BODY[MultipartBody]<----------");
+ MultipartBody body = (MultipartBody) requestBody;
+ for(MultipartBody.Part part:body.parts()){
+ Buffer buffer1 = new Buffer();
+ part.body().writeTo(buffer1);
+ String str=buffer1.readString(charset).replaceAll("%(?![0-9a-fA-F]{2})","%25");
+ param.put(part.headers().get(part.headers().name(0)),URLDecoder.decode(str, "UTF-8"));
+ }
+ logArrays.add(new JSONObject(param).toString(4));
+ }else if(requestBody instanceof FormBody){
+ logArrays.add("---------->REQUEST BODY[FormBody]<----------");
+ FormBody body = (FormBody) requestBody;
+ for(int i = 0 ; i < body.size() ; i ++ ){
+ param.put(body.name(i),body.value(i));
+ }
+ logArrays.add(new JSONObject(param).toString(4));
+ }else{
+ Buffer buffer = new Buffer();
+ requestBody.writeTo(buffer);
+ logArrays.add("---------->REQUEST BODY<----------");
+ String str = buffer.readString(charset);
+ if(str.indexOf("{") == 0 ){
+ logArrays.add(new JSONObject(URLDecoder.decode(str, "UTF-8")).toString(4));
+ }else{
+ logArrays.add(str);
+ }
}
- logArrays.add(GsonUtils.retractJson(new JSONObject(param).toString()));
- }else if(requestBody instanceof FormBody){
- logArrays.add("---------->REQUEST BODY[FormBody]<----------");
- FormBody body = (FormBody) requestBody;
- for(int i = 0 ; i < body.size() ; i ++ ){
- param.put(body.name(i),body.value(i));
- }
- logArrays.add(GsonUtils.retractJson(new JSONObject(param).toString()));
- }else{
- Buffer buffer = new Buffer();
- requestBody.writeTo(buffer);
- logArrays.add("---------->REQUEST BODY<----------");
- String str = buffer.readString(charset);
- try{
- logArrays.add(GsonUtils.retractJson(URLDecoder.decode(str, "UTF-8")));
- }catch (Exception e){
- logArrays.add(str);
- }
+ } catch (Exception e) {
+ e.printStackTrace();
}
logArrays.add("--> END " + request.method() + " " + contentType + " ( "
+ requestBody.contentLength() + "-byte body )");
diff --git a/app/src/main/java/com/auto/lyric/retrofit/api/CollectApiCenter.java b/app/src/main/java/com/auto/lyric/retrofit/api/CollectApiCenter.java
new file mode 100644
index 0000000..8b5e706
--- /dev/null
+++ b/app/src/main/java/com/auto/lyric/retrofit/api/CollectApiCenter.java
@@ -0,0 +1,79 @@
+package com.auto.lyric.retrofit.api;
+
+import com.auto.lyric.data.ActiveResult;
+import com.auto.lyric.ui.collect.CollectListResult;
+
+import io.reactivex.Observable;
+import retrofit2.http.Field;
+import retrofit2.http.FormUrlEncoded;
+import retrofit2.http.POST;
+
+/**
+ * Created by Runt (qingingrunt2010@qq.com) on 2022/5/29.
+ */
+public interface CollectApiCenter {
+
+
+ /**
+ * 收藏夹列表
+ * @return
+ */
+ @FormUrlEncoded
+ @POST("index.php?route=lrc/favorites/getFavoritesList")
+ Observable<CollectListResult> getCollectList();
+
+ /**
+ * 歌词详情
+ * @return
+ */
+ @FormUrlEncoded
+ @POST("index.php?route=lrc/favorites/getLrc")
+ Observable<CollectListResult> getLrcDetail(@Field("lrc_id") int lrc_id);
+
+ /**
+ * 删除歌词
+ * @return
+ */
+ @FormUrlEncoded
+ @POST("index.php?route=lrc/favorites/delLrc")
+ Observable<CollectListResult> removeLrc(@Field("lrc_id") int lrc_id);
+
+ /**
+ * 添加歌词歌词
+ * @return
+ */
+ @FormUrlEncoded
+ @POST("index.php?route=lrc/favorites/delLrc")
+ Observable<CollectListResult> addLrc(@Field("lrc_title") String lrc_title,@Field("lrc_text") String lrc_text);
+
+ /**
+ * 激活软件
+ * @param activeKey
+ * @param ip
+ * @param random
+ * @param time
+ * @param userId
+ * @param sign
+ * @return
+ */
+ @FormUrlEncoded
+ @POST("index.php?route=lrc/login_check")
+ Observable<ActiveResult> loginCheck(@Field("activeKey") String activeKey, @Field("ip") String ip, @Field("random") String random,
+ @Field("timeStamp") long time, @Field("userId") int userId, @Field("sign") String sign);
+
+ /**
+ * 激活软件
+ * @param activeKey
+ * @param ip
+ * @param random
+ * @param time
+ * @param userId
+ * @param sign
+ * @return
+ */
+ @FormUrlEncoded
+ @POST("index.php?route=lrc/register")
+ Observable<ActiveResult> register(@Field("activeKey") String activeKey, @Field("ip") String ip,@Field("phoneID") String phoneID, @Field("random") String random,
+ @Field("timeStamp") long time, @Field("userID") int userId, @Field("sign") String sign);
+
+}
diff --git a/app/src/main/java/com/auto/lyric/retrofit/api/CommonApiCenter.java b/app/src/main/java/com/auto/lyric/retrofit/api/CommonApiCenter.java
index 3e673e2..84bed84 100644
--- a/app/src/main/java/com/auto/lyric/retrofit/api/CommonApiCenter.java
+++ b/app/src/main/java/com/auto/lyric/retrofit/api/CommonApiCenter.java
@@ -2,6 +2,7 @@
+import com.auto.lyric.data.ActiveResult;
import com.auto.lyric.data.ApkUpGradeResult;
import java.util.Map;
@@ -63,4 +64,5 @@
Observable<ApkUpGradeResult> getAppUpdate();
+
}
diff --git a/app/src/main/java/com/auto/lyric/retrofit/converter/DecryptGsonResponseBodyConverter.java b/app/src/main/java/com/auto/lyric/retrofit/converter/DecryptGsonResponseBodyConverter.java
index a86ecf0..8acd35a 100644
--- a/app/src/main/java/com/auto/lyric/retrofit/converter/DecryptGsonResponseBodyConverter.java
+++ b/app/src/main/java/com/auto/lyric/retrofit/converter/DecryptGsonResponseBodyConverter.java
@@ -1,5 +1,6 @@
package com.auto.lyric.retrofit.converter;
+import android.text.TextUtils;
import android.util.Log;
import com.auto.lyric.data.BaseApiResult;
@@ -51,15 +52,15 @@
response = decryptJsonStr(val);//解密
} catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
e.printStackTrace();
- BaseApiResult apiResult = new BaseApiResult<>();
- apiResult.code = 412;
- apiResult.msg = "解密数据出错"+e.getMessage();
+ BaseApiResult apiResult = new BaseApiResult();
+ apiResult.result = "412";
+ apiResult.reason = "解密数据出错"+e.getMessage();
response = new Gson().toJson(apiResult);
} catch (JSONException e) {
e.printStackTrace();
- BaseApiResult apiResult = new BaseApiResult<>();
- apiResult.code = 414;
- apiResult.msg = "非标准json";
+ BaseApiResult apiResult = new BaseApiResult();
+ apiResult.result = "414";
+ apiResult.reason = "非标准json";
response = new Gson().toJson(apiResult);
}catch (Exception e){
JsonReader jsonReader = gson.newJsonReader(value.charStream());
@@ -88,6 +89,8 @@
JSONObject json = new JSONObject(body);
body = json.toString();
//body = RSAUtils.decrypt(json.getString(ENCRYPT), RSAUtils.getPublicKey(RSAUtils.PUBLIC_KEY));//
+ }else if(TextUtils.isEmpty(body)){
+ return body;
}
return transHump? GsonUtils.toHumpJson(body):body;
}
diff --git a/app/src/main/java/com/auto/lyric/retrofit/observable/HttpObserver.java b/app/src/main/java/com/auto/lyric/retrofit/observable/HttpObserver.java
index 4bf4ece..91f4f7b 100644
--- a/app/src/main/java/com/auto/lyric/retrofit/observable/HttpObserver.java
+++ b/app/src/main/java/com/auto/lyric/retrofit/observable/HttpObserver.java
@@ -2,10 +2,9 @@
import android.util.Log;
-import androidx.lifecycle.MutableLiveData;
-
import com.auto.lyric.data.BaseApiResult;
+import java.io.EOFException;
import java.lang.reflect.ParameterizedType;
import java.net.SocketTimeoutException;
@@ -19,50 +18,67 @@
final String TAG = "HttpObserver";
- MutableLiveData<T> resultLive;
-
- public HttpObserver(MutableLiveData<T> resultLive) {
- this.resultLive = resultLive;
- }
-
+ protected T value;
@Override
public void onNext(T value) {
- resultLive.setValue(value);
+ this.value = value;
}
+ /**
+ * 错误处理
+ * @param throwable
+ */
@Override
public void onError(Throwable throwable) {
- Log.i("subscribe","onError");
-
+ Log.e("subscribe","onError "+throwable);
+ T t = null;
try {
Log.e(TAG,this.getClass().getSimpleName()+" "+throwable.getMessage());
Class<T> entityClass = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
- T t = entityClass.newInstance();//实例化一个泛型
- t.code = 410;
+ t = entityClass.newInstance();//实例化一个泛型
+ t.result = "410";
if( throwable instanceof SocketTimeoutException){
- t.msg = "服务请求超时,请稍候再试";//设置错误信息
+ t.reason = "服务请求超时,请稍候再试";//设置错误信息
+ }else if(throwable instanceof EOFException){
+ t.reason = "服务未反馈任何内容";//设置错误信息
}else{
- t.msg = "网络连接不畅,请检查您的网络设置";//设置错误信息
+ t.reason = "网络连接不畅,请检查您的网络设置";//设置错误信息
}
- resultLive.setValue(t);
} catch (ClassCastException e) {
e.printStackTrace();
- T t = (T) new BaseApiResult<String>();
- t.code = 409;
- t.msg = "实例化对象未指定泛型实体类";
- resultLive.setValue(t);
+ t = (T) new BaseApiResult();
+ t.result = "409";
+ t.reason = "实例化对象未指定泛型实体类";
} catch (Exception e) {
e.printStackTrace();
- T t = (T) new BaseApiResult<String>();
- t.code = 409;
- t.msg = e.getMessage();
- resultLive.setValue(t);
+ t.result = "409";
+ t.reason = e.getMessage();
}
+ onError(t);
}
@Override
public void onComplete() {
+ if(value.result.equals("success")){
+ //返回成功
+ onComplete(value);
+ }else{
+ //返回失败
+ onError(value);
+ }
Log.i("subscribe","onComplete");
}
+
+ /**
+ * 接口返回成功
+ * @param result
+ */
+ public abstract void onError(T result) ;
+
+ /**
+ * 接口返回失败
+ * @param error
+ */
+ public abstract void onComplete(T error) ;
}
diff --git a/app/src/main/java/com/auto/lyric/retrofit/observable/LoadingHttpObserver.java b/app/src/main/java/com/auto/lyric/retrofit/observable/LoadingHttpObserver.java
new file mode 100644
index 0000000..a9c783e
--- /dev/null
+++ b/app/src/main/java/com/auto/lyric/retrofit/observable/LoadingHttpObserver.java
@@ -0,0 +1,36 @@
+package com.auto.lyric.retrofit.observable;
+
+import android.text.TextUtils;
+
+import com.auto.lyric.base.activities.BaseActivity;
+import com.auto.lyric.data.BaseApiResult;
+
+/**
+ * Created by Runt (qingingrunt2010@qq.com) on 2022/5/29.
+ */
+public abstract class LoadingHttpObserver<T extends BaseApiResult> extends HttpObserver<T> {
+
+ final String TAG = "HttpObserver";
+ BaseActivity activity;
+
+ public LoadingHttpObserver(BaseActivity activity) {
+ this.activity = activity;
+ }
+
+ @Override
+ protected void onStart() {
+ activity.showLoadingDialog("正在请求中...");
+ }
+
+ @Override
+ public void onComplete() {
+ activity.dissmissLoadingDialog();
+ super.onComplete();
+ }
+
+ @Override
+ public void onError(T error) {
+ activity.dissmissLoadingDialog();
+ activity.showToast(error == null?"未知错误": TextUtils.isEmpty(error.reason)?error.errorInfo: error.reason);
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/auto/lyric/retrofit/utils/RetrofitUtils.java b/app/src/main/java/com/auto/lyric/retrofit/utils/RetrofitUtils.java
index ca63fbf..ef00975 100644
--- a/app/src/main/java/com/auto/lyric/retrofit/utils/RetrofitUtils.java
+++ b/app/src/main/java/com/auto/lyric/retrofit/utils/RetrofitUtils.java
@@ -23,7 +23,6 @@
*/
public class RetrofitUtils {
- public static String HOST_IP_ADDR;
static RetrofitUtils instance;
Retrofit retrofit/*log输出,驼峰转换*/,unHumpRetrofit/*log输出,不强制驼峰转换*/,
unLogRetrofit/*log不输出,驼峰转换*/,unLogHumpRetorfit/*log不输出,不强制驼峰转换*/;
@@ -108,7 +107,7 @@
//设置OKHttpClient
.client(client)
//设置baseUrl,注意,baseUrl必须后缀"/"
- //.baseUrl(BuildConfig.ENVIRONMENT.equals("develop")?HOST_IP_ADDR:BuildConfig.HOST_IP_ADDR)
+ .baseUrl(BuildConfig.HOST_IP_ADDR)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
}
diff --git a/app/src/main/java/com/auto/lyric/service/FloatingWindowService.java b/app/src/main/java/com/auto/lyric/service/FloatingWindowService.java
index b194d21..f6056fd 100644
--- a/app/src/main/java/com/auto/lyric/service/FloatingWindowService.java
+++ b/app/src/main/java/com/auto/lyric/service/FloatingWindowService.java
@@ -17,7 +17,6 @@
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
-import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -28,9 +27,7 @@
import com.auto.lyric.databinding.FloatViewBinding;
import com.auto.lyric.util.DeviceUtil;
-import java.text.ParseException;
import java.text.SimpleDateFormat;
-import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
@@ -45,7 +42,6 @@
FloatViewBinding binding;
final String TAG = "FloatingWindowService";
final int THREAD_STOP = 0, KEYBOARD_SEND = 100;
- SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
SimpleDateFormat msFormat = new SimpleDateFormat("mm:ss.SSS");
boolean pause;//是否暂停
int progress;//时间进度
@@ -136,14 +132,6 @@
binding.btnFast.setOnClickListener(v -> progress+=700);
binding.btnBack.setOnClickListener(v -> progress-=700);
binding.btnStart.setOnClickListener(v -> {
- try {
- if(new Date().getTime() > dateFormat.parse("2022-09-30 04:00:00").getTime()){
- Toast.makeText(getApplicationContext(),"软件使用时间已过期", Toast.LENGTH_SHORT).show();
- return;
- }
- } catch (ParseException e) {
- e.printStackTrace();
- }
if(binding.btnStart.getText().equals("开启")){
start();
}else{
diff --git a/app/src/main/java/com/auto/lyric/ui/collect/Collect.java b/app/src/main/java/com/auto/lyric/ui/collect/Collect.java
new file mode 100644
index 0000000..add7e21
--- /dev/null
+++ b/app/src/main/java/com/auto/lyric/ui/collect/Collect.java
@@ -0,0 +1,9 @@
+package com.auto.lyric.ui.collect;
+
+/**
+ * Created by Runt (qingingrunt2010@qq.com) on 2022/5/29.
+ */
+public class Collect {
+ public int lrdId;
+ public String lrcTitle, lrdText;
+}
diff --git a/app/src/main/java/com/auto/lyric/ui/collect/CollectActivity.java b/app/src/main/java/com/auto/lyric/ui/collect/CollectActivity.java
new file mode 100644
index 0000000..fb255a7
--- /dev/null
+++ b/app/src/main/java/com/auto/lyric/ui/collect/CollectActivity.java
@@ -0,0 +1,16 @@
+package com.auto.lyric.ui.collect;
+
+import com.auto.lyric.base.activities.BaseTitleBarActivity;
+import com.auto.lyric.databinding.ActivityCollectBinding;
+
+/**
+ * Created by Runt (qingingrunt2010@qq.com) on 2022/5/29.
+ */
+public class CollectActivity extends BaseTitleBarActivity<ActivityCollectBinding,CollectViewModel> {
+
+
+ @Override
+ public void initViews() {
+
+ }
+}
diff --git a/app/src/main/java/com/auto/lyric/ui/collect/CollectListResult.java b/app/src/main/java/com/auto/lyric/ui/collect/CollectListResult.java
new file mode 100644
index 0000000..ac646d0
--- /dev/null
+++ b/app/src/main/java/com/auto/lyric/ui/collect/CollectListResult.java
@@ -0,0 +1,14 @@
+package com.auto.lyric.ui.collect;
+
+import com.auto.lyric.data.BaseApiResult;
+
+import java.util.List;
+
+/**
+ * Created by Runt (qingingrunt2010@qq.com) on 2022/5/29.
+ */
+public class CollectListResult extends BaseApiResult {
+
+ public List<Collect> list;
+
+}
diff --git a/app/src/main/java/com/auto/lyric/ui/collect/CollectViewModel.java b/app/src/main/java/com/auto/lyric/ui/collect/CollectViewModel.java
new file mode 100644
index 0000000..40d2382
--- /dev/null
+++ b/app/src/main/java/com/auto/lyric/ui/collect/CollectViewModel.java
@@ -0,0 +1,15 @@
+package com.auto.lyric.ui.collect;
+
+import com.auto.lyric.base.model.BaseViewModel;
+import com.auto.lyric.retrofit.observable.LoadingHttpObserver;
+
+/**
+ * Created by Runt (qingingrunt2010@qq.com) on 2022/5/29.
+ */
+public class CollectViewModel extends BaseViewModel {
+
+ public void getLrcList(LoadingHttpObserver<CollectListResult> observer){
+
+ }
+
+}
diff --git a/app/src/main/java/com/auto/lyric/util/DeviceIdUtils.java b/app/src/main/java/com/auto/lyric/util/DeviceIdUtils.java
new file mode 100644
index 0000000..cd10cdf
--- /dev/null
+++ b/app/src/main/java/com/auto/lyric/util/DeviceIdUtils.java
@@ -0,0 +1,124 @@
+package com.auto.lyric.util;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.provider.Settings;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+
+import org.json.JSONObject;
+
+import java.lang.reflect.Method;
+import java.util.HashSet;
+
+/**
+ * copy from: http://docs.aiduoyou.com/web/#/100/1495
+ */
+public class DeviceIdUtils {
+
+
+ public static String getDeviceId(Context context, int slotId) {
+ try {
+ //实例化TelephonyManager对象
+ TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
+ Method method = telephonyManager.getClass().getMethod("getDeviceId", int.class);
+ return (String) method.invoke(telephonyManager, slotId);
+ } catch (Exception e) {
+ //e.printStackTrace();
+ }
+ return "";
+ }
+
+ public static String getImei(Context context, int slotId) {
+ try {
+ //实例化TelephonyManager对象
+ TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
+ Method method = telephonyManager.getClass().getMethod("getImei", int.class);
+ return (String) method.invoke(telephonyManager, slotId);
+ } catch (Exception e) {
+ //e.printStackTrace();
+ }
+ return "";
+ }
+
+ @SuppressLint("MissingPermission")
+ public static String getDeviceId(Context context) {
+ try {
+ TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
+ return tm.getDeviceId();
+ } catch (Exception e) {
+ //e.printStackTrace();
+ }
+ return "";
+ }
+ public static String getImei(Context context) {
+ try {
+ //实例化TelephonyManager对象
+ TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
+ Method method = telephonyManager.getClass().getMethod("getImei");
+ return (String) method.invoke(telephonyManager);
+ } catch (Exception e) {
+ //e.printStackTrace();
+ }
+ return "";
+ }
+
+ public static String getAndroidId(Context context) {
+ try {
+ return Settings.System.getString(context.getContentResolver(), Settings.System.ANDROID_ID);
+ } catch (Exception e) {
+ //e.printStackTrace();
+ }
+ return "";
+ }
+
+
+ public static JSONObject getDeviceIds(Context context) {
+ try {
+ String imei1 = getDeviceId(context, 0);
+ String imei2 = getDeviceId(context, 1);
+ String imei3 = getImei(context, 0);
+ String imei4 = getImei(context, 1);
+ String imei5 = getDeviceId(context);
+ String imei6 = getImei(context);
+ HashSet<String> hashSet = new HashSet();
+ if (!TextUtils.isEmpty(imei1)) {
+ hashSet.add(imei1);
+ }
+ if (!TextUtils.isEmpty(imei2)) {
+ hashSet.add(imei2);
+ }
+ if (!TextUtils.isEmpty(imei3)) {
+ hashSet.add(imei3);
+ }
+ if (!TextUtils.isEmpty(imei4)) {
+ hashSet.add(imei4);
+ }
+ if (!TextUtils.isEmpty(imei5)) {
+ hashSet.add(imei5);
+ }
+ if (!TextUtils.isEmpty(imei6)) {
+ hashSet.add(imei6);
+ }
+ JSONObject jsonObject = new JSONObject();
+ int i = 0;
+ for (String value : hashSet) {
+ i ++;
+ jsonObject.put(String.valueOf(i), value);
+ }
+
+ String androidId = getAndroidId(context);
+ if (!TextUtils.isEmpty(androidId)) {
+ jsonObject.put("6", androidId);
+ }
+
+ return jsonObject;
+ } catch (Exception e) {
+ //e.printStackTrace();
+ }
+ return null;
+ }
+
+
+
+}
diff --git a/app/src/main/java/com/auto/lyric/util/SpUtils.java b/app/src/main/java/com/auto/lyric/util/PreferencesUtils.java
similarity index 64%
rename from app/src/main/java/com/auto/lyric/util/SpUtils.java
rename to app/src/main/java/com/auto/lyric/util/PreferencesUtils.java
index 21cd1b3..79b06a6 100644
--- a/app/src/main/java/com/auto/lyric/util/SpUtils.java
+++ b/app/src/main/java/com/auto/lyric/util/PreferencesUtils.java
@@ -8,36 +8,35 @@
import java.util.Set;
/**
- * Created by Administrator on 2021/10/28 0028.
+ * PreferencesUtils, easy to get or put data
+ * <ul>
+ * <strong>Preference Name</strong>
+ * <li>you can change preference name by {@link #PREFERENCE_NAME}</li>
+ * </ul>
+ * <ul>
+ * <strong>Put Value</strong>
+ * </ul>
+ *
+ * @author <a href="http://www.trinea.cn" target="_blank">Trinea</a> 2013-3-6
*/
-public class SpUtils {
+public class PreferencesUtils {
- static SpUtils instance;
-
- /**
- * 获取SP实例
- *
- * @return {@link SpUtils}
- */
- public static SpUtils getInstance() {
- if(instance == null){
- instance = new SpUtils();
- }
- return instance;
+ public static final String PREFERENCE_NAME="zipper";
+ public static final String PROJECT = "project";
+ public static final String USER = "user";
+ public static final String VISITOR = "visitor";
+
+ private PreferencesUtils() {
+ throw new AssertionError();
}
-
- public final static String PROJECT = "project";
- public final static String USER = "user";
-
-
- public boolean clearData(Context context, String keyShared){
+ public static boolean clearData(Context context, String keyShared){
SharedPreferences settings = context.getSharedPreferences(keyShared, Context.MODE_PRIVATE);
return settings.edit().clear().commit();
}
- public boolean clearData(Context context, String key, String keyShared){
+ public static boolean clearData(Context context, String key, String keyShared){
putString(context,key,null,keyShared);
return true;
}
@@ -51,7 +50,7 @@
* @param key The name of the preference to modify
* @return True if the new values were successfully written to persistent storage.
*/
- public void removeKey(Context context, String key, String keyShared){
+ public static void removeKey(Context context, String key, String keyShared){
SharedPreferences settings = context.getSharedPreferences(keyShared, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
@@ -65,7 +64,7 @@
* @param value The name of the preference to modify
* @return True if the new values were successfully written to persistent storage.
*/
- public void removeValue(Context context, String value, String keyShared){
+ public static void removeValue(Context context, String value, String keyShared){
SharedPreferences settings = context.getSharedPreferences(keyShared, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.remove(value);
@@ -74,13 +73,13 @@
/**
* put string preferences
- *
+ *
* @param context
* @param key The name of the preference to modify
* @param value The new value for the preference
* @return True if the new values were successfully written to persistent storage.
*/
- public boolean putString(Context context, String key, String value, String keyShared) {
+ public static boolean putString(Context context, String key, String value, String keyShared) {
SharedPreferences settings = context.getSharedPreferences(keyShared, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putString(key, value);
@@ -89,40 +88,40 @@
/**
* get string preferences
- *
+ *
* @param context
* @param key The name of the preference to retrieve
* @return The preference value if it exists, or null. Throws ClassCastException if there is a preference with this
* name that is not a string
* @see #getString(Context, String, String)
*/
- public String getString(Context context, String key, String keyShared) {
+ public static String getString(Context context, String key, String keyShared) {
return getString(context, key, null,keyShared);
}
/**
* get string preferences
- *
+ *
* @param context
* @param key The name of the preference to retrieve
* @param defaultValue Value to return if this preference does not exist
* @return The preference value if it exists, or defValue. Throws ClassCastException if there is a preference with
* this name that is not a string
*/
- public String getString(Context context, String key, String defaultValue, String keyShared) {
+ public static String getString(Context context, String key, String defaultValue, String keyShared) {
SharedPreferences settings = context.getSharedPreferences(keyShared, Context.MODE_PRIVATE);
return settings.getString(key, defaultValue);
}
/**
* put int preferences
- *
+ *
* @param context
* @param key The name of the preference to modify
* @param value The new value for the preference
* @return True if the new values were successfully written to persistent storage.
*/
- public boolean putInt(Context context, String key, int value, String keyShared) {
+ public static boolean putInt(Context context, String key, int value, String keyShared) {
SharedPreferences settings = context.getSharedPreferences(keyShared, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putInt(key, value);
@@ -131,26 +130,26 @@
/**
* get int preferences
- *
+ *
* @param context
* @param key The name of the preference to retrieve
* @return The preference value if it exists, or -1. Throws ClassCastException if there is a preference with this
* name that is not a int
*/
- public int getInt(Context context, String key, String keyShared) {
+ public static int getInt(Context context, String key, String keyShared) {
return getInt(context, key, -1,keyShared);
}
/**
* get int preferences
- *
+ *
* @param context
* @param key The name of the preference to retrieve
* @param defaultValue Value to return if this preference does not exist
* @return The preference value if it exists, or defValue. Throws ClassCastException if there is a preference with
* this name that is not a int
*/
- public int getInt(Context context, String key, int defaultValue, String keyShared) {
+ public static int getInt(Context context, String key, int defaultValue, String keyShared) {
SharedPreferences settings = context.getSharedPreferences(keyShared, Context.MODE_PRIVATE);
try {
return settings.getInt(key, defaultValue);
@@ -165,13 +164,13 @@
/**
* put long preferences
- *
+ *
* @param context
* @param key The name of the preference to modify
* @param value The new value for the preference
* @return True if the new values were successfully written to persistent storage.
*/
- public boolean putLong(Context context, String key, long value, String keyShared) {
+ public static boolean putLong(Context context, String key, long value, String keyShared) {
SharedPreferences settings = context.getSharedPreferences(keyShared, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putLong(key, value);
@@ -180,26 +179,26 @@
/**
* get long preferences
- *
+ *
* @param context
* @param key The name of the preference to retrieve
* @return The preference value if it exists, or -1. Throws ClassCastException if there is a preference with this
* name that is not a long
*/
- public long getLong(Context context, String key, String keyShared) {
+ public static long getLong(Context context, String key, String keyShared) {
return getLong(context, key, -1,keyShared);
}
/**
* get long preferences
- *
+ *
* @param context
* @param key The name of the preference to retrieve
* @param defaultValue Value to return if this preference does not exist
* @return The preference value if it exists, or defValue. Throws ClassCastException if there is a preference with
* this name that is not a long
*/
- public long getLong(Context context, String key, long defaultValue, String keyShared) {
+ public static long getLong(Context context, String key, long defaultValue, String keyShared) {
SharedPreferences settings = context.getSharedPreferences(keyShared, Context.MODE_PRIVATE);
try {
return settings.getLong(key, defaultValue);
@@ -214,13 +213,13 @@
/**
* put float preferences
- *
+ *
* @param context
* @param key The name of the preference to modify
* @param value The new value for the preference
* @return True if the new values were successfully written to persistent storage.
*/
- public boolean putFloat(Context context, String key, float value, String keyShared) {
+ public static boolean putFloat(Context context, String key, float value, String keyShared) {
SharedPreferences settings = context.getSharedPreferences(keyShared, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putFloat(key, value);
@@ -229,26 +228,26 @@
/**
* get float preferences
- *
+ *
* @param context
* @param key The name of the preference to retrieve
* @return The preference value if it exists, or -1. Throws ClassCastException if there is a preference with this
* name that is not a float
*/
- public float getFloat(Context context, String key, String keyShared) {
+ public static float getFloat(Context context, String key, String keyShared) {
return getFloat(context, key, -1,keyShared);
}
/**
* get float preferences
- *
+ *
* @param context
* @param key The name of the preference to retrieve
* @param defaultValue Value to return if this preference does not exist
* @return The preference value if it exists, or defValue. Throws ClassCastException if there is a preference with
* this name that is not a float
*/
- public float getFloat(Context context, String key, float defaultValue, String keyShared) {
+ public static float getFloat(Context context, String key, float defaultValue, String keyShared) {
SharedPreferences settings = context.getSharedPreferences(keyShared, Context.MODE_PRIVATE);
try {
return settings.getFloat(key, defaultValue);
@@ -263,13 +262,13 @@
/**
* put boolean preferences
- *
+ *
* @param context
* @param key The name of the preference to modify
* @param value The new value for the preference
* @return True if the new values were successfully written to persistent storage.
*/
- public boolean putBoolean(Context context, String key, boolean value, String keyShared) {
+ public static boolean putBoolean(Context context, String key, boolean value, String keyShared) {
SharedPreferences settings = context.getSharedPreferences(keyShared, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean(key, value);
@@ -278,26 +277,26 @@
/**
* get boolean preferences, default is false
- *
+ *
* @param context
* @param key The name of the preference to retrieve
* @return The preference value if it exists, or false. Throws ClassCastException if there is a preference with this
* name that is not a boolean
*/
- public boolean getBoolean(Context context, String key, String keyShared) {
+ public static boolean getBoolean(Context context, String key, String keyShared) {
return getBoolean(context, key, false,keyShared);
}
/**
* get boolean preferences
- *
+ *
* @param context
* @param key The name of the preference to retrieve
* @param defaultValue Value to return if this preference does not exist
* @return The preference value if it exists, or defValue. Throws ClassCastException if there is a preference with
* this name that is not a boolean
*/
- public boolean getBoolean(Context context, String key, boolean defaultValue, String keyShared) {
+ public static boolean getBoolean(Context context, String key, boolean defaultValue, String keyShared) {
SharedPreferences settings = context.getSharedPreferences(keyShared, Context.MODE_PRIVATE);
try {
return settings.getBoolean(key, defaultValue);
@@ -318,7 +317,7 @@
* @param value The new value for the preference , the value of set ,canot be the other class out of java collection
* @return True if the new values were successfully written to persistent storage.
*/
- public boolean putStringSet(Context context, String key, Set value, String keyShared) {
+ public static boolean putStringSet(Context context, String key, Set value, String keyShared) {
SharedPreferences settings = context.getSharedPreferences(keyShared, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putStringSet(key, value);
@@ -333,7 +332,7 @@
* @return The preference value if it exists, or false. Throws ClassCastException if there is a preference with this
* name that is not a boolean 获取出来的值最终被转换为hashset类型
*/
- public Set getStringSet(Context context, String key, String keyShared) {
+ public static Set getStringSet(Context context, String key, String keyShared) {
return getStringSet(context, key,new ArraySet(),keyShared);
}
@@ -346,131 +345,8 @@
* @return The preference value if it exists, or defValue. Throws ClassCastException if there is a preference with
* this name that is not a boolean 获取出来的值最终被转换为hashset类型
*/
- public Set getStringSet(Context context, String key, Set defaultValue, String keyShared) {
+ public static Set getStringSet(Context context, String key, Set defaultValue, String keyShared) {
SharedPreferences settings = context.getSharedPreferences(keyShared, Context.MODE_PRIVATE);
return settings.getStringSet(key, defaultValue);
}
-
- public boolean getBooleanValOfUser(Context context, String key){
- return getBoolean(context,key,false,USER);
- }
-
- public boolean getBooleanValOfProject(Context context, String key){
- return getBoolean(context,key,false,PROJECT);
- }
-
- public String getStringValOfUser(Context context, String key){
- return getString(context,key,"",USER);
- }
-
- public String getStringValOfProject(Context context, String key){
- return getString(context,key,"",PROJECT);
- }
-
- public int getIntValOfProject(Context context, String key){
- return getInt(context,key,0,PROJECT);
- }
-
- public Long getLongValOfProject(Context context, String key){
- return getLong(context,key,0,PROJECT);
- }
-
- public float getFloatValOfProject(Context context, String key){
- return getFloat(context,key,0,PROJECT);
- }
-
- public Set getStringSetValOfProject(Context context, String key){
- return getStringSet(context,key,PROJECT);
- }
-
- public int getIntValOfUser(Context context, String key){
- return getInt(context,key,0,USER);
- }
-
- public Long getLongValOfUser(Context context, String key){
- return getLong(context,key,0,USER);
- }
-
- public float getFloatValOfUser(Context context, String key){
- return getFloat(context,key,0,USER);
- }
-
- public Set getStringSetValOfUser(Context context, String key){
- return getStringSet(context,key,USER);
- }
-
-
- public void putBooleanValOfUser(Context context, String key ,Boolean value){
- putBoolean(context,key,value,USER);
- }
-
- public void putBooleanValOfProject(Context context, String key,Boolean value){
- putBoolean(context,key,value,PROJECT);
- }
-
- public void putStringValOfUser(Context context,String key,String value){
- putString(context,key,value,USER);
- }
-
- public void putStringValOfProject(Context context,String key,String value){
- putString(context,key,value,PROJECT);
- }
-
- public void putIntValOfProject(Context context,String key,int value){
- putInt(context,key,value,PROJECT);
- }
-
- public void putLongValOfProject(Context context,String key,long value){
- putLong(context,key,value,PROJECT);
- }
-
- public void putFloatValOfProject(Context context,String key,float value){
- putFloat(context,key,value,PROJECT);
- }
-
- public void putStringSetValOfProject(Context context,String key,Set value){
- putStringSet(context,key,value,PROJECT);
- }
-
- public void putIntValOfUser(Context context,String key,int value){
- putInt(context,key,value,USER);
- }
-
- public void putLongValOfUser(Context context,String key,long value){
- putLong(context,key,value,USER);
- }
-
- public void putFloatValOfUser(Context context,String key,float value){
- putFloat(context,key,value,USER);
- }
-
- public void putStringSetValOfUser(Context context,String key, Set value){
- putStringSet(context,key,value,USER);
- }
-
-
- public void removeUserKey(Context context, String key){
- removeKey(context,key,USER);
- }
-
- public void removeProjectKey(Context context, String key){
- removeKey(context,key,PROJECT);
- }
-
- public void removeUserValue(Context context, String Value){
- removeValue(context,Value,USER);
- }
-
- public void removeProjectValue(Context context, String Value){
- removeValue(context,Value,PROJECT);
- }
-
-
- public void clearProjectData(Context context){
- clearData(context,PROJECT);
- }
- public void clearUserData(Context context){
- clearData(context,USER);
- }
-
}
diff --git a/app/src/main/java/com/auto/lyric/util/SHA1UTIL.java b/app/src/main/java/com/auto/lyric/util/SHA1UTIL.java
new file mode 100644
index 0000000..2f9c5d7
--- /dev/null
+++ b/app/src/main/java/com/auto/lyric/util/SHA1UTIL.java
@@ -0,0 +1,64 @@
+package com.auto.lyric.util;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * Created by Runt (qingingrunt2010@qq.com) on 2022/5/29.
+ */
+public class SHA1UTIL {
+
+ public static String getSHA(String info) {
+ byte[] bytesSHA = null;
+ try {
+
+ MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
+
+ messageDigest.update(info.getBytes());
+
+ bytesSHA = messageDigest.digest();
+ } catch (NoSuchAlgorithmException e) {
+ e.printStackTrace();
+ }
+ String strSHA = byteToHex(bytesSHA);
+ return strSHA;
+ }
+
+
+ private static String byteToHex(byte[] bytes) {
+ String hs = "";
+ String temp;
+ for (byte b : bytes) {
+ temp = (Integer.toHexString(b & 0XFF));
+ if (temp.length() == 1) {
+ hs = hs + "0" + temp;
+ } else {
+ hs = hs + temp;
+ }
+ }
+ return hs;
+ }
+
+ /**
+ * MD5加密之方法二
+ * @explain java实现
+ * @param str
+ * 待加密字符串
+ * @return 16进制加密字符串
+ */
+ public static String MD5(String str) {
+ // 加密后的16进制字符串
+ String hexStr = "";
+ try {
+ // 此 MessageDigest 类为应用程序提供信息摘要算法的功能
+ MessageDigest md5 = MessageDigest.getInstance("MD5");
+ // 转换为MD5码
+ byte[] digest = md5.digest(str.getBytes("utf-8"));
+ hexStr = byteToHex(digest);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return hexStr;
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/auto/lyric/vm/MainViewModel.java b/app/src/main/java/com/auto/lyric/vm/MainViewModel.java
index 395a607..ad1aad3 100644
--- a/app/src/main/java/com/auto/lyric/vm/MainViewModel.java
+++ b/app/src/main/java/com/auto/lyric/vm/MainViewModel.java
@@ -1,9 +1,52 @@
package com.auto.lyric.vm;
import com.auto.lyric.base.model.BaseViewModel;
+import com.auto.lyric.data.ActiveResult;
+import com.auto.lyric.retrofit.api.CollectApiCenter;
+import com.auto.lyric.retrofit.observable.LoadingHttpObserver;
+import com.auto.lyric.retrofit.utils.RetrofitUtils;
+import com.auto.lyric.util.DeviceIdUtils;
+import com.auto.lyric.util.NetWorkUtils;
+import com.auto.lyric.util.SHA1UTIL;
+
+import java.util.Date;
+import java.util.UUID;
+
+import io.reactivex.Observable;
/**
* Created by Runt (qingingrunt2010@qq.com) on 2022/3/20.
*/
public class MainViewModel extends BaseViewModel {
+
+ CollectApiCenter apiCenter;
+
+ public MainViewModel(){
+ apiCenter = RetrofitUtils.getInstance().getRetrofit(CollectApiCenter.class);
+ }
+
+ public void checkActive(String activeKey,LoadingHttpObserver<ActiveResult> observer){
+ String ip = NetWorkUtils.getNetIp();
+ String random = UUID.randomUUID().toString();
+ long time = new Date().getTime()/1000;
+ int userId = 0;
+ String deviceId = DeviceIdUtils.getAndroidId(activity);
+ String sign = String.format("%s%s%s%s%s%s",activeKey,ip,deviceId ,random,time,userId);
+
+ Observable<ActiveResult> observable = apiCenter.register(activeKey, ip,deviceId, random, time, userId, SHA1UTIL.MD5(SHA1UTIL.getSHA(sign)));
+ httpObserverOn(observable,observer);
+ }
+
+ public void register(String activeKey,LoadingHttpObserver<ActiveResult> observer){
+ String ip = NetWorkUtils.getNetIp();
+ String random = UUID.randomUUID().toString();
+ long time = new Date().getTime()/1000;
+ int userId = 0;
+ String deviceId = DeviceIdUtils.getAndroidId(activity);
+ String sign = String.format("%s%s%s%s%s%s",activeKey,ip,deviceId ,random,time,userId);
+
+ Observable<ActiveResult> observable = apiCenter.register(activeKey, ip,deviceId, random, time, userId, SHA1UTIL.MD5(SHA1UTIL.getSHA(sign)));
+ httpObserverOn(observable,observer);
+ }
+
}
diff --git a/app/src/main/res/drawable-v21/bg_white_divider.xml b/app/src/main/res/drawable-v21/bg_white_divider.xml
new file mode 100644
index 0000000..8c3f482
--- /dev/null
+++ b/app/src/main/res/drawable-v21/bg_white_divider.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+ android:color="@color/color_gray">
+ <item>
+ <selector>
+ <item android:state_pressed="true">
+ <shape android:shape="rectangle">
+ <solid android:color="@color/gray_pressed" />
+ </shape>
+ </item>
+
+ <item android:state_enabled="false">
+ <shape android:shape="rectangle">
+ <solid android:color="@color/cut_off_line" />
+ </shape>
+ </item>
+
+ <item>
+ <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <!-- 主体背景颜色值 -->
+ <item >
+ <shape>
+ <solid android:color="@color/white"/>
+ </shape>
+ </item>
+ <!-- 连框颜色值 -->
+ <item android:height="1dp" android:gravity="bottom">
+ <shape>
+ <solid android:color="@color/black"/>
+ </shape>
+ </item>
+ </layer-list>
+ </item>
+
+ </selector>
+ </item>
+
+</ripple>
diff --git a/app/src/main/res/layout/activity_collect.xml b/app/src/main/res/layout/activity_collect.xml
new file mode 100644
index 0000000..d1772ef
--- /dev/null
+++ b/app/src/main/res/layout/activity_collect.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
+
+ <com.auto.lyric.widgets.TitleBarView
+ android:id="@+id/titlebar"
+ android:layout_width="match_parent"
+ android:layout_height="50dp"
+ android:background="@color/black"
+ app:titleTextColor="@color/white"
+ app:titleText="标题"
+ app:leftDrawable="@mipmap/icon_white_back"
+ android:paddingLeft="20dp"
+ app:layout_constraintLeft_toLeftOf="parent"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintRight_toRightOf="parent" />
+
+ <include layout="@layout/refresh_recycler"
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ app:layout_constraintTop_toBottomOf="@id/titlebar"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintLeft_toLeftOf="parent"
+ app:layout_constraintRight_toRightOf="parent"/>
+
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 5fb776e..0362135 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -27,30 +27,58 @@
android:layout_height="wrap_content"
android:text="确认"
android:layout_margin="10dp"
- app:layout_constraintBottom_toBottomOf="@id/edit"
+ app:layout_constraintTop_toBottomOf="@id/edit"
app:layout_constraintRight_toRightOf="@id/edit"/>
+
+ <androidx.appcompat.widget.AppCompatButton
+ android:id="@+id/clear"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="清空"
+ android:layout_margin="10dp"
+ app:layout_constraintRight_toLeftOf="@id/button"
+ app:layout_constraintTop_toBottomOf="@id/edit" />
+
+ <androidx.appcompat.widget.AppCompatButton
+ android:id="@+id/collect"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="收藏"
+ android:layout_margin="10dp"
+ app:layout_constraintRight_toLeftOf="@id/clear"
+ app:layout_constraintTop_toBottomOf="@id/edit" />
+
+ <androidx.appcompat.widget.AppCompatButton
+ android:id="@+id/save"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="保存"
+ android:layout_margin="10dp"
+ app:layout_constraintRight_toLeftOf="@id/collect"
+ app:layout_constraintLeft_toLeftOf="@id/edit"
+ app:layout_constraintTop_toBottomOf="@id/edit" />
<TextView
android:id="@+id/txt_local"
android:layout_width="match_parent"
- android:layout_height="40dp"
+ android:layout_height="50dp"
android:text="本地歌词"
android:gravity="center_vertical"
android:paddingLeft="16dp"
android:textSize="16sp"
- android:background="@drawable/bg_white"
- app:layout_constraintTop_toBottomOf="@id/edit"
+ android:background="@drawable/bg_white_divider"
+ app:layout_constraintTop_toBottomOf="@id/save"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toLeftOf="parent"/>
<TextView
android:id="@+id/txt_favorite"
android:layout_width="match_parent"
- android:layout_height="40dp"
+ android:layout_height="50dp"
android:text="我的收藏"
android:gravity="center_vertical"
android:paddingLeft="16dp"
android:textSize="16sp"
- android:background="@drawable/bg_white"
+ android:background="@drawable/bg_white_divider"
app:layout_constraintTop_toBottomOf="@id/txt_local"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toLeftOf="parent"/>
@@ -59,12 +87,12 @@
<TextView
android:id="@+id/txt_setting"
android:layout_width="match_parent"
- android:layout_height="40dp"
+ android:layout_height="50dp"
android:text="设置"
android:gravity="center_vertical"
android:paddingLeft="16dp"
android:textSize="16sp"
- android:background="@drawable/bg_white"
+ android:background="@drawable/bg_white_divider"
app:layout_constraintTop_toBottomOf="@id/txt_favorite"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toLeftOf="parent"/>
diff --git a/app/src/main/res/mipmap-xhdpi/icon_white_back.png b/app/src/main/res/mipmap-xhdpi/icon_white_back.png
new file mode 100644
index 0000000..8f3faab
--- /dev/null
+++ b/app/src/main/res/mipmap-xhdpi/icon_white_back.png
Binary files differ
diff --git a/app/src/main/res/mipmap-xxhdpi/icon_white_back.png b/app/src/main/res/mipmap-xxhdpi/icon_white_back.png
new file mode 100644
index 0000000..7d82e4c
--- /dev/null
+++ b/app/src/main/res/mipmap-xxhdpi/icon_white_back.png
Binary files differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/icon_white_back.png b/app/src/main/res/mipmap-xxxhdpi/icon_white_back.png
new file mode 100644
index 0000000..f982292
--- /dev/null
+++ b/app/src/main/res/mipmap-xxxhdpi/icon_white_back.png
Binary files differ
--
Gitblit v1.9.1