From: insang-hmogara-pc Date: Mon, 14 Sep 2026 06:32:05 +0000 (+0900) Subject: initialize X-Git-Url: https://git.insang.kr/gitweb/?a=commitdiff_plain;h=HEAD;p=shorcutnaver.git initialize --- 57bc468918b73b75f1bb6d7c190ef7fe4564db70 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/AndroidProjectSystem.xml b/.idea/AndroidProjectSystem.xml new file mode 100644 index 0000000..4a53bee --- /dev/null +++ b/.idea/AndroidProjectSystem.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..bcf4711 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml new file mode 100644 index 0000000..1b36750 --- /dev/null +++ b/.idea/deploymentTargetSelector.xml @@ -0,0 +1,18 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/deviceManager.xml b/.idea/deviceManager.xml new file mode 100644 index 0000000..91f9558 --- /dev/null +++ b/.idea/deviceManager.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..02c4aa5 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..29a5cc0 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..16660f1 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..1cd6107 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,43 @@ +plugins { + alias(libs.plugins.android.application) +} + +android { + namespace = "com.example.shorcutnaver" + compileSdk { + version = release(37) + } + + defaultConfig { + applicationId = "com.example.shorcutnaver" + minSdk = 24 + targetSdk = 37 + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + optimization { + enable = false + } + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } +} + +dependencies { + implementation(libs.androidx.activity.ktx) + implementation(libs.androidx.appcompat) + implementation(libs.androidx.constraintlayout) + implementation(libs.androidx.core.ktx) + implementation(libs.material) + testImplementation(libs.junit) + androidTestImplementation(libs.androidx.espresso.core) + androidTestImplementation(libs.androidx.junit) +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/example/shorcutnaver/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/example/shorcutnaver/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..bdcb84c --- /dev/null +++ b/app/src/androidTest/java/com/example/shorcutnaver/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.example.shorcutnaver + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.example.shorcutnaver", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..114c847 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/example/shorcutnaver/MainActivity.kt b/app/src/main/java/com/example/shorcutnaver/MainActivity.kt new file mode 100644 index 0000000..9239de9 --- /dev/null +++ b/app/src/main/java/com/example/shorcutnaver/MainActivity.kt @@ -0,0 +1,24 @@ +package com.example.shorcutnaver + +import android.content.Intent +import android.os.Bundle +import androidx.activity.ComponentActivity + +class MainActivity : ComponentActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + // 접근성 서비스에 네비게이션 검사 요청 + val intent = Intent( + "com.example.shorcutnaver.REQUEST_NAVIGATION" + ).apply { + setPackage(packageName) + } + + sendBroadcast(intent) + + // 이 앱은 실행 역할만 하고 바로 제거 + finishAndRemoveTask() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/shorcutnaver/MainActivity_bak.kt b/app/src/main/java/com/example/shorcutnaver/MainActivity_bak.kt new file mode 100644 index 0000000..09aeb70 --- /dev/null +++ b/app/src/main/java/com/example/shorcutnaver/MainActivity_bak.kt @@ -0,0 +1,38 @@ +package com.example.shorcutnaver + +import android.content.ComponentName +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import androidx.activity.ComponentActivity + +class MainActivity_bak : ComponentActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + val intent = Intent().apply { + component = ComponentName( + "com.nhn.android.nmap", + "com.naver.map.LaunchActivity" + ) + action = "com.naver.map.action.SHORTCUT" + data = Uri.parse("nmap://navigation") + } + + try { + startActivity(intent) + + // 네이버 지도 실행이 충분히 끝난 뒤 + // 현재 앱을 최근 앱 목록에서 제거 + Handler(Looper.getMainLooper()).postDelayed({ + finishAndRemoveTask() + }, 2000) + + } catch (e: Exception) { + e.printStackTrace() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/shorcutnaver/NavigationReceiver.kt b/app/src/main/java/com/example/shorcutnaver/NavigationReceiver.kt new file mode 100644 index 0000000..a221cdf --- /dev/null +++ b/app/src/main/java/com/example/shorcutnaver/NavigationReceiver.kt @@ -0,0 +1,266 @@ +package com.example.shorcutnaver + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.util.Log + +class NavigationReceiver : BroadcastReceiver() { + + companion object { + + private const val TAG = + "ShortcutNaver" + + private const val REQUEST_NAVIGATION = + "com.example.shorcutnaver.REQUEST_NAVIGATION" + + private const val START_NAVIGATION = + "com.example.shorcutnaver.START_NAVIGATION" + } + + + override fun onReceive( + context: Context, + intent: Intent + ) { + + if ( + intent.action != + REQUEST_NAVIGATION + ) { + return + } + + + Log.d( + TAG, + "================================" + ) + + Log.d( + TAG, + "REQUEST_NAVIGATION 수신!" + ) + + + /* + * 최종 목적지 + */ + + val name = + intent.getStringExtra( + "name" + ) + + val latitude = + intent.getStringExtra( + "latitude" + ) + + val longitude = + intent.getStringExtra( + "longitude" + ) + + + if ( + name.isNullOrBlank() || + latitude.isNullOrBlank() || + longitude.isNullOrBlank() + ) { + + Log.e( + TAG, + "목적지 데이터가 없음" + ) + + return + } + + + /* + * 경유지 개수 + */ + + val waypointCount = + intent.getIntExtra( + "waypoint_count", + 0 + ) + + + Log.d( + TAG, + "목적지" + ) + + Log.d( + TAG, + "name = $name" + ) + + Log.d( + TAG, + "latitude = $latitude" + ) + + Log.d( + TAG, + "longitude = $longitude" + ) + + Log.d( + TAG, + "경유지 수 = $waypointCount" + ) + + + /* + * START_NAVIGATION 생성 + */ + + val serviceIntent = + Intent( + START_NAVIGATION + ).apply { + + setPackage( + context.packageName + ) + + + /* + * 목적지 + */ + + putExtra( + "name", + name + ) + + putExtra( + "latitude", + latitude + ) + + putExtra( + "longitude", + longitude + ) + + + /* + * 경유지 개수 + */ + + putExtra( + "waypoint_count", + waypointCount + ) + + + /* + * 경유지 전달 + */ + + for ( + i in 1..waypointCount + ) { + + val waypointName = + intent.getStringExtra( + "waypoint_${i}_name" + ) + + val waypointLatitude = + intent.getStringExtra( + "waypoint_${i}_latitude" + ) + + val waypointLongitude = + intent.getStringExtra( + "waypoint_${i}_longitude" + ) + + + Log.d( + TAG, + "경유지 $i" + ) + + Log.d( + TAG, + "name = $waypointName" + ) + + Log.d( + TAG, + "latitude = $waypointLatitude" + ) + + Log.d( + TAG, + "longitude = $waypointLongitude" + ) + + + /* + * 유효한 경유지만 전달 + */ + + if ( + !waypointName.isNullOrBlank() && + !waypointLatitude.isNullOrBlank() && + !waypointLongitude.isNullOrBlank() + ) { + + putExtra( + "waypoint_${i}_name", + waypointName + ) + + putExtra( + "waypoint_${i}_latitude", + waypointLatitude + ) + + putExtra( + "waypoint_${i}_longitude", + waypointLongitude + ) + } + } + } + + + /* + * AccessibilityService로 전달 + */ + + try { + + context.sendBroadcast( + serviceIntent + ) + + Log.d( + TAG, + "NmapAccessibilityService로 전달 완료" + ) + + Log.d( + TAG, + "================================" + ) + + } catch (e: Exception) { + + Log.e( + TAG, + "NmapAccessibilityService 전달 실패", + e + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/shorcutnaver/NmapAccessibilityService.kt b/app/src/main/java/com/example/shorcutnaver/NmapAccessibilityService.kt new file mode 100644 index 0000000..6003c61 --- /dev/null +++ b/app/src/main/java/com/example/shorcutnaver/NmapAccessibilityService.kt @@ -0,0 +1,313 @@ +package com.example.shorcutnaver + +import android.accessibilityservice.AccessibilityService +import android.content.BroadcastReceiver +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.net.Uri +import android.os.Build +import android.os.Handler +import android.os.Looper +import android.util.Log +import android.view.accessibility.AccessibilityEvent +import android.view.accessibility.AccessibilityNodeInfo +import java.net.URLEncoder + +class NmapAccessibilityService : AccessibilityService() { + + companion object { + private const val TAG = "NMAP_ACTIVITY" + private const val START_NAVIGATION = "com.example.shorcutnaver.START_NAVIGATION" + private const val NMAP_PACKAGE = "com.nhn.android.nmap" + private const val CHECK_INTERVAL = 3000L + } + + private val handler = Handler(Looper.getMainLooper()) + private var isServiceConnected = false + + private var navigationName: String? = null + private var navigationLatitude: String? = null + private var navigationLongitude: String? = null + + private data class Waypoint(val name: String, val latitude: String, val longitude: String) + + private val navigationWaypoints = mutableListOf() + + private val checkRunnable = object : Runnable { + override fun run() { + if (isServiceConnected) { + checkCurrentScreen() + } + handler.postDelayed(this, CHECK_INTERVAL) + } + } + + private val navigationRequestReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + if (intent?.action != START_NAVIGATION) return + + Log.d(TAG, "================================") + Log.d(TAG, "START_NAVIGATION 수신!") + + val name = intent.getStringExtra("name") + val latitude = intent.getStringExtra("latitude") + val longitude = intent.getStringExtra("longitude") + + if (name.isNullOrBlank() || latitude.isNullOrBlank() || longitude.isNullOrBlank()) { + Log.e(TAG, "목적지 좌표 데이터 없음") + return + } + + navigationName = name + navigationLatitude = latitude + navigationLongitude = longitude + navigationWaypoints.clear() + + val waypointCount = intent.getIntExtra("waypoint_count", 0) + + Log.d(TAG, "목적지") + Log.d(TAG, "name = $name") + Log.d(TAG, "latitude = $latitude") + Log.d(TAG, "longitude = $longitude") + Log.d(TAG, "경유지 수 = $waypointCount") + + for (i in 1..waypointCount) { + val waypointName = intent.getStringExtra("waypoint_${i}_name") + val waypointLatitude = intent.getStringExtra("waypoint_${i}_latitude") + val waypointLongitude = intent.getStringExtra("waypoint_${i}_longitude") + + if (waypointName.isNullOrBlank() || waypointLatitude.isNullOrBlank() || waypointLongitude.isNullOrBlank()) { + Log.d(TAG, "경유지 $i 데이터 없음 → 무시") + continue + } + + navigationWaypoints += Waypoint( + name = waypointName, + latitude = waypointLatitude, + longitude = waypointLongitude + ) + + Log.d(TAG, "경유지 $i 저장") + Log.d(TAG, "name = $waypointName") + Log.d(TAG, "latitude = $waypointLatitude") + Log.d(TAG, "longitude = $waypointLongitude") + } + + Log.d(TAG, "실제 저장된 경유지 = ${navigationWaypoints.size}개") + Log.d(TAG, "좌표 전달 완료 → Navigation 즉시 실행") + + launchNavigation() + + Log.d(TAG, "================================") + } + } + + override fun onServiceConnected() { + super.onServiceConnected() + isServiceConnected = true + + Log.d(TAG, "접근성 서비스 연결됨") + + val filter = IntentFilter(START_NAVIGATION) + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + registerReceiver(navigationRequestReceiver, filter, Context.RECEIVER_NOT_EXPORTED) + } else { + @Suppress("UnspecifiedRegisterReceiverFlag") + registerReceiver(navigationRequestReceiver, filter) + } + + checkCurrentScreen() + + handler.removeCallbacks(checkRunnable) + handler.postDelayed(checkRunnable, CHECK_INTERVAL) + } + + override fun onAccessibilityEvent(event: AccessibilityEvent?) { + if (event == null) return + + if (event.packageName?.toString() != NMAP_PACKAGE) return + + Log.d(TAG, "네이버 지도 이벤트 발생: type=${event.eventType}") + + if (event.eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { + checkCurrentScreen() + } + } + + private fun checkCurrentScreen() { + val root = rootInActiveWindow + + if (root == null) { + Log.d(TAG, "현재 화면을 읽을 수 없음") + return + } + + val packageName = root.packageName?.toString() + + if (packageName != NMAP_PACKAGE) { + root.recycle() + return + } + + checkNavigation(root) + root.recycle() + } + + private fun clickText(root: AccessibilityNodeInfo, target: String): Boolean { + val nodes = root.findAccessibilityNodeInfosByText(target) + + for (node in nodes) { + var current: AccessibilityNodeInfo? = node + + while (current != null) { + if (current.isClickable) { + val result = current.performAction(AccessibilityNodeInfo.ACTION_CLICK) + Log.d(TAG, "$target 클릭 / 결과=$result") + node.recycle() + return result + } + + current = current.parent + } + + node.recycle() + } + + return false + } + + private fun checkNavigation(root: AccessibilityNodeInfo) { + if (findText(root, "경로 안내를 종료하고 길찾기로 이동하시겠습니까?")) { + Log.d(TAG, "경로 종료 확인창 발견 → 아니요 클릭") + clickText(root, "아니요") + return + } + + val condition1 = findText(root, "예약 탭") && findText(root, "대중교통 탭") + val condition2 = findText(root, "최근 경로 더보기") && findText(root, "최근 장소 더보기") && findText(root, "출발지 도착지 전환") + + Log.d(TAG, "화면 검사: condition1=$condition1, condition2=$condition2") + + if (condition1 || condition2) { + Log.d(TAG, "★★★ 네비게이션 화면 감지됨 ★★★") + Log.d(TAG, "condition1 = $condition1") + Log.d(TAG, "condition2 = $condition2") + launchNavigation() + } + } + + private fun findText(node: AccessibilityNodeInfo, target: String): Boolean { + if (node.text?.toString() == target) return true + if (node.contentDescription?.toString() == target) return true + + for (i in 0 until node.childCount) { + val child = node.getChild(i) ?: continue + val found = findText(child, target) + child.recycle() + if (found) return true + } + + return false + } + + private fun launchNavigation() { + val name = navigationName + val latitude = navigationLatitude + val longitude = navigationLongitude + + if (name.isNullOrBlank() || latitude.isNullOrBlank() || longitude.isNullOrBlank()) { + Log.d(TAG, "저장된 좌표 없음 → 기존 Navigation 숏컷 실행") + + val intent = Intent().apply { + component = ComponentName(NMAP_PACKAGE, "com.naver.map.LaunchActivity") + action = "com.naver.map.action.SHORTCUT" + data = Uri.parse("nmap://navigation") + flags = Intent.FLAG_ACTIVITY_NEW_TASK + } + + try { + Log.d(TAG, "Navigation 숏컷 실행") + startActivity(intent) + Log.d(TAG, "Navigation 실행 성공") + } catch (e: Exception) { + Log.e(TAG, "Navigation 실행 실패", e) + } + + return + } + + val encodedName = URLEncoder.encode(name, "UTF-8").replace("+", "%20") + + val uriBuilder = StringBuilder( + "nmap://navigation?dlat=$latitude&dlng=$longitude&dname=$encodedName" + ) + + navigationWaypoints.forEachIndexed { index, waypoint -> + val number = index + 1 + val encodedWaypointName = URLEncoder.encode(waypoint.name, "UTF-8").replace("+", "%20") + + uriBuilder.append("&v${number}lat=${waypoint.latitude}") + uriBuilder.append("&v${number}lng=${waypoint.longitude}") + uriBuilder.append("&v${number}name=$encodedWaypointName") + } + + uriBuilder.append("&appname=$packageName") + + val uri = Uri.parse(uriBuilder.toString()) + + val intent = Intent().apply { + component = ComponentName(NMAP_PACKAGE, "com.naver.map.LaunchActivity") + action = "com.naver.map.action.SHORTCUT" + data = uri + flags = Intent.FLAG_ACTIVITY_NEW_TASK + } + + try { + Log.d(TAG, "================================") + Log.d(TAG, "Navigation 숏컷 실행") + Log.d(TAG, "목적지 = $name") + Log.d(TAG, "latitude = $latitude") + Log.d(TAG, "longitude = $longitude") + Log.d(TAG, "경유지 수 = ${navigationWaypoints.size}") + + navigationWaypoints.forEachIndexed { index, waypoint -> + Log.d(TAG, "경유지 ${index + 1} = ${waypoint.name}") + Log.d(TAG, "경유지 ${index + 1} = ${waypoint.latitude}, ${waypoint.longitude}") + } + + Log.d(TAG, "최종 URI = $uri") + + startActivity(intent) + + Log.d(TAG, "Navigation 실행 성공") + Log.d(TAG, "================================") + + navigationName = null + navigationLatitude = null + navigationLongitude = null + navigationWaypoints.clear() + } catch (e: Exception) { + Log.e(TAG, "Navigation 실행 실패", e) + } + } + + override fun onInterrupt() { + Log.d(TAG, "서비스 중단") + } + + override fun onDestroy() { + isServiceConnected = false + handler.removeCallbacks(checkRunnable) + + try { + unregisterReceiver(navigationRequestReceiver) + } catch (_: Exception) { + } + + Log.d(TAG, "서비스 종료") + super.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/keepRules/rules.keep b/app/src/main/keepRules/rules.keep new file mode 100644 index 0000000..d7e081a --- /dev/null +++ b/app/src/main/keepRules/rules.keep @@ -0,0 +1,12 @@ +# Add project specific R8 rules here. +# AGP will combine all keep rule files in src/main/keepRules to pass to R8 +# +# For more details, see +# https://d.android.com/r/tools/r8/keep-rules + +# 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 *; +#} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..86a5d97 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..6f3b755 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..6f3b755 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000..c209e78 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000..b2dfe3d Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000..4f0f1d6 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 0000000..62b611d Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000..948a307 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..1b9a695 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 0000000..28d4b77 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..9287f50 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 0000000..aa7d642 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..9126ae3 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml new file mode 100644 index 0000000..18aedf4 --- /dev/null +++ b/app/src/main/res/values-night/themes.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..c8524cd --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,5 @@ + + + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..c9a9c5c --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + shorcutnaver + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..2aa9166 --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,9 @@ + + + + +