diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 8d9d4c6..fc08a5d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,10 +1,14 @@ +import java.util.Date +import java.text.SimpleDateFormat plugins { id("com.android.application") // id("org.jetbrains.kotlin.android") // id ("kotlin-kapt") id("io.objectbox") + id("com.google.gms.google-services") + id("com.google.firebase.crashlytics") } - +val timestamp = SimpleDateFormat("MM_dd_HH_mm").format(Date()) android { namespace = "com.hi.music.player" compileSdk = 34 @@ -16,13 +20,13 @@ android { targetSdk = 34 versionCode = 1 versionName = "1.0.0" - + setProperty("archivesBaseName", "MusicApp_V" + versionName + "(${versionCode})_$timestamp") testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { - isMinifyEnabled = false + isMinifyEnabled = true proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" @@ -38,6 +42,7 @@ android { } buildFeatures { viewBinding = true + buildConfig = true } } @@ -85,4 +90,11 @@ dependencies { // implementation ("com.geyifeng.immersionbar:immersionbar:3.2.2") // implementation ("com.geyifeng.immersionbar:immersionbar-components:3.2.2") + + + //------------------firebase + implementation(platform("com.google.firebase:firebase-bom:33.1.1")) + implementation("com.google.firebase:firebase-crashlytics") + implementation("com.google.firebase:firebase-analytics") + implementation("com.google.firebase:firebase-config") } \ No newline at end of file diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..63b1faa --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,29 @@ +{ + "project_info": { + "project_number": "550960818622", + "project_id": "himelody-and", + "storage_bucket": "himelody-and.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:550960818622:android:96fd4141e43410fb24f1ef", + "android_client_info": { + "package_name": "com.hi.music.player.test" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyCp3XR60onMqiGj9pD8ADmrDEOOn__sQDk" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 481bb43..de1b277 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -18,4 +18,12 @@ # If you keep the line number information, uncomment this to # hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file +#-renamesourcefileattribute SourceFile + +# Retrofit 和 OkHttp 的混淆规则 +-dontwarn okhttp3.** +-dontwarn okio.** +-keep class okhttp3.** { *; } +-keep class retrofit2.** { *; } +-dontwarn retrofit2.** +-dontwarn javax.annotation.Nullable \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5ddf8e3..e4f72e1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -25,18 +25,23 @@ tools:targetApi="31"> + android:screenOrientation="portrait" + android:exported="false"> + + + - pair:status){ if(pair.second.equals(videoId)){ diff --git a/app/src/main/java/com/hi/music/player/firebase/RemoteConfig.kt b/app/src/main/java/com/hi/music/player/firebase/RemoteConfig.kt new file mode 100644 index 0000000..08a6aba --- /dev/null +++ b/app/src/main/java/com/hi/music/player/firebase/RemoteConfig.kt @@ -0,0 +1,151 @@ +package com.hi.music.player.firebase + +import android.annotation.SuppressLint +import android.app.Application +import android.content.Context +import android.os.Handler +import android.os.Looper +import android.os.Message +import android.text.TextUtils +import android.util.Log +import com.google.firebase.remoteconfig.ConfigUpdate +import com.google.firebase.remoteconfig.ConfigUpdateListener +import com.google.firebase.remoteconfig.FirebaseRemoteConfig +import com.google.firebase.remoteconfig.FirebaseRemoteConfigException +import com.google.firebase.remoteconfig.FirebaseRemoteConfigSettings +import com.google.firebase.remoteconfig.FirebaseRemoteConfigValue +import com.hi.music.player.BuildConfig +import com.hi.music.player.helper.CommonUtils + + +import java.lang.ref.WeakReference + + +class RemoteConfig { + + private var ctx: Context? = null + private var mFirebaseRemoteConfig: FirebaseRemoteConfig? = null + + //配置是否初始化成功 + private var isInit = false + + //上次获取数据的时间 + private var lastFetchTime: Long = 0 + private val handler = MHandler(this) + + + companion object { + + const val key_open_type = "TYPE" + + //进入A面 + const val value_open_type_0 = "0" + //进入B面 + const val value_open_type_1 = "1" + + + const val MSG_REFRESH_CONFIG = 1 + val instance: RemoteConfig by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { + RemoteConfig() + } + } + + fun init(ctx: Application) { + this.ctx = ctx + initConfig() + fetchConfig() + onConfigUpdate() + } + + private fun initConfig() { + var intervalTime = (60 * 10).toLong() + //如果是开发状态,则将提取时间缩短 + if (BuildConfig.DEBUG) { + intervalTime = (60 * 5).toLong() + } + mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance() + val configSettings = + FirebaseRemoteConfigSettings.Builder() //默认值12小时的最短提取间隔,如果在间隔内取值,则优先取上次的结果 + .setMinimumFetchIntervalInSeconds(intervalTime).build() + mFirebaseRemoteConfig!!.setConfigSettingsAsync(configSettings) + } + + private fun onConfigUpdate() { + mFirebaseRemoteConfig!!.addOnConfigUpdateListener(object : ConfigUpdateListener { + override fun onUpdate(configUpdate: ConfigUpdate) { + + CommonUtils.LogMsg("Updated keys: " + configUpdate.updatedKeys) + try { + mFirebaseRemoteConfig!!.activate().addOnCompleteListener { task -> + if (task.isSuccessful) { + updateData("onConfigUpdate", mFirebaseRemoteConfig!!.all) + } + } + } catch (ignore: Exception) { + } + } + + override fun onError(error: FirebaseRemoteConfigException) { + CommonUtils.LogMsg("Config update error with code: " + error.code) + } + }) + } + + private fun fetchConfig() { + //这里可能会抛出异常 FirebaseRemoteConfigFetchThrottledException + try { + mFirebaseRemoteConfig!!.fetchAndActivate().addOnCompleteListener { task -> + if (task.isSuccessful) { + isInit = true + lastFetchTime = System.currentTimeMillis() + updateData("fetchAndActivate", mFirebaseRemoteConfig!!.all) + //24小时后,重新再去获取 + handler.removeMessages(MSG_REFRESH_CONFIG) + handler.sendEmptyMessageDelayed( + MSG_REFRESH_CONFIG, (1000 * 60 * 60 * 24).toLong() + ) + } else { + //15分钟后重新再去获取 + handler.removeMessages(MSG_REFRESH_CONFIG) + handler.sendEmptyMessageDelayed(MSG_REFRESH_CONFIG, (1000 * 60 * 15).toLong()) + } + } + } catch (ignore: Exception) { + } + } + + private fun updateData(from: String, all: Map) { + for ((key, value) in all) { + try { + CommonUtils.LogMsg( "from = " + from + "Key = " + key + " Value = " + value.asString() + ) + if (TextUtils.equals(key_open_type, key)) { + Sp.getInstance() + .putStringValue(key_open_type, value.asString()).commit() + } + + } catch (ignore: Exception) { + + } + } + } + + private class MHandler(remoteConfig: RemoteConfig) : Handler(Looper.getMainLooper()) { + private val weakReference: WeakReference + + init { + weakReference = WeakReference(remoteConfig) + } + + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val remoteConfig = weakReference.get() + if (remoteConfig?.ctx != null) { + if (msg.what == MSG_REFRESH_CONFIG) { + remoteConfig.fetchConfig() + } + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/hi/music/player/firebase/RemoteConfigJava.java b/app/src/main/java/com/hi/music/player/firebase/RemoteConfigJava.java new file mode 100644 index 0000000..c2ea2ac --- /dev/null +++ b/app/src/main/java/com/hi/music/player/firebase/RemoteConfigJava.java @@ -0,0 +1,167 @@ +package com.hi.music.player.firebase; + +import android.content.Context; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.text.TextUtils; + +import androidx.annotation.NonNull; + +import com.google.android.gms.tasks.OnCompleteListener; +import com.google.android.gms.tasks.Task; +import com.google.firebase.BuildConfig; +import com.google.firebase.remoteconfig.ConfigUpdate; +import com.google.firebase.remoteconfig.ConfigUpdateListener; +import com.google.firebase.remoteconfig.FirebaseRemoteConfig; +import com.google.firebase.remoteconfig.FirebaseRemoteConfigException; +import com.google.firebase.remoteconfig.FirebaseRemoteConfigSettings; +import com.google.firebase.remoteconfig.FirebaseRemoteConfigValue; +import com.hi.music.player.helper.CommonUtils; + +import java.lang.ref.WeakReference; +import java.util.Map; + +public class RemoteConfigJava { + + private static RemoteConfigJava remoteConfigJava; + public static String key_open_type = "TYPE"; + + //进入A面 + public static String value_open_type_0 = "0"; + //进入B面 + public static String value_open_type_1 = "1"; + + + private static int MSG_REFRESH_CONFIG = 1; + + + private Context ctx; + private FirebaseRemoteConfig mFirebaseRemoteConfig; + + //配置是否初始化成功 + private boolean isInit = false; + + //上次获取数据的时间 + private long lastFetchTime = 0; + private MHandler handler = new MHandler(this); + + + private Context getCtx() { + return ctx; + } + + public static RemoteConfigJava getInstance(){ + if(remoteConfigJava == null){ + remoteConfigJava = new RemoteConfigJava(); + } + return remoteConfigJava; + } + private static class MHandler extends Handler { + private WeakReference weakReference; + + + public MHandler(RemoteConfigJava remoteConfig) { + super(Looper.getMainLooper()); + weakReference = new WeakReference<>(remoteConfig); + } + + @Override + public void handleMessage(@NonNull Message msg) { + super.handleMessage(msg); + + RemoteConfigJava remoteConfig1 = weakReference.get(); + if (remoteConfig1.getCtx() != null) { + if (msg.what == MSG_REFRESH_CONFIG) { + remoteConfig1.fetchConfig(); + } + } + } + } + + public void init(Context context) { + this.ctx = context; + initConfig(); + fetchConfig(); + onConfigUpdate(); + } + + private void initConfig() { + long intervalTime = 60L * 10L; + //如果是开发状态,则将提取时间缩短 + if (BuildConfig.DEBUG) { + intervalTime = 60L * 5L; + } + mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance(); + FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder() //默认值12小时的最短提取间隔,如果在间隔内取值,则优先取上次的结果 + .setMinimumFetchIntervalInSeconds(intervalTime).build(); + mFirebaseRemoteConfig.setConfigSettingsAsync(configSettings); + } + + private void onConfigUpdate() { + mFirebaseRemoteConfig.addOnConfigUpdateListener(new ConfigUpdateListener() { + @Override + public void onUpdate(@NonNull ConfigUpdate configUpdate) { + CommonUtils.LogMsg("Updated keys: " + configUpdate.getUpdatedKeys()); + try { + mFirebaseRemoteConfig.activate().addOnCompleteListener(new OnCompleteListener() { + @Override + public void onComplete(@NonNull Task task) { + if (task.isSuccessful()) { + updateData("onConfigUpdate", mFirebaseRemoteConfig.getAll()); + } + } + }); + } catch (Exception ignore) { + CommonUtils.LogErrorMsg("onConfigUpdate Exception " + ignore.getMessage()); + } + } + + @Override + public void onError(@NonNull FirebaseRemoteConfigException error) { + CommonUtils.LogErrorMsg("onConfigUpdate onError " + error.getMessage()); + } + }); + } + + private void fetchConfig() { + //这里可能会抛出异常 FirebaseRemoteConfigFetchThrottledException + try { + mFirebaseRemoteConfig.fetchAndActivate().addOnCompleteListener(new OnCompleteListener() { + @Override + public void onComplete(@NonNull Task task) { + if (task.isSuccessful()) { + isInit = true; + lastFetchTime = System.currentTimeMillis(); + updateData("fetchAndActivate", mFirebaseRemoteConfig.getAll()); + //24小时后,重新再去获取 + handler.removeMessages(MSG_REFRESH_CONFIG); + handler.sendEmptyMessageDelayed( + MSG_REFRESH_CONFIG, 1000 * 60 * 60 * 24L); + } else { + //15分钟后重新再去获取 + handler.removeMessages(MSG_REFRESH_CONFIG); + handler.sendEmptyMessageDelayed(MSG_REFRESH_CONFIG, 1000 * 60 * 15L); + } + + } + }); + } catch (Exception exception) { + CommonUtils.LogErrorMsg(" exception = " + exception.getMessage()); + } + } + + + private void updateData(String from, Map all) { + for (Map.Entry entry : all.entrySet()) { + FirebaseRemoteConfigValue value = entry.getValue(); + String key = entry.getKey(); + CommonUtils.LogMsg("from = " + from + "Key = " + key + " Value = " + value.asString()); + + if (TextUtils.equals(key_open_type, key)) { + Sp.getInstance() + .putStringValue(key_open_type, value.asString()).commit(); + } + } + } +} diff --git a/app/src/main/java/com/hi/music/player/firebase/Sp.java b/app/src/main/java/com/hi/music/player/firebase/Sp.java new file mode 100644 index 0000000..c0662eb --- /dev/null +++ b/app/src/main/java/com/hi/music/player/firebase/Sp.java @@ -0,0 +1,44 @@ +package com.hi.music.player.firebase; + +import android.content.Context; +import android.content.SharedPreferences; + + + +public class Sp { + + private static String spName = "AD_SHOW"; + private static Sp instance; + private SharedPreferences.Editor editor; + + private SharedPreferences preferences; + + private Sp(Context context) { + preferences = context.getSharedPreferences(spName, Context.MODE_PRIVATE); + editor = preferences.edit(); + + } + + + public static void init(Context context){ + instance = new Sp(context); + } + + public static Sp getInstance() { + return instance; + } + + + public Sp putStringValue(String key, String value) { + editor.putString(key, value); + return this; + } + + public boolean commit() { + return editor.commit(); + } + + public String getStringValue(String key) { + return preferences.getString(key, RemoteConfigJava.value_open_type_1); + } +} diff --git a/app/src/main/java/com/hi/music/player/network/JsonHelper.java b/app/src/main/java/com/hi/music/player/network/JsonHelper.java index d9c30a2..efbd2ca 100644 --- a/app/src/main/java/com/hi/music/player/network/JsonHelper.java +++ b/app/src/main/java/com/hi/music/player/network/JsonHelper.java @@ -496,15 +496,6 @@ public class JsonHelper { playCount = getJsonTitle(text, 0); } -// JSONArray runs = text.getJSONArray("runs"); -// for (int g = 0; g < runs.length(); g++) { -// JSONObject jsonObject1 = runs.getJSONObject(g); -// String[] browser = getBrowser(jsonObject1); -// if (browser != null) { -// browserId = browser[0]; -// pageType = browser[1]; -// } -// } } boolean b = videoId == null || videoId.isEmpty(); @@ -716,6 +707,8 @@ public class JsonHelper { .getJSONObject("musicResponsiveListItemFlexColumnRenderer") .getJSONObject("text"); String text = getJsonTitle(jsonObjectText, 0); + + CommonUtils.LogMsg("---------g=" + g + "---text="+text); if (g == 0) { SongTitle = text; @@ -733,8 +726,12 @@ public class JsonHelper { listInfo.setMusicVideoType(watchEndPoint[3]); } - if (g == 1) SingerName = text; - if (g == 2) Description = text; + if (g == 1){ + SingerName = text; + } + if (g == 2) { + Description = text; + } } listInfo.setDescribe(Description); listInfo.setDuration(textTime); @@ -810,7 +807,9 @@ public class JsonHelper { responseSingle.setMusicVideoType(watchEndPoint[3]); } - if (g == 1) SingerName = text; + if (g == 1) { + SingerName = text; + } if (g == 2) { //这里应该没有值 Description = text; diff --git a/app/src/main/java/com/hi/music/player/ui/activity/A_SplashActivity.java b/app/src/main/java/com/hi/music/player/ui/activity/A_SplashActivity.java index b7bb82b..8f435f8 100644 --- a/app/src/main/java/com/hi/music/player/ui/activity/A_SplashActivity.java +++ b/app/src/main/java/com/hi/music/player/ui/activity/A_SplashActivity.java @@ -5,6 +5,8 @@ import android.os.CountDownTimer; import android.view.View; import com.hi.music.player.databinding.ActivityAsplashBinding; +import com.hi.music.player.firebase.RemoteConfigJava; +import com.hi.music.player.firebase.Sp; public class A_SplashActivity extends BaseActivity { @@ -60,9 +62,7 @@ public class A_SplashActivity extends BaseActivity { @Override public void onFinish() { vb.progressBar.setProgress(100); - Intent intent = new Intent(A_SplashActivity.this, A_HomeActivity.class); - startActivity(intent); - finish(); + enterHome(); } }; @@ -74,4 +74,17 @@ public class A_SplashActivity extends BaseActivity { public void onClick(View v) { } + + private void enterHome(){ + String stringValue = Sp.getInstance().getStringValue(RemoteConfigJava.key_open_type); + Intent intent; + if(stringValue.equals(RemoteConfigJava.value_open_type_0)){ + intent = new Intent(A_SplashActivity.this, A_HomeActivity.class); + }else { + intent = new Intent(A_SplashActivity.this, HomeActivity.class); + } + startActivity(intent); + finish(); + + } } \ No newline at end of file diff --git a/app/src/main/java/com/hi/music/player/ui/activity/CategoryListActivity.java b/app/src/main/java/com/hi/music/player/ui/activity/CategoryListActivity.java index ea11627..cec1af3 100644 --- a/app/src/main/java/com/hi/music/player/ui/activity/CategoryListActivity.java +++ b/app/src/main/java/com/hi/music/player/ui/activity/CategoryListActivity.java @@ -206,7 +206,7 @@ public class CategoryListActivity extends BaseActivity() { diff --git a/app/src/main/java/com/hi/music/player/ui/activity/LikeSongActivity.java b/app/src/main/java/com/hi/music/player/ui/activity/LikeSongActivity.java index 4b594f3..3425e08 100644 --- a/app/src/main/java/com/hi/music/player/ui/activity/LikeSongActivity.java +++ b/app/src/main/java/com/hi/music/player/ui/activity/LikeSongActivity.java @@ -111,7 +111,7 @@ public class LikeSongActivity extends BaseActivity impl @Override public boolean showPanel() { - return false; + return true; } @Override diff --git a/app/src/main/java/com/hi/music/player/ui/activity/ResultListActivity.java b/app/src/main/java/com/hi/music/player/ui/activity/ResultListActivity.java index d4aa873..9d95fb3 100644 --- a/app/src/main/java/com/hi/music/player/ui/activity/ResultListActivity.java +++ b/app/src/main/java/com/hi/music/player/ui/activity/ResultListActivity.java @@ -31,6 +31,7 @@ import com.hi.music.player.ui.fragmnt.viewmodel.VMResultList; public class ResultListActivity extends BaseActivity implements HomeItemClickListener { private VMResultList vm; + private String key; @Override protected ActivityResultListBinding getViewBinding() { @@ -40,23 +41,25 @@ public class ResultListActivity extends BaseActivity @Override protected void onCreateInit() { vm = getActivityScopeViewModel(VMResultList.class); - String key = getIntent().getStringExtra(MyValue.KEY_SEARCH_RESULT_BROWSER_ID); + key = getIntent().getStringExtra(MyValue.KEY_SEARCH_RESULT_BROWSER_ID); vm.getList(key); vm.data.observe(this, new Observer() { @Override public void onChanged(ResponseResult responseResult) { - if(responseResult == null){ - + vb.pbLoading.setVisibility(View.GONE); + if (responseResult == null) { + vb.layoutError.linearRetry.setVisibility(View.VISIBLE); return; } + vb.pbLoading.setVisibility(View.GONE); loadInfo(responseResult); } }); } - private void loadInfo(ResponseResult result){ + private void loadInfo(ResponseResult result) { Glide.with(this) .asDrawable() .load(result.getMainCovert()) @@ -86,6 +89,7 @@ public class ResultListActivity extends BaseActivity @Override protected void onInitClick() { vb.imBack.setOnClickListener(this); + vb.layoutError.tvRetry.setOnClickListener(this); } @Override @@ -105,14 +109,16 @@ public class ResultListActivity extends BaseActivity @Override public void onClick(View v) { - if(v.equals(vb.imBack)){ + if (v.equals(vb.imBack)) { finish(); + } else if (v.equals(vb.layoutError.tvRetry)) { + vm.getList(key); } } @Override - public void onClickResultSong(ResponseResultListChild child,int index) { + public void onClickResultSong(ResponseResultListChild child, int index) { String videoId = child.getVideoId(); String playListId = child.getPlayListId(); String browserId = child.getBrowserId(); @@ -121,7 +127,7 @@ public class ResultListActivity extends BaseActivity String songName = child.getSongName(); String subTitle = child.getSubTitle(); - if(videoId!= null&&!videoId.isEmpty()){ + if (videoId != null && !videoId.isEmpty()) { ResponseSingle responseSingle = new ResponseSingle(); responseSingle.setSongTitle(songName); responseSingle.setSingerHead(thumbnail); @@ -129,14 +135,14 @@ public class ResultListActivity extends BaseActivity responseSingle.setPlaylistId(playListId); Intent intent = new Intent(this, PlayActivity.class); intent.putExtra(MyValue.KEY_PLAY_ACTIVITY_SINGER, responseSingle); - intent.putExtra(MyValue.KEY_PLAY_ACTIVITY_CATEGORY_LIST_INDEX,index); - CommonUtils.LogMsg("-------------index="+index); + intent.putExtra(MyValue.KEY_PLAY_ACTIVITY_CATEGORY_LIST_INDEX, index); + CommonUtils.LogMsg("-------------index=" + index); startActivity(intent); - }else { - switch (pageType){ + } else { + switch (pageType) { case "MUSIC_PAGE_TYPE_ALBUM": //专辑 - CommonUtils.LogMsg("------------专辑-index="+index+"--subTitle="+subTitle); + CommonUtils.LogMsg("------------专辑-index=" + index + "--subTitle=" + subTitle); case "MUSIC_PAGE_TYPE_PLAYLIST": //精选 Intent intent1 = new Intent(this, CategoryListActivity.class); @@ -158,7 +164,6 @@ public class ResultListActivity extends BaseActivity } - } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_category_list.xml b/app/src/main/res/layout/activity_category_list.xml index 86404f6..7bdbaa3 100644 --- a/app/src/main/res/layout/activity_category_list.xml +++ b/app/src/main/res/layout/activity_category_list.xml @@ -38,17 +38,26 @@ android:layout_height="wrap_content" android:layout_marginTop="77dp"> - + + + + + android:layout_gravity="center" + android:layout_marginBottom="80dp" /> diff --git a/app/src/main/res/layout/activity_like_song.xml b/app/src/main/res/layout/activity_like_song.xml index fc7d440..15ff86b 100644 --- a/app/src/main/res/layout/activity_like_song.xml +++ b/app/src/main/res/layout/activity_like_song.xml @@ -36,7 +36,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="15dp" - android:layout_marginTop="40dp" + android:layout_marginTop="20dp" android:text="@string/like_song" android:textColor="@color/white" android:textSize="17sp" @@ -46,8 +46,11 @@ diff --git a/app/src/main/res/layout/activity_play.xml b/app/src/main/res/layout/activity_play.xml index 9e16f0a..73fe61a 100644 --- a/app/src/main/res/layout/activity_play.xml +++ b/app/src/main/res/layout/activity_play.xml @@ -1,303 +1,307 @@ - - - + + tools:context=".ui.activity.PlayActivity"> - - - - - - - - + android:layout_height="match_parent" + android:background="@drawable/black_gradient" /> - + + + + - + app:layout_constraintTop_toBottomOf="@id/im_back"> + - + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - + android:background="@drawable/bg_like_layout" + android:orientation="horizontal" + android:paddingStart="22dp" + android:paddingEnd="22dp" + app:layout_constraintLeft_toRightOf="@id/layout_like" + app:layout_constraintTop_toTopOf="@id/layout_like"> - + + + + + + + + - + - + - + - + - + - + - + - + - + - + - \ No newline at end of file + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_result_list.xml b/app/src/main/res/layout/activity_result_list.xml index 1425267..6c41e37 100644 --- a/app/src/main/res/layout/activity_result_list.xml +++ b/app/src/main/res/layout/activity_result_list.xml @@ -3,8 +3,9 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="wrap_content" + android:layout_height="match_parent" android:background="@color/black" + android:fillViewport="true" tools:context=".ui.activity.ResultListActivity"> - - - - + android:layout_height="280dp" + app:layout_constraintTop_toTopOf="parent"> - - + - + + + + + + android:orientation="vertical" + app:layout_constraintTop_toTopOf="parent"> + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_profile.xml b/app/src/main/res/layout/fragment_profile.xml index 9742f61..ca87d63 100644 --- a/app/src/main/res/layout/fragment_profile.xml +++ b/app/src/main/res/layout/fragment_profile.xml @@ -33,6 +33,7 @@ android:layout_width="40dp" android:layout_height="40dp" android:layout_margin="16dp" + android:visibility="gone" android:src="@drawable/ic_launcher_background" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -68,6 +69,14 @@ android:layout_height="match_parent" android:scaleType="centerCrop" /> + + + + @@ -134,6 +145,14 @@ android:layout_centerInParent="true" android:scaleType="centerCrop" /> + + @@ -66,6 +68,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/app_name" + android:maxLines="1" + android:ellipsize="end" android:textColor="@color/white_60_color" android:textSize="12sp" /> diff --git a/app/src/main/res/layout/item_like_song.xml b/app/src/main/res/layout/item_like_song.xml index b7a946c..9a79e03 100644 --- a/app/src/main/res/layout/item_like_song.xml +++ b/app/src/main/res/layout/item_like_song.xml @@ -2,9 +2,8 @@ + android:layout_height="wrap_content" + android:layout_marginTop="16dp"> @@ -37,7 +38,9 @@ android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="@string/like_song" + android:text="@string/app_name" + android:maxLines="1" + android:ellipsize="end" android:textColor="@color/white" android:textSize="14sp" /> @@ -46,21 +49,23 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" - android:text="@string/like_song" + android:text="@string/app_name" + android:maxLines="1" + android:ellipsize="end" android:textColor="@color/white_60_color" android:textSize="12sp" /> + app:layout_constraintTop_toTopOf="@id/card"> + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_panel.xml b/app/src/main/res/layout/layout_panel.xml index 09d0661..1850f7e 100644 --- a/app/src/main/res/layout/layout_panel.xml +++ b/app/src/main/res/layout/layout_panel.xml @@ -51,6 +51,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/app_name" + android:ellipsize="end" + android:maxLines="1" android:textColor="@color/panel_singer_color" android:textSize="12sp" /> diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 134ff9d..fe26dae 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -27,4 +27,6 @@ #B9D1A6 #26FFFFFF #339ED3A2 + + #B3000000 \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 564f71e..f0ca203 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,6 +2,11 @@ plugins { id("com.android.application") version "8.1.3" apply false // id("org.jetbrains.kotlin.android") version "1.9.22" apply false + + + id("com.google.gms.google-services") version "4.3.15" apply false + id ("com.google.firebase.crashlytics") version "2.9.2" apply false + } buildscript {