Commit 7819d3c3 authored by sheteng's avatar sheteng

Initial commit

parents
Pipeline #3028 failed with stages
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties
# Default ignored files
/shelf/
/workspace.xml
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="1.8" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="GRADLE" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleHome" value="$USER_HOME$/.gradle/wrapper/dists/gradle-3.5-all/exhrs6ca08n232b14ue48lbye/gradle-3.5" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
</GradleProjectSettings>
</option>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="MavenRepo" />
<option name="name" value="MavenRepo" />
<option name="url" value="https://repo.maven.apache.org/maven2/" />
</remote-repository>
<remote-repository>
<option name="id" value="maven" />
<option name="name" value="maven" />
<option name="url" value="https://nexus.sky-shark.com/repository/ccnet-group/" />
</remote-repository>
<remote-repository>
<option name="id" value="Google" />
<option name="name" value="Google" />
<option name="url" value="https://dl.google.com/dl/android/maven2/" />
</remote-repository>
<remote-repository>
<option name="id" value="maven" />
<option name="name" value="maven" />
<option name="url" value="https://jitpack.io" />
</remote-repository>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DesignSurface">
<option name="filePathToZoomLevelMap">
<map>
<entry key="..\:/ccwangluo/cc_quickly/app/src/main/res/drawable/back_icon.xml" value="0.34627170582226763" />
<entry key="..\:/ccwangluo/cc_quickly/app/src/main/res/drawable/btn_check.xml" value="0.34627170582226763" />
<entry key="..\:/ccwangluo/cc_quickly/app/src/main/res/drawable/ic_notifications_black_24dp.xml" value="0.353125" />
<entry key="..\:/ccwangluo/cc_quickly/app/src/main/res/drawable/login_edit_bg.xml" value="0.353125" />
<entry key="..\:/ccwangluo/cc_quickly/app/src/main/res/drawable/main_bottom.xml" value="0.353125" />
<entry key="..\:/ccwangluo/cc_quickly/app/src/main/res/drawable/mine.xml" value="0.353125" />
<entry key="..\:/ccwangluo/cc_quickly/app/src/main/res/drawable/news.xml" value="0.5087890625" />
<entry key="..\:/ccwangluo/cc_quickly/app/src/main/res/drawable/quick.xml" value="0.353125" />
<entry key="..\:/ccwangluo/cc_quickly/app/src/main/res/layout/activity_main.xml" value="0.2269021739130435" />
<entry key="..\:/ccwangluo/cc_quickly/app/src/main/res/layout/activity_main2.xml" value="0.23505434782608695" />
<entry key="..\:/ccwangluo/cc_quickly/app/src/main/res/layout/dialog_common.xml" value="0.3328125" />
<entry key="..\:/ccwangluo/cc_quickly/app/src/main/res/layout/dialog_privacy.xml" value="0.2006340579710145" />
<entry key="..\:/ccwangluo/cc_quickly/app/src/main/res/layout/fragment_bottom_navigationview.xml" value="0.20969202898550723" />
<entry key="..\:/ccwangluo/cc_quickly/app/src/main/res/layout/fragment_btn_nav.xml" value="0.20969202898550723" />
<entry key="..\:/ccwangluo/cc_quickly/app/src/main/res/layout/fragment_dashboard.xml" value="0.21829710144927536" />
<entry key="..\:/ccwangluo/cc_quickly/app/src/main/res/layout/fragment_home.xml" value="0.2269021739130435" />
<entry key="..\:/ccwangluo/cc_quickly/app/src/main/res/layout/fragment_login.xml" value="0.21829710144927536" />
<entry key="..\:/ccwangluo/cc_quickly/app/src/main/res/layout/fragment_login_phone.xml" value="0.25" />
<entry key="..\:/ccwangluo/cc_quickly/app/src/main/res/layout/fragment_login_quick.xml" value="0.2006340579710145" />
<entry key="..\:/ccwangluo/cc_quickly/app/src/main/res/layout/fragment_mine.xml" value="0.3328125" />
<entry key="..\:/ccwangluo/cc_quickly/app/src/main/res/layout/fragment_quick.xml" value="0.21829710144927536" />
<entry key="..\:/ccwangluo/cc_quickly/app/src/main/res/layout/main_activity.xml" value="0.23505434782608695" />
<entry key="..\:/ccwangluo/cc_quickly/app/src/main/res/layout/main_fragment.xml" value="0.23505434782608695" />
<entry key="..\:/ccwangluo/cc_quickly/app/src/main/res/menu/bottom_nav_menu.xml" value="0.3328125" />
</map>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
\ No newline at end of file
/build
\ No newline at end of file
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-kapt'
}
android {
signingConfigs {
config {
keyAlias 'ccim'
keyPassword '123456'
storeFile file('ccim_game_accelerator.jks')
storePassword '123456'
}
}
compileSdk 30
defaultConfig {
applicationId "com.ccwangluo.accelerator"
minSdk 21
targetSdk 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moduleName : project.getName() ]
}
}
}
buildTypes {
release {
signingConfig signingConfigs.config
minifyEnabled false
// proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
signingConfig signingConfigs.config
minifyEnabled false
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
buildFeatures {
viewBinding true
}
}
dependencies {
dependencies {implementation fileTree(include: ['*.aar'], dir: 'libs')}
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.annotation:annotation:1.2.0'
implementation 'androidx.vectordrawable:vectordrawable:1.1.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.recyclerview:recyclerview:1.2.0'
implementation 'androidx.navigation:navigation-fragment-ktx:2.3.0'
implementation 'androidx.navigation:navigation-ui-ktx:2.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
def multidex_version = "2.0.1"
implementation "androidx.multidex:multidex:$multidex_version"
def lifecycle_version = "2.3.1"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0'
implementation 'androidx.recyclerview:recyclerview:1.2.1'
implementation 'com.github.bumptech.glide:glide:4.12.0'
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
implementation 'com.google.code.gson:gson:2.8.7'
implementation 'com.github.xuexiangjys:XUI:1.1.8'
implementation 'com.karumi:dexter:6.2.3'
//工具类
implementation 'com.github.xuexiangjys.XUtil:xutil-core:2.0.0'
implementation 'com.github.xuexiangjys.XUtil:xutil-sub:2.0.0'
implementation 'com.tencent:mmkv:1.2.10'
//XPage
implementation 'com.github.xuexiangjys.XPage:xpage-lib:3.3.0'
kapt 'com.github.xuexiangjys.XPage:xpage-compiler:3.3.0'
implementation 'com.github.getActivity:ToastUtils:10.3'
implementation 'com.github.xuexiangjys.AgentWeb:agentweb-core:1.0.0'
implementation 'com.github.xuexiangjys.AgentWeb:agentweb-download:1.0.0'
implementation 'com.github.xuexiangjys.AgentWeb:agentweb-filechooser:1.0.0'
}
\ No newline at end of file
# 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
-dontwarn com.cmic.sso.sdk.**
-dontwarn com.unikuwei.mianmi.account.shield.**
-dontwarn com.sdk.**
-keep class com.cmic.sso.sdk.**{*;}
-keep class com.sdk.** { *;}
-keep class com.unikuwei.mianmi.account.shield.** {*;}
-keep class cn.com.chinatelecom.account.api.**{*;}
-keep class com.xuexiang.xui.widget.edittext.materialedittext.** { *; }
# gson
-keepattributes Signature
-keepattributes *Annotation*
-dontwarn sun.misc.**
-keep class com.google.gson.examples.android.model.** { <fields>; }
-keep class * extends com.google.gson.TypeAdapter
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
-keepclassmembers,allowobfuscation class * {
@com.google.gson.annotations.SerializedName <fields>;
}
-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken
-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken
# xpage
-keep class com.xuexiang.xpage.annotation.** { *; }
-keep class com.xuexiang.xpage.config.** { *; }
-keep class com.just.agentweb.** {
*;
}
-dontwarn com.just.agentweb.**
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ccwangluo.cc_quickly">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<application
android:name=".App"
android:allowBackup="true"
android:usesCleartextTraffic="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".ui.MainActivity"
android:label="@string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.chuanglan.shanyan_sdk.view.CmccLoginActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:launchMode="singleTop"
android:screenOrientation="behind"
/>
<activity-alias
android:name="com.cmic.sso.sdk.view.LoginAuthActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:launchMode="singleTop"
android:screenOrientation="behind"
android:targetActivity="com.chuanglan.shanyan_sdk.view.CmccLoginActivity"
/>
<activity
android:name="com.chuanglan.shanyan_sdk.view.ShanYanOneKeyActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:launchMode="singleTop"
android:screenOrientation="behind"
/>
<activity
android:name="com.chuanglan.shanyan_sdk.view.CTCCPrivacyProtocolActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:launchMode="singleTop"
android:screenOrientation="behind"
/>
</application>
</manifest>
\ No newline at end of file
package com.ccwangluo.cc_quickly
import android.app.Application
import com.ccwangluo.accelerator.utils.PhoneUtils
import com.hjq.toast.ToastUtils
import com.xuexiang.xpage.PageConfig
import com.xuexiang.xpage.base.XPageActivity
class App : Application(){
override fun onCreate() {
super.onCreate()
PageConfig.getInstance() // //页面注册,默认不设置的话使用的就是自动注册
// .setPageConfiguration(new AutoPageConfiguration())
.debug("PageLog") //开启调试
.setContainActivityClazz(XPageActivity::class.java) //设置默认的容器Activity
.init(this)
PhoneUtils.initSdk(this)
// 初始化 Toast 框架
ToastUtils.init(this)
}
}
\ No newline at end of file
package com.ccwangluo.accelerator.model
data class BaseModel<T>(
val code:Int,
val error : String?,
val data:T?
)
package com.ccwangluo.accelerator.model
data class LoginRes(
val createdAt: String?,
val phone: String?,
val token: String?
)
package com.ccwangluo.accelerator.ui
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.viewpager.widget.ViewPager
import com.ccwangluo.cc_quickly.databinding.FragmentBtnNavBinding
import com.ccwangluo.cc_quickly.ui.quick.MineFragment
import com.ccwangluo.cc_quickly.ui.quick.NewsFragment
import com.ccwangluo.cc_quickly.ui.quick.QuickFragment
import com.google.android.material.bottomnavigation.BottomNavigationView
import com.xuexiang.xpage.annotation.Page
import com.xuexiang.xpage.base.XPageFragment
import com.xuexiang.xpage.utils.TitleBar
import com.xuexiang.xui.adapter.FragmentAdapter
import com.xuexiang.xutil.common.CollectionUtils
@Page(name = "主页")
class BottomNavigationFragment : XPageFragment(), ViewPager.OnPageChangeListener,
BottomNavigationView.OnNavigationItemSelectedListener {
lateinit var binding: FragmentBtnNavBinding
override fun inflateView(inflater: LayoutInflater?, container: ViewGroup?): View {
binding = FragmentBtnNavBinding.inflate(inflater!!, container, false)
return binding.root
}
override fun initTitleBar(): TitleBar? {
//不使用@Page标注的一定要注意覆盖这个方法
return null
}
var titles = arrayOf("加速", "资讯", "我的")
override fun initViews() {
val adapter = FragmentAdapter<XPageFragment>(
childFragmentManager
)
adapter.addFragment(QuickFragment.newInstance(), titles[0])
adapter.addFragment(NewsFragment.newInstance(), titles[1])
adapter.addFragment(MineFragment.newInstance(), titles[2])
binding.viewPager.setOffscreenPageLimit(titles.size - 1);
binding.viewPager.adapter = adapter
}
override fun initListeners() {
binding.viewPager.addOnPageChangeListener(this)
binding.bottomNavigation.setOnNavigationItemSelectedListener(this)
binding.bottomNavigation.setItemIconTintList(null);
binding.bottomNavigation.itemTextColor
}
override fun onHiddenChanged(hidden: Boolean) {
super.onHiddenChanged(hidden)
}
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
binding.bottomNavigation.menu.getItem(position).isChecked = true
}
override fun onPageSelected(position: Int) {
}
override fun onPageScrollStateChanged(index: Int) {
}
override fun onNavigationItemSelected(item: MenuItem): Boolean {
val index: Int = CollectionUtils.arrayIndexOf(titles, item.getTitle())
if (index != -1) {
binding.viewPager.setCurrentItem(index, true)
return true
}
return false
}
}
\ No newline at end of file
package com.ccwangluo.cc_quickly.ui
import android.Manifest
import android.os.Bundle
import com.ccwangluo.accelerator.ui.BottomNavigationFragment
import com.ccwangluo.accelerator.utils.PhoneUtils
import com.karumi.dexter.Dexter
import com.karumi.dexter.PermissionToken
import com.karumi.dexter.listener.PermissionDeniedResponse
import com.karumi.dexter.listener.PermissionGrantedResponse
import com.karumi.dexter.listener.PermissionRequest
import com.karumi.dexter.listener.single.PermissionListener
import com.tencent.mmkv.MMKV
import com.xuexiang.xpage.base.XPageActivity
import com.xuexiang.xpage.core.PageOption
class MainActivity() : XPageActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
MMKV.initialize(this)
initPhoneUtils()
//获取权限
Dexter.withContext(this)
.withPermission(Manifest.permission.READ_PHONE_STATE)
.withListener(object : PermissionListener {
override fun onPermissionGranted(response: PermissionGrantedResponse) {
}
override fun onPermissionDenied(response: PermissionDeniedResponse) {
}
override fun onPermissionRationaleShouldBeShown(
permission: PermissionRequest,
token: PermissionToken
) {
}
}).check()
PageOption.to(BottomNavigationFragment::class.java).open(this)
}
private fun initPhoneUtils() {
PhoneUtils.getPhoneInfo()
}
}
\ No newline at end of file
package com.ccwangluo.cc_quickly.ui.quick
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import androidx.fragment.app.Fragment
import com.ccwangluo.accelerator.ui.web.AndroidInterface
import com.ccwangluo.accelerator.utils.http.HttpConfig
import com.ccwangluo.cc_quickly.databinding.FragmentMineBinding
import com.just.agentweb.core.AgentWeb
import com.just.agentweb.core.client.DefaultWebClient
import com.xuexiang.xpage.base.XPageFragment
import com.xuexiang.xpage.utils.TitleBar
class MineFragment : XPageFragment() {
private var _binding: FragmentMineBinding? = null
private val binding get() = _binding!!
override fun initTitleBar(): TitleBar? {
//不使用@Page标注的一定要注意覆盖这个方法
return null
}
override fun inflateView(inflater: LayoutInflater?, container: ViewGroup?): View {
_binding = FragmentMineBinding.inflate(inflater!!, container, false)
return binding.root
}
override fun initViews() {
val agentWeb =
createAgentWeb(this, binding.commonWebview, HttpConfig.UI_MAIN_URL)
agentWeb.getJsInterfaceHolder().addJavaObject("android", AndroidInterface(this))
}
override fun initListeners() {
}
companion object{
fun newInstance(): MineFragment {
val fragment = MineFragment()
return fragment
}
}
fun createAgentWeb(fragment: Fragment?, viewGroup: ViewGroup, url: String): AgentWeb {
return AgentWeb.with(fragment!!)
.setAgentWebParent(
viewGroup!!,
-1,
FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
)
)
.useDefaultIndicator(-1, 3)
.setOpenOtherPageWays(DefaultWebClient.OpenOtherPageWays.ASK)
.createAgentWeb()
.ready()
.go(url)
}
}
\ No newline at end of file
package com.ccwangluo.cc_quickly.ui.quick
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.ccwangluo.cc_quickly.databinding.FragmentNewsBinding
import com.xuexiang.xpage.base.XPageFragment
import com.xuexiang.xpage.utils.TitleBar
class NewsFragment : XPageFragment() {
private var _binding: FragmentNewsBinding? = null
private val binding get() = _binding!!
override fun initTitleBar(): TitleBar? {
//不使用@Page标注的一定要注意覆盖这个方法
return null
}
override fun inflateView(inflater: LayoutInflater?, container: ViewGroup?): View {
_binding = FragmentNewsBinding.inflate(inflater!!, container, false)
return binding.root
}
override fun initViews() {
}
override fun initListeners() {
}
companion object{
fun newInstance(): NewsFragment {
val fragment = NewsFragment()
return fragment
}
}
}
\ No newline at end of file
package com.ccwangluo.cc_quickly.ui.quick
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.ccwangluo.accelerator.utils.LoginUtils
import com.ccwangluo.cc_quickly.databinding.FragmentQuickBinding
import com.xuexiang.xpage.base.XPageFragment
import com.xuexiang.xpage.utils.TitleBar
class QuickFragment : XPageFragment() {
private var _binding: FragmentQuickBinding? = null
private val binding get() = _binding!!
override fun initTitleBar(): TitleBar? {
//不使用@Page标注的一定要注意覆盖这个方法
return null
}
override fun inflateView(inflater: LayoutInflater?, container: ViewGroup?): View {
_binding = FragmentQuickBinding.inflate(inflater!!, container, false)
return binding.root
}
override fun initViews() {
}
override fun initListeners() {
binding.btnExpend.setOnClickListener {
if (binding.expandableLayout1.isExpanded) {
binding.expandableLayout1.toggle()
binding.expandableLayout2.expand()
} else {
binding.expandableLayout1.expand()
binding.expandableLayout2.toggle()
}
}
binding.btnQuick.setOnClickListener {
if (!LoginUtils.hasToken()) {
LoginUtils.login(this)
} else {
}
}
}
companion object {
fun newInstance(): QuickFragment {
val fragment = QuickFragment()
return fragment
}
}
}
\ No newline at end of file
package com.ccwangluo.accelerator.ui.login
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.ccwangluo.accelerator.model.BaseModel
import com.ccwangluo.accelerator.model.LoginRes
import com.ccwangluo.accelerator.utils.LoginUtils
import com.ccwangluo.accelerator.utils.http.HttpGo
import com.google.gson.Gson
import com.hjq.toast.ToastUtils
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
class LoginViewModel : ViewModel() {
val sendCodeState = MutableLiveData<Boolean>()
val loginState = MutableLiveData<Boolean>()
fun login(phone: String, authCdoe: String) {
val map = mutableMapOf<String, String>()
map.put("phone", phone)
map.put("verifyCode",authCdoe)
viewModelScope.launch(Dispatchers.IO) {
val res = HttpGo.postSync<BaseModel<LoginRes>>("/user/verifyCode/login", map)
res?.let {
if (it.code == 200) {
LoginUtils.token = it.data?.token
loginState.postValue(true)
} else {
ToastUtils.show(it.error)
}
}
}
}
inline fun <reified T:Any> T.toJson():String = Gson().toJson(this,T::class.java)
fun getAuthCode(phone: String) {
val map = mutableMapOf<String, String>()
map.put("phone", phone)
viewModelScope.launch(Dispatchers.IO) {
val res = HttpGo.postSync<BaseModel<Boolean>>("/user/sendSms", map)
res?.let {
if (it.code == 200) {
sendCodeState.postValue(true)
} else {
ToastUtils.show(it.error)
}
}
}
}
}
\ No newline at end of file
package com.ccwangluo.cc_quickly.ui.login
import android.os.Handler
import android.os.Looper
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.widget.addTextChangedListener
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import com.ccwangluo.accelerator.ui.login.LoginViewModel
import com.ccwangluo.accelerator.ui.view.PrivacyDialog
import com.ccwangluo.cc_quickly.databinding.FragmentLoginPhoneBinding
import com.hjq.toast.ToastUtils
import com.xuexiang.xpage.annotation.Page
import com.xuexiang.xpage.base.XPageFragment
import com.xuexiang.xpage.utils.TitleBar
import com.xuexiang.xutil.common.StringUtils
import java.util.regex.Pattern
/**
* A simple [Fragment] subclass.
* Use the [PhoneLoginFragment.newInstance] factory method to
* create an instance of this fragment.
*/
@Page(name = "登录")
class PhoneLoginFragment : XPageFragment() {
override fun initTitleBar(): TitleBar? {
return null
}
private val mHandler: Handler = Handler(Looper.getMainLooper());
private var mCountTime = 60
private lateinit var loginViewModel: LoginViewModel
private lateinit var binding: FragmentLoginPhoneBinding
override fun inflateView(inflater: LayoutInflater?, container: ViewGroup?): View {
binding = FragmentLoginPhoneBinding.inflate(inflater!!, container, false)
loginViewModel = ViewModelProvider(this).get(LoginViewModel::class.java)
return binding.root
}
override fun initViews() {
binding.phoneEt.addTextChangedListener {
val phone = it.toString().trim()
val authCdoe = binding.authCodeEt.text.toString()
if (phone.length > 0) {
binding.authCodeBtn.isEnabled = true
} else {
binding.authCodeBtn.isEnabled = false
}
if (isPhone(phone) && authCdoe.length > 0) {
binding.login.isEnabled = true
} else {
binding.login.isEnabled = false
}
}
binding.authCodeEt.addTextChangedListener {
val authCdoe = it.toString().trim()
val phone = binding.phoneEt.text.toString()
if (isPhone(phone) && authCdoe.length > 0) {
binding.login.isEnabled = true
} else {
binding.login.isEnabled = false
}
}
loginViewModel.sendCodeState.observe(this, {
if (it) {
sendVerifyCode()
} else {
binding.authCodeBtn.visibility = View.VISIBLE
binding.authCodeWait.visibility = View.GONE
}
})
loginViewModel.loginState.observe(this, {
if (it) {
popToBack()
}
})
}
override fun initListeners() {
binding.privacyAggreement.setOnClickListener({
PrivacyDialog(this, "http://www.baidu.com", {
}).show<PrivacyDialog>()
})
binding.userAggreement.setOnClickListener {
}
binding.phoneClear.setOnClickListener {
binding.phoneEt.setText("")
}
binding.authCodeBtn.setOnClickListener {
val phone = binding.phoneEt.text.toString()
if (StringUtils.isEmpty(phone) || !isPhone(phone)) {
ToastUtils.show("请输入手机号码")
return@setOnClickListener
}
binding.authCodeBtn.visibility = View.GONE
binding.authCodeWait.visibility = View.VISIBLE
binding.authCodeBtn.isEnabled = false
loginViewModel.getAuthCode(phone)
}
binding.btnBack.setOnClickListener {
popToBack()
}
binding.login.setOnClickListener {
//检查验证码,手机号格式
val phone = binding.phoneEt.text.toString()
val authCdoe = binding.authCodeEt.text.toString()
if (StringUtils.isEmpty(phone) || !isPhone(phone)) {
ToastUtils.show("请输入手机号码")
return@setOnClickListener
}
if (StringUtils.isEmpty(authCdoe) || authCdoe.length < 6) {
ToastUtils.show("请输入验证码")
return@setOnClickListener
}
//检查ck
if (!binding.cbProtocol.isChecked) {
ToastUtils.show("先勾选协议哦")
return@setOnClickListener
}
loginViewModel.login(phone, authCdoe)
}
}
fun isPhone(phone: String): Boolean {
// 开头的"1"代表第一位为数字1,"[3-9]"代表第二位可以为3、4、5、6、7、8、9其中之一,"\\d{9}"代表后面是9位数字
val regex = "1[3-9]\\d{9}"
return Pattern.matches(regex, phone)
}
fun sendVerifyCode() {
mHandler.postDelayed(countDown, 0)
}
/*
倒计时
*/
private val countDown = object : Runnable {
override fun run() {
if (mCountTime > 0) {
mHandler.postDelayed(this, 1000)
} else {
resetCounter()
}
mCountTime--
binding.authCodeWait.setText("${mCountTime}秒后重新获得验证码")
}
}
fun removeRunable() {
mHandler.removeCallbacks(countDown)
}
//重置按钮状态
fun resetCounter(vararg text: String) {
mCountTime = 60
binding.authCodeBtn.visibility = View.VISIBLE
binding.authCodeWait.visibility = View.GONE
binding.authCodeBtn.setText("重新获取验证码")
}
}
\ No newline at end of file
package com.ccwangluo.accelerator.ui.view
import android.content.Context
import android.widget.TextView
import androidx.fragment.app.Fragment
import com.ccwangluo.cc_quickly.R
import com.xuexiang.xui.widget.dialog.materialdialog.CustomMaterialDialog
import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
class CommonDialog(
var fragment: Fragment,
var privacy_url: String,
var callback: (Boolean) -> Unit
) : CustomMaterialDialog(fragment.context) {
override fun getDialogBuilder(context: Context?): MaterialDialog.Builder {
return MaterialDialog.Builder(context!!)
.customView(R.layout.dialog_common, true);
}
override fun initViews(context: Context?) {
}
fun setContent(content: String): CommonDialog {
val dia_text = findViewById<TextView>(R.id.dia_text)
dia_text.text = content
return this
}
fun setBtnLeft(btnText:String,callback:()->Unit): CommonDialog{
val btn_left = findViewById<TextView>(R.id.btn_left)
btn_left.text = btnText
btn_left.setOnClickListener {
callback()
}
return this
}
fun setBtnRight(btnText:String,callback:()->Unit): CommonDialog{
val btn_right = findViewById<TextView>(R.id.btn_right)
btn_right.text = btnText
btn_right.setOnClickListener {
callback()
}
return this
}
}
\ No newline at end of file
package com.ccwangluo.accelerator.ui.view
import android.content.Context
import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.TextView
import androidx.fragment.app.Fragment
import com.ccwangluo.cc_quickly.R
import com.just.agentweb.core.AgentWeb
import com.just.agentweb.core.client.DefaultWebClient
import com.xuexiang.xui.widget.dialog.materialdialog.CustomMaterialDialog
import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
class PrivacyDialog(
var fragment: Fragment,
var privacy_url: String,
var callback: (Boolean) -> Unit
) : CustomMaterialDialog(fragment.context) {
override fun getDialogBuilder(context: Context?): MaterialDialog.Builder {
return MaterialDialog.Builder(context!!)
.customView(R.layout.dialog_privacy, true);
}
override fun initViews(context: Context?) {
val disagree = findViewById<TextView>(R.id.privacy_disagree)
val agree = findViewById<TextView>(R.id.privacy_agree)
disagree.setOnClickListener {
callback(false);
dialog.dismiss()
}
agree.setOnClickListener {
callback(true)
dialog.dismiss()
}
}
init {
val container = findViewById<FrameLayout>(R.id.privacy_webview)
val agentWeb =
createAgentWeb(fragment, container, privacy_url)
}
fun createAgentWeb(fragment: Fragment?, viewGroup: ViewGroup, url: String): AgentWeb {
return AgentWeb.with(fragment!!)
.setAgentWebParent(
viewGroup!!,
-1,
FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
)
)
.useDefaultIndicator(-1, 3)
.setOpenOtherPageWays(DefaultWebClient.OpenOtherPageWays.ASK)
.createAgentWeb()
.ready()
.go(url)
}
}
\ No newline at end of file
package com.ccwangluo.accelerator.ui.web
import android.webkit.JavascriptInterface
import com.ccwangluo.cc_quickly.utils.XToastUtils
import com.xuexiang.xpage.base.XPageFragment
/**
* js注入的方法
*/
class AndroidInterface(val xPageFragment: XPageFragment) {
@JavascriptInterface
fun callAndroid(msg: String) {
XToastUtils.toast("这是Js调用Android的方法,内容:$msg")
}
@JavascriptInterface
fun close() {
xPageFragment.popToBack()
}
fun getPermission(key: String) {
}
}
\ No newline at end of file
package com.ccwangluo.accelerator.utils;
import android.content.Context;
import android.graphics.Point;
import android.os.Handler;
import android.os.Looper;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.WindowManager;
import android.widget.Toast;
/**
* 获得屏幕相关数据的辅助类
*/
public class AbScreenUtils {
private static Handler mainHandler;
private AbScreenUtils() {
/* cannot be instantiated */
throw new UnsupportedOperationException("cannot be instantiated");
}
/**
* 获得屏幕高度
*
* @param context
* @return
*/
public static int getScreenHeight(Context context, boolean isDp) {
int screenHeight = 0;
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
int height = dm.heightPixels; // 屏幕高度(像素)
if (!isDp) {
return height;
}
float density = dm.density; // 屏幕密度(0.75 / 1.0 / 1.5)
screenHeight = (int) (height / density);// 屏幕高度(dp)
return screenHeight;
}
public static int getScreenWidth(Context context, boolean isDp) {
int screenWidth = 0;
int winWidth;
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display defaultDisplay = wm.getDefaultDisplay();
Point point = new Point();
defaultDisplay.getSize(point);
if (point.x > point.y) {
winWidth = point.y;
} else {
winWidth = point.x;
}
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
if (!isDp) {
return winWidth;
}
float density = dm.density; // 屏幕密度(0.75 / 1.0 / 1.5)
screenWidth = (int) (winWidth / density);// 屏幕高度(dp)
return screenWidth;
}
/**
* dp转换成px
*/
public static int dp2px(Context context, float dpValue) {
float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
public static void showToast(final Context context, final String msg) {
mainHandler = new Handler(Looper.getMainLooper());
execute(new Runnable() {
@Override
public void run() {
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
}
});
}
private static void execute(Runnable runnable) {
if (Looper.getMainLooper() == Looper.myLooper()) {
runnable.run();
} else {
mainHandler.post(runnable);
}
}
}
package com.ccwangluo.accelerator.utils
import android.content.Context
import androidx.lifecycle.lifecycleScope
import com.ccwangluo.accelerator.model.BaseModel
import com.ccwangluo.accelerator.model.LoginRes
import com.ccwangluo.accelerator.utils.http.HttpGo
import com.ccwangluo.cc_quickly.ui.login.PhoneLoginFragment
import com.tencent.mmkv.MMKV
import com.xuexiang.xpage.base.XPageFragment
import com.xuexiang.xpage.core.PageOption
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
object LoginUtils {
fun login(xPageFragment: XPageFragment){
PhoneUtils.openLoginAuth(xPageFragment) { b, s ->
if (b) {
val map = mutableMapOf<String, String>()
map.put("token", s)
xPageFragment.lifecycleScope.launch(Dispatchers.IO) {
val res = HttpGo.postSync<BaseModel<LoginRes>>("/user/flash/login", map)
res?.let {
println(it)
}
}
} else {
PageOption.to(PhoneLoginFragment::class.java).open(xPageFragment)
}
}
}
private var sToken: String? = null
private const val KEY_TOKEN = "com.ccwangluo.KEY_TOKEN"
/**
* 初始化Token信息
*/
fun init(context: Context?) {
sToken = MMKV.defaultMMKV().decodeString(KEY_TOKEN, "")
}
fun clearToken() {
sToken = null
MMKV.defaultMMKV().remove(KEY_TOKEN)
}
var token: String?
get() = sToken
set(token) {
sToken = token
MMKV.defaultMMKV().putString(KEY_TOKEN, token)
}
fun hasToken(): Boolean {
return MMKV.defaultMMKV().containsKey(KEY_TOKEN)
}
}
\ No newline at end of file
package com.ccwangluo.accelerator.utils
import android.app.Application
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.Drawable
import android.util.Log
import android.util.TypedValue
import android.widget.RelativeLayout
import android.widget.TextView
import com.ccwangluo.cc_quickly.R
import com.ccwangluo.cc_quickly.ui.login.PhoneLoginFragment
import com.chuanglan.shanyan_sdk.OneKeyLoginManager
import com.chuanglan.shanyan_sdk.tool.ShanYanUIConfig
import com.xuexiang.xpage.base.XPageFragment
import com.xuexiang.xpage.core.PageOption
import org.json.JSONObject
object PhoneUtils {
private val TAG: String = PhoneUtils.javaClass.name
fun initSdk(application: Application, callback: (Boolean) -> Unit = {}) {
val appid = "tqXxGGCH";
OneKeyLoginManager.getInstance().init(
application, appid
) { code, result ->
if (code == 1022) {
callback(true)
} else {
callback(false)
}
}
}
fun getPhoneInfo(callback: (Boolean, String) -> Unit = { t1, t2 -> {} }) {
OneKeyLoginManager.getInstance().getPhoneInfo { code, result ->
if (code == 1022) {
callback(true, result)
} else {
callback(false, "")
}
}
}
fun openLoginAuth(xPageFragment: XPageFragment, callback: (Boolean, String) -> Unit) {
xPageFragment.context?.let {
OneKeyLoginManager.getInstance().setAuthThemeConfig(getEConfig(it, xPageFragment))
OneKeyLoginManager.getInstance().openLoginAuth(false,
{ code, result ->
if (code != 1000) {
callback(false, "")
}
Log.i(TAG, "openLoginAuth: $result")
}
) { code, result ->
if (code == 1000) {
val json = JSONObject(result)
callback(true, json.getString("token"))
}
}
}
}
fun getEConfig(context: Context, xPageFragment: XPageFragment): ShanYanUIConfig? {
/************************************SDK固有控件 */
//登录按钮背景
// val mLoginBt: Drawable =
// context.getResources().getDrawable(R.drawable.login_demo_auth_bt_cus_e)
//协议复选框选中时图标
val mCheckedImg: Drawable =
context.getResources().getDrawable(com.ccwangluo.cc_quickly.R.mipmap.login_check_cus)
//协议复选框未选中时图标
val mCunheckedImg: Drawable =
context.getResources().getDrawable(com.ccwangluo.cc_quickly.R.mipmap.login_uncheck_cus)
//自定义控件(右上角“使用其他手机>”)
val mOtherTv = TextView(context)
mOtherTv.text = "其他方式登录"
mOtherTv.setTextColor(Color.parseColor("#FF408DFF"))
mOtherTv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12f)
val otherLayoutParams = RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT
)
val screenHeight = AbScreenUtils.getScreenHeight(context, false)
val mOtherTvTop = AbScreenUtils.dp2px(context, 100f)
otherLayoutParams.setMargins(0, screenHeight - mOtherTvTop, 0, 0)
otherLayoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL)
mOtherTv.layoutParams = otherLayoutParams
// val mOtherTv2 = TextView(context)
// mOtherTv2.text = "新用户尊享3天免费VIP"
// mOtherTv2.setTextColor(Color.parseColor("#FFD0964E"))
// mOtherTv2.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14f)
// val otherLayoutParams2 = RelativeLayout.LayoutParams(
// RelativeLayout.LayoutParams.WRAP_CONTENT,
// RelativeLayout.LayoutParams.WRAP_CONTENT
// )
// otherLayoutParams2.setMargins(0, AbScreenUtils.dp2px(context, 350f), 0, 0)
// otherLayoutParams2.addRule(RelativeLayout.CENTER_HORIZONTAL)
// mOtherTv.layoutParams = otherLayoutParams2
return ShanYanUIConfig.Builder()
/**设置弹窗样式
* @param isdialogTheme 是否是弹窗主题
* @param dialogWidth 弹窗宽度
* @param dialogHeight 弹窗高度
* @param dialogX 弹窗距离屏幕左测边距(左右等距)
* @param dialogY 弹窗距离屏幕顶部测边距
* @param isDialogBottom 弹窗是否显示到屏幕底部
*/
.setNavText("")
.setSloganHidden(true)
//导航栏标题设置成空
.setLogoHeight(130)
.setLogoWidth(130)
.setLogoOffsetY(30)
.setLogoImgPath(context.resources.getDrawable(com.ccwangluo.cc_quickly.R.mipmap.ic_launcher))
// .addCustomView(
// mOtherTv2, true, false, null
// )
.setNumFieldOffsetBottomY(378)
.setNumberSize(25)
.setLogBtnOffsetBottomY(270)
.setLogBtnWidth(AbScreenUtils.getScreenWidth(context, true) - 60)
.setLogBtnText("登录")
.setLogBtnTextSize(16)
.setLogBtnImgPath(context.resources.getDrawable(R.mipmap.login_btn_onekey))
.addCustomView(
mOtherTv, true, false
) { context, view -> PageOption.to(PhoneLoginFragment::class.java).open(xPageFragment) }
.setPrivacyState(false)
.setCheckedImgPath(mCheckedImg)
.setUncheckedImgPath(mCunheckedImg)
.setCheckBoxWH(20, 20)
.setPrivacyOffsetX(20)
.setcheckBoxOffsetXY(0, 5)
.setPrivacyOffsetBottomY(194)
.setPrivacyOffsetGravityLeft(true)
.setPrivacyTextSize(12)
.setOperatorPrivacyAtLast(true)
.setPrivacySmhHidden(true)
.setAppPrivacyColor(
Color.parseColor("#919095"),
Color.parseColor("#FF408DFF")
)
.setAppPrivacyOne(
"《用户协议》",
"https://api.253.com/api_doc/yin-si-zheng-ce/wei-hu-wang-luo-an-quan-sheng-ming.html"
)
.setAppPrivacyTwo(
"《隐私政策》",
"https://api.253.com/api_doc/yin-si-zheng-ce/ge-ren-xin-xi-bao-hu-sheng-ming.html"
) //设置隐私条款2名称和URL(名称,url)
//设置协议外部文字描述
.setPrivacyText("你已阅读并同意", "、", "和", "", "")
.build()
/**************************授权页配置(示例配置自上而下,可调整顺序) */
}
}
\ No newline at end of file
package com.ccwangluo.cc_quickly.utils
import com.tencent.mmkv.MMKV
/**
* SharedPreferences管理工具基类
*
* @author xuexiang
* @since 2018/11/27 下午5:16
*/
object SettingSPUtils {
private val IS_FIRST_OPEN_KEY = "is_first_open_key"
private val IS_AGREE_PRIVACY_KEY = "is_agree_privacy_key"
/**
* 是否是第一次启动
*/
/**
* 设置是否是第一次启动
*/
var isFirstOpen: Boolean
get() = MMKV.defaultMMKV().decodeBool(IS_FIRST_OPEN_KEY, true)
set(isFirstOpen) {
MMKV.defaultMMKV().putBoolean(IS_FIRST_OPEN_KEY, isFirstOpen)
}
/**
* @return 是否同意隐私政策
*/
var isAgreePrivacy: Boolean
get() = MMKV.defaultMMKV().decodeBool(IS_AGREE_PRIVACY_KEY, false)
set(isAgreePrivacy) {
MMKV.defaultMMKV().putBoolean(IS_AGREE_PRIVACY_KEY, isAgreePrivacy)
}
}
\ No newline at end of file
/*
* Copyright (C) 2019 xuexiangjys(xuexiangjys@163.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.ccwangluo.cc_quickly.utils
import androidx.annotation.MainThread
import androidx.annotation.StringRes
import com.xuexiang.xui.XUI
import com.xuexiang.xui.widget.toast.XToast
/**
* xtoast 工具类
*
* @author xuexiang
* @since 2019-06-30 19:04
*/
object XToastUtils {
init {
XToast.Config.get()
.setYOffset(300)
.setToastTypeface(XUI.getDefaultTypeface())
.allowQueue(false)
}
@MainThread
fun toast(message: CharSequence) {
XToast.normal(XUI.getContext(), message).show()
}
@MainThread
fun toast(@StringRes message: Int) {
XToast.normal(XUI.getContext(), message).show()
}
@MainThread
fun toast(message: CharSequence, duration: Int) {
XToast.normal(XUI.getContext(), message, duration).show()
}
@MainThread
fun toast(@StringRes message: Int, duration: Int) {
XToast.normal(XUI.getContext(), message, duration).show()
}
//=============//
@MainThread
fun error(message: CharSequence) {
XToast.error(XUI.getContext(), message).show()
}
@MainThread
fun error(error: Exception) {
XToast.error(XUI.getContext(), error.message!!).show()
}
@MainThread
fun error(@StringRes message: Int) {
XToast.error(XUI.getContext(), message).show()
}
@MainThread
fun error(message: CharSequence, duration: Int) {
XToast.error(XUI.getContext(), message, duration).show()
}
@MainThread
fun error(@StringRes message: Int, duration: Int) {
XToast.error(XUI.getContext(), message, duration).show()
}
//=============//
@MainThread
fun success(message: CharSequence) {
XToast.success(XUI.getContext(), message).show()
}
@MainThread
fun success(@StringRes message: Int) {
XToast.success(XUI.getContext(), message).show()
}
@MainThread
fun success(message: CharSequence, duration: Int) {
XToast.success(XUI.getContext(), message, duration).show()
}
@MainThread
fun success(@StringRes message: Int, duration: Int) {
XToast.success(XUI.getContext(), message, duration).show()
}
//=============//
@MainThread
fun info(message: CharSequence) {
XToast.info(XUI.getContext(), message).show()
}
@MainThread
fun info(@StringRes message: Int) {
XToast.info(XUI.getContext(), message).show()
}
@MainThread
fun info(message: CharSequence, duration: Int) {
XToast.info(XUI.getContext(), message, duration).show()
}
@MainThread
fun info(@StringRes message: Int, duration: Int) {
XToast.info(XUI.getContext(), message, duration).show()
}
//=============//
@MainThread
fun warning(message: CharSequence) {
XToast.warning(XUI.getContext(), message).show()
}
@MainThread
fun warning(@StringRes message: Int) {
XToast.warning(XUI.getContext(), message).show()
}
@MainThread
fun warning(message: CharSequence, duration: Int) {
XToast.warning(XUI.getContext(), message, duration).show()
}
@MainThread
fun warning(@StringRes message: Int, duration: Int) {
XToast.warning(XUI.getContext(), message, duration).show()
}
}
\ No newline at end of file
package com.ccwangluo.accelerator.utils.http
object HttpConfig {
val baseUrl = "http://10.16.1.98:9002/api"
val UI_MAIN_URL = "http:wwww.baidu.com"
}
\ No newline at end of file
package com.ccwangluo.accelerator.utils.http
import com.google.gson.Gson
import com.hjq.toast.ToastUtils
import okhttp3.*
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.RequestBody.Companion.toRequestBody
import java.io.IOException
import java.security.SecureRandom
import java.security.cert.X509Certificate
import java.util.concurrent.TimeUnit
import javax.net.ssl.SSLContext
import javax.net.ssl.SSLSocketFactory
import javax.net.ssl.X509TrustManager
object HttpGo {
val okHttpClient: OkHttpClient
val gson: Gson
init {
okHttpClient = OkHttpClient().newBuilder()
.readTimeout(60, TimeUnit.SECONDS)//设置读取超时时间
.writeTimeout(60, TimeUnit.SECONDS)//设置写的超时时间
.connectTimeout(60, TimeUnit.SECONDS)//设置连接超时时间
//https支持
.hostnameVerifier { hostname, session -> true }
.sslSocketFactory(initSSLSocketFactory(), initTrustManager())
.build()
gson = Gson()
}
fun getClient(): OkHttpClient {
return okHttpClient;
}
inline fun <reified T> getSync(url: String): T? {
val request: Request = Request.Builder()
.url(HttpConfig.baseUrl + url)
.get()
.build()
val call = okHttpClient.newCall(request)
val response: Response = call.execute()
if (response.isSuccessful) {
return gson.fromJson(response.body?.string(), T::class.java)
} else {
ToastUtils.show("网络错误")
return null
}
}
val jsonType get() = "application/json; charset=utf-8".toMediaTypeOrNull()
/**
* 异步请求
*/
inline fun <reified T> postASync(
url: String,
param: MutableMap<String, String>,
crossinline callback: (T) -> Unit
) {
val body: RequestBody = gson.toJson(param).toString().toRequestBody(jsonType)
val request: Request = Request.Builder()
.url(HttpConfig.baseUrl + url)
.post(body)
.build()
val call = okHttpClient.newCall(request)
call.enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
ToastUtils.show("网络错误")
}
override fun onResponse(call: Call, response: Response) {
callback(gson.fromJson(response.body?.string(), T::class.java))
}
})
}
/**
* 同步请求
*/
inline fun <reified T> postSync(url: String, param: MutableMap<String, String>): T? {
val body: RequestBody = gson.toJson(param).toString().toRequestBody(jsonType)
val request: Request = Request.Builder()
.url(HttpConfig.baseUrl + url)
.post(body)
.build()
val call = okHttpClient.newCall(request)
val response: Response = call.execute()
println(response)
if (response.isSuccessful) {
val string = response.body?.string()
println(string)
return gson.fromJson(string, T::class.java)
} else {
ToastUtils.show("网络错误")
return null
}
}
private fun initSSLSocketFactory(): SSLSocketFactory {
var sslContext: SSLContext? = null
try {
sslContext = SSLContext.getInstance("SSL")
val xTrustArray = arrayOf(initTrustManager())
sslContext.init(
null,
xTrustArray, SecureRandom()
)
} catch (e: Exception) {
e.printStackTrace()
}
return sslContext!!.socketFactory
}
private fun initTrustManager(): X509TrustManager {
return object : X509TrustManager {
override fun getAcceptedIssuers(): Array<X509Certificate> {
return arrayOf()
}
override fun checkServerTrusted(chain: Array<out X509Certificate>?, authType: String?) {
}
override fun checkClientTrusted(chain: Array<out X509Certificate>?, authType: String?) {
}
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:color="@color/colorPrimary"/>
<item android:state_checked="false" android:color="@color/colorPrimaryDark" />
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true" android:color="@color/btn_blue_2"/>
<item android:state_enabled="false" android:color="#D8D8DA" />
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true" android:color="#408DFF"/>
<item android:state_enabled="false" android:color="#D8D8DA" />
</selector>
\ No newline at end of file
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="85.84757"
android:endY="92.4963"
android:startX="42.9492"
android:startY="49.59793"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:state_pressed="true" android:drawable="@mipmap/back_icon_white"/>
<item android:state_checked="false" android:state_pressed="false" android:drawable="@mipmap/back_icon_black"/>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:drawable="@mipmap/login_check_cus"/>
<item android:state_checked="false" android:drawable="@mipmap/login_uncheck_cus"/>
</selector>
\ No newline at end of file
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M3,13h8L11,3L3,3v10zM3,21h8v-6L3,15v6zM13,21h8L21,11h-8v10zM13,3v6h8L21,3h-8z" />
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M10,20v-6h4v6h5v-8h3L12,3 2,12h3v8z" />
</vector>
<?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="#3DDC84"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M12,22c1.1,0 2,-0.9 2,-2h-4c0,1.1 0.89,2 2,2zM18,16v-5c0,-3.07 -1.64,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68C7.63,5.36 6,7.92 6,11v5l-2,2v1h16v-1l-2,-2z" />
</vector>
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:drawable="@mipmap/mine_bu"/>
<item android:state_checked="false" android:drawable="@mipmap/mine_ga"/>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:drawable="@mipmap/news_bu"/>
<item android:state_checked="false" android:drawable="@mipmap/news_ga"/>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:drawable="@mipmap/quick_bu"/>
<item android:state_checked="false" android:drawable="@mipmap/quick_ga"/>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="720dp">
<TextView
android:id="@+id/dia_text"
android:layout_width="match_parent"
android:layout_height="100dp"/>
<LinearLayout
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="wrap_content">
<TextView
android:id="@+id/btn_left"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="20dp"
android:layout_weight="1"
android:gravity="center"
/>
<TextView
android:id="@+id/btn_right"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/colorPrimary"
android:text="同意"
android:padding="20dp"
android:gravity="center"
/>
</LinearLayout>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="720dp">
<FrameLayout
android:id="@+id/privacy_webview"
android:layout_width="match_parent"
android:layout_height="500dp"/>
<LinearLayout
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="wrap_content">
<TextView
android:id="@+id/privacy_disagree"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="不同意"
android:padding="20dp"
android:layout_weight="1"
android:gravity="center"
/>
<TextView
android:id="@+id/privacy_agree"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/colorPrimary"
android:text="同意"
android:padding="20dp"
android:gravity="center"
/>
</LinearLayout>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/container"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.viewpager.widget.ViewPager
android:id="@+id/view_pager"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
app:labelVisibilityMode="labeled"
app:itemTextColor="@color/color_state_menu_navi"
android:background="@color/nr_gray"
app:menu="@menu/bottom_nav_menu" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:focusable="true"
android:background="@color/white"
android:focusableInTouchMode="true"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_marginTop="41.5dp"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/btn_back"
android:layout_marginLeft="20dp"
android:layout_width="10dp"
android:layout_height="17dp"
android:background="@drawable/back_icon"
/>
</LinearLayout>
<TextView
android:layout_marginTop="31.5dp"
android:layout_marginLeft="30dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="输入您的手机号"
android:textColor="#FF000000"
android:textSize="19.5sp"
/>
<TextView
android:layout_marginLeft="30dp"
android:layout_marginTop="11dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="新用户尊享3天免费VIP"
android:textColor="#FFD0964E"
android:textSize="13sp"
/>
<com.xuexiang.xui.widget.layout.XUILinearLayout
android:layout_width="match_parent"
android:layout_height="49dp"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:layout_marginTop="20dp"
android:gravity="center_vertical"
android:layout_marginBottom="10dp"
android:background="#F9F9F9"
android:orientation="horizontal"
app:xui_radius="10dp">
<EditText
android:id="@+id/phone_et"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"
android:background="@null"
android:layout_marginLeft="10dp"
android:textColor="#FF000000"
android:layout_weight="1"
android:maxLength="11"
android:textSize="15sp"/>
<ImageView
android:id="@+id/phone_clear"
android:layout_width="15dp"
android:layout_height="15dp"
android:layout_marginRight="10dp"
android:background="@mipmap/edit_del"
/>
</com.xuexiang.xui.widget.layout.XUILinearLayout>
<com.xuexiang.xui.widget.layout.XUILinearLayout
android:layout_width="match_parent"
android:layout_height="49dp"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:gravity="center_vertical"
android:layout_marginBottom="10dp"
android:background="#F9F9F9"
android:orientation="horizontal"
app:xui_radius="10dp">
<EditText
android:id="@+id/auth_code_et"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"
android:background="@null"
android:layout_marginLeft="10dp"
android:textColor="#FF000000"
android:layout_weight="1"
android:maxLength="6"
android:textSize="15sp"/>
<TextView
android:id="@+id/auth_code_wait"
android:layout_width="wrap_content"
android:layout_height="18.5dp"
android:visibility="gone"
android:text="60秒后重新获得验证码"
android:layout_marginRight="10dp"
android:textColor="#FFBEBEBE"
android:textSize="13sp"
/>
<TextView
android:id="@+id/auth_code_btn"
android:layout_width="wrap_content"
android:layout_height="18.5dp"
android:text="获取验证码"
android:layout_marginRight="10dp"
android:enabled="false"
android:textColor="@color/login_text_color"
android:textSize="13sp"
/>
</com.xuexiang.xui.widget.layout.XUILinearLayout>
<com.xuexiang.xui.widget.button.roundbutton.RoundButton
android:id="@+id/login"
android:layout_width="302dp"
android:layout_height="44dp"
android:layout_marginTop="21dp"
android:layout_gravity="center_horizontal"
android:text="登录"
android:textColor="#FFFFFFFF"
android:textSize="16sp"
android:enabled="false"
app:rb_backgroundColor="@color/login_btn_color"
app:rb_radius="44dp"/>
<LinearLayout
android:layout_marginTop="15dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_marginBottom="20dp"
android:gravity="center"
android:orientation="horizontal">
<CheckBox
android:id="@+id/cb_protocol"
android:layout_width="14dp"
android:layout_height="14dp"
style="@style/btn_checkbox"
/>
<TextView
android:layout_marginLeft="5dp"
style="@style/TextStyle.Explain"
android:layout_width="wrap_content"
android:text="您已阅读并同意"
android:textColor="#FF494949"
android:textSize="12sp"/>
<TextView
android:id="@+id/user_aggreement"
style="@style/TextStyle.Explain"
android:layout_width="wrap_content"
android:text="用户协议"
android:textColor="#FF408DFF"
android:textSize="12sp"/>
<TextView
style="@style/TextStyle.Explain"
android:layout_width="wrap_content"
android:text="和"
android:textColor="#FF494949"
android:textSize="12sp"/>
<TextView
android:id="@+id/privacy_aggreement"
style="@style/TextStyle.Explain"
android:layout_width="wrap_content"
android:text="隐私协议"
android:textColor="#FF408DFF"
android:textSize="12sp"/>
</LinearLayout>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/common_webview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
\ No newline at end of file
<?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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.notifications.NotificationsFragment" >
<TextView
android:id="@+id/text_notifications"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:textAlignment="center"
android:textSize="20sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
This diff is collapsed.
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/navigation_dashboard"
android:icon="@drawable/quick"
android:title="加速"/>
<item
android:id="@+id/navigation_home"
android:icon="@drawable/news"
android:title="资讯"/>
<item
android:id="@+id/navigation_notifications"
android:icon="@drawable/mine"
android:title="我的"/>
</menu>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_700">#293847</color>
<color name="colorPrimary">#2EE7F0</color>
<color name="colorPrimaryDark">#6A6D80</color>
<color name="text_litte_white">#ffd0fffd</color>
<color name="bg_litte_divi">#000000</color>
<color name="nr_gray">#272934</color>
<color name="btn_blue_1">#FF3B4FBE</color>
<color name="btn_blue_2">#685FF5</color>
</resources>
\ No newline at end of file
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
<dimen name="textsize_big">25sp</dimen>
<dimen name="textsize_middle">18sp</dimen>
<dimen name="textsize_little">12sp</dimen>
<dimen name="textsize_lit_mid">15sp</dimen>
</resources>
\ No newline at end of file
<resources>
<string name="app_name">cc_quickly</string>
<string name="title_activity_main">MainActivity</string>
<string name="title_home">Home</string>
<string name="title_dashboard">Dashboard</string>
<string name="title_notifications">Notifications</string>
<string name="title_activity_main2">Main2Activity</string>
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
</resources>
\ No newline at end of file
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.Cc_quickly" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Primary brand color. -->
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/white</item>
<!-- Secondary brand color. -->>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
<style name="AppTheme" parent="XUITheme.Phone">
<!-- 自定义自己的主题样式 -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimary</item>
<item name="colorAccent">@color/black</item>
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
<!-- <item name="android:background">@color/nr_gray</item>-->
<item name="xpage_actionbar_background">@null</item>
<!--标题栏的背景颜色-->
<item name="xpage_actionbar_color">@color/white</item>
<!--是否支持沉浸式标题栏, 默认false-->
<item name="xpage_actionbar_immersive">true</item>
<!--标题栏返回箭头, 默认R.drawable.xpage_ic_navigation_back_white-->
<item name="xpage_actionbar_navigation_back">@drawable/xpage_ic_navigation_back_white</item>
<!--标题栏的高度,默认52dp-->
<item name="xpage_actionbar_height">60dp</item>
<!--标题栏标题文字的大小,默认18sp-->
<item name="xpage_actionbar_title_text_size">18sp</item>
<!--标题栏副标题文字的大小,默认12sp-->
<item name="xpage_actionbar_sub_text_size">14sp</item>
<!--标题栏动作文字的大小,默认15sp-->
<item name="xpage_actionbar_action_text_size">18sp</item>
<!--标题栏动作图片的padding,默认5dp-->
<item name="xpage_actionbar_action_padding">6dp</item>
<!--标题栏两侧文字的padding,默认14dp-->
<item name="xpage_actionbar_side_text_padding">16dp</item>
<item name="XPageTitleBarStyle">@style/XPageTitleBar.Custom</item>
</style>
<style name="XPageTitleBar.Custom">
<item name="tb_immersive">false</item>
<item name="tb_centerGravity">center</item>
</style>
<style name="btn_checkbox" parent="@android:style/Widget.CompoundButton.CheckBox">
<item name="android:button">@drawable/btn_check</item>
</style>
</resources>
\ No newline at end of file
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
maven { url 'https://jitpack.io' }
maven {
url "https://nexus.sky-shark.com/repository/ccnet-group/"
}
}
dependencies {
classpath 'com.android.tools.build:gradle:4.2.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.10"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
maven {
url "https://nexus.sky-shark.com/repository/ccnet-group/"
}
google()
maven {
url "https://jitpack.io"
}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
\ No newline at end of file
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app"s APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true
# Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official
\ No newline at end of file
#Mon Jan 17 13:56:17 CST 2022
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
exec "$JAVACMD" "$@"
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
rootProject.name = "cc_quickly"
include ':app'
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment