Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ google-services.json
# Claude Code local settings
.claude/settings.local.json
.mcp.json
AGENTS.md
CLAUDE.md
.omc/

# Android Profiling
*.hprof
Expand Down
1 change: 1 addition & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ dependencies {
implementation(project(":feature:home"))
implementation(project(":feature:travel"))
implementation(project(":feature:travel-helper"))
implementation(project(":feature:content-recommendation"))

implementation(project(":data:core"))

Expand Down
2 changes: 2 additions & 0 deletions app/src/main/java/com/yapp/ndgl/ui/NDGLApp.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.navigation3.runtime.entryProvider
import androidx.navigation3.ui.NavDisplay
import com.yapp.ndgl.feature.contentrecommendation.navigation.contentRecommendationEntry
import com.yapp.ndgl.feature.home.navigation.homeEntry
import com.yapp.ndgl.feature.travel.navigation.travelEntry
import com.yapp.ndgl.feature.travelhelper.navigation.travelHelperEntry
Expand All @@ -33,6 +34,7 @@ fun NDGLApp() {
homeEntry(navigator)
travelEntry(navigator)
travelHelperEntry(navigator)
contentRecommendationEntry(navigator)
}

NavDisplay(
Expand Down
31 changes: 31 additions & 0 deletions core/ui/src/main/res/drawable/ic_24_alert.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<!--
~ Copyright (C) 2026 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M12,7.917C12.415,7.917 12.75,8.253 12.75,8.667V12C12.75,12.415 12.415,12.75 12,12.75C11.586,12.75 11.25,12.415 11.25,12V8.667C11.25,8.253 11.586,7.917 12,7.917Z"
android:fillColor="#383838"/>
<path
android:pathData="M12,14.583C11.586,14.583 11.25,14.919 11.25,15.333C11.25,15.747 11.586,16.083 12,16.083H12.009C12.423,16.083 12.759,15.747 12.759,15.333C12.759,14.919 12.423,14.583 12.009,14.583H12Z"
android:fillColor="#383838"/>
<path
android:pathData="M2.917,12C2.917,6.984 6.984,2.917 12,2.917C17.017,2.917 21.084,6.984 21.084,12C21.084,17.017 17.017,21.084 12,21.084C6.984,21.084 2.917,17.017 2.917,12ZM12,4.417C7.812,4.417 4.417,7.812 4.417,12C4.417,16.188 7.812,19.584 12,19.584C16.188,19.584 19.584,16.188 19.584,12C19.584,7.812 16.188,4.417 12,4.417Z"
android:fillColor="#383838"
android:fillType="evenOdd"/>
</vector>
24 changes: 24 additions & 0 deletions core/ui/src/main/res/drawable/ic_24_asterisk.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<!--
~ Copyright (C) 2026 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M12.062,4.304C12.468,4.3 12.794,4.626 12.79,5.032L12.735,9.912L16.357,6.291C16.65,5.998 17.125,5.998 17.418,6.291C17.711,6.583 17.71,7.058 17.418,7.351L13.545,11.223L18.921,11.163C19.327,11.158 19.653,11.484 19.648,11.89C19.644,12.297 19.31,12.63 18.904,12.634L13.818,12.691L17.418,16.291C17.711,16.583 17.71,17.058 17.418,17.351C17.125,17.644 16.65,17.644 16.357,17.351L12.692,13.686L12.634,18.904C12.63,19.31 12.297,19.644 11.89,19.648C11.484,19.653 11.158,19.327 11.163,18.921L11.223,13.545L7.418,17.351C7.125,17.644 6.65,17.644 6.357,17.351C6.064,17.058 6.064,16.584 6.357,16.291L9.912,12.735L5.032,12.79C4.626,12.794 4.3,12.468 4.304,12.062C4.309,11.656 4.642,11.324 5.049,11.319L10.265,11.259L6.357,7.351C6.064,7.058 6.064,6.584 6.357,6.291C6.65,5.998 7.125,5.998 7.418,6.291L11.26,10.134L11.319,5.049C11.324,4.642 11.656,4.309 12.062,4.304Z"
android:fillColor="#383838"/>
</vector>
29 changes: 29 additions & 0 deletions core/ui/src/main/res/drawable/ic_24_youtube.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<!--
~ Copyright (C) 2026 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M10.496,8.415C10.264,8.283 9.979,8.285 9.748,8.419C9.517,8.553 9.375,8.8 9.375,9.067V14.517C9.375,14.785 9.517,15.031 9.748,15.166C9.979,15.3 10.264,15.301 10.496,15.169L15.287,12.444C15.522,12.311 15.667,12.062 15.667,11.792C15.667,11.523 15.522,11.274 15.287,11.14L10.496,8.415ZM13.399,11.792L10.875,13.228V10.357L13.399,11.792Z"
android:fillColor="#383838"
android:fillType="evenOdd"/>
<path
android:pathData="M12,5.333C12,4.583 12,4.583 12,4.583L11.983,4.583C11.972,4.583 11.955,4.583 11.934,4.583C11.891,4.583 11.828,4.583 11.747,4.584C11.587,4.585 11.355,4.586 11.074,4.589C10.511,4.595 9.744,4.607 8.932,4.631C8.121,4.655 7.258,4.692 6.503,4.747C5.77,4.8 5.076,4.875 4.64,4.992C4.636,4.993 4.633,4.994 4.629,4.995C4.11,5.142 3.639,5.423 3.263,5.81C2.887,6.198 2.62,6.677 2.489,7.201C2.485,7.217 2.482,7.233 2.479,7.25C2.208,8.748 2.076,10.268 2.083,11.791C2.074,13.325 2.206,14.856 2.479,16.366C2.483,16.39 2.489,16.415 2.495,16.438C2.64,16.946 2.913,17.407 3.288,17.778C3.662,18.149 4.127,18.417 4.635,18.556L4.64,18.558C5.076,18.674 5.77,18.749 6.503,18.803C7.258,18.858 8.121,18.894 8.932,18.918C9.744,18.942 10.511,18.954 11.074,18.96C11.355,18.963 11.587,18.965 11.747,18.966C11.828,18.966 11.891,18.966 11.934,18.966C11.955,18.966 11.972,18.966 11.983,18.966L12,18.966C12,18.966 12,18.966 12,18.216C12,18.966 12,18.966 12,18.966L12.017,18.966C12.026,18.966 12.039,18.966 12.054,18.966L12.066,18.966C12.109,18.966 12.172,18.966 12.253,18.966C12.414,18.965 12.645,18.963 12.926,18.96C13.489,18.954 14.256,18.942 15.068,18.918C15.879,18.894 16.742,18.858 17.497,18.803C18.23,18.749 18.924,18.674 19.361,18.558C19.364,18.557 19.367,18.556 19.371,18.555C19.89,18.408 20.361,18.126 20.737,17.739C21.113,17.352 21.38,16.872 21.511,16.348C21.515,16.332 21.518,16.316 21.521,16.299C21.79,14.812 21.922,13.304 21.917,11.792C21.926,10.258 21.794,8.726 21.521,7.217C21.518,7.2 21.515,7.184 21.511,7.168C21.38,6.644 21.113,6.164 20.737,5.777C20.361,5.39 19.89,5.108 19.371,4.961C19.362,4.959 19.353,4.957 19.345,4.954C18.914,4.849 18.226,4.781 17.492,4.732C16.739,4.682 15.877,4.649 15.066,4.627C14.254,4.605 13.488,4.594 12.926,4.589C12.644,4.586 12.413,4.584 12.252,4.584C12.172,4.583 12.109,4.583 12.066,4.583C12.045,4.583 12.028,4.583 12.017,4.583L12,4.583C12,4.583 12,4.583 12,5.333ZM4.339,6.855C4.53,6.658 4.769,6.515 5.032,6.439C5.315,6.365 5.872,6.297 6.612,6.243C7.336,6.19 8.175,6.154 8.976,6.131C9.777,6.107 10.533,6.095 11.09,6.089C11.368,6.086 11.596,6.084 11.754,6.084C11.833,6.083 11.895,6.083 11.937,6.083C11.948,6.083 11.958,6.083 11.967,6.083C11.974,6.083 11.98,6.083 11.984,6.083L12,6.083L12.063,6.083C12.105,6.083 12.167,6.083 12.246,6.084C12.404,6.084 12.632,6.086 12.911,6.088C13.468,6.094 14.225,6.105 15.026,6.126C15.827,6.148 16.667,6.181 17.392,6.229C18.125,6.278 18.685,6.34 18.975,6.408C19.236,6.484 19.472,6.627 19.661,6.821C19.847,7.014 19.981,7.251 20.05,7.51C20.303,8.921 20.426,10.353 20.417,11.787L20.417,11.79L20.417,11.794C20.422,13.206 20.299,14.616 20.05,16.006C19.981,16.265 19.847,16.502 19.661,16.695C19.47,16.891 19.231,17.034 18.968,17.11C18.685,17.184 18.128,17.253 17.388,17.307C16.664,17.359 15.825,17.395 15.024,17.419C14.224,17.442 13.467,17.454 12.91,17.46C12.632,17.463 12.404,17.465 12.246,17.466C12.167,17.466 12.105,17.466 12.063,17.466C12.042,17.466 12.026,17.466 12.016,17.466L12.001,17.466H12C12,17.466 12,17.466 12,17.699V17.67C12,17.466 12,17.466 12,17.466H11.999L11.937,17.466C11.895,17.466 11.833,17.466 11.754,17.466C11.596,17.465 11.368,17.463 11.09,17.46C10.533,17.454 9.777,17.442 8.976,17.419C8.175,17.395 7.336,17.359 6.612,17.307C5.869,17.252 5.31,17.184 5.029,17.109C4.77,17.038 4.534,16.901 4.343,16.712C4.159,16.53 4.024,16.306 3.948,16.06C3.696,14.653 3.574,13.226 3.583,11.796C3.583,11.793 3.583,11.79 3.583,11.788C3.576,10.365 3.699,8.944 3.95,7.543C4.019,7.284 4.153,7.047 4.339,6.855Z"
android:fillColor="#383838"
android:fillType="evenOdd"/>
</vector>
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,15 @@ object NetworkModule {
): OkHttpClient = OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.build()

@YoutubeOembedClient
@Singleton
@Provides
fun provideYoutubeOembedOkHttpClient(
httpLoggingInterceptor: HttpLoggingInterceptor,
): OkHttpClient = OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.build()
}

@Qualifier
Expand Down Expand Up @@ -190,3 +199,7 @@ annotation class ExchangeRateApiKey
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class ExchangeRateClient

@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class YoutubeOembedClient
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.yapp.ndgl.data.travel.api

import com.yapp.ndgl.data.travel.model.YoutubeOembedResponse
import retrofit2.http.GET
import retrofit2.http.Query

interface YoutubeOembedApi {
@GET("oembed")
suspend fun getMetadata(
@Query("url") url: String,
@Query("format") format: String = "json",
): YoutubeOembedResponse
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import com.yapp.ndgl.data.core.di.RouteBaseUrl
import com.yapp.ndgl.data.core.di.RouteClient
import com.yapp.ndgl.data.core.di.WeatherApiKey
import com.yapp.ndgl.data.core.di.WeatherClient
import com.yapp.ndgl.data.core.di.YoutubeOembedClient
import com.yapp.ndgl.data.travel.BuildConfig
import com.yapp.ndgl.data.travel.api.ExchangeRateApi
import com.yapp.ndgl.data.travel.api.GeocodingApi
Expand All @@ -21,6 +22,7 @@ import com.yapp.ndgl.data.travel.api.TravelProgramApi
import com.yapp.ndgl.data.travel.api.TravelTemplateApi
import com.yapp.ndgl.data.travel.api.UserTravelApi
import com.yapp.ndgl.data.travel.api.WeatherApi
import com.yapp.ndgl.data.travel.api.YoutubeOembedApi
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
Expand All @@ -30,15 +32,21 @@ import kotlinx.serialization.json.Json
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import javax.inject.Qualifier
import javax.inject.Singleton

@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class YoutubeOembedClient

@Module
@InstallIn(SingletonComponent::class)
object TravelNetworkModule {
private const val ROUTES_BASE_URL = "https://routes.googleapis.com/"
private const val WEATHER_BASE_URL = "https://weather.googleapis.com/"
private const val GEOCODING_BASE_URL = "https://maps.googleapis.com/"
private const val EXCHANGE_RATE_BASE_URL = "https://v6.exchangerate-api.com/"
private const val YOUTUBE_OEMBED_BASE_URL = "https://www.youtube.com/"

@Provides
@Singleton
Expand Down Expand Up @@ -167,4 +175,22 @@ object TravelNetworkModule {
fun provideExchangeRateApi(
@ExchangeRateClient retrofit: Retrofit,
): ExchangeRateApi = retrofit.create(ExchangeRateApi::class.java)

@YoutubeOembedClient
@Provides
@Singleton
fun provideYoutubeOembedRetrofit(
@YoutubeOembedClient okHttpClient: OkHttpClient,
json: Json,
Comment thread
coderabbitai[bot] marked this conversation as resolved.
): Retrofit = Retrofit.Builder()
.baseUrl(YOUTUBE_OEMBED_BASE_URL)
.client(okHttpClient)
.addConverterFactory(json.asConverterFactory("application/json".toMediaType()))
.build()

@Provides
@Singleton
fun provideYoutubeOembedApi(
@YoutubeOembedClient retrofit: Retrofit,
): YoutubeOembedApi = retrofit.create(YoutubeOembedApi::class.java)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.yapp.ndgl.data.travel.model

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class YoutubeOembedResponse(
val title: String,
@SerialName("author_name") val authorName: String,
@SerialName("thumbnail_url") val thumbnailUrl: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.yapp.ndgl.data.travel.repository

import com.yapp.ndgl.data.travel.api.YoutubeOembedApi
import com.yapp.ndgl.data.travel.model.YoutubeOembedResponse
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class ContentMetadataRepository @Inject constructor(
private val api: YoutubeOembedApi,
) {
suspend fun getMetadata(videoUrl: String): YoutubeOembedResponse =
api.getMetadata(url = videoUrl)
}
1 change: 1 addition & 0 deletions feature/content-recommendation/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/build
25 changes: 25 additions & 0 deletions feature/content-recommendation/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import java.util.Properties

plugins {
id("ndgl.feature")
}

android {
namespace = "com.yapp.ndgl.feature.contentrecommendation"

val localProperties = Properties().apply {
load(rootProject.file("local.properties").bufferedReader())
}
Comment thread
mj010504 marked this conversation as resolved.

buildFeatures {
buildConfig = true
}

defaultConfig {
buildConfigField("String", "NDGL_INQUIRY_URL", "\"${localProperties.getProperty("NDGL_INQUIRY_URL", "")}\"")
}
}

dependencies {
implementation(project(":data:travel"))
}
Empty file.
21 changes: 21 additions & 0 deletions feature/content-recommendation/proguard-rules.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
4 changes: 4 additions & 0 deletions feature/content-recommendation/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

</manifest>
Loading
Loading