Initial commit: HotDeal Alarm Android App

Features:
- Multi-site hot deal scraping (Ppomppu, Clien, Ruriweb, Coolenjoy)
- Site filter with color-coded badges
- Board display names (e.g., ppomppu8 -> 알리뽐뿌)
- Anti-bot protection with request delays and User-Agent rotation
- Keyword matching and notifications
- Material Design 3 UI
This commit is contained in:
sanjeok77
2026-03-04 01:29:34 +09:00
commit 25a349f273
84 changed files with 6455 additions and 0 deletions
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#FFFFFF"
android:pathData="M54,54m-40,0a40,40 0,1 1,80 0a40,40 0,1 1,-80 0"/>
<path
android:fillColor="#1976D2"
android:pathData="M54,30L54,54L74,54A20,20 0,0 0,54 34L54,30A24,24 0,0 1,78 54L54,54L54,78A24,24 0,0 1,30 54A24,24 0,0 1,54 30Z"/>
<path
android:fillColor="#FF9800"
android:pathData="M54,38m-8,0a8,8 0,1 1,16 0a8,8 0,1 1,-16 0"/>
</vector>
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#FFFFFF"/>
<corners android:radius="16dp"/>
<stroke
android:width="1dp"
android:color="#E0E0E0"/>
</shape>
@@ -0,0 +1,74 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widget_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="12dp"
android:background="@drawable/widget_background">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/app_name"
android:textStyle="bold"
android:textSize="14sp"
android:textColor="@android:color/black"/>
<ImageButton
android:id="@+id/btn_refresh"
android:layout_width="32dp"
android:layout_height="32dp"
android:src="@android:drawable/ic_menu_rotate"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/action_refresh"/>
</LinearLayout>
<TextView
android:id="@+id/tv_deal_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:textSize="12sp"
android:maxLines="2"
android:ellipsize="end"
android:textColor="@android:color/black"/>
<TextView
android:id="@+id/tv_deal_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:textSize="12sp"
android:maxLines="2"
android:ellipsize="end"
android:textColor="@android:color/black"/>
<TextView
android:id="@+id/tv_deal_3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:textSize="12sp"
android:maxLines="2"
android:ellipsize="end"
android:textColor="@android:color/black"/>
<TextView
android:id="@+id/tv_empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="@string/deal_list_empty"
android:textSize="12sp"
android:textColor="@android:color/darker_gray"
android:visibility="gone"/>
</LinearLayout>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>
+24
View File
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Dark Mode Colors -->
<color name="primary">#FF90CAF9</color>
<color name="primary_dark">#FF64B5F6</color>
<color name="primary_light">#FFBBDEFB</color>
<color name="secondary">#FFFFB74D</color>
<color name="secondary_dark">#FFFFA726</color>
<color name="background">#FF121212</color>
<color name="surface">#FF1E1E1E</color>
<color name="error">#FFCF6679</color>
<color name="on_primary">#FF000000</color>
<color name="on_secondary">#FF000000</color>
<color name="on_background">#FFE0E0E0</color>
<color name="on_surface">#FFE0E0E0</color>
<color name="on_error">#FF000000</color>
<!-- Site Colors (Dark Mode) -->
<color name="ppomppu">#FFF48FB1</color>
<color name="clien">#FF81C784</color>
<color name="ruriweb">#FF64B5F6</color>
<color name="coolenjoy">#FFFFAB91</color>
<color name="quasarzone">#FFCE93D8</color>
</resources>
+23
View File
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="primary">#FF1976D2</color>
<color name="primary_dark">#FF1565C0</color>
<color name="primary_light">#FF42A5F5</color>
<color name="secondary">#FFFF9800</color>
<color name="secondary_dark">#FFF57C00</color>
<color name="background">#FFFAFAFA</color>
<color name="surface">#FFFFFFFF</color>
<color name="error">#FFD32F2F</color>
<color name="on_primary">#FFFFFFFF</color>
<color name="on_secondary">#FF000000</color>
<color name="on_background">#FF1C1B1F</color>
<color name="on_surface">#FF1C1B1F</color>
<color name="on_error">#FFFFFFFF</color>
<!-- Site Colors -->
<color name="ppomppu">#FFE91E63</color>
<color name="clien">#FF4CAF50</color>
<color name="ruriweb">#FF2196F3</color>
<color name="coolenjoy">#FFFF5722</color>
<color name="quasarzone">#FF9C27B0</color>
</resources>
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#1976D2</color>
</resources>
+40
View File
@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">핫딜 알람</string>
<!-- Navigation -->
<string name="nav_home"></string>
<string name="nav_settings">설정</string>
<string name="nav_deals">핫딜 목록</string>
<!-- Settings -->
<string name="settings_title">설정</string>
<string name="site_selection">사이트 선택</string>
<string name="keyword_settings">키워드 설정</string>
<string name="polling_interval">폴링 간격</string>
<!-- Notifications -->
<string name="notification_channel_name">핫딜 알림</string>
<string name="notification_channel_description">새로운 핫딜이 올라오면 알림을 보냅니다.</string>
<string name="notification_channel_urgent">긴급 핫딜</string>
<string name="notification_channel_urgent_desc">키워드에 매칭된 핫딜 알림</string>
<string name="notification_channel_normal">일반 핫딜</string>
<string name="notification_channel_normal_desc">새로운 핫딜 알림</string>
<string name="notification_channel_background">백그라운드</string>
<string name="notification_channel_background_desc">폴링 상태 알림</string>
<string name="notification_new_deal">새로운 핫딜</string>
<string name="notification_keyword_match">키워드 매칭!</string>
<!-- Widget -->
<string name="widget_title">최근 핫딜</string>
<!-- Deal List -->
<string name="deal_list_empty">수집된 핫딜이 없습니다</string>
<string name="deal_list_loading">불러오는 중…</string>
<string name="deal_list_error">데이터를 불러오는데 실패했습니다</string>
<!-- Actions -->
<string name="action_refresh">새로고침</string>
<string name="action_share">공유</string>
<string name="action_favorite">즐겨찾기</string>
</resources>
+11
View File
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.HotDealAlarm" parent="android:Theme.Material.Light.NoActionBar">
<item name="android:colorPrimary">@color/primary</item>
<item name="android:colorPrimaryDark">@color/primary_dark</item>
<item name="android:colorAccent">@color/secondary</item>
<item name="android:statusBarColor">@color/primary_dark</item>
<item name="android:navigationBarColor">@color/background</item>
<item name="android:windowLightNavigationBar">true</item>
</style>
</resources>
+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Sample backup rules file
-->
<full-backup-content>
<include domain="sharedpref" path="."/>
<exclude domain="sharedpref" path="device.xml"/>
</full-backup-content>
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Sample data extraction rules file
-->
<data-extraction-rules>
<cloud-backup>
<include domain="sharedpref" path="."/>
<exclude domain="sharedpref" path="device.xml"/>
</cloud-backup>
<device-transfer>
<include domain="sharedpref" path="."/>
<exclude domain="sharedpref" path="device.xml"/>
</device-transfer>
</data-extraction-rules>
+11
View File
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="250dp"
android:minHeight="110dp"
android:updatePeriodMillis="1800000"
android:initialLayout="@layout/widget_hot_deal"
android:resizeMode="horizontal|vertical"
android:widgetCategory="home_screen"
android:previewImage="@drawable/ic_launcher_foreground"
android:description="@string/app_name">
</appwidget-provider>