11 files modified
1 files added
| | |
| | | <category android:name="android.intent.category.LAUNCHER" /> |
| | | </intent-filter> |
| | | </activity> |
| | | <activity android:name=".ui.collect.CollectActivity" /> |
| | | <service |
| | | android:name=".service.AutoInputService" |
| | | android:enabled="true" |
| | |
| | | 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.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; |
| | | |
| | |
| | | |
| | | 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; |
| | | } |
| | | }); |
| | | } |
| | |
| | | //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() { |
| | |
| | | return false; |
| | | } |
| | | |
| | | private void addCollectDailog(String userId,String activeKey,String lrc ){ |
| | | |
| | | showInputDialog("收藏歌词","填写歌词名称","收藏","取消",(dialog1,editText, which) -> { |
| | | viewModel.addToCollect(userId, activeKey, editText.getText().toString(), lrc, new LoadingHttpObserver<ActiveResult>(this) { |
| | | @Override |
| | | public void onComplete(ActiveResult error) { |
| | | |
| | | } |
| | | }); |
| | | },(dialog1,editText, which) -> {}); |
| | | } |
| | | |
| | | 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) -> { |
| | | showInputDialog("软件尚未激活或已过期", "请输入激活码", "激活", "退出程序", (dialog1,editText, which) -> { |
| | | viewModel.register(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) { |
| | | 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(); |
| | | } |
| | | |
| | | } |
| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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 |
| | |
| | | |
| | | 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; |
| | |
| | | .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); |
| | | } |
| | | |
| | | |
| | | } |
| | |
| | | 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; |
| | | |
| | |
| | | */ |
| | | @FormUrlEncoded |
| | | @POST("index.php?route=lrc/favorites/getFavoritesList") |
| | | Observable<CollectListResult> getCollectList(); |
| | | Observable<CollectListResult> getCollectList(@FieldMap Map<String,String> obj); |
| | | |
| | | /** |
| | | * 歌词详情 |
| | |
| | | * @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); |
| | | |
| | | } |
New file |
| | |
| | | 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; |
| | | } |
| | |
| | | |
| | | 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. |
| | |
| | | |
| | | @Override |
| | | public void initViews() { |
| | | viewModel.getLrcList(new LoadingHttpObserver<CollectListResult>(this) { |
| | | @Override |
| | | public void onComplete(CollectListResult error) { |
| | | |
| | | } |
| | | }); |
| | | } |
| | | } |
| | |
| | | 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); |
| | | } |
| | | |
| | | } |
| | |
| | | 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; |
| | | |
| | |
| | | } |
| | | |
| | | 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); |
| | | } |
| | | |
| | | } |
| | |
| | | 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" |
| | |
| | | <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"/> |
| | |
| | | <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> |
| | |
| | | <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> |