diff --git a/app/src/main/java/org/sopt/official/feature/navigator/NavigatorProviderIntent.kt b/app/src/main/java/org/sopt/official/feature/navigator/NavigatorProviderIntent.kt index c0ce58b88..2879ce8ae 100644 --- a/app/src/main/java/org/sopt/official/feature/navigator/NavigatorProviderIntent.kt +++ b/app/src/main/java/org/sopt/official/feature/navigator/NavigatorProviderIntent.kt @@ -33,6 +33,7 @@ import org.sopt.official.common.navigator.DeepLinkType import org.sopt.official.common.navigator.NavigatorProvider import org.sopt.official.feature.attendance.AttendanceActivity import org.sopt.official.feature.auth.AuthActivity +import org.sopt.official.feature.fortune.FortuneActivity import org.sopt.official.feature.home.HomeActivity import org.sopt.official.feature.mypage.mypage.MyPageActivity import org.sopt.official.feature.notification.SchemeActivity @@ -43,48 +44,50 @@ import org.sopt.official.stamp.SoptampActivity import javax.inject.Inject class NavigatorProviderIntent @Inject constructor( - @ApplicationContext private val context: Context + @ApplicationContext private val context: Context, ) : NavigatorProvider { - override fun getAuthActivityIntent(): Intent = AuthActivity.newInstance(context) - override fun getNotificationActivityIntent() = NotificationActivity.newInstance(context) - override fun getNotificationDetailActivityIntent(notificationId: String) = NotificationDetailActivity.getIntent( - context, - notificationId - ) + override fun getAuthActivityIntent(): Intent = AuthActivity.newInstance(context) + override fun getNotificationActivityIntent() = NotificationActivity.newInstance(context) + override fun getNotificationDetailActivityIntent(notificationId: String) = NotificationDetailActivity.getIntent( + context, + notificationId + ) + + override fun getMyPageActivityIntent(name: String) = MyPageActivity.getIntent( + context, + MyPageActivity.StartArgs(UserActiveState.valueOf(name)) + ) - override fun getMyPageActivityIntent(name: String) = MyPageActivity.getIntent( - context, - MyPageActivity.StartArgs(UserActiveState.valueOf(name)) - ) + override fun getAttendanceActivityIntent() = AttendanceActivity.newInstance(context) - override fun getAttendanceActivityIntent() = AttendanceActivity.newInstance(context) + override fun getSoptampActivityIntent() = SoptampActivity.getIntent(context) - override fun getSoptampActivityIntent() = SoptampActivity.getIntent(context) + override fun getPokeNotificationActivityIntent(name: String) = PokeNotificationActivity.getIntent( + context, + PokeNotificationActivity.Argument(name) + ) - override fun getPokeNotificationActivityIntent(name: String) = PokeNotificationActivity.getIntent( - context, - PokeNotificationActivity.Argument(name) - ) + override fun getFortuneActivityIntent(): Intent = FortuneActivity.getIntent(context) - override fun getSchemeActivityIntent( - notificationId: String, - link: String - ) = SchemeActivity.getIntent( - context, - SchemeActivity.Argument( - notificationId, - link + override fun getSchemeActivityIntent( + notificationId: String, + link: String, + ) = SchemeActivity.getIntent( + context, + SchemeActivity.Argument( + notificationId, + link + ) ) - ) - override fun getHomeActivityIntent( - userStatus: UserStatus, - deepLinkType: DeepLinkType? - ) = HomeActivity.getIntent( - context, - HomeActivity.StartArgs( - userStatus, - deepLinkType + override fun getHomeActivityIntent( + userStatus: UserStatus, + deepLinkType: DeepLinkType?, + ) = HomeActivity.getIntent( + context, + HomeActivity.StartArgs( + userStatus, + deepLinkType + ) ) - ) } diff --git a/app/src/release/generated/baselineProfiles/baseline-prof.txt b/app/src/release/generated/baselineProfiles/baseline-prof.txt index a5df04ead..67e0f2505 100644 --- a/app/src/release/generated/baselineProfiles/baseline-prof.txt +++ b/app/src/release/generated/baselineProfiles/baseline-prof.txt @@ -1060,7 +1060,6 @@ Landroidx/core/provider/FontProvider$ContentQueryWrapper; HSPLandroidx/core/provider/FontProvider$ContentQueryWrapper;->make(Landroid/content/Context;Landroid/net/Uri;)Landroidx/core/provider/FontProvider$ContentQueryWrapper; Landroidx/core/provider/FontProvider$ContentQueryWrapperApi24Impl; HSPLandroidx/core/provider/FontProvider$ContentQueryWrapperApi24Impl;->(Landroid/content/Context;Landroid/net/Uri;)V -HSPLandroidx/core/provider/FontProvider$ContentQueryWrapperApi24Impl;->close()V HSPLandroidx/core/provider/FontProvider$ContentQueryWrapperApi24Impl;->query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor; Landroidx/core/provider/FontRequest; HSPLandroidx/core/provider/FontRequest;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V @@ -1073,13 +1072,9 @@ Landroidx/core/provider/FontsContractCompat; HSPLandroidx/core/provider/FontsContractCompat;->buildTypeface(Landroid/content/Context;Landroid/os/CancellationSignal;[Landroidx/core/provider/FontsContractCompat$FontInfo;)Landroid/graphics/Typeface; HSPLandroidx/core/provider/FontsContractCompat;->fetchFonts(Landroid/content/Context;Landroid/os/CancellationSignal;Landroidx/core/provider/FontRequest;)Landroidx/core/provider/FontsContractCompat$FontFamilyResult; Landroidx/core/provider/FontsContractCompat$FontFamilyResult; -HSPLandroidx/core/provider/FontsContractCompat$FontFamilyResult;->(I[Landroidx/core/provider/FontsContractCompat$FontInfo;)V -HSPLandroidx/core/provider/FontsContractCompat$FontFamilyResult;->create(I[Landroidx/core/provider/FontsContractCompat$FontInfo;)Landroidx/core/provider/FontsContractCompat$FontFamilyResult; HSPLandroidx/core/provider/FontsContractCompat$FontFamilyResult;->getFonts()[Landroidx/core/provider/FontsContractCompat$FontInfo; HSPLandroidx/core/provider/FontsContractCompat$FontFamilyResult;->getStatusCode()I Landroidx/core/provider/FontsContractCompat$FontInfo; -HSPLandroidx/core/provider/FontsContractCompat$FontInfo;->(Landroid/net/Uri;IIZI)V -HSPLandroidx/core/provider/FontsContractCompat$FontInfo;->create(Landroid/net/Uri;IIZI)Landroidx/core/provider/FontsContractCompat$FontInfo; HSPLandroidx/core/provider/FontsContractCompat$FontInfo;->getResultCode()I HSPLandroidx/core/provider/FontsContractCompat$FontInfo;->getTtcIndex()I HSPLandroidx/core/provider/FontsContractCompat$FontInfo;->getUri()Landroid/net/Uri; @@ -2679,8 +2674,6 @@ PLandroidx/profileinstaller/ProfileVerifier;->setCompilationStatus(IZZZ)Landroid PLandroidx/profileinstaller/ProfileVerifier;->writeProfileVerification(Landroid/content/Context;Z)Landroidx/profileinstaller/ProfileVerifier$CompilationStatus; PLandroidx/profileinstaller/ProfileVerifier$Api33Impl;->getPackageInfo(Landroid/content/pm/PackageManager;Landroid/content/Context;)Landroid/content/pm/PackageInfo; PLandroidx/profileinstaller/ProfileVerifier$Cache;->(IIJJ)V -PLandroidx/profileinstaller/ProfileVerifier$Cache;->equals(Ljava/lang/Object;)Z -PLandroidx/profileinstaller/ProfileVerifier$Cache;->readFromFile(Ljava/io/File;)Landroidx/profileinstaller/ProfileVerifier$Cache; PLandroidx/profileinstaller/ProfileVerifier$Cache;->writeOnFile(Ljava/io/File;)V PLandroidx/profileinstaller/ProfileVerifier$CompilationStatus;->(IZZZ)V Landroidx/savedstate/R$id; @@ -3404,12 +3397,11 @@ HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSch HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoScheduler;->schedule(Lcom/google/android/datatransport/runtime/TransportContext;I)V HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoScheduler;->schedule(Lcom/google/android/datatransport/runtime/TransportContext;IZ)V Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSchedulerService; -HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSchedulerService;->()V -HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSchedulerService;->lambda$onStartJob$0$com-google-android-datatransport-runtime-scheduling-jobscheduling-JobInfoSchedulerService(Landroid/app/job/JobParameters;)V -HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSchedulerService;->onStartJob(Landroid/app/job/JobParameters;)Z -Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSchedulerService$$ExternalSyntheticLambda0; -HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSchedulerService$$ExternalSyntheticLambda0;->(Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSchedulerService;Landroid/app/job/JobParameters;)V -HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSchedulerService$$ExternalSyntheticLambda0;->run()V +PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSchedulerService;->()V +PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSchedulerService;->lambda$onStartJob$0$com-google-android-datatransport-runtime-scheduling-jobscheduling-JobInfoSchedulerService(Landroid/app/job/JobParameters;)V +PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSchedulerService;->onStartJob(Landroid/app/job/JobParameters;)Z +PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSchedulerService$$ExternalSyntheticLambda0;->(Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSchedulerService;Landroid/app/job/JobParameters;)V +PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSchedulerService$$ExternalSyntheticLambda0;->run()V Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/SchedulerConfig; HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/SchedulerConfig;->()V HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/SchedulerConfig;->adjustedExponentialBackoff(IJ)J @@ -3436,24 +3428,22 @@ HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/SchedulerC Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader; HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->(Landroid/content/Context;Lcom/google/android/datatransport/runtime/backends/BackendRegistry;Lcom/google/android/datatransport/runtime/scheduling/persistence/EventStore;Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/WorkScheduler;Ljava/util/concurrent/Executor;Lcom/google/android/datatransport/runtime/synchronization/SynchronizationGuard;Lcom/google/android/datatransport/runtime/time/Clock;Lcom/google/android/datatransport/runtime/time/Clock;Lcom/google/android/datatransport/runtime/scheduling/persistence/ClientHealthMetricsStore;)V HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->createMetricsEvent(Lcom/google/android/datatransport/runtime/backends/TransportBackend;)Lcom/google/android/datatransport/runtime/EventInternal; -HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->isNetworkAvailable()Z +PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->isNetworkAvailable()Z HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->lambda$logAndUpdateState$2$com-google-android-datatransport-runtime-scheduling-jobscheduling-Uploader(Lcom/google/android/datatransport/runtime/TransportContext;)Ljava/lang/Boolean; HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->lambda$logAndUpdateState$3$com-google-android-datatransport-runtime-scheduling-jobscheduling-Uploader(Lcom/google/android/datatransport/runtime/TransportContext;)Ljava/lang/Iterable; HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->lambda$logAndUpdateState$5$com-google-android-datatransport-runtime-scheduling-jobscheduling-Uploader(Ljava/lang/Iterable;)Ljava/lang/Object; HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->lambda$logAndUpdateState$6$com-google-android-datatransport-runtime-scheduling-jobscheduling-Uploader()Ljava/lang/Object; HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->lambda$logAndUpdateState$8$com-google-android-datatransport-runtime-scheduling-jobscheduling-Uploader(Lcom/google/android/datatransport/runtime/TransportContext;J)Ljava/lang/Object; -HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->lambda$upload$1$com-google-android-datatransport-runtime-scheduling-jobscheduling-Uploader(Lcom/google/android/datatransport/runtime/TransportContext;ILjava/lang/Runnable;)V +PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->lambda$upload$1$com-google-android-datatransport-runtime-scheduling-jobscheduling-Uploader(Lcom/google/android/datatransport/runtime/TransportContext;ILjava/lang/Runnable;)V HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->logAndUpdateState(Lcom/google/android/datatransport/runtime/TransportContext;I)Lcom/google/android/datatransport/runtime/backends/BackendResponse; -HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->upload(Lcom/google/android/datatransport/runtime/TransportContext;ILjava/lang/Runnable;)V -Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda0; -HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda0;->(Lcom/google/android/datatransport/runtime/scheduling/persistence/EventStore;)V -HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda0;->execute()Ljava/lang/Object; +PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->upload(Lcom/google/android/datatransport/runtime/TransportContext;ILjava/lang/Runnable;)V +PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda0;->(Lcom/google/android/datatransport/runtime/scheduling/persistence/EventStore;)V +PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda0;->execute()Ljava/lang/Object; Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda1; HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda1;->(Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;Lcom/google/android/datatransport/runtime/TransportContext;J)V HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda1;->execute()Ljava/lang/Object; -Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda3; -HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda3;->(Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;Lcom/google/android/datatransport/runtime/TransportContext;ILjava/lang/Runnable;)V -HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda3;->run()V +PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda3;->(Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;Lcom/google/android/datatransport/runtime/TransportContext;ILjava/lang/Runnable;)V +PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda3;->run()V Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda4; HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda4;->(Lcom/google/android/datatransport/runtime/scheduling/persistence/ClientHealthMetricsStore;)V HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda4;->execute()Ljava/lang/Object; @@ -3496,7 +3486,7 @@ Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/WorkScheduler Lcom/google/android/datatransport/runtime/scheduling/persistence/AutoValue_EventStoreConfig; HSPLcom/google/android/datatransport/runtime/scheduling/persistence/AutoValue_EventStoreConfig;->(JIIJI)V HSPLcom/google/android/datatransport/runtime/scheduling/persistence/AutoValue_EventStoreConfig;->(JIIJILcom/google/android/datatransport/runtime/scheduling/persistence/AutoValue_EventStoreConfig$1;)V -HSPLcom/google/android/datatransport/runtime/scheduling/persistence/AutoValue_EventStoreConfig;->getEventCleanUpAge()J +PLcom/google/android/datatransport/runtime/scheduling/persistence/AutoValue_EventStoreConfig;->getEventCleanUpAge()J HSPLcom/google/android/datatransport/runtime/scheduling/persistence/AutoValue_EventStoreConfig;->getLoadBatchSize()I HSPLcom/google/android/datatransport/runtime/scheduling/persistence/AutoValue_EventStoreConfig;->getMaxBlobByteSizePerRow()I HSPLcom/google/android/datatransport/runtime/scheduling/persistence/AutoValue_EventStoreConfig;->getMaxStorageSizeInBytes()J @@ -3565,7 +3555,7 @@ HSPLcom/google/android/datatransport/runtime/scheduling/persistence/PersistedEve Lcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore; HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->()V HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->(Lcom/google/android/datatransport/runtime/time/Clock;Lcom/google/android/datatransport/runtime/time/Clock;Lcom/google/android/datatransport/runtime/scheduling/persistence/EventStoreConfig;Lcom/google/android/datatransport/runtime/scheduling/persistence/SchemaManager;Ljavax/inject/Provider;)V -HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->cleanUp()I +PLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->cleanUp()I HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->ensureBeginTransaction(Landroid/database/sqlite/SQLiteDatabase;)V HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->ensureTransportContext(Landroid/database/sqlite/SQLiteDatabase;Lcom/google/android/datatransport/runtime/TransportContext;)J HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->getByteSize()J @@ -3580,8 +3570,8 @@ HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventS HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->inTransaction(Lcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$Function;)Ljava/lang/Object; HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->isStorageAtLimit()Z HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->join(Ljava/util/List;Ljava/util/Map;)Ljava/util/List; -HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->lambda$cleanUp$11$com-google-android-datatransport-runtime-scheduling-persistence-SQLiteEventStore(Landroid/database/Cursor;)Ljava/lang/Object; -HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->lambda$cleanUp$12$com-google-android-datatransport-runtime-scheduling-persistence-SQLiteEventStore(JLandroid/database/sqlite/SQLiteDatabase;)Ljava/lang/Integer; +PLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->lambda$cleanUp$11$com-google-android-datatransport-runtime-scheduling-persistence-SQLiteEventStore(Landroid/database/Cursor;)Ljava/lang/Object; +PLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->lambda$cleanUp$12$com-google-android-datatransport-runtime-scheduling-persistence-SQLiteEventStore(JLandroid/database/sqlite/SQLiteDatabase;)Ljava/lang/Integer; HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->lambda$ensureBeginTransaction$24(Landroid/database/sqlite/SQLiteDatabase;)Ljava/lang/Object; HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->lambda$getNextCallTime$5(Landroid/database/Cursor;)Ljava/lang/Long; HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->lambda$getTimeWindow$21(JLandroid/database/Cursor;)Lcom/google/android/datatransport/runtime/firebase/transport/TimeWindow; @@ -3619,9 +3609,8 @@ HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventS Lcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda1; HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda1;->(Lcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;Ljava/util/List;Lcom/google/android/datatransport/runtime/TransportContext;)V HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda1;->apply(Ljava/lang/Object;)Ljava/lang/Object; -Lcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda10; -HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda10;->(Lcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;J)V -HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda10;->apply(Ljava/lang/Object;)Ljava/lang/Object; +PLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda10;->(Lcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;J)V +PLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda10;->apply(Ljava/lang/Object;)Ljava/lang/Object; Lcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda13; HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda13;->()V HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda13;->apply(Ljava/lang/Object;)Ljava/lang/Object; @@ -3637,9 +3626,8 @@ HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventS Lcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda18; HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda18;->(J)V HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda18;->apply(Ljava/lang/Object;)Ljava/lang/Object; -Lcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda19; -HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda19;->(Lcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;)V -HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda19;->apply(Ljava/lang/Object;)Ljava/lang/Object; +PLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda19;->(Lcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;)V +PLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda19;->apply(Ljava/lang/Object;)Ljava/lang/Object; Lcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda2; HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda2;->()V HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda2;->apply(Ljava/lang/Object;)Ljava/lang/Object; @@ -3749,7 +3737,7 @@ HSPLcom/google/android/datatransport/runtime/time/WallTimeClock;->getTime()J Lcom/google/android/datatransport/runtime/util/PriorityMapping; HSPLcom/google/android/datatransport/runtime/util/PriorityMapping;->()V HSPLcom/google/android/datatransport/runtime/util/PriorityMapping;->toInt(Lcom/google/android/datatransport/Priority;)I -HSPLcom/google/android/datatransport/runtime/util/PriorityMapping;->valueOf(I)Lcom/google/android/datatransport/Priority; +PLcom/google/android/datatransport/runtime/util/PriorityMapping;->valueOf(I)Lcom/google/android/datatransport/Priority; Lcom/google/android/gms/cloudmessaging/Rpc; HSPLcom/google/android/gms/cloudmessaging/Rpc;->()V HSPLcom/google/android/gms/cloudmessaging/Rpc;->(Landroid/content/Context;)V @@ -3892,6 +3880,7 @@ Lcom/google/android/gms/common/internal/GmsClientSupervisor; HSPLcom/google/android/gms/common/internal/GmsClientSupervisor;->()V HSPLcom/google/android/gms/common/internal/GmsClientSupervisor;->()V HSPLcom/google/android/gms/common/internal/GmsClientSupervisor;->getInstance(Landroid/content/Context;)Lcom/google/android/gms/common/internal/GmsClientSupervisor; +PLcom/google/android/gms/common/internal/GmsClientSupervisor;->zzb(Ljava/lang/String;Ljava/lang/String;ILandroid/content/ServiceConnection;Ljava/lang/String;Z)V Lcom/google/android/gms/common/internal/IGmsCallbacks; Lcom/google/android/gms/common/internal/IGmsServiceBroker; Lcom/google/android/gms/common/internal/Objects; @@ -5121,6 +5110,7 @@ HSPLcom/google/android/gms/measurement/internal/zzhv;->(Lcom/google/androi HSPLcom/google/android/gms/measurement/internal/zzhv;->zza(Lcom/google/android/gms/measurement/internal/zzhw;)V HSPLcom/google/android/gms/measurement/internal/zzhv;->zzb(Ljava/lang/Runnable;)V HSPLcom/google/android/gms/measurement/internal/zzhv;->zzc()Ljava/util/concurrent/atomic/AtomicLong; +HSPLcom/google/android/gms/measurement/internal/zzhv;->zzc(Lcom/google/android/gms/measurement/internal/zzhv;)Ljava/lang/Object; HSPLcom/google/android/gms/measurement/internal/zzhv;->zzd(Lcom/google/android/gms/measurement/internal/zzhv;)Ljava/util/concurrent/Semaphore; HSPLcom/google/android/gms/measurement/internal/zzhv;->zze(Lcom/google/android/gms/measurement/internal/zzhv;)Z HSPLcom/google/android/gms/measurement/internal/zzhv;->zzh()Z @@ -6508,14 +6498,15 @@ HSPLcom/google/firebase/crashlytics/internal/common/FirebaseInstallationId;->get Lcom/google/firebase/crashlytics/internal/common/IdManager; HSPLcom/google/firebase/crashlytics/internal/common/IdManager;->()V HSPLcom/google/firebase/crashlytics/internal/common/IdManager;->(Landroid/content/Context;Ljava/lang/String;Lcom/google/firebase/installations/FirebaseInstallationsApi;Lcom/google/firebase/crashlytics/internal/common/DataCollectionArbiter;)V +HSPLcom/google/firebase/crashlytics/internal/common/IdManager;->createAndCacheCrashlyticsInstallId(Ljava/lang/String;Landroid/content/SharedPreferences;)Ljava/lang/String; HSPLcom/google/firebase/crashlytics/internal/common/IdManager;->fetchTrueFid(Z)Lcom/google/firebase/crashlytics/internal/common/FirebaseInstallationId; +HSPLcom/google/firebase/crashlytics/internal/common/IdManager;->formatId(Ljava/lang/String;)Ljava/lang/String; HSPLcom/google/firebase/crashlytics/internal/common/IdManager;->getAppIdentifier()Ljava/lang/String; HSPLcom/google/firebase/crashlytics/internal/common/IdManager;->getInstallIds()Lcom/google/firebase/crashlytics/internal/common/InstallIdProvider$InstallIds; HSPLcom/google/firebase/crashlytics/internal/common/IdManager;->getInstallerPackageName()Ljava/lang/String; HSPLcom/google/firebase/crashlytics/internal/common/IdManager;->getModelName()Ljava/lang/String; HSPLcom/google/firebase/crashlytics/internal/common/IdManager;->getOsBuildVersionString()Ljava/lang/String; HSPLcom/google/firebase/crashlytics/internal/common/IdManager;->getOsDisplayVersionString()Ljava/lang/String; -HSPLcom/google/firebase/crashlytics/internal/common/IdManager;->readCachedCrashlyticsInstallId(Landroid/content/SharedPreferences;)Ljava/lang/String; HSPLcom/google/firebase/crashlytics/internal/common/IdManager;->removeForwardSlashesIn(Ljava/lang/String;)Ljava/lang/String; HSPLcom/google/firebase/crashlytics/internal/common/IdManager;->shouldRefresh()Z Lcom/google/firebase/crashlytics/internal/common/InstallIdProvider; @@ -6720,6 +6711,7 @@ HSPLcom/google/firebase/crashlytics/internal/metadata/UserMetadata;->getCustomKe HSPLcom/google/firebase/crashlytics/internal/metadata/UserMetadata;->getInternalKeys()Ljava/util/Map; HSPLcom/google/firebase/crashlytics/internal/metadata/UserMetadata;->getRolloutsState()Ljava/util/List; HSPLcom/google/firebase/crashlytics/internal/metadata/UserMetadata;->loadFromExistingSession(Ljava/lang/String;Lcom/google/firebase/crashlytics/internal/persistence/FileStore;Lcom/google/firebase/crashlytics/internal/concurrency/CrashlyticsWorkers;)Lcom/google/firebase/crashlytics/internal/metadata/UserMetadata; +HSPLcom/google/firebase/crashlytics/internal/metadata/UserMetadata;->readUserId(Ljava/lang/String;Lcom/google/firebase/crashlytics/internal/persistence/FileStore;)Ljava/lang/String; HSPLcom/google/firebase/crashlytics/internal/metadata/UserMetadata;->setInternalKey(Ljava/lang/String;Ljava/lang/String;)Z Lcom/google/firebase/crashlytics/internal/metadata/UserMetadata$SerializeableKeysMap; HSPLcom/google/firebase/crashlytics/internal/metadata/UserMetadata$SerializeableKeysMap;->(Lcom/google/firebase/crashlytics/internal/metadata/UserMetadata;Z)V @@ -7360,6 +7352,7 @@ HSPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersis HSPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->getOpenSessionIds()Ljava/util/SortedSet; HSPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->getStartTimestampMillis(Ljava/lang/String;)J HSPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->hasFinalizedReports()Z +HSPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->isHighPriorityEventFile(Ljava/lang/String;)Z HSPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->isNormalPriorityEventFile(Ljava/io/File;Ljava/lang/String;)Z HSPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->lambda$static$1(Ljava/io/File;Ljava/lang/String;)Z HSPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->loadFinalizedReports()Ljava/util/List; diff --git a/app/src/release/generated/baselineProfiles/startup-prof.txt b/app/src/release/generated/baselineProfiles/startup-prof.txt index a5df04ead..67e0f2505 100644 --- a/app/src/release/generated/baselineProfiles/startup-prof.txt +++ b/app/src/release/generated/baselineProfiles/startup-prof.txt @@ -1060,7 +1060,6 @@ Landroidx/core/provider/FontProvider$ContentQueryWrapper; HSPLandroidx/core/provider/FontProvider$ContentQueryWrapper;->make(Landroid/content/Context;Landroid/net/Uri;)Landroidx/core/provider/FontProvider$ContentQueryWrapper; Landroidx/core/provider/FontProvider$ContentQueryWrapperApi24Impl; HSPLandroidx/core/provider/FontProvider$ContentQueryWrapperApi24Impl;->(Landroid/content/Context;Landroid/net/Uri;)V -HSPLandroidx/core/provider/FontProvider$ContentQueryWrapperApi24Impl;->close()V HSPLandroidx/core/provider/FontProvider$ContentQueryWrapperApi24Impl;->query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor; Landroidx/core/provider/FontRequest; HSPLandroidx/core/provider/FontRequest;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V @@ -1073,13 +1072,9 @@ Landroidx/core/provider/FontsContractCompat; HSPLandroidx/core/provider/FontsContractCompat;->buildTypeface(Landroid/content/Context;Landroid/os/CancellationSignal;[Landroidx/core/provider/FontsContractCompat$FontInfo;)Landroid/graphics/Typeface; HSPLandroidx/core/provider/FontsContractCompat;->fetchFonts(Landroid/content/Context;Landroid/os/CancellationSignal;Landroidx/core/provider/FontRequest;)Landroidx/core/provider/FontsContractCompat$FontFamilyResult; Landroidx/core/provider/FontsContractCompat$FontFamilyResult; -HSPLandroidx/core/provider/FontsContractCompat$FontFamilyResult;->(I[Landroidx/core/provider/FontsContractCompat$FontInfo;)V -HSPLandroidx/core/provider/FontsContractCompat$FontFamilyResult;->create(I[Landroidx/core/provider/FontsContractCompat$FontInfo;)Landroidx/core/provider/FontsContractCompat$FontFamilyResult; HSPLandroidx/core/provider/FontsContractCompat$FontFamilyResult;->getFonts()[Landroidx/core/provider/FontsContractCompat$FontInfo; HSPLandroidx/core/provider/FontsContractCompat$FontFamilyResult;->getStatusCode()I Landroidx/core/provider/FontsContractCompat$FontInfo; -HSPLandroidx/core/provider/FontsContractCompat$FontInfo;->(Landroid/net/Uri;IIZI)V -HSPLandroidx/core/provider/FontsContractCompat$FontInfo;->create(Landroid/net/Uri;IIZI)Landroidx/core/provider/FontsContractCompat$FontInfo; HSPLandroidx/core/provider/FontsContractCompat$FontInfo;->getResultCode()I HSPLandroidx/core/provider/FontsContractCompat$FontInfo;->getTtcIndex()I HSPLandroidx/core/provider/FontsContractCompat$FontInfo;->getUri()Landroid/net/Uri; @@ -2679,8 +2674,6 @@ PLandroidx/profileinstaller/ProfileVerifier;->setCompilationStatus(IZZZ)Landroid PLandroidx/profileinstaller/ProfileVerifier;->writeProfileVerification(Landroid/content/Context;Z)Landroidx/profileinstaller/ProfileVerifier$CompilationStatus; PLandroidx/profileinstaller/ProfileVerifier$Api33Impl;->getPackageInfo(Landroid/content/pm/PackageManager;Landroid/content/Context;)Landroid/content/pm/PackageInfo; PLandroidx/profileinstaller/ProfileVerifier$Cache;->(IIJJ)V -PLandroidx/profileinstaller/ProfileVerifier$Cache;->equals(Ljava/lang/Object;)Z -PLandroidx/profileinstaller/ProfileVerifier$Cache;->readFromFile(Ljava/io/File;)Landroidx/profileinstaller/ProfileVerifier$Cache; PLandroidx/profileinstaller/ProfileVerifier$Cache;->writeOnFile(Ljava/io/File;)V PLandroidx/profileinstaller/ProfileVerifier$CompilationStatus;->(IZZZ)V Landroidx/savedstate/R$id; @@ -3404,12 +3397,11 @@ HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSch HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoScheduler;->schedule(Lcom/google/android/datatransport/runtime/TransportContext;I)V HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoScheduler;->schedule(Lcom/google/android/datatransport/runtime/TransportContext;IZ)V Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSchedulerService; -HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSchedulerService;->()V -HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSchedulerService;->lambda$onStartJob$0$com-google-android-datatransport-runtime-scheduling-jobscheduling-JobInfoSchedulerService(Landroid/app/job/JobParameters;)V -HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSchedulerService;->onStartJob(Landroid/app/job/JobParameters;)Z -Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSchedulerService$$ExternalSyntheticLambda0; -HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSchedulerService$$ExternalSyntheticLambda0;->(Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSchedulerService;Landroid/app/job/JobParameters;)V -HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSchedulerService$$ExternalSyntheticLambda0;->run()V +PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSchedulerService;->()V +PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSchedulerService;->lambda$onStartJob$0$com-google-android-datatransport-runtime-scheduling-jobscheduling-JobInfoSchedulerService(Landroid/app/job/JobParameters;)V +PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSchedulerService;->onStartJob(Landroid/app/job/JobParameters;)Z +PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSchedulerService$$ExternalSyntheticLambda0;->(Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSchedulerService;Landroid/app/job/JobParameters;)V +PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoSchedulerService$$ExternalSyntheticLambda0;->run()V Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/SchedulerConfig; HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/SchedulerConfig;->()V HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/SchedulerConfig;->adjustedExponentialBackoff(IJ)J @@ -3436,24 +3428,22 @@ HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/SchedulerC Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader; HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->(Landroid/content/Context;Lcom/google/android/datatransport/runtime/backends/BackendRegistry;Lcom/google/android/datatransport/runtime/scheduling/persistence/EventStore;Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/WorkScheduler;Ljava/util/concurrent/Executor;Lcom/google/android/datatransport/runtime/synchronization/SynchronizationGuard;Lcom/google/android/datatransport/runtime/time/Clock;Lcom/google/android/datatransport/runtime/time/Clock;Lcom/google/android/datatransport/runtime/scheduling/persistence/ClientHealthMetricsStore;)V HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->createMetricsEvent(Lcom/google/android/datatransport/runtime/backends/TransportBackend;)Lcom/google/android/datatransport/runtime/EventInternal; -HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->isNetworkAvailable()Z +PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->isNetworkAvailable()Z HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->lambda$logAndUpdateState$2$com-google-android-datatransport-runtime-scheduling-jobscheduling-Uploader(Lcom/google/android/datatransport/runtime/TransportContext;)Ljava/lang/Boolean; HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->lambda$logAndUpdateState$3$com-google-android-datatransport-runtime-scheduling-jobscheduling-Uploader(Lcom/google/android/datatransport/runtime/TransportContext;)Ljava/lang/Iterable; HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->lambda$logAndUpdateState$5$com-google-android-datatransport-runtime-scheduling-jobscheduling-Uploader(Ljava/lang/Iterable;)Ljava/lang/Object; HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->lambda$logAndUpdateState$6$com-google-android-datatransport-runtime-scheduling-jobscheduling-Uploader()Ljava/lang/Object; HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->lambda$logAndUpdateState$8$com-google-android-datatransport-runtime-scheduling-jobscheduling-Uploader(Lcom/google/android/datatransport/runtime/TransportContext;J)Ljava/lang/Object; -HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->lambda$upload$1$com-google-android-datatransport-runtime-scheduling-jobscheduling-Uploader(Lcom/google/android/datatransport/runtime/TransportContext;ILjava/lang/Runnable;)V +PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->lambda$upload$1$com-google-android-datatransport-runtime-scheduling-jobscheduling-Uploader(Lcom/google/android/datatransport/runtime/TransportContext;ILjava/lang/Runnable;)V HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->logAndUpdateState(Lcom/google/android/datatransport/runtime/TransportContext;I)Lcom/google/android/datatransport/runtime/backends/BackendResponse; -HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->upload(Lcom/google/android/datatransport/runtime/TransportContext;ILjava/lang/Runnable;)V -Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda0; -HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda0;->(Lcom/google/android/datatransport/runtime/scheduling/persistence/EventStore;)V -HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda0;->execute()Ljava/lang/Object; +PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->upload(Lcom/google/android/datatransport/runtime/TransportContext;ILjava/lang/Runnable;)V +PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda0;->(Lcom/google/android/datatransport/runtime/scheduling/persistence/EventStore;)V +PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda0;->execute()Ljava/lang/Object; Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda1; HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda1;->(Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;Lcom/google/android/datatransport/runtime/TransportContext;J)V HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda1;->execute()Ljava/lang/Object; -Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda3; -HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda3;->(Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;Lcom/google/android/datatransport/runtime/TransportContext;ILjava/lang/Runnable;)V -HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda3;->run()V +PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda3;->(Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;Lcom/google/android/datatransport/runtime/TransportContext;ILjava/lang/Runnable;)V +PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda3;->run()V Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda4; HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda4;->(Lcom/google/android/datatransport/runtime/scheduling/persistence/ClientHealthMetricsStore;)V HSPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader$$ExternalSyntheticLambda4;->execute()Ljava/lang/Object; @@ -3496,7 +3486,7 @@ Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/WorkScheduler Lcom/google/android/datatransport/runtime/scheduling/persistence/AutoValue_EventStoreConfig; HSPLcom/google/android/datatransport/runtime/scheduling/persistence/AutoValue_EventStoreConfig;->(JIIJI)V HSPLcom/google/android/datatransport/runtime/scheduling/persistence/AutoValue_EventStoreConfig;->(JIIJILcom/google/android/datatransport/runtime/scheduling/persistence/AutoValue_EventStoreConfig$1;)V -HSPLcom/google/android/datatransport/runtime/scheduling/persistence/AutoValue_EventStoreConfig;->getEventCleanUpAge()J +PLcom/google/android/datatransport/runtime/scheduling/persistence/AutoValue_EventStoreConfig;->getEventCleanUpAge()J HSPLcom/google/android/datatransport/runtime/scheduling/persistence/AutoValue_EventStoreConfig;->getLoadBatchSize()I HSPLcom/google/android/datatransport/runtime/scheduling/persistence/AutoValue_EventStoreConfig;->getMaxBlobByteSizePerRow()I HSPLcom/google/android/datatransport/runtime/scheduling/persistence/AutoValue_EventStoreConfig;->getMaxStorageSizeInBytes()J @@ -3565,7 +3555,7 @@ HSPLcom/google/android/datatransport/runtime/scheduling/persistence/PersistedEve Lcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore; HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->()V HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->(Lcom/google/android/datatransport/runtime/time/Clock;Lcom/google/android/datatransport/runtime/time/Clock;Lcom/google/android/datatransport/runtime/scheduling/persistence/EventStoreConfig;Lcom/google/android/datatransport/runtime/scheduling/persistence/SchemaManager;Ljavax/inject/Provider;)V -HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->cleanUp()I +PLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->cleanUp()I HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->ensureBeginTransaction(Landroid/database/sqlite/SQLiteDatabase;)V HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->ensureTransportContext(Landroid/database/sqlite/SQLiteDatabase;Lcom/google/android/datatransport/runtime/TransportContext;)J HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->getByteSize()J @@ -3580,8 +3570,8 @@ HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventS HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->inTransaction(Lcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$Function;)Ljava/lang/Object; HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->isStorageAtLimit()Z HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->join(Ljava/util/List;Ljava/util/Map;)Ljava/util/List; -HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->lambda$cleanUp$11$com-google-android-datatransport-runtime-scheduling-persistence-SQLiteEventStore(Landroid/database/Cursor;)Ljava/lang/Object; -HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->lambda$cleanUp$12$com-google-android-datatransport-runtime-scheduling-persistence-SQLiteEventStore(JLandroid/database/sqlite/SQLiteDatabase;)Ljava/lang/Integer; +PLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->lambda$cleanUp$11$com-google-android-datatransport-runtime-scheduling-persistence-SQLiteEventStore(Landroid/database/Cursor;)Ljava/lang/Object; +PLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->lambda$cleanUp$12$com-google-android-datatransport-runtime-scheduling-persistence-SQLiteEventStore(JLandroid/database/sqlite/SQLiteDatabase;)Ljava/lang/Integer; HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->lambda$ensureBeginTransaction$24(Landroid/database/sqlite/SQLiteDatabase;)Ljava/lang/Object; HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->lambda$getNextCallTime$5(Landroid/database/Cursor;)Ljava/lang/Long; HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->lambda$getTimeWindow$21(JLandroid/database/Cursor;)Lcom/google/android/datatransport/runtime/firebase/transport/TimeWindow; @@ -3619,9 +3609,8 @@ HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventS Lcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda1; HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda1;->(Lcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;Ljava/util/List;Lcom/google/android/datatransport/runtime/TransportContext;)V HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda1;->apply(Ljava/lang/Object;)Ljava/lang/Object; -Lcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda10; -HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda10;->(Lcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;J)V -HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda10;->apply(Ljava/lang/Object;)Ljava/lang/Object; +PLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda10;->(Lcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;J)V +PLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda10;->apply(Ljava/lang/Object;)Ljava/lang/Object; Lcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda13; HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda13;->()V HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda13;->apply(Ljava/lang/Object;)Ljava/lang/Object; @@ -3637,9 +3626,8 @@ HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventS Lcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda18; HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda18;->(J)V HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda18;->apply(Ljava/lang/Object;)Ljava/lang/Object; -Lcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda19; -HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda19;->(Lcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;)V -HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda19;->apply(Ljava/lang/Object;)Ljava/lang/Object; +PLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda19;->(Lcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;)V +PLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda19;->apply(Ljava/lang/Object;)Ljava/lang/Object; Lcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda2; HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda2;->()V HSPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore$$ExternalSyntheticLambda2;->apply(Ljava/lang/Object;)Ljava/lang/Object; @@ -3749,7 +3737,7 @@ HSPLcom/google/android/datatransport/runtime/time/WallTimeClock;->getTime()J Lcom/google/android/datatransport/runtime/util/PriorityMapping; HSPLcom/google/android/datatransport/runtime/util/PriorityMapping;->()V HSPLcom/google/android/datatransport/runtime/util/PriorityMapping;->toInt(Lcom/google/android/datatransport/Priority;)I -HSPLcom/google/android/datatransport/runtime/util/PriorityMapping;->valueOf(I)Lcom/google/android/datatransport/Priority; +PLcom/google/android/datatransport/runtime/util/PriorityMapping;->valueOf(I)Lcom/google/android/datatransport/Priority; Lcom/google/android/gms/cloudmessaging/Rpc; HSPLcom/google/android/gms/cloudmessaging/Rpc;->()V HSPLcom/google/android/gms/cloudmessaging/Rpc;->(Landroid/content/Context;)V @@ -3892,6 +3880,7 @@ Lcom/google/android/gms/common/internal/GmsClientSupervisor; HSPLcom/google/android/gms/common/internal/GmsClientSupervisor;->()V HSPLcom/google/android/gms/common/internal/GmsClientSupervisor;->()V HSPLcom/google/android/gms/common/internal/GmsClientSupervisor;->getInstance(Landroid/content/Context;)Lcom/google/android/gms/common/internal/GmsClientSupervisor; +PLcom/google/android/gms/common/internal/GmsClientSupervisor;->zzb(Ljava/lang/String;Ljava/lang/String;ILandroid/content/ServiceConnection;Ljava/lang/String;Z)V Lcom/google/android/gms/common/internal/IGmsCallbacks; Lcom/google/android/gms/common/internal/IGmsServiceBroker; Lcom/google/android/gms/common/internal/Objects; @@ -5121,6 +5110,7 @@ HSPLcom/google/android/gms/measurement/internal/zzhv;->(Lcom/google/androi HSPLcom/google/android/gms/measurement/internal/zzhv;->zza(Lcom/google/android/gms/measurement/internal/zzhw;)V HSPLcom/google/android/gms/measurement/internal/zzhv;->zzb(Ljava/lang/Runnable;)V HSPLcom/google/android/gms/measurement/internal/zzhv;->zzc()Ljava/util/concurrent/atomic/AtomicLong; +HSPLcom/google/android/gms/measurement/internal/zzhv;->zzc(Lcom/google/android/gms/measurement/internal/zzhv;)Ljava/lang/Object; HSPLcom/google/android/gms/measurement/internal/zzhv;->zzd(Lcom/google/android/gms/measurement/internal/zzhv;)Ljava/util/concurrent/Semaphore; HSPLcom/google/android/gms/measurement/internal/zzhv;->zze(Lcom/google/android/gms/measurement/internal/zzhv;)Z HSPLcom/google/android/gms/measurement/internal/zzhv;->zzh()Z @@ -6508,14 +6498,15 @@ HSPLcom/google/firebase/crashlytics/internal/common/FirebaseInstallationId;->get Lcom/google/firebase/crashlytics/internal/common/IdManager; HSPLcom/google/firebase/crashlytics/internal/common/IdManager;->()V HSPLcom/google/firebase/crashlytics/internal/common/IdManager;->(Landroid/content/Context;Ljava/lang/String;Lcom/google/firebase/installations/FirebaseInstallationsApi;Lcom/google/firebase/crashlytics/internal/common/DataCollectionArbiter;)V +HSPLcom/google/firebase/crashlytics/internal/common/IdManager;->createAndCacheCrashlyticsInstallId(Ljava/lang/String;Landroid/content/SharedPreferences;)Ljava/lang/String; HSPLcom/google/firebase/crashlytics/internal/common/IdManager;->fetchTrueFid(Z)Lcom/google/firebase/crashlytics/internal/common/FirebaseInstallationId; +HSPLcom/google/firebase/crashlytics/internal/common/IdManager;->formatId(Ljava/lang/String;)Ljava/lang/String; HSPLcom/google/firebase/crashlytics/internal/common/IdManager;->getAppIdentifier()Ljava/lang/String; HSPLcom/google/firebase/crashlytics/internal/common/IdManager;->getInstallIds()Lcom/google/firebase/crashlytics/internal/common/InstallIdProvider$InstallIds; HSPLcom/google/firebase/crashlytics/internal/common/IdManager;->getInstallerPackageName()Ljava/lang/String; HSPLcom/google/firebase/crashlytics/internal/common/IdManager;->getModelName()Ljava/lang/String; HSPLcom/google/firebase/crashlytics/internal/common/IdManager;->getOsBuildVersionString()Ljava/lang/String; HSPLcom/google/firebase/crashlytics/internal/common/IdManager;->getOsDisplayVersionString()Ljava/lang/String; -HSPLcom/google/firebase/crashlytics/internal/common/IdManager;->readCachedCrashlyticsInstallId(Landroid/content/SharedPreferences;)Ljava/lang/String; HSPLcom/google/firebase/crashlytics/internal/common/IdManager;->removeForwardSlashesIn(Ljava/lang/String;)Ljava/lang/String; HSPLcom/google/firebase/crashlytics/internal/common/IdManager;->shouldRefresh()Z Lcom/google/firebase/crashlytics/internal/common/InstallIdProvider; @@ -6720,6 +6711,7 @@ HSPLcom/google/firebase/crashlytics/internal/metadata/UserMetadata;->getCustomKe HSPLcom/google/firebase/crashlytics/internal/metadata/UserMetadata;->getInternalKeys()Ljava/util/Map; HSPLcom/google/firebase/crashlytics/internal/metadata/UserMetadata;->getRolloutsState()Ljava/util/List; HSPLcom/google/firebase/crashlytics/internal/metadata/UserMetadata;->loadFromExistingSession(Ljava/lang/String;Lcom/google/firebase/crashlytics/internal/persistence/FileStore;Lcom/google/firebase/crashlytics/internal/concurrency/CrashlyticsWorkers;)Lcom/google/firebase/crashlytics/internal/metadata/UserMetadata; +HSPLcom/google/firebase/crashlytics/internal/metadata/UserMetadata;->readUserId(Ljava/lang/String;Lcom/google/firebase/crashlytics/internal/persistence/FileStore;)Ljava/lang/String; HSPLcom/google/firebase/crashlytics/internal/metadata/UserMetadata;->setInternalKey(Ljava/lang/String;Ljava/lang/String;)Z Lcom/google/firebase/crashlytics/internal/metadata/UserMetadata$SerializeableKeysMap; HSPLcom/google/firebase/crashlytics/internal/metadata/UserMetadata$SerializeableKeysMap;->(Lcom/google/firebase/crashlytics/internal/metadata/UserMetadata;Z)V @@ -7360,6 +7352,7 @@ HSPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersis HSPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->getOpenSessionIds()Ljava/util/SortedSet; HSPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->getStartTimestampMillis(Ljava/lang/String;)J HSPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->hasFinalizedReports()Z +HSPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->isHighPriorityEventFile(Ljava/lang/String;)Z HSPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->isNormalPriorityEventFile(Ljava/io/File;Ljava/lang/String;)Z HSPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->lambda$static$1(Ljava/io/File;Ljava/lang/String;)Z HSPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->loadFinalizedReports()Ljava/util/List; diff --git a/core/common/src/main/java/org/sopt/official/common/navigator/DeepLinkType.kt b/core/common/src/main/java/org/sopt/official/common/navigator/DeepLinkType.kt index aab4f064b..272a928cc 100644 --- a/core/common/src/main/java/org/sopt/official/common/navigator/DeepLinkType.kt +++ b/core/common/src/main/java/org/sopt/official/common/navigator/DeepLinkType.kt @@ -33,72 +33,85 @@ import org.sopt.official.common.util.extractQueryParameter import timber.log.Timber internal val navigator by lazy { - EntryPointAccessors.fromApplication(appContext, NavigatorEntryPoint::class.java).navigatorProvider() + EntryPointAccessors.fromApplication(appContext, NavigatorEntryPoint::class.java).navigatorProvider() } enum class DeepLinkType( - val link: String + val link: String, ) { - HOME("home") { - override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String) = getHomeIntent(userStatus) - }, - NOTIFICATION_LIST("home/notification") { - override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String) = userStatus.setIntent(navigator.getNotificationActivityIntent()) - }, - NOTIFICATION_DETAIL("home/notification/detail") { - override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String): Intent { - val notificationId = deepLink.extractQueryParameter("id") - return userStatus.setIntent(navigator.getNotificationDetailActivityIntent(notificationId)) - } - }, - MY_PAGE("home/mypage") { - override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String) = userStatus.setIntent(navigator.getMyPageActivityIntent(userStatus.name)) - }, - ATTENDANCE("home/attendance") { - override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String) = userStatus.setIntent(navigator.getAttendanceActivityIntent()) - }, - ATTENDANCE_MODAL("home/attendance/attendance-modal") { - override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String) = userStatus.setIntent(navigator.getAttendanceActivityIntent()) - }, - SOPTAMP("home/soptamp") { - override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String) = userStatus.setIntent(navigator.getSoptampActivityIntent()) - }, - SOPTAMP_ENTIRE_RANKING("home/soptamp/entire-ranking") { - override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String) = userStatus.setIntent(navigator.getSoptampActivityIntent()) - }, - SOPTAMP_CURRENT_GENERATION_RANKING("home/soptamp/current-generation-ranking") { - override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String) = userStatus.setIntent(navigator.getSoptampActivityIntent()) - }, - POKE_NOTIFICATION_LIST("home/poke/notification-list") { - override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String) = userStatus.setIntent(navigator.getPokeNotificationActivityIntent(userStatus.name)) - }, - UNKNOWN("unknown-deep-link") { - override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String) = getHomeIntent(userStatus, UNKNOWN) - }, - EXPIRED("expired") { - override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String) = getHomeIntent(userStatus, EXPIRED) - }; + HOME("home") { + override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String) = getHomeIntent(userStatus) + }, + NOTIFICATION_LIST("home/notification") { + override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String) = + userStatus.setIntent(navigator.getNotificationActivityIntent()) + }, + NOTIFICATION_DETAIL("home/notification/detail") { + override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String): Intent { + val notificationId = deepLink.extractQueryParameter("id") + return userStatus.setIntent(navigator.getNotificationDetailActivityIntent(notificationId)) + } + }, + MY_PAGE("home/mypage") { + override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String) = + userStatus.setIntent(navigator.getMyPageActivityIntent(userStatus.name)) + }, + ATTENDANCE("home/attendance") { + override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String) = + userStatus.setIntent(navigator.getAttendanceActivityIntent()) + }, + ATTENDANCE_MODAL("home/attendance/attendance-modal") { + override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String) = + userStatus.setIntent(navigator.getAttendanceActivityIntent()) + }, + SOPTAMP("home/soptamp") { + override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String) = + userStatus.setIntent(navigator.getSoptampActivityIntent()) + }, + SOPTAMP_ENTIRE_RANKING("home/soptamp/entire-ranking") { + override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String) = + userStatus.setIntent(navigator.getSoptampActivityIntent()) + }, + SOPTAMP_CURRENT_GENERATION_RANKING("home/soptamp/current-generation-ranking") { + override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String) = + userStatus.setIntent(navigator.getSoptampActivityIntent()) + }, + POKE_NOTIFICATION_LIST("home/poke/notification-list") { + override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String) = + userStatus.setIntent(navigator.getPokeNotificationActivityIntent(userStatus.name)) + }, + FORTUNE("home/fortune") { + override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String) = + userStatus.setIntent(navigator.getFortuneActivityIntent()) + }, + UNKNOWN("unknown-deep-link") { + override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String) = getHomeIntent(userStatus, UNKNOWN) + }, + EXPIRED("expired") { + override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String) = getHomeIntent(userStatus, EXPIRED) + }; - abstract fun getIntent(context: Context, userStatus: UserStatus, deepLink: String): Intent + abstract fun getIntent(context: Context, userStatus: UserStatus, deepLink: String): Intent - companion object { - private fun UserStatus.setIntent(intent: Intent): Intent { - return when (this == UserStatus.UNAUTHENTICATED) { - true -> navigator.getAuthActivityIntent() - false -> intent - } - } + companion object { + private fun UserStatus.setIntent(intent: Intent): Intent { + return when (this == UserStatus.UNAUTHENTICATED) { + true -> navigator.getAuthActivityIntent() + false -> intent + } + } - fun getHomeIntent(userStatus: UserStatus, deepLinkType: DeepLinkType? = null) = userStatus.setIntent(navigator.getHomeActivityIntent(userStatus, deepLinkType)) + fun getHomeIntent(userStatus: UserStatus, deepLinkType: DeepLinkType? = null) = + userStatus.setIntent(navigator.getHomeActivityIntent(userStatus, deepLinkType)) - fun of(deepLink: String): DeepLinkType { - return try { - val link = deepLink.split("?")[0] - entries.find { it.link == link } ?: UNKNOWN - } catch (exception: Exception) { - Timber.e(exception) - UNKNOWN - } + fun of(deepLink: String): DeepLinkType { + return try { + val link = deepLink.split("?")[0] + entries.find { it.link == link } ?: UNKNOWN + } catch (exception: Exception) { + Timber.e(exception) + UNKNOWN + } + } } - } } diff --git a/core/common/src/main/java/org/sopt/official/common/navigator/NavigatorProvider.kt b/core/common/src/main/java/org/sopt/official/common/navigator/NavigatorProvider.kt index 399c4d02a..f7c2a6086 100644 --- a/core/common/src/main/java/org/sopt/official/common/navigator/NavigatorProvider.kt +++ b/core/common/src/main/java/org/sopt/official/common/navigator/NavigatorProvider.kt @@ -31,26 +31,27 @@ import dagger.hilt.components.SingletonComponent import org.sopt.official.auth.model.UserStatus interface NavigatorProvider { - fun getAuthActivityIntent(): Intent - fun getNotificationActivityIntent(): Intent - fun getNotificationDetailActivityIntent(notificationId: String): Intent - fun getMyPageActivityIntent(name: String): Intent - fun getAttendanceActivityIntent(): Intent - fun getSoptampActivityIntent(): Intent - fun getPokeNotificationActivityIntent(name: String): Intent - fun getHomeActivityIntent( - userStatus: UserStatus, - deepLinkType: DeepLinkType? - ): Intent + fun getAuthActivityIntent(): Intent + fun getNotificationActivityIntent(): Intent + fun getNotificationDetailActivityIntent(notificationId: String): Intent + fun getMyPageActivityIntent(name: String): Intent + fun getAttendanceActivityIntent(): Intent + fun getSoptampActivityIntent(): Intent + fun getPokeNotificationActivityIntent(name: String): Intent + fun getFortuneActivityIntent(): Intent + fun getHomeActivityIntent( + userStatus: UserStatus, + deepLinkType: DeepLinkType?, + ): Intent - fun getSchemeActivityIntent( - notificationId: String, - link: String - ): Intent + fun getSchemeActivityIntent( + notificationId: String, + link: String, + ): Intent } @InstallIn(SingletonComponent::class) @EntryPoint interface NavigatorEntryPoint { - fun navigatorProvider(): NavigatorProvider + fun navigatorProvider(): NavigatorProvider } diff --git a/data/mypage/src/main/java/org/sopt/official/data/mypage/model/response/UserGenerationResponse.kt b/data/mypage/src/main/java/org/sopt/official/data/mypage/model/response/UserGenerationResponse.kt index d198401e5..908fe8f02 100644 --- a/data/mypage/src/main/java/org/sopt/official/data/mypage/model/response/UserGenerationResponse.kt +++ b/data/mypage/src/main/java/org/sopt/official/data/mypage/model/response/UserGenerationResponse.kt @@ -1,6 +1,6 @@ /* * MIT License - * Copyright 2024 SOPT - Shout Our Passion Together + * Copyright 2023-2024 SOPT - Shout Our Passion Together * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/data/mypage/src/main/java/org/sopt/official/data/mypage/source/UserDataSource.kt b/data/mypage/src/main/java/org/sopt/official/data/mypage/source/UserDataSource.kt index aacaa58ff..98211ccdd 100644 --- a/data/mypage/src/main/java/org/sopt/official/data/mypage/source/UserDataSource.kt +++ b/data/mypage/src/main/java/org/sopt/official/data/mypage/source/UserDataSource.kt @@ -1,6 +1,6 @@ /* * MIT License - * Copyright 2023 SOPT - Shout Our Passion Together + * Copyright 2023-2024 SOPT - Shout Our Passion Together * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/domain/mypage/src/main/kotlin/org/sopt/official/domain/mypage/repository/UserRepository.kt b/domain/mypage/src/main/kotlin/org/sopt/official/domain/mypage/repository/UserRepository.kt index 6ea8b85c7..e61c80335 100644 --- a/domain/mypage/src/main/kotlin/org/sopt/official/domain/mypage/repository/UserRepository.kt +++ b/domain/mypage/src/main/kotlin/org/sopt/official/domain/mypage/repository/UserRepository.kt @@ -1,6 +1,6 @@ /* * MIT License - * Copyright 2023 SOPT - Shout Our Passion Together + * Copyright 2023-2024 SOPT - Shout Our Passion Together * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/domain/soptamp/src/main/kotlin/org/sopt/official/domain/soptamp/fake/FakeUserRepository.kt b/domain/soptamp/src/main/kotlin/org/sopt/official/domain/soptamp/fake/FakeUserRepository.kt index 3958a159c..2b604543b 100644 --- a/domain/soptamp/src/main/kotlin/org/sopt/official/domain/soptamp/fake/FakeUserRepository.kt +++ b/domain/soptamp/src/main/kotlin/org/sopt/official/domain/soptamp/fake/FakeUserRepository.kt @@ -1,6 +1,6 @@ /* * MIT License - * Copyright 2023 SOPT - Shout Our Passion Together + * Copyright 2023-2024 SOPT - Shout Our Passion Together * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/feature/fortune/src/androidTest/java/org/sopt/official/feature/fortune/fortuneDetail/FortuneDetailScreenTest.kt b/feature/fortune/src/androidTest/java/org/sopt/official/feature/fortune/fortuneDetail/FortuneDetailScreenTest.kt index c599a6530..b490eba95 100644 --- a/feature/fortune/src/androidTest/java/org/sopt/official/feature/fortune/fortuneDetail/FortuneDetailScreenTest.kt +++ b/feature/fortune/src/androidTest/java/org/sopt/official/feature/fortune/fortuneDetail/FortuneDetailScreenTest.kt @@ -24,7 +24,6 @@ */ package org.sopt.official.feature.fortune.fortuneDetail -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.ui.semantics.SemanticsProperties import androidx.compose.ui.semantics.getOrNull import androidx.compose.ui.test.assertIsDisplayed @@ -55,7 +54,6 @@ internal class FortuneDetailScreenTest { composeRule.setContent { SoptTheme { FortuneDetailScreen( - paddingValue = PaddingValues(), date = date, onFortuneAmuletClick = { }, onPokeClick = { }, diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/FortuneActivity.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/FortuneActivity.kt index 81fb42b11..9dd5b529c 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/FortuneActivity.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/FortuneActivity.kt @@ -50,7 +50,7 @@ class FortuneActivity : AppCompatActivity() { setContent { SoptTheme { FoundationScreen( - navigateToNotification = { + onClickLeadingIcon = { startActivity(navigator.getNotificationActivityIntent()) }, navigateToHome = { diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/FoundationScreen.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/FoundationScreen.kt index 14108e739..5b12aea80 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/FoundationScreen.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/FoundationScreen.kt @@ -29,9 +29,17 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.material3.Scaffold +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.rememberNavController @@ -39,6 +47,7 @@ import org.sopt.official.designsystem.SoptTheme import org.sopt.official.feature.fortune.component.FortuneTopBar import org.sopt.official.feature.fortune.feature.fortuneAmulet.navigation.FortuneAmulet import org.sopt.official.feature.fortune.feature.fortuneAmulet.navigation.fortuneAmuletNavGraph +import org.sopt.official.feature.fortune.feature.fortuneDetail.component.PokeSnackBar import org.sopt.official.feature.fortune.feature.fortuneDetail.navigation.FortuneDetail import org.sopt.official.feature.fortune.feature.fortuneDetail.navigation.fortuneDetailNavGraph import org.sopt.official.feature.fortune.feature.home.navigation.Home @@ -46,15 +55,30 @@ import org.sopt.official.feature.fortune.feature.home.navigation.homeNavGraph @Composable fun FoundationScreen( - navigateToNotification: () -> Unit, + onClickLeadingIcon: () -> Unit, navigateToHome: () -> Unit, navController: NavHostController = rememberNavController(), ) { + var isBottomSheetVisible by remember { mutableStateOf(false) } + val snackBarHostState = remember { SnackbarHostState() } + Scaffold( + snackbarHost = { + Box(modifier = Modifier.fillMaxSize()) { + SnackbarHost( + hostState = snackBarHostState, + modifier = Modifier + .padding(top = 16.dp) + .align(alignment = Alignment.TopCenter), + snackbar = { PokeSnackBar() }, + ) + } + }, modifier = Modifier.fillMaxSize(), topBar = { FortuneTopBar( - onClickNavigationIcon = navigateToNotification + isEnabled = !isBottomSheetVisible, + onClickNavigationIcon = onClickLeadingIcon, ) }, content = { paddingValue -> @@ -75,10 +99,13 @@ fun FoundationScreen( ) fortuneDetailNavGraph( - paddingValue = paddingValue, navigateToFortuneAmulet = { navController.navigate(FortuneAmulet) - } + }, + isBottomSheetVisible = { + isBottomSheetVisible = it + }, + snackBarHostState = snackBarHostState, ) fortuneAmuletNavGraph( @@ -95,7 +122,7 @@ fun FoundationScreen( fun FoundationScreenPreview() { SoptTheme { FoundationScreen( - navigateToNotification = {}, + onClickLeadingIcon = {}, navigateToHome = {} ) } diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/component/FortuneButton.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/component/FortuneButton.kt new file mode 100644 index 000000000..ceed410da --- /dev/null +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/component/FortuneButton.kt @@ -0,0 +1,71 @@ +/* + * MIT License + * Copyright 2024 SOPT - Shout Our Passion Together + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package org.sopt.official.feature.fortune.component + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import org.sopt.official.designsystem.SoptTheme + +@Composable +fun FortuneButton( + title: String, + onClick: () -> Unit, + modifier: Modifier = Modifier, +) { + Box( + modifier = modifier + .fillMaxWidth() + .clip(RoundedCornerShape(12.dp)) + .background(SoptTheme.colors.primary) + .clickable(onClick = onClick), + contentAlignment = Alignment.Center + ) { + Text( + text = title, + style = SoptTheme.typography.label18SB, + color = SoptTheme.colors.onPrimary, + modifier = Modifier.padding(horizontal = 26.dp, vertical = 16.dp) + ) + } +} + +@Preview +@Composable +fun FortuneButtonPreview() { + SoptTheme { + FortuneButton(title = "오늘의 부적 받기", onClick = {}) + } +} diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/component/FortuneTopBar.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/component/FortuneTopBar.kt index 0f6ea637c..cf6c80f2c 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/component/FortuneTopBar.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/component/FortuneTopBar.kt @@ -35,32 +35,33 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import org.sopt.official.designsystem.Gray200 import org.sopt.official.designsystem.SoptTheme @Composable fun FortuneTopBar( - modifier: Modifier = Modifier, onClickNavigationIcon: () -> Unit, + modifier: Modifier = Modifier, + isEnabled: Boolean = true, ) { Box(modifier = modifier.fillMaxWidth()) { Icon( imageVector = Icons.Filled.Close, + tint = if (!isEnabled) Gray200 else SoptTheme.colors.onBackground, contentDescription = null, - modifier = Modifier - .padding(start = 8.dp, top = 2.dp, bottom = 2.dp) - .padding(8.dp) - .clickable(onClick = onClickNavigationIcon), - tint = SoptTheme.colors.onBackground + modifier = Modifier.padding(start = 8.dp, top = 2.dp, bottom = 2.dp).padding(8.dp) + .clickable { if (isEnabled) onClickNavigationIcon() }, ) } } -@Preview +@Preview(showBackground = true) @Composable fun FortuneTopBarPreview() { SoptTheme { - FortuneTopBar { - - } + FortuneTopBar( + onClickNavigationIcon = { }, + isEnabled = false, + ) } } diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/component/UrlImage.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/component/UrlImage.kt index 2b5a1276f..7c19b414d 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/component/UrlImage.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/component/UrlImage.kt @@ -26,6 +26,7 @@ package org.sopt.official.feature.fortune.component import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.tooling.preview.Preview import coil.compose.AsyncImage @@ -33,11 +34,13 @@ import coil.compose.AsyncImage fun UrlImage( url: String, modifier: Modifier = Modifier, + contentScale: ContentScale = ContentScale.Fit, contentDescription: String? = null, ) { AsyncImage( model = url, contentDescription = contentDescription, + contentScale = contentScale, modifier = modifier ) } diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneAmulet/FortuneAmuletState.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneAmulet/FortuneAmuletState.kt index 3188a8126..351b5c3bb 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneAmulet/FortuneAmuletState.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneAmulet/FortuneAmuletState.kt @@ -33,5 +33,5 @@ data class FortuneAmuletState( val imageColor: Color = Color.White, val imageUrl: String = "", val name: String = "", - val nameSuffix: String = "이 왔솝" + val nameSuffix: String = "이 왔솝", ) diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailRoute.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailRoute.kt index 9bdcba6fe..644bbccc9 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailRoute.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailRoute.kt @@ -26,33 +26,95 @@ package org.sopt.official.feature.fortune.feature.fortuneDetail import android.content.Intent import android.net.Uri -import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.ModalBottomSheetLayout +import androidx.compose.material.ModalBottomSheetValue +import androidx.compose.material.rememberModalBottomSheetState +import androidx.compose.material3.SnackbarDuration +import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import kotlinx.coroutines.launch +import org.sopt.official.designsystem.Gray800 +import org.sopt.official.feature.fortune.feature.fortuneDetail.component.PokeMessageBottomSheetScreen @Composable internal fun FortuneDetailRoute( - paddingValue: PaddingValues, date: String, onFortuneAmuletClick: () -> Unit, + isBottomSheetVisible: (isVisible: Boolean) -> Unit, + snackBarHostState: SnackbarHostState, viewModel: FortuneDetailViewModel = hiltViewModel(), ) { val context = LocalContext.current val uiState by viewModel.uiState.collectAsStateWithLifecycle() + var isAnonymous by remember { mutableStateOf(true) } + var selectedIndex by remember { mutableIntStateOf(-1) } + val bottomSheetState = rememberModalBottomSheetState(initialValue = ModalBottomSheetValue.Hidden) + val scope = rememberCoroutineScope() - FortuneDetailScreen( - paddingValue = paddingValue, - date = date, - onFortuneAmuletClick = onFortuneAmuletClick, - onPokeClick = {}, - onProfileClick = { userId -> - context.startActivity( - Intent(Intent.ACTION_VIEW, Uri.parse("https://playground.sopt.org/members/${userId}")) + LaunchedEffect(bottomSheetState.currentValue) { + if (bottomSheetState.currentValue == ModalBottomSheetValue.Hidden) isBottomSheetVisible(false) + } + + ModalBottomSheetLayout( + sheetState = bottomSheetState, + sheetShape = RoundedCornerShape( + topStart = 20.dp, + topEnd = 20.dp, + ), + sheetBackgroundColor = Gray800, + sheetContent = { + PokeMessageBottomSheetScreen( + selectedIndex = selectedIndex, + onItemClick = { newSelectedIndex, message -> + scope.launch { + selectedIndex = newSelectedIndex + bottomSheetState.hide() + viewModel.poke(message) + }.invokeOnCompletion { + isBottomSheetVisible(false) + } + }, + onIconClick = { + isAnonymous = !isAnonymous + if (isAnonymous.not()) scope.launch { + snackBarHostState.showSnackbar( + message = "", + duration = SnackbarDuration.Short, + ) + } + }, + isAnonymous = isAnonymous, ) }, - uiState = uiState, - ) + ) { + FortuneDetailScreen( + date = date, + onFortuneAmuletClick = onFortuneAmuletClick, + onProfileClick = { userId -> + context.startActivity( + Intent(Intent.ACTION_VIEW, Uri.parse("https://playground.sopt.org/members/${userId}")) + ) + }, + onPokeClick = { + scope.launch { + bottomSheetState.show() + }.invokeOnCompletion { + isBottomSheetVisible(true) + } + }, + uiState = uiState, + ) + } } diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailScreen.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailScreen.kt index fa91303f7..5efecc526 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailScreen.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailScreen.kt @@ -25,7 +25,6 @@ package org.sopt.official.feature.fortune.feature.fortuneDetail import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height @@ -36,6 +35,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import org.sopt.official.designsystem.SoptTheme +import org.sopt.official.feature.fortune.component.FortuneButton import org.sopt.official.feature.fortune.feature.fortuneDetail.component.PokeRecommendationDashboard import org.sopt.official.feature.fortune.feature.fortuneDetail.component.TodayFortuneDashboard import org.sopt.official.feature.fortune.feature.fortuneDetail.model.FortuneDetailUiState @@ -48,7 +48,6 @@ import timber.log.Timber @Composable internal fun FortuneDetailScreen( - paddingValue: PaddingValues, date: String, onFortuneAmuletClick: () -> Unit, onPokeClick: (userId: Long) -> Unit, @@ -60,14 +59,15 @@ internal fun FortuneDetailScreen( horizontalAlignment = Alignment.CenterHorizontally, modifier = modifier .fillMaxSize() - .padding(paddingValues = paddingValue), + .padding(horizontal = 20.dp), ) { Spacer(modifier = Modifier.height(height = 16.dp)) when (uiState) { is Success -> { TodayFortuneDashboard( date = date, - todaySentence = uiState.todaySentence.message, + todaySentence = uiState.todaySentence.content, + name = uiState.todaySentence.userName, ) Spacer(modifier = Modifier.height(height = 20.dp)) PokeRecommendationDashboard( @@ -75,8 +75,14 @@ internal fun FortuneDetailScreen( name = uiState.userInfo.userName, userDescription = uiState.userInfo.userDescription, onPokeClick = { onPokeClick(uiState.userInfo.userId) }, - onProfileClick = { onProfileClick(uiState.userInfo.userId) } + onProfileClick = { onProfileClick(uiState.userInfo.userId) }, ) + Spacer(modifier = Modifier.weight(1f)) + FortuneButton( + title = "오늘의 부적 받기", + onClick = onFortuneAmuletClick, + ) + Spacer(modifier = Modifier.height(height = 14.dp)) } is Error -> Timber.e(uiState.errorMessage) @@ -92,7 +98,6 @@ internal fun FortuneDetailScreen( private fun FortuneDetailScreenPreview() { SoptTheme { FortuneDetailScreen( - paddingValue = PaddingValues(vertical = 16.dp), date = "2024-09-09", onFortuneAmuletClick = {}, uiState = Success( diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailViewModel.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailViewModel.kt index 54395d589..514613f78 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailViewModel.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailViewModel.kt @@ -55,6 +55,9 @@ internal class FortuneDetailViewModel @Inject constructor( private val _uiState: MutableStateFlow = MutableStateFlow(Loading) val uiState: StateFlow get() = _uiState.asStateFlow() + private var isAnonymous: Boolean = false + private var userId = DEFAULT_ID + init { viewModelScope.launch { runCatching { @@ -67,10 +70,9 @@ internal class FortuneDetailViewModel @Inject constructor( }.onSuccess { result -> val todayFortune = result[0] as TodayFortuneWord val pokeUser = result[1] as GetOnboardingPokeUserListResponse - + val user = pokeUser.data?.randomInfoList?.get(0)?.userInfoList?.get(0) ?: throw IllegalArgumentException() + userId = user.userId _uiState.update { - val user = pokeUser.data?.randomInfoList?.get(0)?.userInfoList?.get(0) ?: throw IllegalArgumentException() - Success( todaySentence = TodaySentence( userName = todayFortune.userName, @@ -86,10 +88,28 @@ internal class FortuneDetailViewModel @Inject constructor( ) } }.onFailure { error -> - _uiState.update { - Error(error) - } + _uiState.update { Error(error) } + } + } + } + + fun poke(message: String) { + viewModelScope.launch { + runCatching { + pokeRepository.pokeUser( + userId = userId, + isAnonymous = isAnonymous, + message = message + ) + }.onSuccess { + _uiState.update { uiState.value as Success } + }.onFailure { error -> + _uiState.update { Error(error) } } } } + + companion object { + private const val DEFAULT_ID = -1 + } } diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/FortuneDetailBox.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/FortuneDetailBox.kt index 10d4e5288..9dc40c891 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/FortuneDetailBox.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/FortuneDetailBox.kt @@ -27,7 +27,6 @@ package org.sopt.official.feature.fortune.feature.fortuneDetail.component import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -47,7 +46,6 @@ internal fun TodayFortuneBox( contentAlignment = Alignment.Center, modifier = modifier .fillMaxWidth() - .padding(horizontal = 20.dp) .background( color = Gray900, shape = RoundedCornerShape(12.dp), diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/PokeMessageBottomSheet.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/PokeMessageBottomSheet.kt new file mode 100644 index 000000000..8b7a76552 --- /dev/null +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/PokeMessageBottomSheet.kt @@ -0,0 +1,127 @@ +/* + * MIT License + * Copyright 2024 SOPT - Shout Our Passion Together + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package org.sopt.official.feature.fortune.feature.fortuneDetail.component + +import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import okhttp3.internal.immutableListOf +import org.sopt.official.designsystem.Gray10 +import org.sopt.official.designsystem.Gray30 +import org.sopt.official.designsystem.SoptTheme +import org.sopt.official.feature.fortune.R.drawable.ic_checkbox_off +import org.sopt.official.feature.fortune.R.drawable.ic_checkbox_on + +@Composable +internal fun PokeMessageBottomSheetScreen( + isAnonymous: Boolean, + selectedIndex: Int, + onItemClick: (selectedIndex: Int, message: String) -> Unit, + onIconClick: () -> Unit, + modifier: Modifier = Modifier, +) { + Column( + modifier = modifier.fillMaxWidth() + .padding(horizontal = 20.dp) + .padding( + top = 24.dp, + bottom = 12.dp, + ), + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier.fillMaxWidth(), + ) { + Text( + text = "함께 보낼 메시지를 선택해주세요", + style = SoptTheme.typography.heading20B, + color = Gray30, + ) + Spacer(modifier = Modifier.weight(weight = 1f)) + Image( + imageVector = if (isAnonymous) ImageVector.vectorResource(id = ic_checkbox_on) + else ImageVector.vectorResource(id = ic_checkbox_off), + contentDescription = "익명 체크박스", + modifier = Modifier.clickable { onIconClick() }, + ) + Spacer(modifier = Modifier.width(width = 8.dp)) + Text( + text = "익명", + style = SoptTheme.typography.title16SB, + color = Gray10, + ) + } + Spacer(modifier = Modifier.height(height = 12.dp)) + LazyColumn(contentPadding = PaddingValues(vertical = 4.dp)) { + val messages = immutableListOf( + "안녕하세요? I AM 35기에요", + "친해지고 싶어서 DM 드려요 ^^~", + "이야기 해보고 싶었어요!!", + "모각작 하실래요?", + "콕 \uD83D\uDC48", + ) + + itemsIndexed(messages) { index, message -> + PokeMessageItem( + message = message, + isSelected = index == selectedIndex, + onItemClick = { onItemClick(index, message) }, + ) + } + } + } +} + +@Preview +@Composable +private fun PokeMessageBottomSheetScreenPreview() { + SoptTheme { + PokeMessageBottomSheetScreen( + isAnonymous = true, + selectedIndex = 0, + onItemClick = { _, _ -> }, + onIconClick = { }, + ) + } +} diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/PokeMessageItem.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/PokeMessageItem.kt new file mode 100644 index 000000000..b2092ec2b --- /dev/null +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/PokeMessageItem.kt @@ -0,0 +1,84 @@ +/* + * MIT License + * Copyright 2024 SOPT - Shout Our Passion Together + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package org.sopt.official.feature.fortune.feature.fortuneDetail.component + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import org.sopt.official.designsystem.Gray10 +import org.sopt.official.designsystem.Gray700 +import org.sopt.official.designsystem.Gray800 +import org.sopt.official.designsystem.SoptTheme + +@Composable +internal fun PokeMessageItem( + message: String, + isSelected: Boolean, + onItemClick: () -> Unit, + modifier: Modifier = Modifier, +) { + Box( + modifier = modifier + .fillMaxWidth() + .background( + color = if (isSelected) Gray700 else Gray800, + shape = RoundedCornerShape(size = 6.dp), + ) + .clickable( + indication = null, + interactionSource = null, + ) { onItemClick() }, + ) { + Text( + text = message, + style = SoptTheme.typography.body16M, + color = Gray10, + modifier = Modifier.padding( + vertical = 14.dp, + horizontal = 8.dp, + ), + ) + } +} + +@Preview(showBackground = true) +@Composable +private fun PokeMessageItemPreview() { + SoptTheme { + PokeMessageItem( + message = "123", + isSelected = true, + onItemClick = { }, + ) + } +} diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/PokeRecommendationDashboard.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/PokeRecommendationDashboard.kt index 002537eac..f6c23984d 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/PokeRecommendationDashboard.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/PokeRecommendationDashboard.kt @@ -1,6 +1,6 @@ /* * MIT License - * Copyright 2023-2024 SOPT - Shout Our Passion Together + * Copyright 2024 SOPT - Shout Our Passion Together * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -26,6 +26,7 @@ package org.sopt.official.feature.fortune.feature.fortuneDetail.component import androidx.compose.foundation.background import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -36,7 +37,6 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -109,12 +109,14 @@ internal fun PokeRecommendationDashboard( color = Gray300, ) } - IconButton( - onClick = onPokeClick, - modifier = Modifier.size(size = 44.dp).background( - color = Gray10, - shape = RoundedCornerShape(size = 18.dp), - ), + Box( + contentAlignment = Alignment.Center, + modifier = Modifier + .size(size = 44.dp) + .background( + color = Gray10, + shape = RoundedCornerShape(size = 18.dp), + ).clickable { onPokeClick() }, ) { Icon( imageVector = ImageVector.vectorResource(ic_poke), diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/PokeRecommendationUserProfileImage.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/PokeRecommendationUserProfileImage.kt index c5683b3b0..20634c3da 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/PokeRecommendationUserProfileImage.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/PokeRecommendationUserProfileImage.kt @@ -28,6 +28,7 @@ import androidx.compose.foundation.Image import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.vectorResource import androidx.compose.ui.tooling.preview.Preview import org.sopt.official.designsystem.SoptTheme @@ -52,6 +53,7 @@ internal fun PokeRecommendationUserProfileImage( UrlImage( url = profile, contentDescription = "profileImage", + contentScale = ContentScale.Crop, modifier = modifier, ) } diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/PokeSnackBar.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/PokeSnackBar.kt new file mode 100644 index 000000000..74ff577de --- /dev/null +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/PokeSnackBar.kt @@ -0,0 +1,83 @@ +/* + * MIT License + * Copyright 2024 SOPT - Shout Our Passion Together + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package org.sopt.official.feature.fortune.feature.fortuneDetail.component + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Icon +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.res.* +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import org.sopt.official.designsystem.Gray10 +import org.sopt.official.designsystem.Gray900 +import org.sopt.official.designsystem.SoptTheme +import org.sopt.official.feature.fortune.R.drawable.ic_alert + +@Composable +internal fun PokeSnackBar() { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp) + .background( + color = Gray10, + shape = RoundedCornerShape(18.dp), + ) + ) { + Spacer(modifier = Modifier.width(width = 16.dp)) + Icon( + imageVector = ImageVector.vectorResource(ic_alert), + tint = Color.Unspecified, + contentDescription = null, + ) + Spacer(modifier = Modifier.width(width = 8.dp)) + Text( + text = "익명 해제 시, 상대방이 나를 알 수 있어요.", + style = SoptTheme.typography.title14SB, + color = Gray900, + modifier = Modifier.padding(vertical = 16.dp), + ) + } +} + +@Preview +@Composable +private fun PokeSnackBarPreview() { + SoptTheme { + PokeSnackBar() + } +} diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/TodayFortuneDashboard.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/TodayFortuneDashboard.kt index 4e0fe14c7..3a61f37ee 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/TodayFortuneDashboard.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/TodayFortuneDashboard.kt @@ -1,6 +1,6 @@ /* * MIT License - * Copyright 2024 SOPT - Shout Our Passion Together + * Copyright 2023-2024 SOPT - Shout Our Passion Together * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -27,24 +27,16 @@ package org.sopt.official.feature.fortune.feature.fortuneDetail.component import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.vectorResource -import androidx.compose.ui.semantics.contentDescription -import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.text.style.LineBreak -import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import org.sopt.official.designsystem.Gray100 -import org.sopt.official.designsystem.Gray30 import org.sopt.official.designsystem.SoptTheme import org.sopt.official.feature.fortune.R.drawable.img_fortune_title @@ -52,6 +44,7 @@ import org.sopt.official.feature.fortune.R.drawable.img_fortune_title internal fun TodayFortuneDashboard( date: String, todaySentence: String, + name: String, modifier: Modifier = Modifier, ) { TodayFortuneBox( @@ -72,17 +65,9 @@ internal fun TodayFortuneDashboard( color = Gray100, ) Spacer(modifier = Modifier.height(height = 20.dp)) - Text( - text = todaySentence, - style = SoptTheme.typography.title24SB.copy( - lineBreak = LineBreak.Simple, - ), - color = Gray30, - textAlign = TextAlign.Center, - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 68.dp) - .semantics { contentDescription = "todaySentence" }, + TodayFortuneText( + todaySentence = todaySentence, + name = name, ) Spacer(modifier = Modifier.height(height = 36.dp)) } @@ -90,13 +75,15 @@ internal fun TodayFortuneDashboard( ) } + @Preview(showBackground = true) @Composable private fun TodayFortuneDashboardPreview() { SoptTheme { TodayFortuneDashboard( date = "2024-09-09", - todaySentence = "hi my name is Sehun kim, nice to meet you", + todaySentence = "예상치 못한 칭찬을 받게 되겠솝", + name = "김세훈", ) } } diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/TodayFortuneText.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/TodayFortuneText.kt new file mode 100644 index 000000000..77b03e9a4 --- /dev/null +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/TodayFortuneText.kt @@ -0,0 +1,121 @@ +/* + * MIT License + * Copyright 2024 SOPT - Shout Our Passion Together + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package org.sopt.official.feature.fortune.feature.fortuneDetail.component + +import android.graphics.Paint +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.text.style.LineBreak +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import org.sopt.official.designsystem.Gray30 +import org.sopt.official.designsystem.SoptTheme + +@Composable +internal fun TodayFortuneText( + todaySentence: String, + name: String, + modifier: Modifier = Modifier, +) { + val currentDensity = LocalDensity.current + val currentConfiguration = LocalConfiguration.current + val textPaint = remember { Paint().apply { textSize = with(currentDensity) { 24.sp.toPx() } } } + val screenWidth = remember { with(currentDensity) { (currentConfiguration.screenWidthDp.dp - (88.dp * 2)).toPx() } } + val formattedSentence = remember { todaySentence.toLineBreakingSentence(textPaint, screenWidth) } + + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = modifier + .fillMaxWidth() + .padding(horizontal = 68.dp) + .semantics { contentDescription = "todaySentence" }, + ) { + Text( + text = "${name}님,", + style = SoptTheme.typography.title24SB, + color = Gray30, + maxLines = 1, + textAlign = TextAlign.Center, + ) + Text( + text = formattedSentence, + style = SoptTheme.typography.title24SB.copy( + lineBreak = LineBreak.Simple, + ), + color = Gray30, + maxLines = 4, + textAlign = TextAlign.Center, + softWrap = true, + ) + } +} + +private fun String.toLineBreakingSentence(textPaint: Paint, screenWidth: Float): String { + var resultSentence = "" + var sentenceLineWidth = 0f + val words = split(" ") + val spaceWidth = textPaint.measureText(" ") + + words.forEach { word -> + val wordWidth = textPaint.measureText(word) + + when (sentenceLineWidth + wordWidth + spaceWidth > screenWidth) { + true -> { + resultSentence += "\n$word" + sentenceLineWidth = wordWidth + } + + false -> { + resultSentence = if (resultSentence.isBlank()) word else "$resultSentence $word" + sentenceLineWidth += wordWidth + spaceWidth + } + } + } + + return resultSentence +} + +@Preview +@Composable +private fun TodayFortuneTextPreview() { + SoptTheme { + TodayFortuneText( + todaySentence = "저 근데 진짜 발 딛는 것도 처음이라 좀 수치스러울 것 같은데 옆에서 카공하다", + name = "김세훈", + ) + } +} diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/model/FortuneDetailUiState.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/model/FortuneDetailUiState.kt index 73964eb3b..66bf3286e 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/model/FortuneDetailUiState.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/model/FortuneDetailUiState.kt @@ -40,9 +40,7 @@ internal sealed interface FortuneDetailUiState { data class TodaySentence( val userName: String, val content: String, - ) { - val message: String get() = "${userName}님,\n${content}" - } + ) @Immutable data class UserInfo( diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/navigation/FortuneDetailNavGraph.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/navigation/FortuneDetailNavGraph.kt index 25c9369e0..a92ff6815 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/navigation/FortuneDetailNavGraph.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/navigation/FortuneDetailNavGraph.kt @@ -24,7 +24,7 @@ */ package org.sopt.official.feature.fortune.feature.fortuneDetail.navigation -import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.material3.SnackbarHostState import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable import androidx.navigation.toRoute @@ -35,15 +35,17 @@ import org.sopt.official.feature.fortune.feature.fortuneDetail.FortuneDetailRout data class FortuneDetail(val date: String) fun NavGraphBuilder.fortuneDetailNavGraph( - paddingValue: PaddingValues, navigateToFortuneAmulet: () -> Unit, + snackBarHostState: SnackbarHostState, + isBottomSheetVisible: (isVisible: Boolean) -> Unit, ) { composable { backStackEntry -> val items = backStackEntry.toRoute() FortuneDetailRoute( - paddingValue = paddingValue, date = items.date, - onFortuneAmuletClick = navigateToFortuneAmulet + onFortuneAmuletClick = navigateToFortuneAmulet, + isBottomSheetVisible = isBottomSheetVisible, + snackBarHostState = snackBarHostState, ) } } diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/home/HomeScreen.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/home/HomeScreen.kt index df7f396d4..93e716d2f 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/home/HomeScreen.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/home/HomeScreen.kt @@ -26,27 +26,23 @@ package org.sopt.official.feature.fortune.feature.home import androidx.compose.foundation.Image import androidx.compose.foundation.background -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.vectorResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import org.sopt.official.designsystem.SoptTheme import org.sopt.official.feature.fortune.R +import org.sopt.official.feature.fortune.component.FortuneButton import java.time.LocalDate import java.time.format.DateTimeFormatter import java.time.format.TextStyle @@ -74,6 +70,7 @@ private fun HomeScreen( Column( modifier = Modifier .fillMaxSize() + .padding(horizontal = 20.dp) .background(SoptTheme.colors.background), horizontalAlignment = Alignment.CenterHorizontally ) { @@ -98,8 +95,7 @@ private fun HomeScreen( Image( imageVector = ImageVector.vectorResource(id = R.drawable.img_fortune_title), contentDescription = null, - modifier = Modifier - .padding(horizontal = 45.dp) + modifier = Modifier.padding(horizontal = 25.dp) ) Spacer(modifier = Modifier.height(10.dp)) @@ -108,27 +104,15 @@ private fun HomeScreen( imageVector = ImageVector.vectorResource(id = R.drawable.img_fortune_three_cards), contentDescription = null, modifier = Modifier - .padding(horizontal = 26.dp) + .padding(horizontal = 6.dp) ) Spacer(modifier = Modifier.weight(1f)) - Box( - modifier = Modifier - .padding(horizontal = 20.dp) - .fillMaxWidth() - .clip(RoundedCornerShape(12.dp)) - .background(SoptTheme.colors.primary) - .clickable(onClick = navigateToFortuneDetail), - contentAlignment = Alignment.Center - ) { - Text( - text = "오늘의 운세 보러가기", - style = SoptTheme.typography.label18SB, - color = SoptTheme.colors.onPrimary, - modifier = Modifier.padding(horizontal = 26.dp, vertical = 16.dp) - ) - } + FortuneButton( + title = "오늘의 운세 보러 가기", + onClick = navigateToFortuneDetail, + ) Spacer(modifier = Modifier.height(36.dp)) } diff --git a/feature/fortune/src/main/res/drawable/ic_alert.xml b/feature/fortune/src/main/res/drawable/ic_alert.xml new file mode 100644 index 000000000..7914b80d6 --- /dev/null +++ b/feature/fortune/src/main/res/drawable/ic_alert.xml @@ -0,0 +1,43 @@ + + + + + + + + + + diff --git a/feature/fortune/src/main/res/drawable/ic_checkbox_off.xml b/feature/fortune/src/main/res/drawable/ic_checkbox_off.xml new file mode 100644 index 000000000..b5b5e14ab --- /dev/null +++ b/feature/fortune/src/main/res/drawable/ic_checkbox_off.xml @@ -0,0 +1,33 @@ + + + + + diff --git a/feature/fortune/src/main/res/drawable/ic_checkbox_on.xml b/feature/fortune/src/main/res/drawable/ic_checkbox_on.xml new file mode 100644 index 000000000..403550cfc --- /dev/null +++ b/feature/fortune/src/main/res/drawable/ic_checkbox_on.xml @@ -0,0 +1,40 @@ + + + + + +