Bladeren bron

add(person): person page

zhaoyadi 2 jaren geleden
bovenliggende
commit
615e0822f5
52 gewijzigde bestanden met toevoegingen van 561 en 50 verwijderingen
  1. 1 0
      .idea/gradle.xml
  2. 0 1
      .idea/misc.xml
  3. 9 4
      app/build.gradle.kts
  4. 3 3
      app/src/main/AndroidManifest.xml
  5. 38 0
      app/src/main/java/com/zaojiao/app/base/BaseActivity.kt
  6. 0 12
      app/src/main/java/com/zaojiao/app/ui/HomeActivity.kt
  7. 18 0
      app/src/main/java/com/zaojiao/app/ui/home/HomeActivity.kt
  8. 6 0
      app/src/main/java/com/zaojiao/app/ui/home/HomeBBSFragment.kt
  9. 54 0
      app/src/main/java/com/zaojiao/app/ui/home/HomeCourseFragment.kt
  10. 6 0
      app/src/main/java/com/zaojiao/app/ui/home/HomePersonFragment.kt
  11. 6 0
      app/src/main/java/com/zaojiao/app/ui/home/HomePlanFragment.kt
  12. 18 6
      app/src/main/res/layout/activity_home.xml
  13. 6 0
      app/src/main/res/layout/fragment_bbs.xml
  14. 40 0
      app/src/main/res/layout/fragment_course.xml
  15. 90 0
      app/src/main/res/layout/fragment_person.xml
  16. 6 0
      app/src/main/res/layout/fragment_plan.xml
  17. 6 0
      app/src/main/res/layout/item_course.xml
  18. 18 0
      app/src/main/res/menu/nav_home_menu.xml
  19. 6 0
      app/src/main/res/mipmap-anydpi-v33/ic_launcher_round.xml
  20. BIN
      app/src/main/res/mipmap-hdpi/ic_launcher.webp
  21. BIN
      app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
  22. BIN
      app/src/main/res/mipmap-mdpi/ic_launcher.webp
  23. BIN
      app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
  24. BIN
      app/src/main/res/mipmap-xhdpi/ic_cart.png
  25. BIN
      app/src/main/res/mipmap-xhdpi/ic_launcher.webp
  26. BIN
      app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
  27. BIN
      app/src/main/res/mipmap-xhdpi/ic_message.png
  28. BIN
      app/src/main/res/mipmap-xhdpi/ic_qrcode.png
  29. BIN
      app/src/main/res/mipmap-xxhdpi/ic_cart.png
  30. BIN
      app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
  31. BIN
      app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
  32. BIN
      app/src/main/res/mipmap-xxhdpi/ic_message.png
  33. BIN
      app/src/main/res/mipmap-xxhdpi/ic_qrcode.png
  34. BIN
      app/src/main/res/mipmap-xxxhdpi/ic_cart.png
  35. BIN
      app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
  36. BIN
      app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
  37. BIN
      app/src/main/res/mipmap-xxxhdpi/ic_message.png
  38. BIN
      app/src/main/res/mipmap-xxxhdpi/ic_qrcode.png
  39. 23 0
      app/src/main/res/navigation/nav_graph.xml
  40. 0 16
      app/src/main/res/values-night/themes.xml
  41. 7 0
      app/src/main/res/values/ids.xml
  42. 4 0
      app/src/main/res/values/strings.xml
  43. 26 8
      app/src/main/res/values/themes.xml
  44. 19 0
      build.gradle.kts
  45. 43 0
      http/build.gradle.kts
  46. 0 0
      http/consumer-rules.pro
  47. 21 0
      http/proguard-rules.pro
  48. 24 0
      http/src/androidTest/java/com/zaojiao/http/ExampleInstrumentedTest.kt
  49. 4 0
      http/src/main/AndroidManifest.xml
  50. 34 0
      http/src/main/java/com/zaojiao/http/HttpManager.kt
  51. 17 0
      http/src/test/java/com/zaojiao/http/ExampleUnitTest.kt
  52. 8 0
      settings.gradle.kts

+ 1 - 0
.idea/gradle.xml

@@ -12,6 +12,7 @@
           <set>
             <option value="$PROJECT_DIR$" />
             <option value="$PROJECT_DIR$/app" />
+            <option value="$PROJECT_DIR$/http" />
           </set>
         </option>
       </GradleProjectSettings>

+ 0 - 1
.idea/misc.xml

@@ -1,4 +1,3 @@
-<?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="ExternalStorageConfigurationManager" enabled="true" />
   <component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">

+ 9 - 4
app/build.gradle.kts

@@ -1,6 +1,7 @@
 plugins {
     id("com.android.application")
     id("org.jetbrains.kotlin.android")
+    id("androidx.navigation.safeargs.kotlin")
 }
 
 android {
@@ -9,7 +10,7 @@ android {
 
     defaultConfig {
         applicationId = "com.zaojiao.app"
-        minSdk = 24
+        minSdk = 27
         targetSdk = 33
         versionCode = 1
         versionName = "1.0"
@@ -26,18 +27,22 @@ android {
             )
         }
     }
+
     compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_8
-        targetCompatibility = JavaVersion.VERSION_1_8
+        sourceCompatibility = JavaVersion.VERSION_11
+        targetCompatibility = JavaVersion.VERSION_11
     }
+
     kotlinOptions {
-        jvmTarget = "1.8"
+        jvmTarget = "11"
     }
 }
 
 dependencies {
     implementation("androidx.core:core-ktx:1.10.1")
     implementation("androidx.appcompat:appcompat:1.6.1")
+    implementation("androidx.navigation:navigation-fragment-ktx:2.5.3")
+    implementation("androidx.navigation:navigation-ui-ktx:2.5.3")
 
     implementation("androidx.constraintlayout:constraintlayout:2.1.4")
     implementation("androidx.coordinatorlayout:coordinatorlayout:1.2.0")

+ 3 - 3
app/src/main/AndroidManifest.xml

@@ -10,14 +10,14 @@
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
         android:supportsRtl="true"
-        android:theme="@style/Theme.逻辑狗一起成长"
+        android:theme="@style/Theme.Luojigou"
         tools:targetApi="31">
         <activity
-            android:name=".ui.HomeActivity"
+            android:name=".ui.home.HomeActivity"
+            android:theme="@style/Theme.Luojigou.LightBar"
             android:exported="true">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>

+ 38 - 0
app/src/main/java/com/zaojiao/app/base/BaseActivity.kt

@@ -0,0 +1,38 @@
+package com.zaojiao.app.base
+
+import android.graphics.Color
+import android.os.Build
+import android.os.Bundle
+import android.view.WindowManager
+import androidx.annotation.LayoutRes
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.view.WindowCompat
+import androidx.core.view.WindowInsetsCompat
+import androidx.core.view.WindowInsetsControllerCompat
+
+abstract class BaseActivity(@LayoutRes val layoutId: Int? = null) : AppCompatActivity() {
+    private lateinit var windowInsetsController: WindowInsetsControllerCompat
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        configureSystemBar()
+        layoutId?.let { setContentView(it) }
+    }
+
+    /* 配置系统状态栏 */
+    private fun configureSystemBar() {
+        WindowCompat.setDecorFitsSystemWindows(window, false)
+        windowInsetsController = WindowInsetsControllerCompat(window, window.decorView)
+
+        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
+        window.statusBarColor = Color.TRANSPARENT
+        window.navigationBarColor = Color.TRANSPARENT
+
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+            window.addFlags(WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES)
+        }
+        windowInsetsController.apply {
+            show(WindowInsetsCompat.Type.systemBars())
+        }
+    }
+}

+ 0 - 12
app/src/main/java/com/zaojiao/app/ui/HomeActivity.kt

@@ -1,12 +0,0 @@
-package com.zaojiao.app.ui
-
-import androidx.appcompat.app.AppCompatActivity
-import android.os.Bundle
-import com.zaojiao.app.R
-
-class HomeActivity : AppCompatActivity() {
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_home)
-    }
-}

+ 18 - 0
app/src/main/java/com/zaojiao/app/ui/home/HomeActivity.kt

@@ -0,0 +1,18 @@
+package com.zaojiao.app.ui.home
+
+import androidx.appcompat.app.AppCompatActivity
+import android.os.Bundle
+import android.view.WindowManager
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowCompat
+import androidx.core.view.WindowInsetsAnimationCompat
+import androidx.core.view.WindowInsetsCompat
+import androidx.core.view.WindowInsetsControllerCompat
+import com.zaojiao.app.R
+import com.zaojiao.app.base.BaseActivity
+
+class HomeActivity : BaseActivity(R.layout.activity_home) {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+    }
+}

+ 6 - 0
app/src/main/java/com/zaojiao/app/ui/home/HomeBBSFragment.kt

@@ -0,0 +1,6 @@
+package com.zaojiao.app.ui.home
+
+import androidx.fragment.app.Fragment
+
+class HomeBBSFragment : Fragment() {
+}

+ 54 - 0
app/src/main/java/com/zaojiao/app/ui/home/HomeCourseFragment.kt

@@ -0,0 +1,54 @@
+package com.zaojiao.app.ui.home
+
+import android.graphics.Color
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.zaojiao.app.R
+
+class HomeCourseFragment : Fragment() {
+
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? {
+        return inflater.inflate(R.layout.fragment_course, container, false)
+    }
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+
+        val listview = view.findViewById<RecyclerView>(R.id.view_course)
+        listview.layoutManager =
+            LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
+        listview.adapter = HomeCourseAdapter()
+    }
+
+    class HomeCourseAdapter : RecyclerView.Adapter<HomeCourseViewHolder>() {
+        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HomeCourseViewHolder {
+            val view =
+                LayoutInflater.from(parent.context).inflate(R.layout.item_course, parent, false)
+            return HomeCourseViewHolder(view)
+        }
+
+        override fun getItemCount(): Int = 100
+
+        override fun onBindViewHolder(holder: HomeCourseViewHolder, position: Int) {
+            if (position % 2 == 0) {
+                holder.itemView.setBackgroundColor(Color.BLACK)
+            } else {
+                holder.itemView.setBackgroundColor(Color.WHITE)
+            }
+        }
+
+    }
+
+    class HomeCourseViewHolder(view: View) : RecyclerView.ViewHolder(view) {
+
+    }
+}

+ 6 - 0
app/src/main/java/com/zaojiao/app/ui/home/HomePersonFragment.kt

@@ -0,0 +1,6 @@
+package com.zaojiao.app.ui.home
+
+import androidx.fragment.app.Fragment
+
+class HomePersonFragment : Fragment() {
+}

+ 6 - 0
app/src/main/java/com/zaojiao/app/ui/home/HomePlanFragment.kt

@@ -0,0 +1,6 @@
+package com.zaojiao.app.ui.home
+
+import androidx.fragment.app.Fragment
+
+class HomePlanFragment : Fragment() {
+}

+ 18 - 6
app/src/main/res/layout/activity_home.xml

@@ -4,15 +4,27 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    tools:context=".ui.HomeActivity">
+    android:fitsSystemWindows="false"
+    tools:context=".ui.home.HomeActivity">
 
-    <TextView
-        android:layout_width="wrap_content"
+    <androidx.fragment.app.FragmentContainerView
+        android:id="@+id/nav_host_fragment"
+        android:name="androidx.navigation.fragment.NavHostFragment"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        app:defaultNavHost="true"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:navGraph="@navigation/nav_graph" />
+
+    <com.google.android.material.bottomnavigation.BottomNavigationView
+        android:id="@+id/home_nav"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:text="Hello World!"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent" />
-
+        app:menu="@menu/nav_home_menu" />
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 6 - 0
app/src/main/res/layout/fragment_bbs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 40 - 0
app/src/main/res/layout/fragment_course.xml

@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:fitsSystemWindows="true">
+
+    <LinearLayout
+        android:id="@+id/course_header_layout"
+        android:layout_width="match_parent"
+        android:layout_height="60dp"
+        android:layout_marginHorizontal="16dp"
+        android:gravity="center_vertical"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="探索空间"
+            android:textColor="#ff333333"
+            android:textSize="20sp" />
+
+        <View
+            android:layout_width="16dp"
+            android:layout_height="0dp" />
+
+        <androidx.appcompat.widget.SearchView
+            android:layout_width="0dp"
+            android:layout_height="34dp"
+            android:layout_weight="1" />
+    </LinearLayout>
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/view_course"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/course_header_layout" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 90 - 0
app/src/main/res/layout/fragment_person.xml

@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <androidx.appcompat.widget.LinearLayoutCompat
+        android:layout_width="match_parent"
+        android:layout_height="41dp"
+        android:background=""
+        android:fitsSystemWindows="true"
+        android:gravity="center_vertical"
+        android:orientation="vertical">
+
+        <androidx.appcompat.widget.LinearLayoutCompat
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_marginVertical="9dp"
+            android:gravity="end">
+
+            <androidx.appcompat.widget.AppCompatImageView
+                android:layout_width="25dp"
+                android:layout_height="23dp"
+                android:src="@mipmap/ic_message" />
+
+            <View
+                android:layout_width="21dp"
+                android:layout_height="0dp" />
+
+            <androidx.appcompat.widget.AppCompatImageView
+                android:layout_width="25dp"
+                android:layout_height="23dp"
+                android:src="@mipmap/ic_cart" />
+
+            <View
+                android:layout_width="21dp"
+                android:layout_height="0dp" />
+
+            <androidx.appcompat.widget.AppCompatImageView
+                android:layout_width="25dp"
+                android:layout_height="23dp"
+                android:src="@mipmap/ic_qrcode" />
+
+            <View
+                android:layout_width="13dp"
+                android:layout_height="0dp" />
+        </androidx.appcompat.widget.LinearLayoutCompat>
+
+        <View
+            android:layout_width="0dp"
+            android:layout_height="23dp" />
+
+        <androidx.appcompat.widget.LinearLayoutCompat
+            android:layout_width="match_parent"
+            android:layout_height="70dp">
+
+            <androidx.appcompat.widget.AppCompatImageView
+                android:id="@+id/person_avatar"
+                android:layout_width="70dp"
+                android:layout_height="70dp" />
+
+            <View
+                android:layout_width="12dp"
+                android:layout_height="match_parent" />
+
+            <TextView
+                android:id="@+id/person_name"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_vertical"
+                android:text="逻辑狗" />
+
+            <androidx.appcompat.widget.LinearLayoutCompat
+                android:id="@+id/person_homepage"
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="match_parent"
+                    android:gravity="center_vertical"
+                    android:text="个人主页" />
+
+                <View
+                    android:layout_width="7dp"
+                    android:layout_height="match_parent" />
+            </androidx.appcompat.widget.LinearLayoutCompat>
+        </androidx.appcompat.widget.LinearLayoutCompat>
+    </androidx.appcompat.widget.LinearLayoutCompat>
+</ScrollView>

+ 6 - 0
app/src/main/res/layout/fragment_plan.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 6 - 0
app/src/main/res/layout/item_course.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="200dp">
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 18 - 0
app/src/main/res/menu/nav_home_menu.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+        android:id="@id/nav_item_course"
+        android:title="@string/home_item_course" />
+
+    <item
+        android:id="@id/nav_item_plan"
+        android:title="@string/home_item_plan" />
+
+    <item
+        android:id="@id/nav_item_bbs"
+        android:title="@string/home_item_bbs" />
+
+    <item
+        android:id="@+id/nav_item_person"
+        android:title="@string/home_item_person" />
+</menu>

+ 6 - 0
app/src/main/res/mipmap-anydpi-v33/ic_launcher_round.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@drawable/ic_launcher_background" />
+    <foreground android:drawable="@drawable/ic_launcher_foreground" />
+    <monochrome android:drawable="@drawable/ic_launcher_foreground" />
+</adaptive-icon>

BIN
app/src/main/res/mipmap-hdpi/ic_launcher.webp


BIN
app/src/main/res/mipmap-hdpi/ic_launcher_round.webp


BIN
app/src/main/res/mipmap-mdpi/ic_launcher.webp


BIN
app/src/main/res/mipmap-mdpi/ic_launcher_round.webp


BIN
app/src/main/res/mipmap-xhdpi/ic_cart.png


BIN
app/src/main/res/mipmap-xhdpi/ic_launcher.webp


BIN
app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp


BIN
app/src/main/res/mipmap-xhdpi/ic_message.png


BIN
app/src/main/res/mipmap-xhdpi/ic_qrcode.png


BIN
app/src/main/res/mipmap-xxhdpi/ic_cart.png


BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher.webp


BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp


BIN
app/src/main/res/mipmap-xxhdpi/ic_message.png


BIN
app/src/main/res/mipmap-xxhdpi/ic_qrcode.png


BIN
app/src/main/res/mipmap-xxxhdpi/ic_cart.png


BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp


BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp


BIN
app/src/main/res/mipmap-xxxhdpi/ic_message.png


BIN
app/src/main/res/mipmap-xxxhdpi/ic_qrcode.png


+ 23 - 0
app/src/main/res/navigation/nav_graph.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<navigation xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/nav_graph.xml"
+    app:startDestination="@id/homeCourseFragment">
+
+    <fragment
+        android:id="@+id/homeCourseFragment"
+        android:name="com.zaojiao.app.ui.home.HomeCourseFragment"
+        android:label="HomeCourseFragment" />
+    <fragment
+        android:id="@+id/homeBBSFragment"
+        android:name="com.zaojiao.app.ui.home.HomeBBSFragment"
+        android:label="HomeBBSFragment" />
+    <fragment
+        android:id="@+id/homePlanFragment"
+        android:name="com.zaojiao.app.ui.home.HomePlanFragment"
+        android:label="HomePlanFragment" />
+    <fragment
+        android:id="@+id/homePersonFragment"
+        android:name="com.zaojiao.app.ui.home.HomePersonFragment"
+        android:label="HomePersonFragment" />
+</navigation>

+ 0 - 16
app/src/main/res/values-night/themes.xml

@@ -1,16 +0,0 @@
-<resources xmlns:tools="http://schemas.android.com/tools">
-    <!-- Base application theme. -->
-    <style name="Theme.逻辑狗一起成长" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
-        <!-- Primary brand color. -->
-        <item name="colorPrimary">@color/purple_200</item>
-        <item name="colorPrimaryVariant">@color/purple_700</item>
-        <item name="colorOnPrimary">@color/black</item>
-        <!-- Secondary brand color. -->
-        <item name="colorSecondary">@color/teal_200</item>
-        <item name="colorSecondaryVariant">@color/teal_200</item>
-        <item name="colorOnSecondary">@color/black</item>
-        <!-- Status bar color. -->
-        <item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
-        <!-- Customize your theme here. -->
-    </style>
-</resources>

+ 7 - 0
app/src/main/res/values/ids.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <item name="nav_item_course" type="id" />
+    <item name="nav_item_plan" type="id" />
+    <item name="nav_item_bbs" type="id" />
+    <item name="nav_item_person" type="id" />
+</resources>

+ 4 - 0
app/src/main/res/values/strings.xml

@@ -1,3 +1,7 @@
 <resources>
     <string name="app_name">逻辑狗一起成长</string>
+    <string name="home_item_course">探索空间</string>
+    <string name="home_item_plan">学习计划</string>
+    <string name="home_item_bbs">妈咪社团</string>
+    <string name="home_item_person">我的勋章</string>
 </resources>

+ 26 - 8
app/src/main/res/values/themes.xml

@@ -1,16 +1,34 @@
-<resources xmlns:tools="http://schemas.android.com/tools">
-    <!-- Base application theme. -->
-    <style name="Theme.逻辑狗一起成长" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
-        <!-- Primary brand color. -->
+<resources>
+
+    <style name="Theme.Luojigou" parent="Theme.Material3.Light.NoActionBar">
         <item name="colorPrimary">@color/purple_500</item>
         <item name="colorPrimaryVariant">@color/purple_700</item>
         <item name="colorOnPrimary">@color/white</item>
-        <!-- Secondary brand color. -->
+
         <item name="colorSecondary">@color/teal_200</item>
         <item name="colorSecondaryVariant">@color/teal_700</item>
         <item name="colorOnSecondary">@color/black</item>
-        <!-- Status bar color. -->
-        <item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
-        <!-- Customize your theme here. -->
+
+        <item name="windowActionBar">false</item>
+        <item name="windowNoTitle">true</item>
+        <item name="android:windowSoftInputMode">adjustPan</item>
+
+        <item name="android:windowLayoutInDisplayCutoutMode">always</item>
+
+        <item name="bottomNavigationStyle">@style/Theme.App.BottomBar</item>
+    </style>
+
+    <style name="Theme.Luojigou.LightBar">
+        <item name="android:windowLightStatusBar">true</item>
+        <item name="android:windowLightNavigationBar">true</item>
+    </style>
+
+    <style name="Theme.Luojigou.DarkBar">
+        <item name="android:windowLightStatusBar">false</item>
+        <item name="android:windowLightNavigationBar">false</item>
+    </style>
+
+    <style name="Theme.App.BottomBar" parent="Widget.Material3.BottomNavigationView">
+        <item name="android:minHeight">56dp</item>
     </style>
 </resources>

+ 19 - 0
build.gradle.kts

@@ -1,9 +1,12 @@
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile;
+
 rootProject.buildDir = File("build")
 
 buildscript {
     dependencies {
         classpath("com.android.tools.build:gradle:8.0.1")
         classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.21")
+        classpath("androidx.navigation:navigation-safe-args-gradle-plugin:2.5.3")
     }
 }
 
@@ -11,4 +14,20 @@ plugins {
     id("com.android.application").version("8.0.1").apply(false)
     id("com.android.library").version("8.0.1").apply(false)
     id("org.jetbrains.kotlin.android").version("1.8.20").apply(false)
+    id("org.jetbrains.kotlin.kapt").version("1.8.10").apply(false)
+}
+
+subprojects {
+    project.buildDir = File("${rootProject.buildDir}/${project.name}")
+
+    tasks.withType<KotlinCompile>() {
+        kotlinOptions {
+            freeCompilerArgs = listOf("-Xjsr305=strict")
+            jvmTarget = "17"
+        }
+    }
+}
+
+tasks.register("clean", Delete::class) {
+    delete(rootProject.buildDir)
 }

+ 43 - 0
http/build.gradle.kts

@@ -0,0 +1,43 @@
+plugins {
+    id("com.android.library")
+    id("org.jetbrains.kotlin.android")
+}
+
+android {
+    namespace = "com.zaojiao.http"
+    compileSdk = 33
+
+    defaultConfig {
+        minSdk = 27
+
+        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
+        consumerProguardFiles("consumer-rules.pro")
+    }
+
+    buildTypes {
+        release {
+            isMinifyEnabled = false
+            proguardFiles(
+                getDefaultProguardFile("proguard-android-optimize.txt"),
+                "proguard-rules.pro"
+            )
+        }
+    }
+    compileOptions {
+        sourceCompatibility = JavaVersion.VERSION_11
+        targetCompatibility = JavaVersion.VERSION_11
+    }
+    kotlinOptions {
+        jvmTarget = "11"
+    }
+}
+
+dependencies {
+    implementation("androidx.core:core-ktx:1.10.1")
+
+    implementation("com.squareup.okhttp3:okhttp:4.10.0")
+    implementation("com.squareup.okhttp3:logging-interceptor:4.10.0")
+
+    implementation("com.squareup.retrofit2:retrofit:2.9.0")
+    implementation("com.squareup.retrofit2:converter-gson:2.9.0")
+}

+ 0 - 0
http/consumer-rules.pro


+ 21 - 0
http/proguard-rules.pro

@@ -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

+ 24 - 0
http/src/androidTest/java/com/zaojiao/http/ExampleInstrumentedTest.kt

@@ -0,0 +1,24 @@
+package com.zaojiao.http
+
+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.zaojiao.http.test", appContext.packageName)
+    }
+}

+ 4 - 0
http/src/main/AndroidManifest.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest>
+
+</manifest>

+ 34 - 0
http/src/main/java/com/zaojiao/http/HttpManager.kt

@@ -0,0 +1,34 @@
+package com.zaojiao.http
+
+import okhttp3.OkHttpClient
+import retrofit2.Retrofit
+import retrofit2.converter.gson.GsonConverterFactory
+import java.util.concurrent.TimeUnit
+
+object HttpManager {
+    private const val API_ENDPOINT = "https://open.api.luojigou.vip"
+    private const val TIMEOUT: Long = 30 * 1000
+
+    private val okHttpClient by lazy {
+        OkHttpClient.Builder()
+            .connectTimeout(TIMEOUT, TimeUnit.MILLISECONDS)
+            .readTimeout(TIMEOUT, TimeUnit.MILLISECONDS)
+            .writeTimeout(TIMEOUT, TimeUnit.MILLISECONDS)
+            .retryOnConnectionFailure(true)
+            .followRedirects(false)
+            .followSslRedirects(false)
+            .build()
+    }
+
+    private val restfulClient by lazy {
+        Retrofit.Builder()
+            .client(okHttpClient)
+            .baseUrl(API_ENDPOINT)
+            .addConverterFactory(GsonConverterFactory.create())
+            .build()
+    }
+
+    fun <T> create(service: Class<T>): T = restfulClient.create(service)
+
+    inline fun <reified T> create(): T = create(T::class.java)
+}

+ 17 - 0
http/src/test/java/com/zaojiao/http/ExampleUnitTest.kt

@@ -0,0 +1,17 @@
+package com.zaojiao.http
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+    @Test
+    fun addition_isCorrect() {
+        assertEquals(4, 2 + 2)
+    }
+}

+ 8 - 0
settings.gradle.kts

@@ -13,6 +13,14 @@ dependencyResolutionManagement {
         google()
         mavenCentral()
     }
+    versionCatalogs {
+        create("libs") {
+            version("minSdkVersion", "24")
+            version("maxSdkVersion", "33")
+            library("androidx-appcompat", "androidx.appcompat:appcompat:1.6.1")
+        }
+    }
 }
 
 include(":app")
+include(":http")