This commit is contained in:
lunaticbum 2025-07-16 12:56:56 +09:00
parent 3d65f30516
commit 405b8c8fed
14 changed files with 2926 additions and 2117 deletions

View File

@ -111,7 +111,9 @@ dependencies {
implementation("com.github.delight-im:Android-AdvancedWebView:v3.2.1")
implementation(project(":library"))
implementation(project(":utils"))
// implementation ("org.apache.tika:tika-parsers:1.12")
// implementation("org.mozilla.geckoview:geckoview:139.0.20250523173407")
// https://mvnrepository.com/artifact/org.mozilla.geckoview/geckoview
implementation("org.mozilla.geckoview:geckoview:139.0.20250523173407")
// implementation("org.opencv:opencv-android:4.11.0")

View File

@ -78,12 +78,12 @@
android:windowSoftInputMode="adjustResize"
android:requestLegacyExternalStorage="true"
>
<!-- android:excludeFromRecents="true"-->
<activity
android:name=".LauncherActivity"
android:theme="@style/Theme.LunarLauncher.Starting"
android:launchMode="singleInstance"
android:excludeFromRecents="true"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|screenLayout|layoutDirection"
android:windowSoftInputMode="adjustResize"
android:exported="true">
@ -93,9 +93,9 @@
<data android:mimeType="*/*"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.HOME" />
<action android:name="android.intent.action.MAIN"/>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

View File

@ -76,7 +76,6 @@ import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
import bums.lunatic.launcher.apps.AppDrawer
import bums.lunatic.launcher.common.CommonActivity
import bums.lunatic.launcher.databinding.LauncherActivityBinding
import bums.lunatic.launcher.feeds.Feeds
import bums.lunatic.launcher.feeds.WidgetHost
import bums.lunatic.launcher.helpers.BluetoothManager
import bums.lunatic.launcher.helpers.Constants.Companion.KEY_APPLICATION_THEME
@ -1038,9 +1037,9 @@ internal class LauncherActivity : CommonActivity() {
// }
// }
fun switchFeeds() {
startActivity(Intent(this,Feeds::class.java))
}
// fun switchFeeds() {
// startActivity(Intent(this,Feeds::class.java))
// }
// inner class MyJavaScriptInterface(val webView: WebView) {
// @JavascriptInterface

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,473 @@
package bums.lunatic.launcher.home
import android.content.Context
import android.os.Handler
import android.os.Looper
import android.os.Message
import android.util.AttributeSet
import android.util.Log
import android.view.KeyEvent
import android.view.KeyEvent.ACTION_UP
import android.view.KeyEvent.KEYCODE_BUTTON_A
import android.view.KeyEvent.KEYCODE_BUTTON_B
import android.view.KeyEvent.KEYCODE_BUTTON_SELECT
import android.view.KeyEvent.KEYCODE_BUTTON_START
import android.view.KeyEvent.KEYCODE_BUTTON_X
import android.view.KeyEvent.KEYCODE_BUTTON_Y
import android.view.KeyEvent.KEYCODE_DPAD_DOWN
import android.view.KeyEvent.KEYCODE_DPAD_UP
import bums.lunatic.launcher.utils.Blog
import com.google.gson.Gson
import org.json.JSONObject
import org.mozilla.gecko.util.ThreadUtils
import org.mozilla.geckoview.ExperimentDelegate
import org.mozilla.geckoview.GeckoResult
import org.mozilla.geckoview.GeckoRuntime
import org.mozilla.geckoview.GeckoRuntimeSettings
import org.mozilla.geckoview.GeckoSession
import org.mozilla.geckoview.GeckoView
import org.mozilla.geckoview.MediaSession
import org.mozilla.geckoview.WebExtension
import org.mozilla.geckoview.WebExtension.MessageDelegate
import org.mozilla.geckoview.WebExtension.PortDelegate
import org.mozilla.geckoview.WebExtensionController.AddonManagerDelegate
import org.mozilla.geckoview.WebRequestError
class GeckoWeb : GeckoView {
constructor(context: Context?) : super(context) {
initWithContext(context)
}
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) {
initWithContext(context)
}
fun loadUrl(url: String) {
Blog.LOGE("url >>>> ${url}")
if (url.split("//").size > 1) {
url.replace("//","/").replace("https:/","https://").let {
Blog.LOGE("url >> ${url} , it >>> ${it}")
this.session?.loadUri(url)
}
} else {
this.session?.loadUri(url)
}
currentRetryCount = 0;
}
val handle = object : Handler(Looper.getMainLooper()) {
override fun handleMessage(msg: Message) {
if (msg.what == 0) {
(msg.obj as? ReaderConfig)?.let {
}
}
}
}
var lastedUrl: String? = null
var canGoBack: Boolean? = null
var mPort: WebExtension.Port? = null
object WebExtensionInfo {
val mPortNam = "browser"
val extPath = "resource://android/assets/extensions/my_extension/"
val extId = "messaging@booktoki468.com"
}
var mExtension: WebExtension? = null
var mSession: GeckoSession? = null
val addonManagerDelegate = object : AddonManagerDelegate {
override fun onReady(extension: WebExtension) {
Blog.LOGE("onReady ${extension.id} from WebExtension")
mExtension = extension
}
override fun onEnabling(extension: WebExtension) {
Blog.LOGE("onEnabling ${extension.id} from WebExtension")
}
override fun onEnabled(extension: WebExtension) {
Blog.LOGE("onEnabled ${extension.id} from WebExtension")
mExtension = extension
}
}
private fun initWithContext(context: Context?) {
context?.let { context ->
initGeckoRuntime(context)
mSession = GeckoSession()
mSession?.contentDelegate = contentDelegate
mSession?.progressDelegate = progressDelegate
mSession?.navigationDelegate = navigationDelegate
sRuntime?.apply {
webExtensionController.setAddonManagerDelegate(addonManagerDelegate)
webExtensionController.ensureBuiltIn(WebExtensionInfo.extPath, WebExtensionInfo.extId)
.accept( // Register message delegate for background script
{ extension: WebExtension? ->
ThreadUtils.runOnUiThread(Runnable { mSession?.let{session-> extension?.let { session.webExtensionController.setMessageDelegate(it,messageDelegate,WebExtensionInfo.mPortNam) }} })
},
{ e: Throwable? -> Log.e("MessageDelegate", "Error registering WebExtension", e) })
mSession?.mediaDelegate = mediaDelegate
mSession?.mediaSessionDelegate = mediaSessionDelegate
mSession?.open(sRuntime!!)
}.let {
this.setSession(mSession!!)
this.loadUrl("https://booktoki468.com") // Or any other URL...
}
}
}
val mediaDelegate = object : GeckoSession.MediaDelegate {
override fun onRecordingStatusChanged(
session: GeckoSession,
devices: Array<out GeckoSession.MediaDelegate.RecordingDevice?>
) {
super.onRecordingStatusChanged(session, devices)
}
}
val mediaSessionDelegate = object : MediaSession.Delegate {
override fun onActivated(
session: GeckoSession,
mediaSession: MediaSession
) {
Blog.LOGE("onActivated")
super.onActivated(session, mediaSession)
}
override fun onDeactivated(
session: GeckoSession,
mediaSession: MediaSession
) {
Blog.LOGE("onDeactivated")
super.onDeactivated(session, mediaSession)
}
override fun onMetadata(
session: GeckoSession,
mediaSession: MediaSession,
meta: MediaSession.Metadata
) {
Blog.LOGE("onMetadata ${Gson().toJson(meta)}")
super.onMetadata(session, mediaSession, meta)
}
override fun onFeatures(
session: GeckoSession,
mediaSession: MediaSession,
features: Long
) {
Blog.LOGE("onFeatures $features")
super.onFeatures(session, mediaSession, features)
}
override fun onPlay(
session: GeckoSession,
mediaSession: MediaSession
) {
Blog.LOGE("onPlay")
super.onPlay(session, mediaSession)
}
override fun onPause(
session: GeckoSession,
mediaSession: MediaSession
) {
Blog.LOGE("onPause")
super.onPause(session, mediaSession)
}
override fun onStop(
session: GeckoSession,
mediaSession: MediaSession
) {
Blog.LOGE("onStop")
super.onStop(session, mediaSession)
}
override fun onPositionState(
session: GeckoSession,
mediaSession: MediaSession,
state: MediaSession.PositionState
) {
Blog.LOGE("onPositionState $state")
super.onPositionState(session, mediaSession, state)
}
override fun onFullscreen(
session: GeckoSession,
mediaSession: MediaSession,
enabled: Boolean,
meta: MediaSession.ElementMetadata?
) {
Blog.LOGE("onFullscreen $Boolean ${Gson().toJson(meta)}")
super.onFullscreen(session, mediaSession, enabled, meta)
}
}
private fun initGeckoRuntime(context : Context) {
if (sRuntime == null) {
try {
val settings: GeckoRuntimeSettings =
GeckoRuntimeSettings.Builder().extensionsProcessEnabled(true)
.extensionsWebAPIEnabled(true)
.experimentDelegate(experimentDelegate)
.remoteDebuggingEnabled(true).build()
sRuntime = GeckoRuntime.create(context, settings)
} catch (e: Exception) {
}
}
}
val experimentDelegate = object : ExperimentDelegate {
override fun onGetExperimentFeature(feature: String): GeckoResult<JSONObject?> {
Blog.LOGE("onGetExperimentFeature $feature")
return super.onGetExperimentFeature(feature)
}
override fun onRecordExposureEvent(feature: String): GeckoResult<Void?> {
Blog.LOGE("onRecordExposureEvent $feature")
return super.onRecordExposureEvent(feature)
}
override fun onRecordExperimentExposureEvent(
feature: String,
slug: String
): GeckoResult<Void?> {
Blog.LOGE("onRecordExperimentExposureEvent $feature , $slug")
return super.onRecordExperimentExposureEvent(feature, slug)
}
override fun onRecordMalformedConfigurationEvent(
feature: String,
part: String
): GeckoResult<Void?> {
Blog.LOGE("onRecordMalformedConfigurationEvent $feature , $part")
return super.onRecordMalformedConfigurationEvent(feature, part)
}
}
val contentDelegate = object : GeckoSession.ContentDelegate {
override fun onTitleChange(
session: GeckoSession,
title: String?
) {
Blog.LOGE("onTitleChange $title")
super.onTitleChange(session, title)
}
override fun onCrash(session: GeckoSession) {
Blog.LOGE("onCrash")
super.onCrash(session)
}
override fun onPaintStatusReset(session: GeckoSession) {
Blog.LOGE("onPaintStatusReset")
super.onPaintStatusReset(session)
}
override fun onFirstContentfulPaint(session: GeckoSession) {
Blog.LOGE("onFirstContentfulPaint")
super.onFirstContentfulPaint(session)
}
}
val progressDelegate = object : GeckoSession.ProgressDelegate {
override fun onSecurityChange(
session: GeckoSession,
securityInfo: GeckoSession.ProgressDelegate.SecurityInformation
) {
Blog.LOGE("onSecurityChange $securityInfo from WebExtension")
super.onSecurityChange(session, securityInfo)
}
override fun onSessionStateChange(
session: GeckoSession,
sessionState: GeckoSession.SessionState
) {
Blog.LOGE("onSessionStateChange $sessionState from WebExtension")
super.onSessionStateChange(session, sessionState)
}
override fun onPageStart(session: GeckoSession, url: String) {
super.onPageStart(session, url)
}
override fun onPageStop(session: GeckoSession, success: Boolean) {
Blog.LOGE("onPageStop $success from WebExtension")
super.onPageStop(session, success)
if (success && mPort != null) {
if (mPort == null) {
// No extension registered yet, let's ignore this message
return
}
}
}
}
val navigationDelegate = object : GeckoSession.NavigationDelegate {
override fun onLoadError(
session: GeckoSession,
uri: String?,
error: WebRequestError
): GeckoResult<String>? {
error.printStackTrace()
Blog.LOGE("onLoadError >>> ${uri} ::>> ${error.category} , ${error.code}")
if (error.code == WebRequestError.ERROR_NET_RESET) {
}
return super.onLoadError(session, uri, error)
}
override fun onNewSession(
session: GeckoSession,
uri: String
): GeckoResult<GeckoSession>? {
Blog.LOGE("GeckoView", "onNewSession: $session from WebExtension")
return super.onNewSession(session, uri)
}
override fun onLocationChange(
session: GeckoSession,
url: String?,
perms: MutableList<GeckoSession.PermissionDelegate.ContentPermission>,
hasUserGesture: Boolean
) {
// url이 현재 로드된 주소입니다.
Blog.LOGE("GeckoView", "현재 주소: $url")
Blog.LOGE("GeckoView", "현재 session: $session")
url?.let { url ->
if (url.split("//").size > 1) {
url.replace("//", "/").replace("https:/", "https://").let {
Blog.LOGE("url >> ${url} , it >>> ${it}")
lastedUrl = url
}
} else {
lastedUrl = url
}
}
}
override fun onCanGoBack(session: GeckoSession, canGoBack: Boolean) {
super.onCanGoBack(session, canGoBack)
this@GeckoWeb.canGoBack = canGoBack
if (canGoBack) {
}
}
}
val portDelegate: PortDelegate =
object : PortDelegate {
override fun onPortMessage(
message: Any, port: WebExtension.Port
) {
Blog.LOGE("PortDelegate", "Received message from extension: $message")
}
override fun onDisconnect(port: WebExtension.Port) {
// This port is not usable anymore.
if (port === mPort) {
mPort = null
}
}
}
val messageDelegate: MessageDelegate =
object : MessageDelegate {
override fun onConnect(port: WebExtension.Port) {
mPort = port
mPort!!.setDelegate(portDelegate)
}
override fun onMessage(
nativeApp: String,
message: Any,
sender: WebExtension.MessageSender
): GeckoResult<in Any>? {
Blog.LOGE(
"messageDelegate",
"onMessage from WebExtension: ${nativeApp} , $message , ${sender.webExtension.id}"
)
return super.onMessage(nativeApp, message, sender)
}
}
fun onStart() {
}
fun onResume() {
}
fun onDestroy() {
sRuntime = null
}
override fun dispatchKeyEvent(ev: KeyEvent): Boolean {
Blog.LOGE("dispatch ev?.device?.name >>> ${ev?.device?.name}")
if (ev?.device?.name?.contains("SM-031N Mouse") == true) {
when (ev.action) {
ACTION_UP -> {
Blog.LOGE("dispatch dispatchKeyEvent>>> ${ev}")
when (ev.keyCode) {
KEYCODE_BUTTON_Y -> {
}
KEYCODE_BUTTON_X -> {
}
KEYCODE_BUTTON_A -> {
}
KEYCODE_BUTTON_B -> {
}
KEYCODE_DPAD_DOWN -> {
}
KEYCODE_DPAD_UP -> {
}
KEYCODE_BUTTON_START -> {
}
KEYCODE_BUTTON_SELECT -> {
}
else -> {}
}
}
else -> {}
}
return true
}
return super.dispatchKeyEvent(ev)
}
companion object {
private const val TAG = "DualScreenStatus"
var sRuntime: GeckoRuntime? = null
var currentRetryCount = 0
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -121,7 +121,7 @@ class RssViewerActivity : AwesomeWebViewActivity(), View.OnGenericMotionListene
} else {
loadWithIntent = false
}
webView?.setOnTouchListener(this)
webView?.setOnTouchListener(this)
}
private var startX = 0f

View File

@ -45,7 +45,7 @@ class OpenWeatherGetter(context: Context, workerParams: WorkerParameters) : Base
}
fun getWeather(latitude: Double, longitude: Double) {
Blog.LOGE("into getWeather")
Blog.LOGE("into getWeather ${PrefString.weatherApiKey.get()}")
///saved weatherForcast
Retrofit.Builder()
.baseUrl(URI_WEATHERAPI)

View File

@ -7,12 +7,6 @@
android:id="@+id/mainFragmentsContainer"
android:fitsSystemWindows="true">
<WebView
android:layout_margin="@dimen/default_layout_margin"
android:id="@+id/searcher_01"
android:layout_width="match_parent"
android:alpha="0"
android:layout_height="match_parent"/>
<androidx.fragment.app.FragmentContainerView
android:id="@+id/home"
@ -20,19 +14,6 @@
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<!-- <FrameLayout-->
<!-- android:id="@+id/feeds"-->
<!-- android:visibility="gone"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="match_parent" >-->
<!-- </FrameLayout>-->
<FrameLayout
android:visibility="gone"
android:id="@+id/app_drawer"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</FrameLayout>
</FrameLayout>

View File

@ -7,334 +7,23 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/batteryProgress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/default_layout_margin"
android:indeterminate="false"
android:visibility="gone"
style="@style/normal"
android:text="빠떼뤼 ~> 0%"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<bums.lunatic.launcher.view.DateTimeView
<androidx.recyclerview.widget.RecyclerView
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
android:layout_margin="@dimen/default_layout_margin"
android:id="@+id/infoList"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="@drawable/base_bg"
android:text="this is init sentence"
android:id="@+id/time"
android:visibility="gone"
android:gravity="center"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/batteryProgress"
tools:ignore="MissingConstraints" />
<ImageView
android:id="@+id/next_play"
android:src="@drawable/play_song"
app:layout_constraintRight_toRightOf="@id/time"
app:layout_constraintTop_toTopOf="@id/time"
app:layout_constraintBottom_toBottomOf="@id/time"
android:layout_width="wrap_content"
android:adjustViewBounds="true"
android:layout_margin="@dimen/default_layout_margin"
android:layout_height="40dp"/>
<bums.lunatic.launcher.view.CircleImageView
app:layout_constraintLeft_toLeftOf="@id/time"
app:layout_constraintTop_toTopOf="@id/time"
app:layout_constraintBottom_toBottomOf="@id/time"
android:layout_margin="@dimen/default_layout_margin"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:background="@null"
android:layout_width="wrap_content"
app:civ_border_width="1dp"
app:civ_border_color="#000000"
app:civ_label="택시"
android:visibility="gone"
android:layout_height="0dp"
android:src="@drawable/kakaot"
android:id="@+id/alchol_katalkT"/>
<!-- <com.google.android.material.textview.MaterialTextView-->
<!-- android:id="@+id/weather"-->
<!-- app:layout_goneMarginBottom="0dp"-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:gravity="center"-->
<!-- android:maxLines="1"-->
<!-- android:textIsSelectable="false"-->
<!-- app:layout_constraintLeft_toLeftOf="parent"-->
<!-- app:layout_constraintRight_toRightOf="parent"-->
<!-- app:layout_constraintTop_toBottomOf="@+id/time"-->
<!-- />-->
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/current_music"
app:layout_constraintTop_toBottomOf="@id/time"
app:layout_constraintLeft_toLeftOf="parent"
android:background="@drawable/base_bg"
android:layout_margin="@dimen/default_layout_margin"
app:layout_goneMarginTop="0dp"
app:layout_goneMarginBottom="0dp"
android:layout_height="match_parent"
android:overScrollMode="never"
android:padding="@dimen/default_padding"
android:visibility="gone"
app:layout_constraintRight_toRightOf="parent"
android:layout_width="match_parent"
android:layout_height="60dp">
<bums.lunatic.launcher.view.CircleImageView
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:id="@+id/album_art"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:layout_width="wrap_content"
android:layout_height="50dp"/>
<TextView
android:layout_margin="@dimen/default_layout_margin"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toRightOf="@id/album_art"
app:layout_constraintRight_toLeftOf="@id/next_btn"
android:gravity="left"
style="@style/small"
android:lines="1"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:layout_width="0dp"
android:id="@+id/artist"
android:layout_height="wrap_content"/>
<TextView
android:layout_margin="@dimen/default_layout_margin"
app:layout_constraintTop_toBottomOf="@id/artist"
android:id="@+id/title"
android:gravity="left"
style="@style/small"
android:lines="1"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
app:layout_constraintBottom_toBottomOf="@id/album_art"
app:layout_constraintLeft_toRightOf="@id/album_art"
app:layout_constraintRight_toLeftOf="@id/next_btn"
android:layout_width="0dp"
android:layout_height="wrap_content"/>
<ImageView
android:layout_margin="@dimen/default_layout_margin"
android:id="@+id/next_btn"
android:src="@drawable/next_song"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:layout_width="wrap_content"
android:layout_height="40dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>
<include
android:layout_margin="@dimen/default_layout_margin"
android:id="@+id/weathers"
layout="@layout/weather_book"
android:visibility="gone"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/current_music"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<LinearLayout
android:layout_margin="@dimen/default_layout_margin"
android:id="@+id/summaryChoose"
android:layout_width="0dp"
android:gravity="center"
android:scrollbars="none"
android:visibility="visible"
android:background="@drawable/base_bg"
app:layout_constraintLeft_toLeftOf="parent"
android:orientation="horizontal"
app:layout_constraintRight_toRightOf="parent"
android:layout_height="40dp"
app:layout_constraintTop_toBottomOf="@+id/weathers"
>
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
/>
<TextView
style="@style/normal"
android:id="@+id/missedCalls"
android:gravity="center"
android:textColor="@color/tabs"
android:text="통화 목록"
android:background="@null"
android:checked="true"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
style="@style/normal"
android:id="@+id/otherCheck"
android:gravity="center"
android:background="@null"
android:text="글타래"
android:textColor="@color/tabs"
android:checked="false"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
style="@style/normal"
android:id="@+id/favApps"
android:gravity="center"
android:background="@null"
android:text="앱스"
android:textColor="@color/tabs"
android:checked="false"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
style="@style/normal"
android:id="@+id/recentSms"
android:gravity="center"
android:background="@null"
android:text="문자 내역"
android:textColor="@color/tabs"
android:checked="false"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
style="@style/normal"
android:id="@+id/notice"
android:gravity="center"
android:background="@null"
android:text="알림"
android:textColor="@color/tabs"
android:checked="false"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@+id/summaryChoose"
app:layout_constraintBottom_toTopOf="@id/functionLayer"
>
<androidx.recyclerview.widget.RecyclerView
android:layout_margin="@dimen/default_layout_margin"
android:id="@+id/mainList"
android:layout_width="0dp"
android:layout_height="0dp"
android:overScrollMode="never"
android:padding="@dimen/default_padding"
android:visibility="gone"
android:background="@drawable/base_bg"
android:scrollbars="none"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="2"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
/>
<androidx.recyclerview.widget.RecyclerView
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="2"
android:layout_margin="@dimen/default_layout_margin"
android:id="@+id/smsList"
android:layout_width="0dp"
android:layout_height="0dp"
android:overScrollMode="never"
android:padding="@dimen/default_padding"
android:scrollbars="none"
android:visibility="gone"
android:background="@drawable/base_bg"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
/>
<androidx.recyclerview.widget.RecyclerView
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
android:layout_margin="@dimen/default_layout_margin"
android:id="@+id/infoList"
android:layout_width="0dp"
android:layout_height="0dp"
android:overScrollMode="never"
android:padding="@dimen/default_padding"
android:scrollbars="none"
android:visibility="gone"
android:background="@drawable/base_bg"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
/>
<androidx.recyclerview.widget.RecyclerView
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
android:layout_margin="@dimen/default_layout_margin"
android:id="@+id/appsList"
android:layout_width="0dp"
android:layout_height="0dp"
android:overScrollMode="never"
android:padding="@dimen/default_padding"
app:spanCount="3"
android:scrollbars="none"
android:visibility="gone"
android:background="@drawable/base_bg"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
/>
<androidx.recyclerview.widget.RecyclerView
android:layout_margin="@dimen/default_layout_margin"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
android:id="@+id/notiList"
android:layout_width="0dp"
android:layout_height="0dp"
android:overScrollMode="never"
android:padding="@dimen/default_padding"
android:scrollbars="none"
android:visibility="gone"
android:background="@drawable/base_bg"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
/>
</RelativeLayout>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_margin="@dimen/default_layout_margin"
android:id="@+id/functionLayer"
android:layout_width="@dimen/zero"
android:layout_height="40dp"
android:layout_marginTop="@dimen/default_layout_margin"
android:layout_marginBottom="@dimen/default_layout_margin"
android:background="@drawable/base_bg"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent" >
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,340 @@
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:background="@android:color/transparent"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/batteryProgress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/default_layout_margin"
android:indeterminate="false"
android:visibility="gone"
style="@style/normal"
android:text="빠떼뤼 ~> 0%"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<bums.lunatic.launcher.view.DateTimeView
android:layout_margin="@dimen/default_layout_margin"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="@drawable/base_bg"
android:text="this is init sentence"
android:id="@+id/time"
android:visibility="gone"
android:gravity="center"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/batteryProgress"
tools:ignore="MissingConstraints" />
<ImageView
android:id="@+id/next_play"
android:src="@drawable/play_song"
app:layout_constraintRight_toRightOf="@id/time"
app:layout_constraintTop_toTopOf="@id/time"
app:layout_constraintBottom_toBottomOf="@id/time"
android:layout_width="wrap_content"
android:adjustViewBounds="true"
android:layout_margin="@dimen/default_layout_margin"
android:layout_height="40dp"/>
<bums.lunatic.launcher.view.CircleImageView
app:layout_constraintLeft_toLeftOf="@id/time"
app:layout_constraintTop_toTopOf="@id/time"
app:layout_constraintBottom_toBottomOf="@id/time"
android:layout_margin="@dimen/default_layout_margin"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:background="@null"
android:layout_width="wrap_content"
app:civ_border_width="1dp"
app:civ_border_color="#000000"
app:civ_label="택시"
android:visibility="gone"
android:layout_height="0dp"
android:src="@drawable/kakaot"
android:id="@+id/alchol_katalkT"/>
<!-- <com.google.android.material.textview.MaterialTextView-->
<!-- android:id="@+id/weather"-->
<!-- app:layout_goneMarginBottom="0dp"-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:gravity="center"-->
<!-- android:maxLines="1"-->
<!-- android:textIsSelectable="false"-->
<!-- app:layout_constraintLeft_toLeftOf="parent"-->
<!-- app:layout_constraintRight_toRightOf="parent"-->
<!-- app:layout_constraintTop_toBottomOf="@+id/time"-->
<!-- />-->
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/current_music"
app:layout_constraintTop_toBottomOf="@id/time"
app:layout_constraintLeft_toLeftOf="parent"
android:background="@drawable/base_bg"
android:layout_margin="@dimen/default_layout_margin"
app:layout_goneMarginTop="0dp"
app:layout_goneMarginBottom="0dp"
android:padding="@dimen/default_padding"
android:visibility="gone"
app:layout_constraintRight_toRightOf="parent"
android:layout_width="match_parent"
android:layout_height="60dp">
<bums.lunatic.launcher.view.CircleImageView
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:id="@+id/album_art"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:layout_width="wrap_content"
android:layout_height="50dp"/>
<TextView
android:layout_margin="@dimen/default_layout_margin"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toRightOf="@id/album_art"
app:layout_constraintRight_toLeftOf="@id/next_btn"
android:gravity="left"
style="@style/small"
android:lines="1"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:layout_width="0dp"
android:id="@+id/artist"
android:layout_height="wrap_content"/>
<TextView
android:layout_margin="@dimen/default_layout_margin"
app:layout_constraintTop_toBottomOf="@id/artist"
android:id="@+id/title"
android:gravity="left"
style="@style/small"
android:lines="1"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
app:layout_constraintBottom_toBottomOf="@id/album_art"
app:layout_constraintLeft_toRightOf="@id/album_art"
app:layout_constraintRight_toLeftOf="@id/next_btn"
android:layout_width="0dp"
android:layout_height="wrap_content"/>
<ImageView
android:layout_margin="@dimen/default_layout_margin"
android:id="@+id/next_btn"
android:src="@drawable/next_song"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:layout_width="wrap_content"
android:layout_height="40dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>
<include
android:layout_margin="@dimen/default_layout_margin"
android:id="@+id/weathers"
layout="@layout/weather_book"
android:visibility="gone"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/current_music"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<LinearLayout
android:layout_margin="@dimen/default_layout_margin"
android:id="@+id/summaryChoose"
android:layout_width="0dp"
android:gravity="center"
android:background="@drawable/base_bg"
app:layout_constraintLeft_toLeftOf="parent"
android:orientation="horizontal"
app:layout_constraintRight_toRightOf="parent"
android:layout_height="40dp"
app:layout_constraintTop_toBottomOf="@+id/weathers"
>
<TextView
style="@style/normal"
android:id="@+id/missedCalls"
android:gravity="center"
android:textColor="@color/tabs"
android:text="통화 목록"
android:background="@null"
android:checked="true"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
style="@style/normal"
android:id="@+id/otherCheck"
android:gravity="center"
android:background="@null"
android:text="글타래"
android:textColor="@color/tabs"
android:checked="false"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
style="@style/normal"
android:id="@+id/favApps"
android:gravity="center"
android:background="@null"
android:text="앱스"
android:textColor="@color/tabs"
android:checked="false"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
style="@style/normal"
android:id="@+id/recentSms"
android:gravity="center"
android:background="@null"
android:text="문자 내역"
android:textColor="@color/tabs"
android:checked="false"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
style="@style/normal"
android:id="@+id/notice"
android:gravity="center"
android:background="@null"
android:text="알림"
android:textColor="@color/tabs"
android:checked="false"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@+id/summaryChoose"
app:layout_constraintBottom_toTopOf="@id/functionLayer"
>
<androidx.recyclerview.widget.RecyclerView
android:layout_margin="@dimen/default_layout_margin"
android:id="@+id/mainList"
android:layout_width="0dp"
android:layout_height="0dp"
android:overScrollMode="never"
android:padding="@dimen/default_padding"
android:visibility="gone"
android:background="@drawable/base_bg"
android:scrollbars="none"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="2"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
/>
<androidx.recyclerview.widget.RecyclerView
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="2"
android:layout_margin="@dimen/default_layout_margin"
android:id="@+id/smsList"
android:layout_width="0dp"
android:layout_height="0dp"
android:overScrollMode="never"
android:padding="@dimen/default_padding"
android:scrollbars="none"
android:visibility="gone"
android:background="@drawable/base_bg"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
/>
<androidx.recyclerview.widget.RecyclerView
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
android:layout_margin="@dimen/default_layout_margin"
android:id="@+id/infoList"
android:layout_width="0dp"
android:layout_height="0dp"
android:overScrollMode="never"
android:padding="@dimen/default_padding"
android:scrollbars="none"
android:visibility="gone"
android:background="@drawable/base_bg"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
/>
<androidx.recyclerview.widget.RecyclerView
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
android:layout_margin="@dimen/default_layout_margin"
android:id="@+id/appsList"
android:layout_width="0dp"
android:layout_height="0dp"
android:overScrollMode="never"
android:padding="@dimen/default_padding"
app:spanCount="3"
android:scrollbars="none"
android:visibility="gone"
android:background="@drawable/base_bg"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
/>
<androidx.recyclerview.widget.RecyclerView
android:layout_margin="@dimen/default_layout_margin"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
android:id="@+id/notiList"
android:layout_width="0dp"
android:layout_height="0dp"
android:overScrollMode="never"
android:padding="@dimen/default_padding"
android:scrollbars="none"
android:visibility="gone"
android:background="@drawable/base_bg"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
/>
</RelativeLayout>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_margin="@dimen/default_layout_margin"
android:id="@+id/functionLayer"
android:layout_width="@dimen/zero"
android:layout_height="40dp"
android:layout_marginTop="@dimen/default_layout_margin"
android:layout_marginBottom="@dimen/default_layout_margin"
android:background="@drawable/base_bg"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent" >
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -9,8 +9,8 @@ buildscript {
}
plugins {
id ("com.android.application") version "8.8.0" apply false
id ("com.android.library") version "8.8.0" apply false
id ("com.android.application") version "8.10.1" apply false
id ("com.android.library") version "8.10.1" apply false
id ("io.realm.kotlin") version "2.0.0" apply false
id("org.jetbrains.kotlin.android") version "2.0.0" apply false

View File

@ -3,7 +3,8 @@ pluginManagement {
gradlePluginPortal()
google()
mavenCentral()
jcenter()
// jcenter()
maven (url = "https://maven.mozilla.org/maven2/")
}
}
@ -11,9 +12,10 @@ pluginManagement {
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
jcenter()
// jcenter()
google()
mavenCentral()
maven (url = "https://maven.mozilla.org/maven2/")
maven(url = "https://jitpack.io")
}
}