Runt
2022-06-04 a046d5a804d6842796a718fba4e98c3259340a60
接口参数问题
标题栏
添加收藏功能
11 files modified
1 files added
230 ■■■■■ changed files
app/src/main/AndroidManifest.xml 1 ●●●● patch | view | raw | blame | history
app/src/main/java/com/auto/lyric/MainActivity.java 59 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/auto/lyric/base/activities/BaseActivity.java 41 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/auto/lyric/base/model/BaseViewModel.java 22 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/auto/lyric/retrofit/api/CollectApiCenter.java 27 ●●●● patch | view | raw | blame | history
app/src/main/java/com/auto/lyric/retrofit/api/FieldData.java 10 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/auto/lyric/ui/collect/CollectActivity.java 6 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/auto/lyric/ui/collect/CollectViewModel.java 21 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/auto/lyric/vm/MainViewModel.java 35 ●●●●● patch | view | raw | blame | history
app/src/main/res/layout/activity_collect.xml 4 ●●●● patch | view | raw | blame | history
app/src/main/res/values-night/themes.xml 2 ●●● patch | view | raw | blame | history
app/src/main/res/values/themes.xml 2 ●●● patch | view | raw | blame | history
app/src/main/AndroidManifest.xml
@@ -44,6 +44,7 @@
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".ui.collect.CollectActivity" />
        <service
            android:name=".service.AutoInputService"
            android:enabled="true"
app/src/main/java/com/auto/lyric/MainActivity.java
@@ -6,12 +6,7 @@
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;
@@ -22,7 +17,7 @@
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.ui.collect.CollectActivity;
import com.auto.lyric.vm.MainViewModel;
import com.google.gson.Gson;
@@ -35,27 +30,31 @@
public class MainActivity extends BaseActivity<ActivityMainBinding, MainViewModel> {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    UserInfo userInfo;
    @Override
    public void initViews() {
        Intent floatService  = new Intent(getApplicationContext(), FloatingWindowService.class);
        String key = getStringProjectPrefrence("activeKey");
        UserInfo result = new Gson().fromJson(key,UserInfo.class);
        userInfo = new Gson().fromJson(key,UserInfo.class);
        try {
            if(TextUtils.isEmpty(key) || TextUtils.isEmpty(result.keyDateValid)||
                    new Date().getTime() > dateFormat.parse(result.keyDateValid).getTime()){
            if(TextUtils.isEmpty(key) || TextUtils.isEmpty(userInfo.keyDateValid)||
                    new Date().getTime() > dateFormat.parse(userInfo.keyDateValid).getTime()){
                activeDialog();
            }else{
                viewModel.checkActive(result.userId,result.activeKey,new LoadingHttpObserver<ActiveResult>(this) {
                viewModel.checkActive(userInfo.userId,userInfo.activeKey,new LoadingHttpObserver<ActiveResult>(this) {
                    @Override
                    public void onError(ActiveResult error) {
                        super.onError(error);
                        if(error.result.equals("108")){
                            activeDialog();
                        }
                    }
                    @Override
                    public void onComplete(ActiveResult result) {
                        userInfo = result.userInfo;
                    }
                });
            }
@@ -113,6 +112,8 @@
                //startService(floatService);
            }
        });
        binding.collect.setOnClickListener(v -> addCollectDailog(userInfo.userId,userInfo.activeKey,binding.edit.getText().toString()));
        binding.txtFavorite.setOnClickListener(v -> startActivity(new Intent(mContext, CollectActivity.class)));
    }
    public boolean isAccessibilitySettingsOn() {
@@ -153,39 +154,31 @@
        return false;
    }
    private void addCollectDailog(String userId,String activeKey,String lrc ){
    private void activeDialog(){
        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.register(editText.getText().toString().trim(),new LoadingHttpObserver<ActiveResult>(this) {
        showInputDialog("收藏歌词","填写歌词名称","收藏","取消",(dialog1,editText, which) -> {
            viewModel.addToCollect(userId, activeKey, editText.getText().toString(), lrc, new LoadingHttpObserver<ActiveResult>(this) {
                @Override
                public void onError(ActiveResult error) {
                    super.onError(error);
                    dialg.show();
                public void onComplete(ActiveResult error) {
                }
            });
        },(dialog1,editText, which) -> {});
                }
    private void activeDialog(){
        showInputDialog("软件尚未激活或已过期", "请输入激活码", "激活", "退出程序", (dialog1,editText, which) -> {
            viewModel.register(editText.getText().toString().trim(),new LoadingHttpObserver<ActiveResult>(this) {
                @Override
                public void onComplete(ActiveResult result) {
                    dialog1.dismiss();
                    userInfo = result.userInfo;
                    putStringProjectPrefrence("activeKey",new Gson().toJson(result.userInfo));
                }
            });
        });
        dialg.setButton(AlertDialog.BUTTON_POSITIVE,"退出程序",(dialog,which) ->{
        }, (dialog1,editText, which) -> {
            System.exit(0);
        });
        dialg.show();
    }
}
app/src/main/java/com/auto/lyric/base/activities/BaseActivity.java
@@ -10,9 +10,11 @@
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Toast;
import androidx.annotation.ColorRes;
@@ -25,6 +27,7 @@
import com.auto.lyric.R;
import com.auto.lyric.base.model.BaseViewModel;
import com.auto.lyric.base.model.ViewModelFactory;
import com.auto.lyric.util.DeviceUtil;
import com.auto.lyric.util.PreferencesUtils;
import java.io.File;
@@ -271,6 +274,44 @@
    }
    /**
     * inputdialog
     * @param title         标题文本
     * @param hint          提示文本
     * @param confirm       确认文本
     * @param cancle        取消文本
     * @param confirmClick  确认事件
     * @param cancleClick   取消事件
     * @return
     */
    public void showInputDialog(String title, String hint, String confirm, String cancle, InputDialogClick confirmClick, InputDialogClick cancleClick){
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle(title);
        EditText editText = new EditText(this);
        editText.setHint(hint);
        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.setCanceledOnTouchOutside(false);
        dialg.setCancelable(false);
        dialg.setButton(AlertDialog.BUTTON_NEGATIVE, confirm, (dialog, which) -> {
            confirmClick.onClick(dialg,editText,which);
        });
        dialg.setButton(AlertDialog.BUTTON_POSITIVE,cancle,(dialog, which) -> {
            cancleClick.onClick(dialg,editText,which);
        });
        dialg.show();
    }
    protected interface InputDialogClick{
        void onClick(AlertDialog dialog,EditText editText,int whitch);
    }
    /**
     * 获取文件保存路径 sdcard根目录/download/文件名称
     * @param fileUrl
     * @return
app/src/main/java/com/auto/lyric/base/model/BaseViewModel.java
@@ -4,7 +4,16 @@
import com.auto.lyric.base.activities.BaseActivity;
import com.auto.lyric.retrofit.AndroidScheduler;
import com.auto.lyric.retrofit.api.FieldData;
import com.auto.lyric.retrofit.observable.HttpObserver;
import com.auto.lyric.util.DeviceIdUtils;
import com.auto.lyric.util.NetWorkUtils;
import com.auto.lyric.util.SHA1UTIL;
import com.google.gson.Gson;
import java.util.Date;
import java.util.Map;
import java.util.UUID;
import io.reactivex.Observable;
import io.reactivex.schedulers.Schedulers;
@@ -32,6 +41,19 @@
                .subscribe(observer);
    }
    public Map getApiFileds(String userId,String activeKey){
        FieldData data = new FieldData();
        data.userID = userId;
        data.ip = NetWorkUtils.getNetIp();
        data.random = UUID.randomUUID().toString();
        data.timeStamp = new Date().getTime()/1000+"";
        data.phoneID = DeviceIdUtils.getAndroidId(activity);
        data.activeKey = activeKey;
        String sign = String.format("%s%s%s%s%s%s",activeKey,data.ip,data.phoneID ,data.random,data.timeStamp,userId);
        data.sign = SHA1UTIL.MD5(SHA1UTIL.getSHA(sign));
        Gson gson = new Gson();
        return gson.fromJson(gson.toJson(data), Map.class);
    }
}
app/src/main/java/com/auto/lyric/retrofit/api/CollectApiCenter.java
@@ -3,8 +3,11 @@
import com.auto.lyric.data.ActiveResult;
import com.auto.lyric.ui.collect.CollectListResult;
import java.util.Map;
import io.reactivex.Observable;
import retrofit2.http.Field;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;
@@ -20,7 +23,7 @@
     */
    @FormUrlEncoded
    @POST("index.php?route=lrc/favorites/getFavoritesList")
    Observable<CollectListResult> getCollectList();
    Observable<CollectListResult> getCollectList(@FieldMap Map<String,String> obj);
    /**
     * 歌词详情
@@ -43,37 +46,23 @@
     * @return
     */
    @FormUrlEncoded
    @POST("index.php?route=lrc/favorites/delLrc")
    Observable<CollectListResult> addLrcToCollect(@Field("lrc_title") String lrc_title,@Field("lrc_text") String lrc_text);
    @POST("index.php?route=lrc/favorites/addLrc")
    Observable<CollectListResult> addLrcToCollect(@Field("lrc_title") String lrc_title,@Field("lrc_text") String lrc_text,@FieldMap Map<String,String> obj);
    /**
     * 激活软件
     * @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("phoneID") String phoneID, @Field("random") String random,
                                        @Field("timeStamp") long time, @Field("userID") String userId, @Field("sign") String sign);
    Observable<ActiveResult> loginCheck(@FieldMap Map<String,String> obj);
    /**
     * 激活软件
     * @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);
    Observable<ActiveResult> register(@FieldMap Map<String,String> obj);
}
app/src/main/java/com/auto/lyric/retrofit/api/FieldData.java
New file
@@ -0,0 +1,10 @@
package com.auto.lyric.retrofit.api;
/**
 * 接口请求数据
 * Created by Runt (qingingrunt2010@qq.com) on 2022/6/4.
 */
public class FieldData {
    public String activeKey, ip, phoneID, random, sign;
    public String timeStamp , userID;
}
app/src/main/java/com/auto/lyric/ui/collect/CollectActivity.java
@@ -2,6 +2,7 @@
import com.auto.lyric.base.activities.BaseTitleBarActivity;
import com.auto.lyric.databinding.ActivityCollectBinding;
import com.auto.lyric.retrofit.observable.LoadingHttpObserver;
/**
 * Created by Runt (qingingrunt2010@qq.com) on 2022/5/29.
@@ -11,6 +12,11 @@
    @Override
    public void initViews() {
        viewModel.getLrcList(new LoadingHttpObserver<CollectListResult>(this) {
            @Override
            public void onComplete(CollectListResult error) {
    }
        });
    }
}
app/src/main/java/com/auto/lyric/ui/collect/CollectViewModel.java
@@ -1,15 +1,34 @@
package com.auto.lyric.ui.collect;
import com.auto.lyric.base.activities.BaseActivity;
import com.auto.lyric.base.model.BaseViewModel;
import com.auto.lyric.data.UserInfo;
import com.auto.lyric.retrofit.api.CollectApiCenter;
import com.auto.lyric.retrofit.observable.LoadingHttpObserver;
import com.auto.lyric.retrofit.utils.RetrofitUtils;
import com.google.gson.Gson;
/**
 * Created by Runt (qingingrunt2010@qq.com) on 2022/5/29.
 */
public class CollectViewModel extends BaseViewModel {
    public void getLrcList(LoadingHttpObserver<CollectListResult> observer){
    CollectApiCenter apiCenter;
    UserInfo userInfo;
    public CollectViewModel(){
        apiCenter = RetrofitUtils.getInstance().getRetrofit(CollectApiCenter.class);
    }
    @Override
    public void onCreate(BaseActivity activity) {
        super.onCreate(activity);
        String key = activity.getStringProjectPrefrence("activeKey");
        userInfo = new Gson().fromJson(key,UserInfo.class);
    }
    public void getLrcList(LoadingHttpObserver<CollectListResult> observer){
        httpObserverOn(apiCenter.getCollectList(getApiFileds(userInfo.userId,userInfo.activeKey)),observer);
    }
}
app/src/main/java/com/auto/lyric/vm/MainViewModel.java
@@ -5,12 +5,6 @@
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;
@@ -26,26 +20,25 @@
    }
    public void checkActive(String userId,String activeKey,LoadingHttpObserver<ActiveResult> observer){
        String ip = NetWorkUtils.getNetIp();
        String random = UUID.randomUUID().toString();
        long time = new Date().getTime()/1000;
        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.loginCheck(activeKey, ip,deviceId, random, time, userId, SHA1UTIL.MD5(SHA1UTIL.getSHA(sign)));
        Observable<ActiveResult> observable = apiCenter.loginCheck(getApiFileds(userId,activeKey));
        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)));
        Observable<ActiveResult> observable = apiCenter.register(getApiFileds("0",activeKey));
        httpObserverOn(observable,observer);
    }
    /**
     *
     * @param userId
     * @param activeKey
     * @param title         歌词标题
     * @param lrc           歌词内容
     * @param observer
     */
    public void addToCollect(String userId,String activeKey,String title,String lrc,LoadingHttpObserver<ActiveResult> observer){
        httpObserverOn(apiCenter.addLrcToCollect(title,lrc,getApiFileds(userId,activeKey)),observer);
    }
}
app/src/main/res/layout/activity_collect.xml
@@ -6,7 +6,7 @@
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <com.auto.lyric.widgets.TitleBarView
        android:id="@+id/titlebar"
        android:id="@+id/titleBar"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="@color/black"
@@ -21,7 +21,7 @@
    <include layout="@layout/refresh_recycler"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintTop_toBottomOf="@id/titlebar"
        app:layout_constraintTop_toBottomOf="@id/titleBar"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"/>
app/src/main/res/values-night/themes.xml
@@ -1,6 +1,6 @@
<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.AutoLyric" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
    <style name="Theme.AutoLyric" parent="Theme.AppCompat.DayNight.NoActionBar">
        <!-- Primary brand color. -->
        <item name="colorPrimary">@color/white</item>
        <item name="colorPrimaryVariant">@color/color_gray</item>
app/src/main/res/values/themes.xml
@@ -1,6 +1,6 @@
<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.AutoLyric" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
    <style name="Theme.AutoLyric" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Primary brand color. -->
        <item name="colorPrimary">@color/black</item>
        <item name="colorPrimaryVariant">@color/gray_normal</item>