From 549a487148522fa4a459967cd6546e22a315ae52 Mon Sep 17 00:00:00 2001
From: Runt <qingingrunt2010@qq.com>
Date: Mon, 26 Dec 2022 15:17:52 +0000
Subject: [PATCH] 上传歌词

---
 app/src/main/java/com/auto/lyric/MainActivity.java                  |   46 ++++++++++++++-
 app/src/main/java/com/auto/lyric/base/model/BaseViewModel.java      |   11 +++
 app/src/main/java/com/auto/lyric/vm/MainViewModel.java              |   17 +++++
 app/src/main/res/layout/activity_main.xml                           |    1 
 app/src/main/java/com/auto/lyric/base/activities/BaseActivity.java  |   52 +++++++++++++++++
 app/build.gradle                                                    |    4 
 app/src/main/java/com/auto/lyric/retrofit/api/CollectApiCenter.java |   13 ++++
 7 files changed, 137 insertions(+), 7 deletions(-)

diff --git a/app/build.gradle b/app/build.gradle
index 947103f..6a19aa5 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -7,7 +7,7 @@
 
     defaultConfig {
         applicationId "com.auto.lyric"
-        minSdk 21
+        minSdk 22
         targetSdk 31
         versionCode 1
         versionName "1.0"
@@ -47,7 +47,7 @@
 
 dependencies {
 
-    implementation 'androidx.appcompat:appcompat:1.2.0'
+    implementation 'androidx.appcompat:appcompat:1.3.1'
     implementation 'com.google.android.material:material:1.3.0'
     implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
     implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.1'
diff --git a/app/src/main/java/com/auto/lyric/MainActivity.java b/app/src/main/java/com/auto/lyric/MainActivity.java
index 8bed626..ece5151 100644
--- a/app/src/main/java/com/auto/lyric/MainActivity.java
+++ b/app/src/main/java/com/auto/lyric/MainActivity.java
@@ -1,12 +1,17 @@
 package com.auto.lyric;
 
+import android.Manifest;
 import android.content.Intent;
 import android.net.Uri;
 import android.os.Build;
+import android.os.Environment;
 import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.Log;
 import android.widget.Toast;
+
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.contract.ActivityResultContracts;
 
 import com.auto.lyric.base.activities.BaseActivity;
 import com.auto.lyric.data.ActiveResult;
@@ -21,11 +26,11 @@
 import com.auto.lyric.vm.MainViewModel;
 import com.google.gson.Gson;
 
+import java.io.File;
 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> {
@@ -33,9 +38,33 @@
     UserInfo userInfo;
     @Override
     public void initViews() {
+        //选择文件
+        ActivityResultLauncher fileLauncher = registerForActivityResult(new ActivityResultContracts.OpenDocument(), result -> {
+            Log.e(TAG,"result:"+result+" "+(result == null?"":result.getPath()));
+            if(result != null && result.getPath().indexOf(".lrc") == result.getPath().length()-4) {
+                Log.e(TAG,"getRootDirectory:"+" "+Environment.getExternalStorageDirectory());
+                String path = Environment.getExternalStorageDirectory()+"/"+result.getPath().split(":")[1];
+
+                viewModel.uploadFile(userInfo.userId,userInfo.activeKey,new File(path));
+            }else{
+                showDialog("文件格式错误", "请选择标准的歌词文件", (dialog, which) -> {
+                    dialog.dismiss();
+                });
+            }
+        });
+        //单个权限申请
+        ActivityResultLauncher singlePermission = registerForActivityResult(new ActivityResultContracts.RequestPermission(), result -> {
+            if(result){
+                fileLauncher.launch(new String[]{"*/*"});
+            }else{
+                showDialog("权限申请", "没有文件读取权限", (dialog, which) -> {
+                    dialog.dismiss();
+                });
+            }
+        });
         Intent floatService  = new Intent(getApplicationContext(), FloatingWindowService.class);
         String key = getStringProjectPrefrence("activeKey");
-        userInfo = new Gson().fromJson(key,UserInfo.class);
+        /*userInfo = new Gson().fromJson(key,UserInfo.class);
         try {
             if(TextUtils.isEmpty(key) || TextUtils.isEmpty(userInfo.keyDateValid)||
                     new Date().getTime() > dateFormat.parse(userInfo.keyDateValid).getTime()){
@@ -60,8 +89,8 @@
             }
         } catch (ParseException e) {
             e.printStackTrace();
-        }
-
+        }*/
+        //确认
         binding.button.setOnClickListener(v -> {
 
             if(binding.edit.getText().toString().trim().length() == 0){
@@ -112,7 +141,16 @@
                 //startService(floatService);
             }
         });
+        //收藏
         binding.collect.setOnClickListener(v -> addCollectDailog(userInfo.userId,userInfo.activeKey,binding.edit.getText().toString()));
+        //清空
+        binding.clear.setOnClickListener(v -> binding.edit.setText(""));
+        //保存本地
+        binding.save.setOnClickListener(v -> {});
+        binding.txtLocal.setOnClickListener(v -> {
+            singlePermission.launch(Manifest.permission.READ_EXTERNAL_STORAGE);//读取文件权限
+        });
+        //收藏夹
         binding.txtFavorite.setOnClickListener(v -> startActivity(new Intent(mContext, CollectActivity.class)));
     }
 
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 d4dfaff..4f072c1 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
@@ -3,6 +3,7 @@
 import android.Manifest;
 import android.app.AlertDialog;
 import android.content.Context;
+import android.content.DialogInterface;
 import android.content.pm.ActivityInfo;
 import android.os.Build;
 import android.os.Bundle;
@@ -273,6 +274,12 @@
         showToast(getString(msg));
     }
 
+    public void showInputDialog(String title, String hint, InputDialogClick confirmClick){
+        showInputDialog(title,hint,"确认",confirmClick);
+    }
+    public void showInputDialog(String title, String hint, String confirm,InputDialogClick confirmClick){
+        showInputDialog(title,hint,confirm,"取消",confirmClick,null);
+    }
     /**
      * inputdialog
      * @param title         标题文本
@@ -302,7 +309,11 @@
             confirmClick.onClick(dialg,editText,which);
         });
         dialg.setButton(AlertDialog.BUTTON_POSITIVE,cancle,(dialog, which) -> {
-            cancleClick.onClick(dialg,editText,which);
+            if(cancleClick != null) {
+                cancleClick.onClick(dialg, editText, which);
+            }else{
+                dialg.dismiss();
+            }
         });
         dialg.show();
     }
@@ -311,6 +322,45 @@
         void onClick(AlertDialog dialog,EditText editText,int whitch);
     }
 
+
+    public void showDialog(String title, String hint, DialogInterface.OnClickListener  confirmClick){
+        showDialog(title,hint,"确认",confirmClick);
+    }
+    public void showDialog(String title, String hint, String confirm,DialogInterface.OnClickListener  confirmClick){
+        showDialog(title,hint,confirm,"取消",confirmClick,null);
+    }
+    /**
+     * inputdialog
+     * @param title         标题文本
+     * @param hint          提示文本
+     * @param confirm       确认文本
+     * @param cancle        取消文本
+     * @param confirmClick  确认事件
+     * @param cancleClick   取消事件
+     * @return
+     */
+    public void showDialog(String title, String hint, String confirm, String cancle, DialogInterface.OnClickListener confirmClick, DialogInterface.OnClickListener cancleClick){
+        AlertDialog.Builder builder = new AlertDialog.Builder(this);
+        builder.setTitle(title);
+        builder.setMessage(hint);
+        builder.setCancelable(false);
+        AlertDialog dialg = builder.create();
+        dialg.setCanceledOnTouchOutside(false);
+        dialg.setCancelable(false);
+        dialg.setButton(AlertDialog.BUTTON_NEGATIVE, confirm, (dialog, which) -> {
+            confirmClick.onClick(dialg,which);
+        });
+        dialg.setButton(AlertDialog.BUTTON_POSITIVE,cancle,(dialog, which) -> {
+            if(cancleClick != null) {
+                cancleClick.onClick(dialg, which);
+            }else{
+                dialg.dismiss();
+            }
+        });
+        dialg.show();
+    }
+
+
     /**
      * 获取文件保存路径 sdcard根目录/download/文件名称
      * @param fileUrl
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 90a0797..a511ae5 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
@@ -12,11 +12,13 @@
 import com.google.gson.Gson;
 
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
 
 import io.reactivex.Observable;
 import io.reactivex.schedulers.Schedulers;
+import okhttp3.RequestBody;
 
 /**
  * Created by Administrator on 2021/11/11 0011.
@@ -55,5 +57,14 @@
         return gson.fromJson(gson.toJson(data), Map.class);
     }
 
+    public Map<String, RequestBody> getApiMultiFileds(String userId, String activeKey){
+        Map<String,String> fileds = getApiFileds(userId,activeKey);
+        Map<String, RequestBody> multiMap = new HashMap<>();
+        for(String key : fileds.keySet()){
+            multiMap.put(key,RequestBody.create(fileds.get(key),null));
+        }
+        return multiMap;
+    }
+
 
 }
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
index 04c4eba..0c5f3d9 100644
--- a/app/src/main/java/com/auto/lyric/retrofit/api/CollectApiCenter.java
+++ b/app/src/main/java/com/auto/lyric/retrofit/api/CollectApiCenter.java
@@ -6,10 +6,15 @@
 import java.util.Map;
 
 import io.reactivex.Observable;
+import okhttp3.MultipartBody;
+import okhttp3.RequestBody;
 import retrofit2.http.Field;
 import retrofit2.http.FieldMap;
 import retrofit2.http.FormUrlEncoded;
+import retrofit2.http.Multipart;
 import retrofit2.http.POST;
+import retrofit2.http.Part;
+import retrofit2.http.PartMap;
 
 /**
  * Created by Runt (qingingrunt2010@qq.com) on 2022/5/29.
@@ -50,6 +55,14 @@
     Observable<CollectListResult> addLrcToCollect(@Field("lrc_title") String lrc_title,@Field("lrc_text") String lrc_text,@FieldMap Map<String,String> obj);
 
     /**
+     * 上传歌词
+     * @return
+     */
+    @Multipart
+    @POST("index.php?route=lrc/krc2lrc")
+    Observable<ActiveResult> uploadLrc(@Part MultipartBody.Part file, @PartMap() Map<String, RequestBody> obj);
+
+    /**
      * 激活软件
      * @return
      */
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 4e3ec42..d646f38 100644
--- a/app/src/main/java/com/auto/lyric/vm/MainViewModel.java
+++ b/app/src/main/java/com/auto/lyric/vm/MainViewModel.java
@@ -6,7 +6,12 @@
 import com.auto.lyric.retrofit.observable.LoadingHttpObserver;
 import com.auto.lyric.retrofit.utils.RetrofitUtils;
 
+import java.io.File;
+
 import io.reactivex.Observable;
+import okhttp3.MediaType;
+import okhttp3.MultipartBody;
+import okhttp3.RequestBody;
 
 /**
  * Created by Runt (qingingrunt2010@qq.com) on 2022/3/20.
@@ -29,6 +34,18 @@
         httpObserverOn(observable,observer);
     }
 
+    public void uploadFile(String userId,String activeKey,File file){
+        RequestBody body = RequestBody.create(MediaType.parse("text/plain; charset=utf-8"),file);
+        MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), body);
+        httpObserverOn(apiCenter.uploadLrc(part, getApiMultiFileds(userId, activeKey)), new LoadingHttpObserver<ActiveResult>(activity) {
+            @Override
+            public void onComplete(ActiveResult error) {
+
+            }
+
+        });
+    }
+
     /**
      *
      * @param userId
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 0362135..865aef9 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -53,6 +53,7 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="保存"
+        android:visibility="invisible"
         android:layout_margin="10dp"
         app:layout_constraintRight_toLeftOf="@id/collect"
         app:layout_constraintLeft_toLeftOf="@id/edit"

--
Gitblit v1.9.1