Commit 662f8ccf authored by sheteng's avatar sheteng

资讯页面

parent 14a60b11
......@@ -31,5 +31,10 @@
<option name="name" value="maven" />
<option name="url" value="https://jitpack.io" />
</remote-repository>
<remote-repository>
<option name="id" value="maven3" />
<option name="name" value="maven3" />
<option name="url" value="https://repo1.maven.org/maven2/" />
</remote-repository>
</component>
</project>
\ No newline at end of file
......@@ -11,20 +11,25 @@
<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/drawable/tab_bg.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_member.xml" value="0.26358695652173914" />
<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_collection_object.xml" value="0.2871376811594203" />
<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/fragment_news.xml" value="0.26358695652173914" />
<entry key="..\:/ccwangluo/cc_quickly/app/src/main/res/layout/fragment_quick.xml" value="0.33" />
<entry key="..\:/ccwangluo/cc_quickly/app/src/main/res/layout/fragment_webview.xml" value="0.2708333333333333" />
<entry key="..\:/ccwangluo/cc_quickly/app/src/main/res/layout/item_tab.xml" value="0.2871376811594203" />
<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" />
......
......@@ -27,6 +27,7 @@ android {
arguments = [ moduleName : project.getName() ]
}
}
manifestPlaceholders = [qqappid: "你的qq appid"]
}
buildTypes {
......@@ -72,6 +73,7 @@ dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0'
implementation 'androidx.recyclerview:recyclerview:1.2.1'
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"
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'
......@@ -91,4 +93,20 @@ dependencies {
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'
// 友盟基础组件库(所有友盟业务SDK都依赖基础组件库)
implementation 'com.umeng.umsdk:common:9.4.7'// (必选)
implementation 'com.umeng.umsdk:asms:1.5.0'// 必选
implementation 'com.umeng.umsdk:share-core:7.1.7'//分享核心库,必选
implementation 'com.umeng.umsdk:share-board:7.1.7'//分享面板功能,可选
//在线依赖目前支持QQ、微信、新浪微博、支付宝、钉钉;若需支持其他平台,请选择手动下载SDK
implementation 'com.umeng.umsdk:share-wx:7.1.7' //微信完整版
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:6.7.9'//微信官方依赖库,必选
//
implementation 'com.umeng.umsdk:share-qq:7.1.7'//QQ完整版
implementation files('libs/open_sdk_3.5.7.4_r1bc9afe_lite.jar') //QQ官方依赖库,必选
implementation 'com.squareup.okhttp3:okhttp:3.14.9'//QQ官方sdk 3.53及之后版本需要集成okhttp3.x,必选
}
\ No newline at end of file
......@@ -53,3 +53,98 @@
*;
}
-dontwarn com.just.agentweb.**
-dontshrink
-dontoptimize
-dontwarn com.google.android.maps.**
-dontwarn com.squareup.okhttp.**
-dontwarn android.webkit.WebView
-dontwarn com.umeng.**
-dontwarn com.tencent.weibo.sdk.**
-dontwarn com.facebook.**
-keep public class javax.**
-keep public class android.webkit.**
-dontwarn android.support.v4.**
-keep enum com.facebook.**
-keepattributes Exceptions,InnerClasses,Signature
-keepattributes *Annotation*
-keepattributes SourceFile,LineNumberTable
-keepattributes EnclosingMethod
-keep public interface com.facebook.**
-keep public interface com.tencent.**
-keep public interface com.umeng.socialize.**
-keep public interface com.umeng.socialize.sensor.**
-keep public interface com.umeng.scrshot.**
-keep public class com.umeng.socialize.* {*;}
-keep class com.umeng.commonsdk.statistics.common.MLog {*;}
-keep class com.umeng.commonsdk.UMConfigure {*;}
-keep class com.umeng.** {*;}
-keep class com.umeng.**
-keep class com.facebook.**
-keep class com.facebook.** { *; }
-keep class com.umeng.scrshot.**
-keep public class com.tencent.** {*;}
-keep class com.umeng.socialize.sensor.**
-keep class com.umeng.socialize.handler.**
-keep class com.umeng.socialize.handler.*
-keep class com.umeng.weixin.handler.**
-keep class com.umeng.weixin.handler.*
-keep class com.umeng.qq.handler.**
-keep class com.umeng.qq.handler.*
-keep class UMMoreHandler{*;}
-keep class com.tencent.mm.sdk.modelmsg.WXMediaMessage {*;}
-keep class com.tencent.mm.sdk.modelmsg.** implements com.tencent.mm.sdk.modelmsg.WXMediaMessage$IMediaObject {*;}
-keep class im.yixin.sdk.api.YXMessage {*;}
-keep class im.yixin.sdk.api.** implements im.yixin.sdk.api.YXMessage$YXMessageData{*;}
-keep class com.tencent.mm.sdk.** {
*;
}
-keep class com.tencent.mm.opensdk.** {
*;
}
-keep class com.tencent.wxop.** {
*;
}
-keep class com.tencent.mm.sdk.** {
*;
}
-dontwarn twitter4j.**
-keep class twitter4j.** { *; }
-keep class com.tencent.** {*;}
-dontwarn com.tencent.**
-keep class com.kakao.** {*;}
-dontwarn com.kakao.**
-keep public class com.umeng.com.umeng.soexample.R$*{
public static final int *;
}
-keep public class com.linkedin.android.mobilesdk.R$*{
public static final int *;
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class com.tencent.open.TDialog$*
-keep class com.tencent.open.TDialog$* {*;}
-keep class com.tencent.open.PKDialog
-keep class com.tencent.open.PKDialog {*;}
-keep class com.tencent.open.PKDialog$*
-keep class com.tencent.open.PKDialog$* {*;}
-keep class com.umeng.socialize.impl.ImageImpl {*;}
-keep class com.sina.** {*;}
-dontwarn com.sina.**
-keep class com.alipay.share.sdk.** {
*;
}
-keepnames class * implements android.os.Parcelable {
public static final ** CREATOR;
}
-keep class com.linkedin.** { *; }
-keep class com.android.dingtalk.share.ddsharemodule.** { *; }
-keepattributes Signature
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ccwangluo.cc_quickly">
package="com.ccwangluo.accelerator">
<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"/>
......@@ -15,6 +15,11 @@
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<queries>
<package android:name="com.tencent.mm" /> // 指定微信包名
<package android:name="com.tencent.mobileqq" /> //指定qq包名
</queries>
<application
android:name=".App"
......@@ -35,6 +40,49 @@
</intent-filter>
</activity>
<activity
android:name=".wxapi.WXEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
<!-- <provider-->
<!-- android:name="android.support.v4.content.FileProvider"-->
<!-- android:authorities="com.ccwangluo.accelerator.fileprovider"-->
<!-- android:exported="false"-->
<!-- android:grantUriPermissions="true">-->
<!-- <meta-data-->
<!-- android:name="android.support.FILE_PROVIDER_PATHS"-->
<!-- android:resource="@xml/filepaths"/>-->
<!-- </provider>-->
<activity
android:name="com.tencent.tauth.AuthActivity"
android:noHistory="true"
android:launchMode="singleTask" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="1212121" />
</intent-filter>
</activity>
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="behind"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<!-- <provider-->
<!-- android:authorities="${applicationId}.fileprovider"-->
<!-- android:name="android.support.v4.content.FileProvider"-->
<!-- android:exported="false"-->
<!-- android:grantUriPermissions="true"-->
<!-- >-->
<!-- <meta-data-->
<!-- android:name="android.support.FILE_PROVIDER_PATHS"-->
<!-- android:resource="@xml/filepaths"/>-->
<!-- </provider>-->
<activity
android:name="com.chuanglan.shanyan_sdk.view.CmccLoginActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
......
package com.ccwangluo.cc_quickly
package com.ccwangluo.accelerator
import android.app.Application
import com.ccwangluo.accelerator.utils.PhoneUtils
......@@ -18,6 +18,7 @@ class App : Application(){
PhoneUtils.initSdk(this)
// 初始化 Toast 框架
ToastUtils.init(this)
// UMConfigure.preInit()
}
}
\ No newline at end of file
package com.ccwangluo.accelerator.adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
/**
* actor 晴天 create 2019/5/17
* 封装一个kotlin下的通用adapter
*/
class KotlinDataAdapter<T> private constructor() : RecyclerView.Adapter<KotlinDataAdapter<T>.MyViewHolder>() {
//数据
private var mDatalist: ArrayList<T>? = null
//布局id
private var mLayoutId: Int? = null
//绑定事件的lambda放发
private var addBindView: ((itemView: View, itemData: T) -> Unit)? = null
override fun onCreateViewHolder(p0: ViewGroup, p1: Int): MyViewHolder {
val view = LayoutInflater.from(p0.context).inflate(mLayoutId!!, p0, false)
return MyViewHolder(view)
}
override fun getItemCount(): Int {
return mDatalist?.size ?: -1 //左侧为null时返回-1
}
override fun onBindViewHolder(p0: MyViewHolder, p1: Int) {
addBindView?.invoke(p0.itemView, mDatalist?.get(p1)!!)
}
inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
/**
* 建造者,用来完成adapter的数据组合
*/
class Builder<B> {
private var adapter: KotlinDataAdapter<B> = KotlinDataAdapter()
/**
* 设置数据
*/
fun setData(lists: ArrayList<B>): Builder<B> {
adapter.mDatalist = lists
return this
}
/**
* 设置布局id
*/
fun setLayoutId(layoutId: Int): Builder<B> {
adapter.mLayoutId = layoutId
return this
}
/**
* 绑定View和数据
*/
fun addBindView(itemBind: ((itemView: View, itemData: B) -> Unit)): Builder<B> {
adapter.addBindView = itemBind
return this
}
fun create(): KotlinDataAdapter<B> {
return adapter
}
}
}
\ No newline at end of file
package com.ccwangluo.accelerator.model
class NetState {
//延迟
var netDelay : Int = 0
//丢包率
var lossRate : Float = 0f
//网络类型
var netType: String ="__"
}
\ No newline at end of file
package com.ccwangluo.accelerator.ui
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.view.*
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.ccwangluo.accelerator.databinding.FragmentBtnNavBinding
import com.ccwangluo.accelerator.ui.home.MineFragment
import com.ccwangluo.accelerator.ui.home.NewsFragment
import com.ccwangluo.accelerator.ui.home.QuickFragment
import com.google.android.material.bottomnavigation.BottomNavigationView
import com.xuexiang.xpage.annotation.Page
import com.xuexiang.xpage.base.XPageFragment
......@@ -63,7 +58,7 @@ class BottomNavigationFragment : XPageFragment(), ViewPager.OnPageChangeListener
}
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
binding.bottomNavigation.menu.getItem(position).isChecked = true
// binding.bottomNavigation.menu.getItem(position).isChecked = true
}
override fun onPageSelected(position: Int) {
......@@ -83,4 +78,8 @@ class BottomNavigationFragment : XPageFragment(), ViewPager.OnPageChangeListener
return false
}
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
return super.onKeyDown(keyCode, event)
}
}
\ No newline at end of file
package com.ccwangluo.cc_quickly.ui
package com.ccwangluo.accelerator.ui
import android.Manifest
import android.content.Intent
import android.os.Bundle
import com.ccwangluo.accelerator.ui.BottomNavigationFragment
import android.view.KeyEvent
import com.ccwangluo.accelerator.ui.view.PrivacyDialog
import com.ccwangluo.accelerator.utils.LoginUtils
import com.ccwangluo.accelerator.utils.PhoneUtils
import com.ccwangluo.accelerator.utils.http.HttpConfig
import com.ccwangluo.cc_quickly.utils.SettingSPUtils
import com.karumi.dexter.Dexter
import com.karumi.dexter.MultiplePermissionsReport
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.karumi.dexter.listener.multi.MultiplePermissionsListener
import com.tencent.mmkv.MMKV
import com.tencent.tauth.Tencent
import com.umeng.socialize.UMShareAPI
import com.xuexiang.xpage.base.XPageActivity
import com.xuexiang.xpage.core.PageOption
......@@ -24,25 +29,39 @@ class MainActivity() : XPageActivity() {
initPhoneUtils()
//获取权限
Dexter.withContext(this)
.withPermission(Manifest.permission.READ_PHONE_STATE)
.withListener(object : PermissionListener {
override fun onPermissionGranted(response: PermissionGrantedResponse) {
}
override fun onPermissionDenied(response: PermissionDeniedResponse) {
.withPermissions(
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
)
.withListener(object : MultiplePermissionsListener {
override fun onPermissionsChecked(p0: MultiplePermissionsReport?) {
println(p0)
}
override fun onPermissionRationaleShouldBeShown(
permission: PermissionRequest,
token: PermissionToken
p0: MutableList<PermissionRequest>?,
p1: PermissionToken?
) {
println(p0)
println(p1)
}
}).check()
PageOption.to(BottomNavigationFragment::class.java).open(this)
Tencent.setIsPermissionGranted(true)
//隐私协议
if (!SettingSPUtils.isAgreePrivacy) {
PrivacyDialog(this, HttpConfig.privacy_url, {
if (it) {
SettingSPUtils.isAgreePrivacy = true
} else {
finish()
}
}).show<PrivacyDialog>()
}
}
private fun initPhoneUtils() {
......@@ -54,6 +73,23 @@ class MainActivity() : XPageActivity() {
LoginUtils.clearToken()
}
override fun onActivityResult(
requestCode: Int,
resultCode: Int,
data: Intent?
) {
super.onActivityResult(requestCode, resultCode, data)
UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data)
}
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
activeFragment?.let {
if (activeFragment.onKeyDown(keyCode, event)) {
return true
}
}
return super.onKeyDown(keyCode, event)
}
}
\ No newline at end of file
package com.ccwangluo.cc_quickly.ui.quick
package com.ccwangluo.accelerator.ui.home
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.databinding.FragmentMineBinding
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
......@@ -17,6 +17,7 @@ import com.xuexiang.xpage.utils.TitleBar
class MineFragment : XPageFragment() {
private var _binding: FragmentMineBinding? = null
private val binding get() = _binding!!
var agentWeb: AgentWeb? = null
override fun initTitleBar(): TitleBar? {
//不使用@Page标注的一定要注意覆盖这个方法
......@@ -61,4 +62,21 @@ class MineFragment : XPageFragment() {
.ready()
.go(url)
}
override fun onPause() {
agentWeb?.getWebLifeCycle()?.onPause()
super.onPause()
}
override fun onResume() {
agentWeb?.getWebLifeCycle()?.onResume()
super.onResume()
}
override fun onDestroyView() {
agentWeb?.getWebLifeCycle()?.onDestroy()
super.onDestroyView()
}
}
\ No newline at end of file
package com.ccwangluo.cc_quickly.ui.quick
package com.ccwangluo.accelerator.ui.home
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.ccwangluo.cc_quickly.databinding.FragmentNewsBinding
import androidx.lifecycle.ViewModelProvider
import com.ccwangluo.accelerator.R
import com.ccwangluo.accelerator.databinding.FragmentNewsBinding
import com.ccwangluo.accelerator.ui.news.DemoCollectionAdapter
import com.google.android.material.tabs.TabLayoutMediator
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!!
private lateinit var newsViewModel: NewsViewModel
override fun initTitleBar(): TitleBar? {
//不使用@Page标注的一定要注意覆盖这个方法
return null
......@@ -17,18 +22,41 @@ class NewsFragment : XPageFragment() {
override fun inflateView(inflater: LayoutInflater?, container: ViewGroup?): View {
_binding = FragmentNewsBinding.inflate(inflater!!, container, false)
newsViewModel = ViewModelProvider(requireActivity()).get(NewsViewModel::class.java)
return binding.root
}
val titles = arrayOf("动态", "攻略", "视频", "评价", "问答")
var adapter: DemoCollectionAdapter? = null
override fun initViews() {
newsViewModel.refreshState.observe(this, {
if (!it) {
binding.refreshLayout.isRefreshing = false
}
})
binding.tvMarquee.addDisplayString("【公告】韩服 DNF已经开启预约啦,小伙伴…")
binding.tvMarquee.startRoll()
adapter = DemoCollectionAdapter(this, titles)
binding.viewPager.adapter = adapter
TabLayoutMediator(binding.tabLayout, binding.viewPager) { tab, position ->
tab.setCustomView(R.layout.item_tab)
tab.text = titles[position]
}.attach()
}
override fun initListeners() {
binding.refreshLayout.setOnRefreshListener {
adapter?.refresh(binding.viewPager.currentItem)
binding.refreshLayout.postDelayed({
binding.refreshLayout.isRefreshing = false
}, 2000)
}
}
companion object{
companion object {
fun newInstance(): NewsFragment {
val fragment = NewsFragment()
return fragment
......
package com.ccwangluo.accelerator.ui.home
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class NewsViewModel : ViewModel() {
/**
* 刷新状态
*/
val refreshState = MutableLiveData<Boolean>()
}
\ No newline at end of file
package com.ccwangluo.cc_quickly.ui.quick
package com.ccwangluo.accelerator.ui.home
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 android.view.animation.Animation
import android.view.animation.LinearInterpolator
import android.view.animation.RotateAnimation
import com.ccwangluo.accelerator.databinding.FragmentQuickBinding
import com.ccwangluo.accelerator.ui.view.MemberDialog
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!!
......@@ -23,7 +27,7 @@ class QuickFragment : XPageFragment() {
}
override fun initViews() {
//
}
override fun initListeners() {
......@@ -31,19 +35,39 @@ class QuickFragment : XPageFragment() {
if (binding.expandableLayout1.isExpanded) {
binding.expandableLayout1.toggle()
binding.expandableLayout2.expand()
binding.btnExpendBg.setBackgroundResource(com.ccwangluo.accelerator.R.mipmap.quick_arrow_up)
} else {
binding.expandableLayout1.expand()
binding.expandableLayout2.toggle()
binding.btnExpendBg.setBackgroundResource(com.ccwangluo.accelerator.R.mipmap.quick_arrow_down)
}
}
binding.btnQuick.setOnClickListener {
if (!LoginUtils.hasToken()) {
LoginUtils.login(this,{
// if (!LoginUtils.hasToken()) {
// LoginUtils.login(this, {
//
// })
// return@setOnClickListener
// } else {
// val token = LoginUtils.token
// println(token)
// }
//
// if (!SysUtils.getConnectivityStatus(attachContext!!)) {
// binding.quickTopToast.visibility = View.VISIBLE
// binding.quickTopToastTx.setText("网络异常,请检查网络后重试")
// return@setOnClickListener
// }
//用户是否有使用时长
// if (){
//
// }
MemberDialog(this).show<MemberDialog>()
// startAnim()
})
} else {
}
}
}
......
package com.ccwangluo.accelerator.ui.home
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.ccwangluo.accelerator.model.NetState
class QuickViewModel : ViewModel() {
//加速状态
var accState = MutableLiveData<Int>()
//网络状态
var netState = MutableLiveData<NetState>()
}
\ No newline at end of file
......@@ -15,10 +15,12 @@ class LoginViewModel : ViewModel() {
val sendCodeState = MutableLiveData<Boolean>()
val loginState = MutableLiveData<Boolean>()
val timerNumber = MutableLiveData<Int>()
fun login(phone: String, authCdoe: String) {
val map = mutableMapOf<String, String>()
map.put("phone", phone)
map.put("verifyCode",authCdoe)
map.put("verifyCode", authCdoe)
viewModelScope.launch(Dispatchers.IO) {
val res = HttpGo.postSync<LoginRes>("/user/verifyCode/login", map)
res?.let {
......@@ -33,6 +35,7 @@ class LoginViewModel : ViewModel() {
}
}
fun getAuthCode(phone: String) {
val map = mutableMapOf<String, String>()
map.put("phone", phone)
......@@ -42,9 +45,13 @@ class LoginViewModel : ViewModel() {
if (it.code == 200) {
sendCodeState.postValue(true)
} else {
sendCodeState.postValue(false)
ToastUtils.show(it.error)
}
}
if (res == null) {
sendCodeState.postValue(false)
}
}
}
......
package com.ccwangluo.cc_quickly.ui.login
package com.ccwangluo.accelerator.ui.login
import android.os.Handler
import android.os.Looper
......@@ -8,9 +8,8 @@ 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.ccwangluo.accelerator.databinding.FragmentLoginPhoneBinding
import com.ccwangluo.accelerator.utils.LoginUtils
import com.hjq.toast.ToastUtils
import com.xuexiang.xpage.annotation.Page
import com.xuexiang.xpage.base.XPageFragment
......@@ -40,7 +39,7 @@ class PhoneLoginFragment : XPageFragment() {
override fun inflateView(inflater: LayoutInflater?, container: ViewGroup?): View {
binding = FragmentLoginPhoneBinding.inflate(inflater!!, container, false)
loginViewModel = ViewModelProvider(this).get(LoginViewModel::class.java)
loginViewModel = ViewModelProvider(requireActivity()).get(LoginViewModel::class.java)
return binding.root
}
......@@ -68,14 +67,18 @@ class PhoneLoginFragment : XPageFragment() {
} else {
binding.login.isEnabled = false
}
if (isPhone(phone) && authCdoe.length == 6 && binding.cbProtocol.isChecked) {
loginViewModel.login(phone, authCdoe)
}
}
loginViewModel.sendCodeState.observe(this, {
if (it) {
sendVerifyCode()
LoginUtils.startTimer()
} else {
binding.authCodeBtn.visibility = View.VISIBLE
binding.authCodeWait.visibility = View.GONE
binding.authCodeBtn.isEnabled = true
}
})
......@@ -84,13 +87,21 @@ class PhoneLoginFragment : XPageFragment() {
popToBack()
}
})
loginViewModel.timerNumber.observe(this, {
if (it > 0) {
binding.authCodeBtn.visibility = View.GONE
binding.authCodeWait.visibility = View.VISIBLE
binding.authCodeBtn.isEnabled = false
binding.authCodeWait.setText("${it}秒后重新获得验证码")
} else {
resetCounter()
}
})
}
override fun initListeners() {
binding.privacyAggreement.setOnClickListener({
PrivacyDialog(this, "http://www.baidu.com", {
}).show<PrivacyDialog>()
})
binding.userAggreement.setOnClickListener {
......@@ -104,11 +115,9 @@ class PhoneLoginFragment : XPageFragment() {
binding.authCodeBtn.setOnClickListener {
val phone = binding.phoneEt.text.toString()
if (StringUtils.isEmpty(phone) || !isPhone(phone)) {
ToastUtils.show("请输入手机号码")
ToastUtils.show("输入正确的手机号")
return@setOnClickListener
}
binding.authCodeBtn.visibility = View.GONE
binding.authCodeWait.visibility = View.VISIBLE
binding.authCodeBtn.isEnabled = false
loginViewModel.getAuthCode(phone)
}
......@@ -123,7 +132,7 @@ class PhoneLoginFragment : XPageFragment() {
val authCdoe = binding.authCodeEt.text.toString()
if (StringUtils.isEmpty(phone) || !isPhone(phone)) {
ToastUtils.show("请输入手机号码")
ToastUtils.show("输入正确的手机号")
return@setOnClickListener
}
if (StringUtils.isEmpty(authCdoe) || authCdoe.length < 6) {
......@@ -146,34 +155,24 @@ class PhoneLoginFragment : XPageFragment() {
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}秒后重新获得验证码")
override fun onResume() {
super.onResume()
LoginUtils.registerTimerCallBack {
loginViewModel.timerNumber.postValue(it)
}
}
fun removeRunable() {
mHandler.removeCallbacks(countDown)
override fun onPause() {
super.onPause()
LoginUtils.unRegisterTimerCallBack()
}
//重置按钮状态
fun resetCounter(vararg text: String) {
fun resetCounter() {
mCountTime = 60
binding.authCodeBtn.visibility = View.VISIBLE
binding.authCodeWait.visibility = View.GONE
binding.authCodeBtn.setText("重新获取验证码")
binding.authCodeBtn.isEnabled = true
}
}
\ No newline at end of file
package com.ccwangluo.accelerator.ui.news
import android.os.Bundle
import androidx.fragment.app.Fragment
import androidx.viewpager2.adapter.FragmentStateAdapter
class DemoCollectionAdapter(fragment: Fragment, val titles: Array<String>) :
FragmentStateAdapter(fragment) {
override fun getItemCount(): Int = titles.size
var list = mutableListOf<DemoObjectFragment>()
override fun createFragment(position: Int): Fragment {
val fragment = DemoObjectFragment()
fragment.arguments = Bundle().apply {
// Our object is just an integer :-P
putInt(ARG_OBJECT, position)
}
list.add(fragment)
return fragment
}
fun refresh(index:Int) {
list.get(index).refresh()
}
companion object {
val ARG_OBJECT = "object"
}
}
package com.ccwangluo.accelerator.ui.news
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.RecyclerView
import com.ccwangluo.accelerator.R
import com.ccwangluo.accelerator.ui.home.NewsViewModel
import com.ccwangluo.accelerator.ui.news.DemoCollectionAdapter.Companion.ARG_OBJECT
class DemoObjectFragment : Fragment() {
var recycle_view: RecyclerView? = null
private lateinit var newsViewModel: NewsViewModel
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
newsViewModel = ViewModelProvider(requireActivity()).get(NewsViewModel::class.java)
return inflater.inflate(R.layout.fragment_collection_object, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
arguments?.takeIf { it.containsKey(ARG_OBJECT) }?.apply {
val position = getInt(ARG_OBJECT).toString()
recycle_view = view.findViewById(R.id.recycle_view)
}
// val adapter = KotlinDataAdapter.Builder<DeviceModel>()
// .setData(deviceList)
// .setLayoutId(R.layout.item_device)
// .addBindView { itemView, itemData ->
// itemView.tv_device_name.text = if (itemData.platform.isEmpty()) "未命名" else
// }
// .create()
}
fun refresh() {
recycle_view?.postDelayed({
newsViewModel.refreshState.postValue(false )
}, 1000)
}
}
\ No newline at end of file
......@@ -3,7 +3,7 @@ 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.ccwangluo.accelerator.R
import com.xuexiang.xui.widget.dialog.materialdialog.CustomMaterialDialog
import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
......@@ -16,7 +16,7 @@ class CommonDialog(
override fun getDialogBuilder(context: Context?): MaterialDialog.Builder {
return MaterialDialog.Builder(context!!)
.customView(R.layout.dialog_common, true);
.customView(R.layout.dialog_common, false);
}
......
package com.ccwangluo.accelerator.ui.view
import android.content.Context
import android.os.Bundle
import android.widget.ImageView
import com.ccwangluo.accelerator.R
import com.ccwangluo.accelerator.ui.web.CommonWebViewFragment
import com.ccwangluo.accelerator.utils.http.HttpConfig
import com.xuexiang.xpage.base.XPageFragment
import com.xuexiang.xui.widget.dialog.materialdialog.CustomMaterialDialog
import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
/**
* 会员购买框
*/
class MemberDialog(
var fragment: XPageFragment,
) : CustomMaterialDialog(fragment.context) {
override fun getDialogBuilder(context: Context?): MaterialDialog.Builder {
return MaterialDialog.Builder(context!!)
.customView(R.layout.dialog_member, false);
}
override fun initViews(context: Context?) {
val btn = findViewById<ImageView>(R.id.dialog_memeber_btn)
btn.setOnClickListener {
dismiss<MemberDialog>()
val params = Bundle()
params.putString(CommonWebViewFragment.WEBVIEW_URL_KEY, HttpConfig.privacy_url)
fragment.openPage(CommonWebViewFragment::class.java, params)
}
}
}
\ 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.ccwangluo.accelerator.R
import com.just.agentweb.core.AgentWeb
import com.just.agentweb.core.client.DefaultWebClient
import com.xuexiang.xpage.base.XPageActivity
import com.xuexiang.xui.widget.dialog.materialdialog.CustomMaterialDialog
import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
class PrivacyDialog(
var fragment: Fragment,
var xPageActivity: XPageActivity,
var privacy_url: String,
var callback: (Boolean) -> Unit
) : CustomMaterialDialog(fragment.context) {
) : CustomMaterialDialog(xPageActivity) {
override fun getDialogBuilder(context: Context?): MaterialDialog.Builder {
return MaterialDialog.Builder(context!!)
.customView(R.layout.dialog_privacy, true);
.customView(R.layout.dialog_privacy, false);
}
......@@ -40,11 +41,11 @@ class PrivacyDialog(
init {
val container = findViewById<FrameLayout>(R.id.privacy_webview)
val agentWeb =
createAgentWeb(fragment, container, privacy_url)
createAgentWeb(xPageActivity, container, privacy_url)
}
fun createAgentWeb(fragment: Fragment?, viewGroup: ViewGroup, url: String): AgentWeb {
return AgentWeb.with(fragment!!)
fun createAgentWeb(xPageActivity: XPageActivity, viewGroup: ViewGroup, url: String): AgentWeb {
return AgentWeb.with(xPageActivity)
.setAgentWebParent(
viewGroup!!,
-1,
......
package com.ccwangluo.accelerator.ui.web
import android.os.Bundle
import android.webkit.JavascriptInterface
import androidx.core.content.ContextCompat.checkSelfPermission
import com.ccwangluo.accelerator.utils.LoginUtils
import com.ccwangluo.accelerator.utils.SysUtils
import com.ccwangluo.cc_quickly.utils.XToastUtils
import com.just.agentweb.core.AgentWeb
import com.karumi.dexter.Dexter
import com.karumi.dexter.MultiplePermissionsReport
import com.karumi.dexter.PermissionToken
import com.karumi.dexter.listener.PermissionRequest
import com.karumi.dexter.listener.multi.MultiplePermissionsListener
import com.xuexiang.xpage.base.XPageFragment
......@@ -25,10 +31,17 @@ class AndroidInterface(val xPageFragment: XPageFragment, val agentWeb: AgentWeb)
}
@JavascriptInterface
fun open(pageName: String) {
fun openNative(pageName: String) {
xPageFragment.openPage(pageName)
}
@JavascriptInterface
fun openWebview(url: String) {
val params = Bundle()
params.putString(CommonWebViewFragment.WEBVIEW_URL_KEY, url)
xPageFragment.openPage(CommonWebViewFragment::class.java, params)
}
@JavascriptInterface
fun login(callback: String) {
LoginUtils.login(xPageFragment, {
......@@ -48,7 +61,41 @@ class AndroidInterface(val xPageFragment: XPageFragment, val agentWeb: AgentWeb)
xPageFragment.context?.let {
val hasPermission: Boolean = if (checkSelfPermission(it, key) > 0) true else false
agentWeb.getJsAccessEntrace()
.quickCallJs(callback,key, hasPermission.toString())
.quickCallJs(callback, key, hasPermission.toString())
}
}
/**
* 申请权限
*/
@JavascriptInterface
fun requirePermissionState(key: String, callback: String) {
xPageFragment.context?.let {
//获取权限
Dexter.withContext(it)
.withPermissions(key)
.withListener(object : MultiplePermissionsListener {
override fun onPermissionsChecked(p0: MultiplePermissionsReport?) {
p0?.let {
it.grantedPermissionResponses.forEach {
agentWeb.getJsAccessEntrace()
.quickCallJs(callback, key, "true")
}
it.deniedPermissionResponses.forEach {
agentWeb.getJsAccessEntrace()
.quickCallJs(callback, key, "false")
}
}
}
override fun onPermissionRationaleShouldBeShown(
p0: MutableList<PermissionRequest>?,
p1: PermissionToken?
) {
}
}).check()
}
}
......
package com.ccwangluo.accelerator.ui.web
import android.view.KeyEvent
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.utils.http.HttpConfig
import com.ccwangluo.cc_quickly.databinding.FragmentWebviewBinding
import com.ccwangluo.accelerator.databinding.FragmentWebviewBinding
import com.just.agentweb.core.AgentWeb
import com.just.agentweb.core.client.DefaultWebClient
import com.xuexiang.xpage.annotation.Page
......@@ -16,6 +16,7 @@ import com.xuexiang.xpage.base.XPageFragment
@Page(name = "webview")
class CommonWebViewFragment : XPageFragment() {
var agentWeb: AgentWeb? = null
lateinit var binding: FragmentWebviewBinding
override fun inflateView(inflater: LayoutInflater?, container: ViewGroup?): View {
binding = FragmentWebviewBinding.inflate(inflater!!, container, false)
......@@ -23,9 +24,11 @@ class CommonWebViewFragment : XPageFragment() {
}
override fun initViews() {
val agentWeb =
createAgentWeb(this, binding.commonWebview, HttpConfig.UI_MAIN_URL)
agentWeb.getJsInterfaceHolder().addJavaObject("android", AndroidInterface(this, agentWeb))
val url = arguments?.getString(WEBVIEW_URL_KEY)
agentWeb =
url?.let { createAgentWeb(this, binding.commonWebview, it) }
agentWeb?.getJsInterfaceHolder()
?.addJavaObject("android", AndroidInterface(this, agentWeb!!))
}
fun createAgentWeb(fragment: Fragment?, viewGroup: ViewGroup, url: String): AgentWeb {
......@@ -48,4 +51,35 @@ class CommonWebViewFragment : XPageFragment() {
override fun initListeners() {
}
override fun onPause() {
agentWeb?.getWebLifeCycle()?.onPause()
super.onPause()
}
override fun onResume() {
agentWeb?.getWebLifeCycle()?.onResume()
super.onResume()
}
override fun onDestroyView() {
agentWeb?.getWebLifeCycle()?.onDestroy()
super.onDestroyView()
}
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
if (keyCode == KeyEvent.KEYCODE_BACK) {
agentWeb?.let {
if (it.back()) {
return true
}
}
}
return super.onKeyDown(keyCode, event)
}
companion object {
var WEBVIEW_URL_KEY = "WEBVIEW_URL_KEY"
}
}
\ No newline at end of file
package com.ccwangluo.accelerator.utils
/**
* 加速功能工具类
*/
object AcceleratorUtils {
}
\ No newline at end of file
......@@ -3,8 +3,8 @@ package com.ccwangluo.accelerator.utils
import android.content.Context
import androidx.lifecycle.lifecycleScope
import com.ccwangluo.accelerator.model.LoginRes
import com.ccwangluo.accelerator.ui.login.PhoneLoginFragment
import com.ccwangluo.accelerator.utils.http.HttpGo
import com.ccwangluo.cc_quickly.ui.login.PhoneLoginFragment
import com.chuanglan.shanyan_sdk.OneKeyLoginManager
import com.hjq.toast.ToastUtils
import com.tencent.mmkv.MMKV
......@@ -13,9 +13,43 @@ import com.xuexiang.xpage.core.PageOption
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.util.*
object LoginUtils {
var loginRes: LoginRes? = null
var timeNumber = 60
private var timer: Timer? = null
private var timerTask: TimerTask? = null
private var timerCallBack: (Int) -> Unit? = {}
fun registerTimerCallBack(callBack: (Int) -> Unit) {
timerCallBack = callBack
}
fun unRegisterTimerCallBack() {
timerCallBack = {}
}
fun startTimer() {
timer?.cancel()
timerTask = object : TimerTask() {
override fun run() {
timeNumber--
timerCallBack(timeNumber)
if (timeNumber == 0) {
timer?.cancel()
}
}
}
timer = Timer();
timer?.schedule(timerTask, 0, 1000);
}
fun login(xPageFragment: XPageFragment, callBack: (Boolean) -> Unit) {
PhoneUtils.openLoginAuth(xPageFragment) { b, s ->
if (b) {
......@@ -26,16 +60,17 @@ object LoginUtils {
res?.let {
if (it.code == 200) {
token = it.data?.token
loginRes = it.data
ToastUtils.show("登录成功")
OneKeyLoginManager.getInstance().finishAuthActivity()
withContext(Dispatchers.Main){
withContext(Dispatchers.Main) {
callBack(true)
}
} else {
it.error?.let {
ToastUtils.show(it)
}
withContext(Dispatchers.Main){
withContext(Dispatchers.Main) {
callBack(false)
}
}
......@@ -73,4 +108,9 @@ object LoginUtils {
return MMKV.defaultMMKV().containsKey(KEY_TOKEN)
}
fun logout() {
}
}
\ No newline at end of file
......@@ -8,8 +8,9 @@ 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.ccwangluo.accelerator.R
import com.ccwangluo.accelerator.ui.login.PhoneLoginFragment
import com.chuanglan.shanyan_sdk.OneKeyLoginManager
import com.chuanglan.shanyan_sdk.tool.ShanYanUIConfig
import com.xuexiang.xpage.base.XPageFragment
......@@ -77,10 +78,10 @@ object PhoneUtils {
// 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)
context.getResources().getDrawable(R.mipmap.login_check_cus)
//协议复选框未选中时图标
val mCunheckedImg: Drawable =
context.getResources().getDrawable(com.ccwangluo.cc_quickly.R.mipmap.login_uncheck_cus)
context.getResources().getDrawable(R.mipmap.login_uncheck_cus)
//自定义控件(右上角“使用其他手机>”)
val mOtherTv = TextView(context)
mOtherTv.text = "其他方式登录"
......@@ -124,7 +125,7 @@ object PhoneUtils {
.setLogoHeight(130)
.setLogoWidth(130)
.setLogoOffsetY(30)
.setLogoImgPath(context.resources.getDrawable(com.ccwangluo.cc_quickly.R.mipmap.ic_launcher))
.setLogoImgPath(context.resources.getDrawable(R.mipmap.ic_launcher))
// .addCustomView(
// mOtherTv2, true, false, null
// )
......
......@@ -41,5 +41,4 @@ object SysUtils {
return packageNames.contains(packageName)
}
}
\ No newline at end of file
......@@ -3,4 +3,7 @@ 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"
//隐私协议地址
val privacy_url = "http:wwww.baidu.com"
}
\ No newline at end of file
package com.ccwangluo.accelerator.wxapi;
import com.umeng.socialize.weixin.view.WXCallbackActivity;
public class WXEntryActivity extends WXCallbackActivity {
}
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android">
<rotate
android:fromDegrees="0"
android:toDegrees="359"
android:pivotX="50%"
android:pivotY="50%"
android:duration="2000"
android:repeatCount="-1">
</rotate>
</rotate>
\ 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_selected="true" android:color="#FF000000"/>
<item android:state_selected="false" android:color="#9E9E9E" />
</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_selected="true" android:drawable="@mipmap/tab_bg_selected"/>
<item android:state_selected="false" android:drawable="@color/white"/>
</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="308dp"
android:layout_height="381dp"
android:background="@mipmap/dialog_member"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="178.25dp"
android:text="您的加速特权已到期"
android:textColor="#FF000000"
android:textSize="18sp" />
<TextView
android:layout_width="232dp"
android:layout_height="47.5dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="14dp"
android:text="此游戏加速为会员服务,成为会员,体验一件加速的超快感吧!"
android:textColor="#FF343434"
android:textSize="15sp" />
<ImageView
android:id="@+id/dialog_memeber_btn"
android:layout_width="235dp"
android:layout_height="49dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="35dp"
android:background="@mipmap/dialog_member_btn" />
</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:layout_width="302dp"
android:orientation="vertical"
android:layout_height="720dp">
android:layout_height="418.5dp">
<FrameLayout
android:id="@+id/privacy_webview"
android:layout_width="match_parent"
android:layout_height="500dp"/>
android:layout_height="364.5dp"/>
<LinearLayout
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="wrap_content">
android:layout_height="53.5dp">
<TextView
android:id="@+id/privacy_disagree"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="match_parent"
android:text="不同意"
android:padding="20dp"
android:textColor="#FFA8A8A8"
android:textSize="15sp"
android:layout_weight="1"
android:gravity="center"
/>
......@@ -28,10 +29,10 @@
android:id="@+id/privacy_agree"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/colorPrimary"
android:layout_height="match_parent"
android:text="同意"
android:padding="20dp"
android:textColor="#FF3CA4FD"
android:textSize="15sp"
android:gravity="center"
/>
......
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycle_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
\ No newline at end of file
......@@ -59,12 +59,13 @@
<EditText
android:id="@+id/phone_et"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="30dp"
android:inputType="number"
android:background="@null"
android:layout_marginLeft="10dp"
android:textColor="#FF000000"
android:layout_weight="1"
android:hint="请输入手机号"
android:maxLength="11"
android:textSize="15sp"/>
......@@ -93,12 +94,13 @@
<EditText
android:id="@+id/auth_code_et"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="30dp"
android:inputType="number"
android:background="@null"
android:layout_marginLeft="10dp"
android:textColor="#FF000000"
android:layout_weight="1"
android:hint="请输入验证码"
android:maxLength="6"
android:textSize="15sp"/>
......
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout 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:id="@+id/refresh_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.notifications.NotificationsFragment" >
android:background="@color/black"
android:orientation="vertical">
<TextView
android:id="@+id/text_notifications"
<LinearLayout
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
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="36dp"
android:gravity="center_horizontal"
android:text="地下城与勇士 韩服"
android:textColor="#FFFFFFFF"
android:textSize="16sp" />
<com.xuexiang.xui.widget.layout.XUILinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="16dp"
android:background="@color/white"
android:orientation="vertical"
app:xui_hideRadiusSide="bottom"
app:xui_radius="10dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="21dp"
android:orientation="horizontal">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:orientation="vertical">
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_gravity="center_horizontal"
android:background="@mipmap/game_download" />
<TextView
android:layout_width="70dp"
android:layout_height="20dp"
android:layout_marginTop="8dp"
android:gravity="center"
android:text="游戏下载"
android:textColor="#FF3B3B3B"
android:textSize="14sp" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:orientation="vertical">
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_gravity="center_horizontal"
android:background="@mipmap/game_group" />
<TextView
android:layout_width="70dp"
android:layout_height="20dp"
android:layout_marginTop="8dp"
android:gravity="center"
android:text="万能宝藏群"
android:textColor="#FF3B3B3B"
android:textSize="14sp" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:orientation="vertical">
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_gravity="center_horizontal"
android:background="@mipmap/game_google" />
<TextView
android:layout_width="70dp"
android:layout_height="20dp"
android:layout_marginTop="8dp"
android:gravity="center"
android:text="谷歌套件"
android:textColor="#FF3B3B3B"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="20dp"
android:layout_marginLeft="20dp"
android:layout_marginTop="21dp"
android:layout_marginRight="20dp">
<ImageView
android:layout_width="17.95dp"
android:layout_height="14.6dp"
android:layout_gravity="center_vertical"
android:background="@mipmap/icon_notice" />
<com.xuexiang.xui.widget.textview.MarqueeTextView
android:id="@+id/tv_marquee"
android:layout_width="299dp"
android:layout_height="wrap_content"
android:layout_marginLeft="3dp"
android:gravity="center"
android:text=""
android:textColor="#FF1A1A1A"
android:textSize="14sp"
app:mtv_isAutoDisplay="true"
app:mtv_isAutoFit="true" />
</LinearLayout>
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
style="@style/MyTablayoutstyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp" />
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</com.xuexiang.xui.widget.layout.XUILinearLayout>
</LinearLayout>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
\ No newline at end of file
This diff is collapsed.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="32dp"
android:layout_height="22.5dp">
<ImageView
android:layout_alignParentBottom="true"
android:id="@+id/tab_icon"
android:layout_width="32dp"
android:layout_height="10.5dp"
android:src="@drawable/tab_bg" />
<com.google.android.material.textview.MaterialTextView
android:id="@android:id/text1"
android:layout_centerInParent="true"
android:textSize="16sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/tab_color" />
</RelativeLayout>
\ No newline at end of file
......@@ -11,6 +11,6 @@
<color name="nr_gray">#272934</color>
<color name="btn_blue_1">#FF3B4FBE</color>
<color name="btn_blue_2">#685FF5</color>
<color name="transparent">#00000000</color>
</resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--DialogTheme,用于将Activity作为Dialog的主题-->
<style name="DialogTheme" parent="XUITheme.Phone"><!--name是我们在使用时要用到的资源的标志,parent是指当前的样式所继承的父类样式-->
<item name="android:windowFrame">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowIsTranslucent">false</item>
<item name="android:windowNoTitle">true</item><!--隐藏标题栏-->
<item name="android:background">@color/transparent</item>
<item name="android:windowBackground">@color/transparent
</item><!--这儿也很重要啊,我这儿用了一张透明的.9.png的图,当然用#00000000也是可以的,否则的话这儿出来后有一个黑色的背景-->
<item name="android:backgroundDimEnabled">false</item>
</style>
<style name="MyTablayoutstyle" parent="Base.Widget.Design.TabLayout">
<item name="tabIndicatorHeight">0dp</item>
<item name="tabSelectedTextColor">@color/black</item>
<item name="android:textSize">16sp</item>
<item name="android:textColor">#FF9E9E9E</item>
</style>
</resources>
\ No newline at end of file
......@@ -39,11 +39,11 @@
<!--标题栏两侧文字的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>
......
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-files-path name="umeng_cache" path="umeng_cache"/>
<!-- QQ 官方分享SDK 共享路径 -->
<root-path name="opensdk_root" path=""/>
<external-files-path name="opensdk_external" path="Images/tmp"/>
</paths>
\ No newline at end of file
......@@ -6,6 +6,7 @@ buildscript {
maven {
url "https://nexus.sky-shark.com/repository/ccnet-group/"
}
maven { url 'https://repo1.maven.org/maven2/'}
}
dependencies {
classpath 'com.android.tools.build:gradle:4.2.2'
......@@ -22,6 +23,7 @@ allprojects {
url "https://nexus.sky-shark.com/repository/ccnet-group/"
}
google()
maven { url 'https://repo1.maven.org/maven2/'}
maven {
url "https://jitpack.io"
}
......
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