欢迎页面 及其他页模板

This commit is contained in:
renhaoting 2025-10-22 15:33:04 +08:00
parent 817e7bf467
commit c0480c12e6
13 changed files with 525 additions and 11 deletions

View File

@ -2,6 +2,35 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="com.android.providers.media.MediaProvider" />
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="com.android.vending.BILLING" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<application
android:name=".configs.NovelApplication"
android:allowBackup="true"
@ -13,14 +42,41 @@
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".ui.main.MainActivity"
android:exported="true"
>
android:name=".ui.splash.SplashActivity"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ui.main.MainActivity"
android:exported="false" >
</activity>
<activity
android:name=".ui.search.SearchActivity"
android:exported="false" >
</activity>
<activity
android:name=".ui.discussion.DiscussionActivity"
android:exported="false" >
</activity>
<activity
android:name=".ui.checkin.CheckInActivity"
android:exported="false" >
</activity>
<activity
android:name=".ui.Chat.ChatActivity"
android:exported="false" >
</activity>
</application>
</manifest>

View File

@ -0,0 +1,65 @@
package com.remax.visualnovel.ui.Chat
import androidx.activity.viewModels
import androidx.lifecycle.Observer
import com.alibaba.android.arouter.facade.annotation.Route
import com.alibaba.android.arouter.launcher.ARouter
import com.remax.visualnovel.app.base.BaseBindingActivity
import com.remax.visualnovel.utils.Routers
import com.remax.visualnovel.utils.StatusBarUtils
import com.pengxr.modular.eventbus.generated.events.EventDefineOfUserEvents
import com.remax.visualnovel.databinding.ActivityActorChatBinding
import com.remax.visualnovel.event.model.OnLoginEvent
import com.remax.visualnovel.extension.launchWithRequest
import com.remax.visualnovel.ui.main.MainViewModel
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
@Route(path = Routers.CHAT)
class ChatActivity : BaseBindingActivity<ActivityActorChatBinding>() {
private val mViewModel by viewModels<MainViewModel>()
override fun initView() {
StatusBarUtils.setStatusBarAndNavBarIsLight(this, false)
StatusBarUtils.setTransparent(this)
with(binding) {
}
}
override fun initData() {
}
private val loginObserver = Observer<OnLoginEvent?> {
launchWithRequest({
//TODO - business handling for login events
if (it?.isLogin() == true) {
} else {
}
})
}
override fun onDestroy() {
super.onDestroy()
EventDefineOfUserEvents.onLoginStatusChanged().removeObserver(loginObserver)
}
companion object {
fun start() {
ARouter.getInstance()
.build(Routers.CHAT)
.navigation()
}
}
}

View File

@ -0,0 +1,65 @@
package com.remax.visualnovel.ui.checkin
import androidx.activity.viewModels
import androidx.lifecycle.Observer
import com.alibaba.android.arouter.facade.annotation.Route
import com.alibaba.android.arouter.launcher.ARouter
import com.remax.visualnovel.app.base.BaseBindingActivity
import com.remax.visualnovel.utils.Routers
import com.remax.visualnovel.utils.StatusBarUtils
import com.pengxr.modular.eventbus.generated.events.EventDefineOfUserEvents
import com.remax.visualnovel.databinding.ActivityCheckinBinding
import com.remax.visualnovel.event.model.OnLoginEvent
import com.remax.visualnovel.extension.launchWithRequest
import com.remax.visualnovel.ui.main.MainViewModel
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
@Route(path = Routers.CHECK_IN)
class CheckInActivity : BaseBindingActivity<ActivityCheckinBinding>() {
private val mViewModel by viewModels<MainViewModel>()
override fun initView() {
StatusBarUtils.setStatusBarAndNavBarIsLight(this, false)
StatusBarUtils.setTransparent(this)
with(binding) {
}
}
override fun initData() {
}
private val loginObserver = Observer<OnLoginEvent?> {
launchWithRequest({
//TODO - business handling for login events
if (it?.isLogin() == true) {
} else {
}
})
}
override fun onDestroy() {
super.onDestroy()
EventDefineOfUserEvents.onLoginStatusChanged().removeObserver(loginObserver)
}
companion object {
fun start() {
ARouter.getInstance()
.build(Routers.CHECK_IN)
.navigation()
}
}
}

View File

@ -0,0 +1,66 @@
package com.remax.visualnovel.ui.discussion
import androidx.activity.viewModels
import androidx.lifecycle.Observer
import com.alibaba.android.arouter.facade.annotation.Route
import com.alibaba.android.arouter.launcher.ARouter
import com.remax.visualnovel.app.base.BaseBindingActivity
import com.remax.visualnovel.utils.Routers
import com.remax.visualnovel.utils.StatusBarUtils
import com.pengxr.modular.eventbus.generated.events.EventDefineOfUserEvents
import com.remax.visualnovel.databinding.ActivityCheckinBinding
import com.remax.visualnovel.databinding.ActivityDiscussionBinding
import com.remax.visualnovel.event.model.OnLoginEvent
import com.remax.visualnovel.extension.launchWithRequest
import com.remax.visualnovel.ui.main.MainViewModel
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
@Route(path = Routers.DISCUSSION)
class DiscussionActivity : BaseBindingActivity<ActivityDiscussionBinding>() {
private val mViewModel by viewModels<MainViewModel>()
override fun initView() {
StatusBarUtils.setStatusBarAndNavBarIsLight(this, false)
StatusBarUtils.setTransparent(this)
with(binding) {
}
}
override fun initData() {
}
private val loginObserver = Observer<OnLoginEvent?> {
launchWithRequest({
//TODO - business handling for login events
if (it?.isLogin() == true) {
} else {
}
})
}
override fun onDestroy() {
super.onDestroy()
EventDefineOfUserEvents.onLoginStatusChanged().removeObserver(loginObserver)
}
companion object {
fun start() {
ARouter.getInstance()
.build(Routers.DISCUSSION)
.navigation()
}
}
}

View File

@ -0,0 +1,66 @@
package com.remax.visualnovel.ui.search
import androidx.activity.viewModels
import androidx.lifecycle.Observer
import com.alibaba.android.arouter.facade.annotation.Route
import com.alibaba.android.arouter.launcher.ARouter
import com.remax.visualnovel.app.base.BaseBindingActivity
import com.remax.visualnovel.utils.Routers
import com.remax.visualnovel.utils.StatusBarUtils
import com.pengxr.modular.eventbus.generated.events.EventDefineOfUserEvents
import com.remax.visualnovel.databinding.ActivityCheckinBinding
import com.remax.visualnovel.databinding.ActivitySearchBinding
import com.remax.visualnovel.event.model.OnLoginEvent
import com.remax.visualnovel.extension.launchWithRequest
import com.remax.visualnovel.ui.main.MainViewModel
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
@Route(path = Routers.SEARCH)
class SearchActivity : BaseBindingActivity<ActivitySearchBinding>() {
private val mViewModel by viewModels<MainViewModel>()
override fun initView() {
StatusBarUtils.setStatusBarAndNavBarIsLight(this, false)
StatusBarUtils.setTransparent(this)
with(binding) {
}
}
override fun initData() {
}
private val loginObserver = Observer<OnLoginEvent?> {
launchWithRequest({
//TODO - business handling for login events
if (it?.isLogin() == true) {
} else {
}
})
}
override fun onDestroy() {
super.onDestroy()
EventDefineOfUserEvents.onLoginStatusChanged().removeObserver(loginObserver)
}
companion object {
fun start() {
ARouter.getInstance()
.build(Routers.SEARCH)
.navigation()
}
}
}

View File

@ -0,0 +1,61 @@
package com.remax.visualnovel.ui.splash
import android.os.CountDownTimer
import com.alibaba.android.arouter.facade.annotation.Route
import com.remax.visualnovel.app.base.BaseBindingActivity
import com.remax.visualnovel.utils.Routers
import com.remax.visualnovel.utils.StatusBarUtils
import com.remax.visualnovel.databinding.ActivitySplashBinding
import com.remax.visualnovel.ui.main.MainActivity
import com.remax.visualnovel.utils.TimeUtils
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
@Route(path = Routers.SPLASH)
class SplashActivity : BaseBindingActivity<ActivitySplashBinding>() {
private var mCountDownTimer: CountDownTimer? = null
override fun initView() {
StatusBarUtils.setStatusBarAndNavBarIsLight(this, false)
StatusBarUtils.setTransparent(this)
with(binding) {
}
}
override fun initData() {
startCountDown()
}
private fun startCountDown() {
mCountDownTimer?.cancel()
mCountDownTimer = object : CountDownTimer(TimeUtils.ONE_SECOND * 1, 1000) {
override fun onTick(millisUntilFinished: Long) {
}
override fun onFinish() {
gotoMain()
}
}
mCountDownTimer?.start()
}
private fun gotoMain() {
MainActivity.start()
finish()
}
override fun onDestroy() {
super.onDestroy()
mCountDownTimer?.cancel()
}
}

View File

@ -13,15 +13,8 @@ class Routers {
private const val ROUTER = "/router/"
/**
* 欢迎页
*/
const val WELCOME = "${ROUTER}welcome"
const val TEST = "${ROUTER}test"
/**
* main activity
*/
const val SPLASH = "${ROUTER}splash"
const val MAIN = "${ROUTER}main"
const val ROUTE_FRAG_BOOKLIST = "${ROUTER}bookList"
const val ROUTE_FRAG_MANGALIST = "${ROUTER}mangaList"
@ -30,6 +23,11 @@ class Routers {
const val LOGIN = "${ROUTER}login"
const val REGISTER = "${ROUTER}register"
const val BROWSER = "${ROUTER}browser"
const val CHAT = "${ROUTER}chat"
const val DISCUSSION = "${ROUTER}discussion"
const val SEARCH = "${ROUTER}search"
const val CHECK_IN = "${ROUTER}checkin"

View File

@ -0,0 +1,29 @@
<?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:background="@mipmap/bg_level_1_page"
android:orientation="vertical">
<com.remax.visualnovel.widget.uitoken.view.UITokenTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="@dimen/sp_18"
android:padding="@dimen/dp_10"
android:text="Chat"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:backgroundColorToken="@string/color_surface_element_normal"
app:radiusToken="@string/radius_pill"
app:strokeColorToken="@string/color_surface_top_normal"
app:strokeWidthToken="@string/border_divider"
app:textColorToken="@string/color_txt_secondary_press"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,29 @@
<?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:background="@mipmap/bg_level_1_page"
android:orientation="vertical">
<com.remax.visualnovel.widget.uitoken.view.UITokenTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="@dimen/sp_18"
android:padding="@dimen/dp_10"
android:text="CheckIn"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:backgroundColorToken="@string/color_surface_element_normal"
app:radiusToken="@string/radius_pill"
app:strokeColorToken="@string/color_surface_top_normal"
app:strokeWidthToken="@string/border_divider"
app:textColorToken="@string/color_txt_secondary_press"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,29 @@
<?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:background="@mipmap/bg_level_1_page"
android:orientation="vertical">
<com.remax.visualnovel.widget.uitoken.view.UITokenTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="@dimen/sp_18"
android:padding="@dimen/dp_10"
android:text="Discussion"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:backgroundColorToken="@string/color_surface_element_normal"
app:radiusToken="@string/radius_pill"
app:strokeColorToken="@string/color_surface_top_normal"
app:strokeWidthToken="@string/border_divider"
app:textColorToken="@string/color_txt_secondary_press"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,29 @@
<?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:background="@mipmap/bg_level_1_page"
android:orientation="vertical">
<com.remax.visualnovel.widget.uitoken.view.UITokenTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="@dimen/sp_18"
android:padding="@dimen/dp_10"
android:text="Search"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:backgroundColorToken="@string/color_surface_element_normal"
app:radiusToken="@string/radius_pill"
app:strokeColorToken="@string/color_surface_top_normal"
app:strokeWidthToken="@string/border_divider"
app:textColorToken="@string/color_txt_secondary_press"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,21 @@
<?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:orientation="vertical">
<com.remax.visualnovel.widget.uitoken.view.UITokenImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitCenter"
android:background="@mipmap/splash_bg"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB