初始化

This commit is contained in:
lijia 2024-10-21 10:31:06 +08:00
parent 80a5170bbf
commit b64a200deb
364 changed files with 24276 additions and 0 deletions

15
.gitignore vendored Normal file
View File

@ -0,0 +1,15 @@
*.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

3
.idea/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

6
.idea/compiler.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="17" />
</component>
</project>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetDropDown">
<value>
<entry key="app">
<State />
</entry>
</value>
</component>
</project>

20
.idea/gradle.xml Normal file
View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="#JAVA_HOME" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
<option value="$PROJECT_DIR$/mylibrary" />
</set>
</option>
<option name="resolveExternalAnnotations" value="false" />
</GradleProjectSettings>
</option>
</component>
</project>

6
.idea/kotlinc.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="KotlinJpsPluginSettings">
<option name="version" value="1.9.0" />
</component>
</project>

10
.idea/migrations.xml Normal file
View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectMigrations">
<option name="MigrateToGradleLocalJavaHome">
<set>
<option value="$PROJECT_DIR$" />
</set>
</option>
</component>
</project>

4
.idea/misc.xml Normal file
View File

@ -0,0 +1,4 @@
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK" />
</project>

1
app/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/build

147
app/build.gradle Normal file
View File

@ -0,0 +1,147 @@
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
def releaseTime() {
return new Date().format("yyyyMMddHHmm", TimeZone.getTimeZone("GMT+08:00"))
}
android {
signingConfigs {
config {
keyAlias 'key0'
keyPassword '210419'
storeFile file('glowner.jks')
storePassword '210419'
v1SigningEnabled true
v2SigningEnabled true
}
}
namespace 'com.dhsd.glowner'
compileSdk 34
defaultConfig {
applicationId "com.dhsd.glowner"
minSdk 23
targetSdk 34
versionCode 1
versionName "1.0"
flavorDimensions "CHANNEL_VALUE"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary true
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.config
}
debug {
signingConfig signingConfigs.config
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = '11'
}
buildFeatures {
viewBinding = true
buildConfig = true
}
buildFeatures {
compose true
}
composeOptions {
kotlinCompilerExtensionVersion '1.5.1'
}
productFlavors {
dev {
applicationId "com.dhsd.glowner"
manifestPlaceholders = [CHANNEL_VALUE: "货主端(测试)",
// app_icon : "@drawable/head_defaut",
JPUSH_PKGNAME: applicationId,
//JPush Appkey.
JPUSH_APPKEY : "fba6f55621c670d8c1fe9191",
//.
JPUSH_CHANNEL: "developer-n",
]
buildConfigField("String", "BASE_URL", "\"https://platform.test.v2.dahehuoyun.com/\"")
buildConfigField "boolean", "isTest", "true"
// //APP名称androidMainfest中引用
resValue "string", "appName", "货主端测试"
}
prod {
applicationId "com.dhsd.glowner"
manifestPlaceholders = [CHANNEL_VALUE: "货主端",
// app_icon : "@drawable/ysxy",
JPUSH_PKGNAME: applicationId,
//JPush Appkey.
JPUSH_APPKEY : "fba6f55621c670d8c1fe9191",
//.
JPUSH_CHANNEL: "developer-default"]
buildConfigField("String", "BASE_URL", "\"http://app.dahehuoyun.com/api/\"")
buildConfigField "boolean", "isTest", "false"
resValue "string", "appName", "货主端"
}
}
// android.applicationVariants.all { variant ->
// variant.outputs.all {
// //
// def isText = variant.productFlavors[0].properties.get("buildConfigFields").getAt("isTest").properties.get("value")
// def appName = null
// if (isText == "true") {
// appName = '货主端测试_'
// } else {
// appName = '货主端正式_'
// }
// outputFileName = appName + "${variant.buildType.name}_${defaultConfig.versionName}_${releaseTime()}.apk"
//
// }
// }
// packaging {
// resources {
// excludes += '/META-INF/{AL2.0,LGPL2.1}'
// }
// }
}
dependencies {
implementation 'androidx.core:core-ktx:1.10.1'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1'
implementation 'androidx.activity:activity-compose:1.7.0'
implementation platform('androidx.compose:compose-bom:2023.08.00')
implementation 'androidx.compose.ui:ui'
implementation 'androidx.compose.ui:ui-graphics'
implementation 'androidx.compose.ui:ui-tooling-preview'
implementation 'androidx.compose.material3:material3'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
androidTestImplementation platform('androidx.compose:compose-bom:2023.08.00')
androidTestImplementation 'androidx.compose.ui:ui-test-junit4'
debugImplementation 'androidx.compose.ui:ui-tooling'
debugImplementation 'androidx.compose.ui:ui-test-manifest'
//
implementation 'com.amap.api:map2d:6.0.0'
implementation project(path: ':mylibrary')
}

BIN
app/glowner.jks Normal file

Binary file not shown.

21
app/proguard-rules.pro vendored Normal file
View File

@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

BIN
app/release/app-release.apk Normal file

Binary file not shown.

View File

@ -0,0 +1,20 @@
{
"version": 3,
"artifactType": {
"type": "APK",
"kind": "Directory"
},
"applicationId": "com.dhsd.glowner",
"variantName": "release",
"elements": [
{
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 1,
"versionName": "1.0",
"outputFile": "app-release.apk"
}
],
"elementType": "File"
}

View File

@ -0,0 +1,24 @@
package com.dhsd.glowner
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.Assert.*
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("com.dhsd.glowner", appContext.packageName)
}
}

View File

@ -0,0 +1,162 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!-- //地图SDK包含其搜索功能需要的基础权限-->
<!--允许程序打开网络套接字-->
<uses-permission android:name="android.permission.INTERNET" />
<!--允许程序设置内置sd卡的写权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--允许程序获取网络状态-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--允许程序访问WiFi网络信息-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--允许程序访问CellID或WiFi热点来获取粗略的位置-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
<!-- Android 13版本适配细化存储权限-->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<!-- 安卓11使用相机 -->
<queries package="${applicationId}">
<intent>
<action android:name="android.media.action.IMAGE_CAPTURE">
</action>
</intent>
<intent>
<action android:name="android.media.action.ACTION_VIDEO_CAPTURE">
</action>
</intent>
</queries>
<application
android:name=".base.App"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:usesCleartextTraffic="true"
android:theme="@style/Theme.GLOwner"
tools:targetApi="31">
<meta-data
android:name="CHANNEL"
android:value="${CHANNEL_VALUE}" />
<!-- 适配全面屏 Android O vivo&oppo -->
<meta-data
android:name="android.max_aspect"
android:value="2.2" /> <!-- 适配刘海屏、水滴屏 Android O 小米 -->
<meta-data
android:name="notch.config"
android:value="portrait|landscape" /> <!-- 适配刘海屏、水滴屏 Android O 华为 -->
<meta-data
android:name="android.notch_support"
android:value="true" />
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="203d8b896f30ce1e7dd55d7c4a62c362" />
<activity
android:name=".ui.LauncherActivity"
android:configChanges="keyboardHidden|orientation|locale"
android:exported="true"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:theme="@style/Theme.Splash"
android:windowSoftInputMode="adjustPan|stateHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ui.HomeActivity"
android:configChanges="keyboardHidden|orientation|locale"
android:exported="true"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan|stateHidden" />
<activity
android:name=".ui.account.LoginActivity"
android:configChanges="keyboardHidden|orientation|locale"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan|stateHidden" />
<activity
android:name=".ui.home.activtiy.SendGoodsActivity"
android:configChanges="keyboardHidden|orientation|locale"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan|stateHidden" />
<activity
android:name=".ui.home.activtiy.AddressEditActivity"
android:configChanges="keyboardHidden|orientation|locale"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan|stateHidden" />
<activity
android:name=".ui.home.activtiy.GoodsInfoActivity"
android:configChanges="keyboardHidden|orientation|locale"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan|stateHidden" />
<activity
android:name=".ui.home.activtiy.CarTypeActivity"
android:configChanges="keyboardHidden|orientation|locale"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan|stateHidden" />
<activity
android:name=".ui.home.activtiy.SendSuccActivity"
android:configChanges="keyboardHidden|orientation|locale"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan|stateHidden" />
<activity
android:name=".ui.waybill.activity.SourceDetailActivity"
android:configChanges="keyboardHidden|orientation|locale"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan|stateHidden" />
<activity
android:name=".ui.waybill.activity.WaybillLDetailActivity"
android:configChanges="keyboardHidden|orientation|locale"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan|stateHidden" />
</application>
</manifest>

View File

@ -0,0 +1,71 @@
package com.dhsd.glowner.adapter
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.ImageView
import android.widget.TextView
import com.dahe.gldriver.bean.GridBean
import com.dhsd.glowner.R
/**
* @ClassName GridItemAdapter
* @Author 用户
* @Date 2024/1/23 10:26
* @Description TODO
*/
class GridItemAdapter(private val context: Context, private val dataList: MutableList<GridBean>) :
BaseAdapter() {
private var cusLayout: Int = 0
constructor(context: Context, dataList: MutableList<GridBean>, mlayoutid: Int) : this(
context,
dataList
) {
this.cusLayout = mlayoutid
}
// 实现必要的方法...
override fun getCount(): Int {
return dataList.size
}
override fun getItem(position: Int): Any {
return dataList[position]
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
var view = convertView
var holder: ViewHolder
if (convertView == null) {
view = LayoutInflater.from(context)
.inflate(if (cusLayout == 0) R.layout.grid_item else cusLayout, null)
holder = ViewHolder()
holder.title = view.findViewById(R.id.title)
holder.image = view.findViewById(R.id.image)
view?.tag = holder
} else {
holder = (view?.tag) as ViewHolder
}
val item = dataList[position]
holder.title?.text = item.title
holder.image?.setBackgroundResource(item.image)
return view!!
}
private class ViewHolder {
var title: TextView? = null
var image: ImageView? = null
}
}

View File

@ -0,0 +1,31 @@
package com.dhsd.glowner.adapter
import android.content.Context
import android.view.ViewGroup
import com.chad.library.adapter4.BaseQuickAdapter
import com.chad.library.adapter4.viewholder.QuickViewHolder
import com.dahe.glex.bean.WayBillBean
import com.dhsd.glowner.R
/**
* @ClassName MessageAdapter
* @Author 用户
* @Date 2024/1/24 14:40
* @Description TODO
*/
class MessageAdapter: BaseQuickAdapter<WayBillBean, QuickViewHolder>() {
override fun onBindViewHolder(holder: QuickViewHolder, position: Int, item: WayBillBean?) {
}
override fun onCreateViewHolder(
context: Context,
parent: ViewGroup,
viewType: Int
): QuickViewHolder {
// 返回一个 ViewHolder
return QuickViewHolder(R.layout.item_message, parent)
}
}

View File

@ -0,0 +1,43 @@
package com.dhsd.glowner.adapter
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentStatePagerAdapter
import java.util.ArrayList
/**
* Created by Administrator on 2018/7/16 0016.
*/
class MyHomePagerAdapter : FragmentStatePagerAdapter {
private lateinit var mTitles: Array<String>
private var mFragments = ArrayList<Fragment>()
constructor(fm: FragmentManager?) : super(fm!!) {}
constructor(
fm: FragmentManager?,
mTitles: Array<String>,
mFragments: ArrayList<Fragment>
) : super(
fm!!) {
this.mTitles = mTitles
this.mFragments = mFragments
}
// 初始化每个页卡选项
// @Override
// public Object instantiateItem(ViewGroup arg0, int arg1) {
// // TODO Auto-generated method stub
// node_return super.instantiateItem(arg0, arg1);
// }
override fun getCount(): Int {
return mFragments.size
}
override fun getPageTitle(position: Int): CharSequence? {
return mTitles[position]
}
override fun getItem(position: Int): Fragment {
return mFragments[position]
}
}

View File

@ -0,0 +1,32 @@
package com.dhsd.glowner.adapter
import android.content.Context
import android.view.ViewGroup
import android.widget.RadioButton
import android.widget.TextView
import com.chad.library.adapter4.BaseQuickAdapter
import com.chad.library.adapter4.QuickAdapterHelper
import com.chad.library.adapter4.viewholder.QuickViewHolder
import com.dahe.glex.bean.WayBillBean
import com.dhsd.glowner.R
import com.dhsd.glowner.bean.PackTypeBean
/**
* @ClassName PackingTypeAdapter
* @Author john
* @Date 2024/2/4 14:49
* @Description TODO
*/
class PackingTypeAdapter : BaseQuickAdapter<PackTypeBean,QuickViewHolder>() {
override fun onBindViewHolder(holder: QuickViewHolder, position: Int, item: PackTypeBean?) {
holder.getView<TextView>(R.id.rbWord).isSelected = item?.isCheck == true
// holder.getView<RadioButton>(R.id.rbWord).isChecked = item?.isCheck == true
holder.setText(R.id.rbWord,item?.content)
}
override fun onCreateViewHolder(
context: Context,
parent: ViewGroup,
viewType: Int
) = QuickViewHolder(R.layout.item_packing_type,parent)
}

View File

@ -0,0 +1,37 @@
package com.dhsd.glowner.adapter
import android.content.Context
import android.view.ViewGroup
import com.chad.library.adapter4.BaseQuickAdapter
import com.chad.library.adapter4.QuickAdapterHelper
import com.chad.library.adapter4.viewholder.QuickViewHolder
import com.dahe.glex.bean.WayBillBean
import com.dhsd.glowner.R
/**
* @ClassName SendGoodsAdapter
* @Author john
* @Date 2024/2/4 09:37
* @Description TODO
*/
class SendGoodsAdapter : BaseQuickAdapter<WayBillBean, QuickViewHolder>() {
override fun onBindViewHolder(holder: QuickViewHolder, position: Int, item: WayBillBean?) {
if (0==position){
holder.setBackgroundResource(R.id.ivType,R.drawable.icon_loading)
}else if (position==items.size-1){
holder.setBackgroundResource(R.id.ivType,R.drawable.icon_unloading)
}else{
holder.setBackgroundResource(R.id.ivType,R.drawable.icon_point)
}
}
override fun onCreateViewHolder(
context: Context,
parent: ViewGroup,
viewType: Int
): QuickViewHolder {
// 返回一个 ViewHolder
return QuickViewHolder(R.layout.item_send_goods, parent)
}
}

View File

@ -0,0 +1,30 @@
package com.dhsd.glowner.adapter
import android.content.Context
import android.view.ViewGroup
import com.chad.library.adapter4.BaseQuickAdapter
import com.chad.library.adapter4.viewholder.QuickViewHolder
import com.dahe.glex.bean.WayBillBean
import com.dhsd.glowner.R
/**
* @ClassName WaybillAdapter
* @Author 用户
* @Date 2024/1/23 16:27
* @Description TODO
*/
class WaybillAdapter :
BaseQuickAdapter<WayBillBean, QuickViewHolder>() {
override fun onBindViewHolder(holder: QuickViewHolder, position: Int, item: WayBillBean?) {
}
override fun onCreateViewHolder(
context: Context,
parent: ViewGroup,
viewType: Int
): QuickViewHolder {
// 返回一个 ViewHolder
return QuickViewHolder(R.layout.item_waybill, parent)
}
}

View File

@ -0,0 +1,30 @@
package com.dhsd.glowner.adapter
import android.content.Context
import android.view.ViewGroup
import com.chad.library.adapter4.BaseQuickAdapter
import com.chad.library.adapter4.viewholder.QuickViewHolder
import com.dahe.glex.bean.WayBillBean
import com.dhsd.glowner.R
/**
* @ClassName WaybillAdapter
* @Author 用户
* @Date 2024/1/23 16:27
* @Description TODO
*/
class WaybillListAdapter() :
BaseQuickAdapter<WayBillBean, QuickViewHolder>() {
override fun onBindViewHolder(holder: QuickViewHolder, position: Int, item: WayBillBean?) {
}
override fun onCreateViewHolder(
context: Context,
parent: ViewGroup,
viewType: Int
): QuickViewHolder {
// 返回一个 ViewHolder
return QuickViewHolder(R.layout.item_waybill, parent)
}
}

View File

@ -0,0 +1,83 @@
package com.dhsd.glowner.base
import android.app.Application
import android.content.Context
import com.dahe.mylibrary.CommonBaseLibrary
import java.lang.Exception
import java.security.SecureRandom
import java.security.cert.X509Certificate
import javax.net.ssl.HttpsURLConnection
import javax.net.ssl.SSLContext
import javax.net.ssl.TrustManager
import javax.net.ssl.X509TrustManager
class App : Application() {
override fun onCreate() {
super.onCreate()
app = this
CommonBaseLibrary.getInstance().init(this, Api.BASE_URL)
// if (BuildConfig.DEBUG) {
// CrashHandler.getInstance().init(this);
// CrashHandler2.getInstance().init(getApplicationContext());
// }
// CrashReport.initCrashReport(getApplicationContext(), AppConfig.BUGLY_APP_ID, false);
// SophixManager.getInstance().queryAndLoadNewPatch();
// OssServiceUtil.getInstance().init();
// PendingIntent pendingIntent =
// PendingIntent.getActivity(this, 0, new Intent(this, HomeActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);
// Cactus.getInstance()
// .isDebug(true)
// //可选,设置通知栏点击事件
// .setPendingIntent(pendingIntent)
//// .setBackgroundMusicEnabled(true)//可选,退到后台是否可以播放音乐
//// .setMusicId(R.raw.main) //可选,设置音乐
//// .setPendingIntent(pendingIntent)//可选,设置通知栏点击事件
//// .addCallback(new CactusCallback())//可选,运行时回调
// .setCrashRestartUIEnabled(true) //可选设置奔溃可以重启google原生rom android 10以下可以正常重启
// .setCrashRestartUIEnabled(true)//可选设置奔溃可以重启google原生rom android 10以下可以正常重启
// .setTitle("大河好运")
// .hideNotificationAfterO(true)
// .setSmallIcon(R.drawable.right_icon)
// .addBackgroundCallback(new CactusBackgroundCallback() {
// @Override
// public void onBackground(boolean b) {
// if (b){
//// getBillLocation();
// }
// }
// })
// .register(this);
}
override fun attachBaseContext(base: Context) {
super.attachBaseContext(base)
}
//忽略https的证书校验
fun handleSSLHandshake() {
try {
val trustAllCerts = arrayOf<TrustManager>(object : X509TrustManager {
override fun getAcceptedIssuers(): Array<X509Certificate?> {
return arrayOfNulls(0)
}
override fun checkClientTrusted(certs: Array<X509Certificate>, authType: String) {}
override fun checkServerTrusted(certs: Array<X509Certificate>, authType: String) {}
})
val sc = SSLContext.getInstance("TLS")
// trustAllCerts信任所有的证书
sc.init(null, trustAllCerts, SecureRandom())
HttpsURLConnection.setDefaultSSLSocketFactory(sc.socketFactory)
HttpsURLConnection.setDefaultHostnameVerifier { hostname, session -> true }
} catch (ignored: Exception) {
}
}
companion object {
var app: App? = null
}
}

View File

@ -0,0 +1,17 @@
package com.dahe.gldriver.base
/**
* @ClassName AppConfig
* @Author 用户
* @Date 2022/1/14 15:24
* @Description TODO
*/
object AppConfig {
const val BUGLY_APP_ID = "a5b894cef7"
const val TIME = "DA_HE_TIME"
const val ID = "DA_HE_ID"
const val PWD = "DA_HE_PHONE"
const val CODE = "DA_HE_PHONE"
const val SUCCESS_TYPE = "DA_HE_SUCCESS_TYPE"
}

View File

@ -0,0 +1,119 @@
package com.dhsd.glowner.ui
import android.os.Bundle
import android.text.TextUtils
import android.view.View
import android.webkit.WebView
import android.widget.FrameLayout
import android.widget.TextView
import com.dahe.mylibrary.R
import com.dahe.mylibrary.base.BaseActivity
import com.dhsd.glowner.databinding.ActivityWebBinding
import com.just.agentweb.AgentWeb
import com.just.agentweb.AgentWebUIControllerImplBase
import com.just.agentweb.WebChromeClient
import com.just.agentweb.WebViewClient
/**
* @ClassName WebActivity
* @Author john
* @Date 2024/2/1 15:08
* @Description TODO
*/
class WebActivity : BaseActivity<ActivityWebBinding>() {
var mTextRight: TextView? = null
private var mAgentWeb: AgentWeb? = null
private var mTitle = ""
private var mUrl = ""
override fun initView(savedInstanceState: Bundle?) {
mTitle = intent.extras?.getString("title").toString()
mUrl = intent.extras?.getString("url").toString()
setStatusBarColor(R.color.colorWhite)
setTitleBar(mTitle) { v: View? -> if (!mAgentWeb!!.back()) finish() }
mAgentWeb = AgentWeb.with(this)
.setAgentWebParent(binding.WebViewLayout, FrameLayout.LayoutParams(-1, -1))
.useDefaultIndicator()
.setWebChromeClient(mWebChromeClient)
.setSecurityType(AgentWeb.SecurityType.DEFAULT_CHECK)
.setAgentWebUIController(AgentWebUIControllerImplBase())
.createAgentWeb()
.ready()
.go(mUrl)
// mAgentWeb?.jsInterfaceHolder?.addJavaObject("phone", AndroidInterfaceWeb())
}
override fun initDate() {
}
private val mWebChromeClient: WebChromeClient = object : WebChromeClient() {
override fun onProgressChanged(view: WebView, newProgress: Int) {
super.onProgressChanged(view, newProgress)
}
override fun onReceivedTitle(view: WebView, title: String) {
super.onReceivedTitle(view, title)
setTitleBar(
if (TextUtils.isEmpty(mTitle)) title else mTitle
) { if (!mAgentWeb!!.back()) finish() }
}
}
// private val mWebViewClient: WebViewClient = object : WebViewClient() {
// override fun onPageStarted(view: WebView, url: String, favicon: Bitmap) {
// super.onPageStarted(view, url, favicon)
// }
//
// override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean {
// return super.shouldOverrideUrlLoading(view, request)
// } // @Override
// // public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
// // //该方法在Build.VERSION_CODES.LOLLIPOP以后有效
// // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
// // String url = request.getUrl().toString();
// // Log.i(TAG, "shouldOverrideUrlLoading: " + url);
// // }
// // return false;
// // }
// }
// @OnClick({R.id.common_toolBar_text_right, R.id.common_toolBar_image_right})
// public void onClick(View view) {
// if (view.getId() == R.id.common_toolBar_text_right) {
// } else if (view.getId() == R.id.common_toolBar_image_right) {
// }
// }
override fun onPause() {
mAgentWeb?.webLifeCycle?.onPause()
super.onPause()
}
override fun onResume() {
mAgentWeb?.webLifeCycle?.onResume()
super.onResume()
}
override fun onDestroy() {
mAgentWeb?.webLifeCycle?.onDestroy()
super.onDestroy()
}
// internal class AndroidInterfaceWeb {
// @JavascriptInterface
// fun gohome() {
// val intent = Intent(mContext, HomeActivity::class.java)
// intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
// mContext.startActivity(intent)
// }
// }
}

View File

@ -0,0 +1,9 @@
package com.dahe.gldriver.bean
import java.io.Serializable
class CheckCodeBean : Serializable {
var image: String? = null
var expireTime: String? = null
var uuid: String? = null
}

View File

@ -0,0 +1,27 @@
package com.dhsd.glowner.bean
/**
* @ClassName CodeBean
* @Author john
* @Date 2024/10/16 09:58
* @Description TODO
*/
data class CodeBean(
val captchaEnabled: Boolean,
val code: Int,
val img: String,
val msg: String,
val uuid: String
)
data class LoginBean(
var username: String,
var password: String,
var code: String?,
var uuid: String?
){
constructor(username: String, password: String) : this(username,password,"","") {
this.username = username
this.password = password
}
}

View File

@ -0,0 +1,13 @@
package com.dahe.glex.bean
/**
* @ClassName TextBean
* @Author 用户
* @Date 2023/9/21 11:08
* @Description TODO
*/
data class CommListBean(
val list: MutableList<OrderBean>,
val num: Int,
val totalFreight: String
)

View File

@ -0,0 +1,12 @@
package com.dahe.gldriver.bean
/**
* @ClassName GridBean
* @Author 用户
* @Date 2024/1/23 10:37
* @Description TODO
*/
data class GridBean(
val title:String,
val image : Int
)

View File

@ -0,0 +1,14 @@
package com.dahe.glex.bean
/**
* @ClassName LogBean
* @Author 用户
* @Date 2022/1/17 15:18
* @Description TODO
*/
data class LogBean(
var smscode: String,
var uname: String,
var registerType: Int,
var roleId: Int,
)

View File

@ -0,0 +1,26 @@
package com.dahe.glex.bean
/**
* @ClassName OrderBean
* @Author 用户
* @Date 2023/9/21 10:22
* @Description TODO
*/
data class OrderBean(
var orderId: String,
var waybillId: String,
var orderNum: String,
var waybillNum: String,
var orderTime: String,
var totalFreight: String,
var dispatchType : Int,
var effectiveTime: String,
var sendPut: String,
var distance: String,
var loadingAddress: String,
var receiverAddress: String,
var waybillStatus: Int,
var evaluation: Int,
var complaint: Int,
var multipleScore: String,
)

View File

@ -0,0 +1,9 @@
package com.dhsd.glowner.bean
/**
* @ClassName PackTypeBean
* @Author john
* @Date 2024/2/4 15:19
* @Description TODO
*/
data class PackTypeBean(var content: String, var id: Int, var isCheck: Boolean = false)

View File

@ -0,0 +1,9 @@
package com.dahe.glex.bean
/**
* @ClassName RefreshBean
* @Author 用户
* @Date 2023/9/21 10:53
* @Description TODO
*/
data class RefreshBean(var page : Int,var limit : Int)

View File

@ -0,0 +1,26 @@
package com.dahe.gldriver.bean
import com.flyco.tablayout.listener.CustomTabEntity
/**
* @ClassName TabBean2
* @Author 用户
* @Date 2023/12/28 15:27
* @Description TODO
*/
data class TabBean(var title:String,
var selectedIcon:Int,
var unSelectedIcon:Int
) : CustomTabEntity {
override fun getTabTitle(): String {
return title
}
override fun getTabSelectedIcon(): Int {
return selectedIcon
}
override fun getTabUnselectedIcon(): Int {
return unSelectedIcon
}
}

View File

@ -0,0 +1,31 @@
package com.dahe.glex.bean
/**
* @ClassName UserBean
* @Author 用户
* @Date 2023/9/21 09:52
* @Description TODO
*/
data class UserBean(
var token :String,
var access_token :String,
var expires_in :String,
var id :String,
var roleId :String,
var uname :String,
var registerPhone :String,
var companyName :String,
var account :String,
var headportraitUrl :String,
var salt :String,
var jumpUrl :String,
var distance :String,
var idCardValidity :String,
var driverValidity :String,
var qualificationValidity :String,
var isCar :String,
var qrcodeUrl :String,
var credit :String
)

View File

@ -0,0 +1,82 @@
/**
* @ClassName WayBill2
* @Author 用户
* @Date 2023/9/21 17:48
* @Description TODO
*/
data class WayBill2(
val acceptTime: String,
val avgScore: Int,
val carNumber: String,
val carType: String,
val contractUrl: String,
val distance: String,
val driverName: String,
val endCountrySubdivisionCode: String,
val isEvaluation: Int,
val nfcId: String,
val operation: Int,
val report: Int,
val reportAlct: Int,
val roleId: Int,
val serialNumber: String,
val shippingNoteNumber: String,
val startCountrySubdivisionCode: String,
val totalAmount: String,
val wayChildren: List<WayChildren>,
val waybillId: Int,
val waybillStatus: String
)
data class WayChildren(
val acceptTime: String,
val address: String,
val carNumber: String,
val carType: String,
val deadline: String,
val deadlineDate: Long,
val delay: Int,
val displayOrder: String,
val distance: String,
val driverName: String,
val goods: List<Good>,
val id: Long,
val imageTakenDate: String,
val isEvaluation: Int,
val latitude: String,
val longitude: String,
val name: String,
val orderId: Int,
val phone: String,
val realityTimeDate: Long,
val receiptLatitude: String,
val receiptLocationAddress: String,
val receiptLongitude: String,
val receiptTime: String,
val receiptUrl: List<String>,
val report: Int,
val reportAlct: Int,
val sendPutImagesUrl: List<String>,
val sendPutLatitude: String,
val sendPutLocationAddress: String,
val sendPutLongitude: String,
val shippingNoteNumber: String,
val status: Int,
val totalAmount: String,
val type: Int,
val updateTime: String,
val waybillStatus: String
)
data class Good(
val childrenId: String,
val createTime: String,
val goodName: String,
val goodNum: String,
val goodPrice: String,
val goodUnit: String,
val id: String,
val packName: String
)

View File

@ -0,0 +1,9 @@
package com.dahe.glex.bean
/**
* @ClassName WayBillBean
* @Author 用户
* @Date 2023/9/21 17:34
* @Description TODO
*/
data class WayBillBean(var waybillId :String="")

View File

@ -0,0 +1,53 @@
import com.dahe.glex.bean.*
import com.dahe.mylibrary.net.CommonResponseBean
import com.dhsd.glowner.BuildConfig
import com.dhsd.glowner.bean.LoginBean
import io.reactivex.rxjava3.core.Observable
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST
/**
* Created by Administrator on 2018/8/8 0008.
*/
interface Api {
/*-------------------登录----------------------------*/
@POST(BASE_URL + "common/register")
fun log(@Body logBean: LogBean?): Observable<CommonResponseBean<UserBean>>
//运单列表
@POST(BASE_URL + "app/driver/waybill/listV2")
fun orderList(@Body bean: RefreshBean?): Observable<CommonResponseBean<CommListBean>>
//获取正在执行的运单/运单详情
@POST(BASE_URL + "app/driver/waybill/getExecuteWaybill")
fun getExecuteWaybill(@Body bean: WayBillBean?): Observable<CommonResponseBean<WayBill2>>
companion object {
const val BASE_URL = BuildConfig.BASE_URL
//获取版本
const val VERSION = BASE_URL + "app/version"
}
/**
* 是否需要验证码登录
* @return Observable<CommonResponseBean<CodeBean>>
*/
@GET(BASE_URL+"devApi/code")
fun getCode(): Observable<CommonResponseBean<Any>>
/**
* 是否需要验证码登录
* @return Observable<CommonResponseBean<CodeBean>>
*/
@POST(BASE_URL+"devApi/auth/login")
fun login(@Body bean: LoginBean): Observable<CommonResponseBean<UserBean>>
@GET(BASE_URL+"devApi/business/shipper/order/list")
fun getOrderList(): Observable<CommonResponseBean<MutableList<OrderBean>>>
}

View File

@ -0,0 +1,42 @@
import android.content.Context
import com.dahe.mylibrary.net.CommonResponseBean
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.disposables.Disposable
/**
* 自定义观察者
*/
class BaseObserver<T>(
private val mContext: Context,
private val mRxHttpCallBack: RxHttpCallBack<T>
) : Observer<CommonResponseBean<T>> {
private var disposable: Disposable? = null
/**
* 订阅成功
*
* @param d
*/
override fun onSubscribe(d: Disposable) {
disposable = d
mRxHttpCallBack.onStart()
}
override fun onNext(tCommonResponseBean: CommonResponseBean<T>) {
if (200 == tCommonResponseBean.code) {
mRxHttpCallBack.onSuccess(tCommonResponseBean)
} else {
mRxHttpCallBack.onCodeError(mContext, tCommonResponseBean)
}
}
override fun onError(e: Throwable) {
mRxHttpCallBack.onFailure(mContext, e)
if (disposable != null && disposable!!.isDisposed) {
disposable!!.dispose()
}
}
override fun onComplete() {}
}

View File

@ -0,0 +1,59 @@
import com.dahe.mylibrary.CommonBaseLibrary
import com.dahe.mylibrary.base.BaseSingNoParam
import com.dahe.mylibrary.net.JsonInterceptor
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.ObservableTransformer
import io.reactivex.rxjava3.schedulers.Schedulers
import okhttp3.OkHttpClient
import java.util.concurrent.TimeUnit
/**
* @ClassName DataManager3
* @Author 用户
* @Date 2023/12/29 10:09
* @Description TODO
*/
class DataManager private constructor(){
//伴生对象实现BaseSingleton抽象类
// companion object : BaseSingNoParam<Api>() {
// //重写方法并给出具体实现
// override fun creator(): Api {
// return CommonBaseLibrary.getRetrofit().newBuilder()
// .client(OkHttpClient.Builder()
// .connectTimeout(30, TimeUnit.SECONDS)
// .readTimeout(30, TimeUnit.SECONDS)
// .writeTimeout(30, TimeUnit.SECONDS)
// .addInterceptor(JsonInterceptor())
// .addInterceptor(RequestHeadInterceptor())
// .build()) // .addNetworkInterceptor(new TokenInterceptor())
// .build().create(Api::class.java)
// }
// }
//伴生对象实现BaseSingleton抽象类
companion object : BaseSingNoParam<Api>() {
//重写方法并给出具体实现
override fun creator(): Api {
return CommonBaseLibrary.getRetrofit().newBuilder()
.client(OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.addInterceptor(RequestHeadInterceptor())
.addInterceptor(JsonInterceptor())
.build()) // .addNetworkInterceptor(new TokenInterceptor())
.build().create(Api::class.java)
}
}
open fun <T : Any> setThread(): ObservableTransformer<T, T>? {
return ObservableTransformer { upstream ->
upstream.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
}
}
}

View File

@ -0,0 +1,43 @@
import kotlin.Throws
import android.text.TextUtils
import android.util.Log
import com.dahe.mylibrary.utils.BaseUtils
import com.dahe.mylibrary.utils.AppUtils
import com.dahe.mylibrary.utils.BaseSPUtils
import com.dhsd.glowner.base.App
import com.dhsd.glowner.utils.SPUtils
import okhttp3.Interceptor
import okhttp3.Request
import okhttp3.Response
import java.io.IOException
/**
* 头部Interceptor
*/
class RequestHeadInterceptor : Interceptor {
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response {
val builder: Request.Builder = chain.request().newBuilder()
if (!TextUtils.isEmpty(SPUtils.instance.getUserToken(App.app))) {
// builder.addHeader("Authorization", SPUtils.getUserInfo(App.getApp()).getToken());
builder.addHeader("Authorization",
"Bearer " + SPUtils.instance.getUserToken(App.app))
}
val request: Request = builder
.addHeader("versionCode", AppUtils.getAppVersionCode().toString() + "")
.addHeader("versionValue", AppUtils.getAppVersionName() + "")
.addHeader("deviceType", "ANDROID")
.addHeader("language", BaseUtils.getLanguage(App.app).toString() + "")
.build()
Log.i(TAG, "intercept: " + request.headers)
return chain.proceed(request)
}
companion object {
private const val TAG = "RequestHeadInterceptor"
}
}

View File

@ -0,0 +1,126 @@
import android.accounts.NetworkErrorException
import android.app.Activity
import android.app.ProgressDialog
import com.dhsd.glowner.utils.UserUtils.Companion.instance
import android.content.Context
import android.text.TextUtils
import android.view.Window
import com.dahe.mylibrary.net.CommonResponseBean
import com.dahe.mylibrary.net.ResultException
import com.dahe.mylibrary.utils.ToastUtils
import java.net.ConnectException
import java.net.SocketTimeoutException
import java.net.UnknownHostException
import java.util.concurrent.TimeoutException
import javax.net.ssl.SSLException
/**
* 统一的网络回调
*/
abstract class RxHttpCallBack<T> {
private var dialog: ProgressDialog? = null
private fun initDialog(activity: Activity, dialogMessage: String) {
dialog = ProgressDialog(activity)
dialog!!.requestWindowFeature(Window.FEATURE_NO_TITLE)
dialog!!.setCanceledOnTouchOutside(false)
dialog!!.setProgressStyle(ProgressDialog.STYLE_SPINNER)
dialog!!.setMessage(dialogMessage)
}
constructor(activity: Activity, dialogMessage: String?) {
initDialog(activity,
(if (TextUtils.isEmpty(dialogMessage)) "网络请求中......" else dialogMessage)!!)
}
constructor(activity: Activity) {
initDialog(activity, "网络请求中......")
}
constructor() {}
/**
* 订阅成功
*/
fun onStart() {
if (dialog != null && !dialog!!.isShowing) {
dialog!!.show()
}
}
fun onStop() {
if (dialog != null && dialog!!.isShowing) {
dialog!!.dismiss()
}
}
/**
* 返回成功
*
* @param t
* @throws Exception
*/
open fun onSuccess(t: CommonResponseBean<T>) {
if (dialog != null && dialog!!.isShowing) {
dialog!!.dismiss()
}
}
/**
* 返回成功了,但是code错误
*
* @param t
* @throws Exception
*/
open fun onCodeError(mContext: Context?, t: CommonResponseBean<T>) {
if (dialog != null && dialog!!.isShowing) {
dialog!!.dismiss()
}
if (t.code == 401) {
instance.loginOut(mContext!!)
// Intent intent = new Intent(mContext, LoginActivity.class);
// intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
// mContext.startActivity(intent);
ToastUtils.showToast(mContext, "您的账号再异地登录,请重新登录")
} else {
ToastUtils.showToast(mContext, t.msg)
}
// if (t.getMessage().getMsg_code() == 100 && SPUtils.hasUserInfo(mContext)) {
// SPUtils.remove(mContext, SPUtils.USER_INFO_KEY);
// } else {
// ToastUtils.showToast(mContext, t.getMessage().getMsg_desc());
// }
}
/**
* 返回失败
*
* @param e
* @throws Exception
*/
open fun onFailure(mContext: Context?, e: Throwable) {
if (dialog != null && dialog!!.isShowing) {
dialog!!.dismiss()
}
if (e is ConnectException
|| e is TimeoutException
|| e is SocketTimeoutException
|| e is SSLException
|| e is NetworkErrorException
|| e is UnknownHostException
) {
ToastUtils.showToast(mContext, "请检查您的网络~")
} else if (e is ResultException) {
e.printStackTrace()
//自定义的ResultException
//由于返回200,300返回格式不统一的问题自定义GsonResponseBodyConverter凡是300的直接抛异常
// System.out.println("---------errorCode------->"+((ResultException) e).getErrCode());
} else if (e is SSLException) {
ToastUtils.showToast(mContext, "网络连接终端,请检查您的网络~")
} else {
ToastUtils.showToast(mContext, e.message)
}
}
}

View File

@ -0,0 +1,44 @@
import okhttp3.Interceptor
import okhttp3.Request
import okhttp3.Response
import kotlin.Throws
import org.json.JSONObject
import java.io.IOException
import java.lang.Exception
import java.nio.charset.StandardCharsets
class TokenInterceptor : Interceptor {
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response {
val request: Request = chain.request()
val response: Response = chain.proceed(request)
val responseBody = response.body
if (responseBody != null) {
val source = responseBody.source()
source.request(Long.MAX_VALUE) // Buffer the entire body.
val buffer = source.buffer()
try {
val result = buffer.clone().readString(StandardCharsets.UTF_8)
val jsonObject = JSONObject(result)
val code = jsonObject.getInt("code")
if (code == -1) { //判断返回code
// SPUtils.cleanUserInfo(App.getApp());
// Intent intent = new Intent(App.getApp(), LoginActivity.class);
// intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
// App.getApp().startActivity(intent);
// ToastUtils.showToast(App.getApp(), "您的账号再异地登录,请重新登录");
// ToastUtils.showShort("身份过期,请重新登录");
//跳转方式
//1.使用MyApplication添加跳转
//2.使用路由跳转
}
} catch (e: Exception) {
e.printStackTrace()
}
}
return response
}
}

View File

@ -0,0 +1,108 @@
package com.dhsd.glowner.ui
import android.Manifest
import android.os.Build
import android.os.Bundle
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.viewpager.widget.ViewPager
import com.dahe.gldriver.bean.TabBean
import com.dahe.mylibrary.base.BaseActivity
import com.dhsd.glowner.R
import com.dhsd.glowner.adapter.MyHomePagerAdapter
import com.dhsd.glowner.databinding.ActivityHomeBinding
import com.dhsd.glowner.ui.home.HomeFragment
import com.dhsd.glowner.ui.message.MessageFragment
import com.dhsd.glowner.ui.mine.MineFragment
import com.dhsd.glowner.ui.waybill.WaybillFragment
import com.flyco.tablayout.listener.CustomTabEntity
import com.flyco.tablayout.listener.OnTabSelectListener
import com.permissionx.guolindev.PermissionX
/**
* @ClassName HomeActivity
* @Author 用户
* @Date 2023/12/27 17:12
* @Description TODO
*/
class HomeActivity: BaseActivity<ActivityHomeBinding>(), OnTabSelectListener,
ViewPager.OnPageChangeListener {
private val mNormalRes = mutableListOf(
R.drawable.tab_home_normal,
R.drawable.tab_message_normal,
R.drawable.tab_waybill_normal,
R.drawable.tab_mine_normal
)
private val mSelectRes = mutableListOf(
R.drawable.tab_home_press,
R.drawable.tab_message_press,
R.drawable.tab_waybill_press,
R.drawable.tab_mine_press
)
private var mTitles = arrayOf("首页","消息","运单","我的")
private var mTabEntities = arrayListOf<CustomTabEntity>(
TabBean(mTitles[0],mSelectRes[0],mNormalRes[0]),
TabBean(mTitles[1],mSelectRes[1],mNormalRes[1]),
TabBean(mTitles[2],mSelectRes[2],mNormalRes[2]),
TabBean(mTitles[3],mSelectRes[3],mNormalRes[3]))
private var mFragments = arrayListOf<Fragment>(HomeFragment(),
MessageFragment(), WaybillFragment(), MineFragment()
)
override fun initView(savedInstanceState: Bundle?) {
binding.homeTabLayout.run {
setTabData(mTabEntities)
setOnTabSelectListener(this@HomeActivity)
currentTab=0
}
binding.homeNoScrollViewPager.run {
adapter = MyHomePagerAdapter(this@HomeActivity.supportFragmentManager, mTitles, mFragments)
addOnPageChangeListener(this@HomeActivity)
offscreenPageLimit = 3
}
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
// getPermissions()
// }
}
override fun initDate() {
}
private fun getPermissions() {
PermissionX.init(this)
.permissions(
Manifest.permission.CAMERA)
.request { allGranted, grantedList, deniedList ->
if (allGranted) {
} else {
Toast.makeText(mContext, "开启权限失败,请在应用设置-权限-定位-始终允许", Toast.LENGTH_SHORT).show()
}
}
}
override fun onTabSelect(position: Int) {
binding.homeNoScrollViewPager.setCurrentItem(position)
}
override fun onTabReselect(position: Int) {
}
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
}
override fun onPageSelected(position: Int) {
binding.homeTabLayout.setCurrentTab(position)
}
override fun onPageScrollStateChanged(state: Int) {
}
}

View File

@ -0,0 +1,99 @@
package com.dhsd.glowner.ui
import android.os.Bundle
import android.text.TextUtils
import com.dahe.mylibrary.base.BaseActivity
import com.dahe.mylibrary.utils.ActivityUtils
import com.dhsd.glowner.ui.account.LoginActivity
import com.dhsd.glowner.databinding.ActivityLauncherBinding
import com.dhsd.glowner.utils.SPUtils
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.schedulers.Schedulers
import java.util.concurrent.TimeUnit
class LauncherActivity : BaseActivity<ActivityLauncherBinding>() {
override fun initView(savedInstanceState: Bundle?) {
// setStatusBarColorToLight2()
val extras = intent.extras
binding.llCount.setOnClickListener {
mDisposable?.dispose()
//已登录,直接跳转首页
val userToken = SPUtils.instance.getUserToken(mContext)
if (!TextUtils.isEmpty(userToken)) {
ActivityUtils.startActivity(mContext, HomeActivity::class.java,intent.extras)
} else {
ActivityUtils.startActivity(
this@LauncherActivity,
LoginActivity::class.java
)
}
// val userInfo = SPUtils.getUserInfo(mContext)
//
// if (userInfo != null && StringUtils.isNotEmpty(userInfo.token)) {
// ActivityUtils.startActivity(mContext, HomeActivity::class.java,intent.extras)
// } else {
// ActivityUtils.startActivity(this@LauncherActivity, LoginActivity::class.java)
// }
// window.setFlags(
// WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN,
// WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
// ActivityUtils.startActivity(this@LauncherActivity, LoginActivity::class.java)
finish()
}
val count = 3
mDisposable = Observable.interval(0, 1, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { aLong: Long ->
binding.tvCount.setText((count - aLong).toString())
if (count - aLong == 0L) {
mDisposable?.dispose()
//已登录,直接跳转首页
//已登录,直接跳转首页
// val userInfo: UserBean? = SPUtils.getUserInfo(mContext)
//
val userToken = SPUtils.instance.getUserToken(mContext)
if (!TextUtils.isEmpty(userToken)) {
ActivityUtils.startActivity(mContext, HomeActivity::class.java,intent.extras)
} else {
ActivityUtils.startActivity(
this@LauncherActivity,
LoginActivity::class.java
)
}
// ActivityUtils.startActivity(
// this@LauncherActivity,
// LoginActivity::class.java
// )
// window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
// window.setFlags(
// WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN,
// WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
// finish()
}
}
}
private var mDisposable: Disposable? = null
override fun initDate() {
}
override fun onDestroy() {
super.onDestroy()
mDisposable?.dispose()
}
}

View File

@ -0,0 +1,201 @@
package com.dhsd.glowner.ui.account
import BaseObserver
import DataManager
import RxHttpCallBack
import android.content.Intent
import android.os.Bundle
import android.text.TextPaint
import android.text.TextUtils
import android.text.method.LinkMovementMethod
import android.text.style.ClickableSpan
import android.view.View
import android.widget.TextView
import androidx.core.text.toSpannable
import com.dahe.glex.bean.UserBean
import com.dahe.mylibrary.base.BaseActivity
import com.dahe.mylibrary.net.CommonResponseBean
import com.dahe.mylibrary.utils.ActivityUtils
import com.dahe.mylibrary.utils.Base64Utils
import com.dahe.mylibrary.utils.ToastUtils
import com.dhsd.glowner.R
import com.dhsd.glowner.bean.LoginBean
import com.dhsd.glowner.databinding.ActivityLoginBinding
import com.dhsd.glowner.ui.HomeActivity
import com.dhsd.glowner.ui.WebActivity
import com.dhsd.glowner.utils.OnLimitClickHelper
import com.dhsd.glowner.utils.OnLimitClickListener
import com.dhsd.glowner.utils.SPUtils
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.schedulers.Schedulers
/**
* @ClassName LoginActivity
* @Author 用户
* @Date 2024/1/17 08:51
* @Description TODO
*/
class LoginActivity : BaseActivity<ActivityLoginBinding>(), View.OnClickListener,
OnLimitClickListener {
var isNeedCode: Boolean = false
var uuid:String = ""
override fun initView(savedInstanceState: Bundle?) {
binding.cb.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
// et_pass.setTransformationMethod(PasswordTransformationMethod.getInstance())
} else {
// et_pass.setTransformationMethod(HideReturnsTransformationMethod.getInstance())
}
// et_pass.setSelection(et_pass.getText().toString().length)
}
//
// binding.btnLogin.setOnClickListener {
// ActivityUtils.startActivity(this, HomeActivity::class.java)
//// ActivityUtils.startActivity(this, TextActivity::class.java)
// }
//
// binding.getCode.setOnClickListener {
// SmsTimeUtils.startCountdown(binding.getCode,mContext)
// }
binding.ok.setOnClickListener(this)
binding.ivCode.setOnClickListener(OnLimitClickHelper(this))
binding.imgHead.setOnLongClickListener {
ActivityUtils.startActivity(mContext, HomeActivity::class.java)
return@setOnLongClickListener true
}
dealAgreement()
}
override fun initDate() {
getCode()
}
override fun onClick(view: View?) {
super.onClick(view)
when (view?.id) {
binding.ok.id -> {
login()
}
binding.ivCode.id -> {
getCode()
}
}
}
private fun login() {
val phone = binding.etPhone.text.toString().trim()
val pwd = binding.etPwd.text.toString().trim()
val code = binding.etPCode.text.toString().trim()
if (TextUtils.isEmpty(phone) || TextUtils.isEmpty(pwd)) {
ToastUtils.showToast(mContext, "请输入账户密码")
return
}
if (isNeedCode) {
val code = binding.etPCode.text.toString().trim()
if (TextUtils.isEmpty(code)) {
ToastUtils.showToast(mContext, "请填写验证码")
return
}
}
DataManager.getInstance().login(LoginBean(phone, pwd,code,uuid))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(BaseObserver(mContext, object : RxHttpCallBack<UserBean>() {
override fun onSuccess(t: CommonResponseBean<UserBean>) {
super.onSuccess(t)
SPUtils.instance.setUserToken(mContext, t.data.access_token)
val userToken = SPUtils.instance.getUserToken(mContext)
ActivityUtils.startActivity(
mContext,
HomeActivity::class.java
)
finish()
}
}))
// if ("获取验证码" == binding.ok.text) {
// ActivityUtils.startActivity(mContext, CodeLoginActivity::class.java)
// }else{
// ActivityUtils.startActivity(mContext, SelectRoleActivity::class.java)
// }
}
/**
* 是否需要验证码并加载验证码图片
*/
private fun getCode() {
DataManager.getInstance().getCode().subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(BaseObserver(mContext, object : RxHttpCallBack<Any>() {
override fun onSuccess(t: CommonResponseBean<Any>) {
super.onSuccess(t)
isNeedCode = t.isCaptchaEnabled
if (isNeedCode) {
binding.run {
ivCode.setImageBitmap(Base64Utils.base64ToBitmap(t.img))
}
uuid = t.uuid
}
binding.llCode.visibility = if (isNeedCode) View.VISIBLE else View.GONE
}
}))
}
private fun dealAgreement(){
val toSpannable = binding.tvContent.text.toSpannable()
toSpannable.run {
val start = indexOf("")
setSpan(object : ClickableSpan(){
override fun onClick(widget: View) {
//用户服务协议点击事件
startActivity(Intent(this@LoginActivity, WebActivity::class.java).apply {
putExtra("url", "http://agreement.dahehuoyun.com/huawei/#/private")
putExtra("title", "用户服务协议")
})
}
override fun updateDrawState(ds: TextPaint) {
super.updateDrawState(ds)
ds.color = resources.getColor(R.color.theme_color, null)
// 去掉下划线
ds.isUnderlineText = false
}
}, start, start + 8, 0)
val end = lastIndexOf("")
setSpan(object : ClickableSpan(){
override fun onClick(widget: View) {
//用户服务协议点击事件
startActivity(Intent(this@LoginActivity, WebActivity::class.java).apply {
putExtra("url", "http://agreement.dahehuoyun.com/#/user")
putExtra("title", "隐私政策")
})
}
override fun updateDrawState(ds: TextPaint) {
super.updateDrawState(ds)
ds.color = resources.getColor(R.color.theme_color, null)
// 去掉下划线
ds.isUnderlineText = false
}
}, end, end + 6, 0)
}
binding.tvContent.run {
movementMethod = LinkMovementMethod.getInstance()
setText(toSpannable, TextView.BufferType.SPANNABLE)
}
}
}

View File

@ -0,0 +1,111 @@
package com.dhsd.glowner.ui.home
import BaseObserver
import DataManager
import RxHttpCallBack
import android.graphics.Color
import android.widget.LinearLayout
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.dahe.gldriver.bean.GridBean
import com.dahe.glex.bean.OrderBean
import com.dahe.glex.bean.WayBillBean
import com.dahe.mylibrary.base.BaseFragment
import com.dahe.mylibrary.callback.RefreshCallBack
import com.dahe.mylibrary.net.CommonResponseBean
import com.dahe.mylibrary.recycleviewswipe.RecycleViewDivider
import com.dahe.mylibrary.utils.ActivityUtils
import com.dahe.mylibrary.utils.ConvertUtils
import com.dahe.mylibrary.utils.ToastUtils
import com.dhsd.glowner.R
import com.dhsd.glowner.adapter.GridItemAdapter
import com.dhsd.glowner.adapter.WaybillAdapter
import com.dhsd.glowner.databinding.FragmentHomeBinding
import com.dhsd.glowner.ui.home.activtiy.SendGoodsActivity
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.schedulers.Schedulers
/**
* @ClassName HomeFragment
* @Author 用户
* @Date 2023/9/21 10:13
* @Description TODO
*/
class HomeFragment : BaseFragment<FragmentHomeBinding>(), RefreshCallBack {
override fun onFragmentVisibleChange(isVisible: Boolean) {
if (isVisible) {
}
}
override fun onFragmentFirstVisible() {
initRecy()
binding.tvMar.isSelected = true
binding.ivNor.setOnClickListener {
ActivityUtils.startActivity(mContext,SendGoodsActivity::class.java)
}
binding.ivNor.setOnClickListener {
ActivityUtils.startActivity(mContext,SendGoodsActivity::class.java)
}
initData()
}
override fun getRefreshDate(stat: Int, page: Int, count: Int) {
initData()
}
private fun initRecy() {
setRefresh(binding.refresh, this)
var datas = mutableListOf<WayBillBean>(
WayBillBean(),
WayBillBean(),
WayBillBean(),
WayBillBean(),
WayBillBean(),
WayBillBean(),
WayBillBean(),
WayBillBean()
)
var adapter = binding.recyclerView.run {
layoutManager = LinearLayoutManager(mContext, RecyclerView.VERTICAL, false)
setHasFixedSize(true)
addItemDecoration(
RecycleViewDivider(
LinearLayout.VERTICAL,
ConvertUtils.dp2px(16.0f),
Color.TRANSPARENT
)
)
adapter = WaybillAdapter()
adapter as WaybillAdapter
}.apply {
setOnItemClickListener { _, _, position ->
ToastUtils.showToast(mContext, position.toString())
}
addOnItemChildClickListener(R.id.btnOk) { adapter, view, position ->
// ActivityUtils.startActivity(mContext, WaybillDetailActivity::class.java)
}
}
adapter.submitList(datas)
}
private fun initData() {
DataManager.getInstance().getOrderList()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(BaseObserver(mContext,object :RxHttpCallBack<MutableList<OrderBean>>(){
override fun onSuccess(t: CommonResponseBean<MutableList<OrderBean>>) {
super.onSuccess(t)
showToast(t.rows.size.toString())
}
}))
}
}

View File

@ -0,0 +1,73 @@
package com.dhsd.glowner.ui.home.activtiy
import android.graphics.Color
import android.os.Bundle
import android.view.View
import android.widget.LinearLayout
import androidx.compose.material3.Switch
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.dahe.glex.bean.WayBillBean
import com.dahe.mylibrary.base.BaseActivity
import com.dahe.mylibrary.recycleviewswipe.RecycleViewDivider
import com.dahe.mylibrary.utils.ConvertUtils
import com.dahe.mylibrary.utils.PickerUtils
import com.dhsd.glowner.R
import com.dhsd.glowner.adapter.SendGoodsAdapter
import com.dhsd.glowner.databinding.ActivityAddressEditBinding
import com.github.gzuliyujiang.wheelpicker.contract.OnAddressPickedListener
import com.github.gzuliyujiang.wheelpicker.entity.CityEntity
import com.github.gzuliyujiang.wheelpicker.entity.CountyEntity
import com.github.gzuliyujiang.wheelpicker.entity.ProvinceEntity
/**
* @ClassName AddresEditActivity
* @Author john
* @Date 2024/2/4 10:44
* @Description TODO
*/
class AddressEditActivity : BaseActivity<ActivityAddressEditBinding>(), View.OnClickListener {
override fun initView(savedInstanceState: Bundle?) {
setStatusBarColor(R.color.white)
setTitleBar("发货地址", true)
var datas = mutableListOf<WayBillBean>(
WayBillBean(),
WayBillBean(),
WayBillBean()
)
binding.recycler.run {
layoutManager = LinearLayoutManager(mContext,RecyclerView.VERTICAL,false)
addItemDecoration(
RecycleViewDivider(
LinearLayout.VERTICAL,
ConvertUtils.dp2px(14.0f),
Color.TRANSPARENT
)
)
adapter = SendGoodsAdapter()
adapter as SendGoodsAdapter
}.submitList(datas)
binding.run {
tvSSQ.setOnClickListener(this@AddressEditActivity)
tvClear.setOnClickListener { etAddressDetail.setText("") }
}
}
override fun onClick(view: View?) {
super.onClick(view)
when (view?.id) {
R.id.tvSSQ -> {
PickerUtils.getInstance().showAddress(this
) { province, city, county ->
binding.tvSSQ.text = """${province.name}-${city.name}-${county.name}"""
}
}
}
}
override fun initDate() {
}
}

View File

@ -0,0 +1,88 @@
package com.dhsd.glowner.ui.home.activtiy
import android.os.Bundle
import androidx.recyclerview.widget.GridLayoutManager
import com.dahe.mylibrary.base.BaseActivity
import com.dahe.mylibrary.weight.FullyGridLayoutManager
import com.dhsd.glowner.R
import com.dhsd.glowner.adapter.PackingTypeAdapter
import com.dhsd.glowner.bean.PackTypeBean
import com.dhsd.glowner.databinding.ActivityCarTypeBinding
import com.luck.picture.lib.decoration.GridSpacingItemDecoration
import com.luck.picture.lib.utils.DensityUtil
/**
* @ClassName CarTypeActivity
* @Author john
* @Date 2024/2/5 09:22
* @Description TODO
*/
class CarTypeActivity : BaseActivity<ActivityCarTypeBinding>() {
override fun initView(savedInstanceState: Bundle?) {
setStatusBarColor(R.color.white)
setTitleBar("用车类型", true)
var datas = mutableListOf<PackTypeBean>(
PackTypeBean("4.2米", 0),
PackTypeBean("4.2米", 1, true),
PackTypeBean("4.2米", 2),
PackTypeBean("4.2米", 3),
PackTypeBean("4.2米", 4),
PackTypeBean("4.2米", 5),
PackTypeBean("4.2米", 6),
PackTypeBean("4.2米", 7)
)
binding.recycler1.run {
layoutManager = FullyGridLayoutManager(mContext, 3, GridLayoutManager.VERTICAL, false)
addItemDecoration(
GridSpacingItemDecoration(
3,
DensityUtil.dip2px(mContext, 8f), false
)
)
adapter = PackingTypeAdapter()
adapter as PackingTypeAdapter
}.apply {
addOnItemChildClickListener(R.id.rbWord) { adapter, view, position ->
datas[position].isCheck = !datas[position].isCheck
this.notifyItemChanged(position)
}
submitList(datas)
}
var datas2 = mutableListOf<PackTypeBean>(
PackTypeBean("平板", 0),
PackTypeBean("平板", 1, true),
PackTypeBean("平板", 2),
PackTypeBean("平板", 3),
PackTypeBean("平板", 4),
PackTypeBean("平板", 5),
PackTypeBean("平板", 6),
PackTypeBean("平板", 7)
)
binding.recycler2.run {
layoutManager = FullyGridLayoutManager(mContext, 3, GridLayoutManager.VERTICAL, false)
addItemDecoration(
GridSpacingItemDecoration(
3,
DensityUtil.dip2px(mContext, 8f), false
)
)
adapter = PackingTypeAdapter()
adapter as PackingTypeAdapter
}.apply {
addOnItemChildClickListener(R.id.rbWord) { adapter, view, position ->
datas2[position].isCheck = !datas2[position].isCheck
this.notifyItemChanged(position)
}
submitList(datas2)
}
}
override fun initDate() {
}
}

View File

@ -0,0 +1,97 @@
package com.dhsd.glowner.ui.home.activtiy
import android.os.Bundle
import android.view.Gravity
import android.view.View
import androidx.recyclerview.widget.GridLayoutManager
import com.dahe.mylibrary.base.BaseActivity
import com.dahe.mylibrary.utils.PickerUtils
import com.dahe.mylibrary.weight.FullyGridLayoutManager
import com.dhsd.glowner.R
import com.dhsd.glowner.adapter.PackingTypeAdapter
import com.dhsd.glowner.bean.PackTypeBean
import com.dhsd.glowner.databinding.ActivityGoodsInfoBinding
import com.dhsd.glowner.utils.OnLimitClickHelper
import com.dhsd.glowner.utils.OnLimitClickListener
import com.github.gzuliyujiang.wheelpicker.contract.OnOptionPickedListener
import com.luck.picture.lib.decoration.GridSpacingItemDecoration
import com.luck.picture.lib.utils.DensityUtil
/**
* @ClassName GoodsInfoActivity
* @Author john
* @Date 2024/2/4 11:09
* @Description 货物信息
*/
class GoodsInfoActivity : BaseActivity<ActivityGoodsInfoBinding>(),
OnLimitClickListener {
override fun initView(savedInstanceState: Bundle?) {
setStatusBarColor(R.color.white)
setTitleBar("货物信息", true)
var datas = mutableListOf<PackTypeBean>(
PackTypeBean("散装",0),
PackTypeBean("袋装",1,true),
PackTypeBean("吨包",2),
PackTypeBean("托盘",3),
PackTypeBean("困扎",4),
PackTypeBean("裸装",5),
PackTypeBean("箱装",6),
PackTypeBean("其他",7)
)
binding.recycler.run {
layoutManager = FullyGridLayoutManager(mContext, 3, GridLayoutManager.VERTICAL, false)
addItemDecoration(
GridSpacingItemDecoration(
3,
DensityUtil.dip2px(mContext, 8f), false
)
)
adapter = PackingTypeAdapter()
adapter as PackingTypeAdapter
}.apply {
addOnItemChildClickListener(R.id.rbWord){ adapter, view, position ->
val size = datas.filter { it.isCheck }.size
val check = datas[position].isCheck
if (size>2&&!check){
showToast("最多选择三项")
return@addOnItemChildClickListener
}
datas[position].isCheck = !datas[position].isCheck
this.notifyItemChanged(position)
}
submitList(datas)
}
binding.run {
tvGood.setOnClickListener(OnLimitClickHelper(this@GoodsInfoActivity))
tvGoodType.setOnClickListener(OnLimitClickHelper(this@GoodsInfoActivity))
}
}
override fun initDate() {
}
override fun onClick(view: View?) {
super.onClick(view)
when(view?.id){
R.id.tvGood->{
var datas = mutableListOf("螺纹钢","螺纹钢1","螺纹钢2")
PickerUtils.getInstance().showSingleSelect(this, "请选择货物", datas
) { position, item ->
showToast(item as String)
}
}
R.id.tvGoodType->{
var datas = mutableListOf("钢铁","螺纹钢1","螺纹钢2")
PickerUtils.getInstance().showSingleSelect(this, "请选择货物类型", datas
) { position, item ->
showToast(item as String)
}
}
}
}
}

View File

@ -0,0 +1,76 @@
package com.dhsd.glowner.ui.home.activtiy
import android.graphics.Color
import android.os.Bundle
import android.widget.LinearLayout
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.chad.library.adapter4.BaseQuickAdapter
import com.chad.library.adapter4.BaseQuickAdapter.OnItemChildClickListener
import com.dahe.glex.bean.WayBillBean
import com.dahe.mylibrary.base.BaseActivity
import com.dahe.mylibrary.recycleviewswipe.RecycleViewDivider
import com.dahe.mylibrary.utils.ActivityUtils
import com.dahe.mylibrary.utils.ConvertUtils
import com.dahe.mylibrary.utils.ToastUtils
import com.dhsd.glowner.R
import com.dhsd.glowner.adapter.SendGoodsAdapter
import com.dhsd.glowner.databinding.ActivitySendGoodsBinding
/**
* @ClassName SendGoodsActivity
* @Author john
* @Date 2024/2/2 14:41
* @Description 普通发货
*/
class SendGoodsActivity : BaseActivity<ActivitySendGoodsBinding>() {
override fun initView(savedInstanceState: Bundle?) {
setStatusBarColor(R.color.white)
setTitleBar("普通装货", true)
binding.rgTeam.setOnCheckedChangeListener { radioGroup, i ->
ToastUtils.showToast(mContext, radioGroup.id.toString())
}
var datas = mutableListOf<WayBillBean>(
WayBillBean(),
WayBillBean()
)
binding.llGoods.setOnClickListener {
ActivityUtils.startActivity(mContext, GoodsInfoActivity::class.java)
}
binding.llCarType.setOnClickListener {
ActivityUtils.startActivity(mContext, CarTypeActivity::class.java)
}
binding.btnOk.setOnLongClickListener {
ActivityUtils.startActivity(mContext,SendSuccActivity::class.java)
return@setOnLongClickListener true
}
var adapter = binding.recycler.run {
layoutManager = LinearLayoutManager(mContext, RecyclerView.VERTICAL, false)
addItemDecoration(
RecycleViewDivider(
LinearLayout.VERTICAL,
ConvertUtils.dp2px(14.0f),
Color.TRANSPARENT
)
)
adapter = SendGoodsAdapter()
adapter as SendGoodsAdapter
}.run {
addOnItemChildClickListener(R.id.tvSelAddress) { adapter, view, position ->
ActivityUtils.startActivity(mContext, AddressEditActivity::class.java)
}
this
}.submitList(datas)
}
override fun initDate() {
}
}

View File

@ -0,0 +1,22 @@
package com.dhsd.glowner.ui.home.activtiy
import android.os.Bundle
import com.dahe.mylibrary.base.BaseActivity
import com.dhsd.glowner.R
import com.dhsd.glowner.databinding.ActivitySendSuccBinding
/**
* @ClassName SendSuccActivity
* @Author john
* @Date 2024/2/5 09:38
* @Description TODO
*/
class SendSuccActivity : BaseActivity<ActivitySendSuccBinding>() {
override fun initView(savedInstanceState: Bundle?) {
setStatusBarColor(R.color.white)
setTitleBar("创建成功",true)
}
override fun initDate() {
}
}

View File

@ -0,0 +1,71 @@
package com.dhsd.glowner.ui.message
import android.content.Context
import android.graphics.Color
import android.widget.LinearLayout
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.dahe.glex.bean.WayBillBean
import com.dahe.mylibrary.base.BaseFragment
import com.dahe.mylibrary.callback.RefreshCallBack
import com.dahe.mylibrary.recycleviewswipe.RecycleViewDivider
import com.dahe.mylibrary.utils.ConvertUtils
import com.dhsd.glowner.adapter.MessageAdapter
import com.dhsd.glowner.databinding.FragmentMessageBinding
/**
* @ClassName HomeFragment
* @Author 用户
* @Date 2023/9/21 10:13
* @Description TODO
*/
class MessageFragment : BaseFragment<FragmentMessageBinding>(), RefreshCallBack {
override fun onFragmentVisibleChange(isVisible: Boolean) {
if (isVisible) {
}
}
override fun onFragmentFirstVisible() {
initRecy()
}
override fun getRefreshDate(stat: Int, page: Int, count: Int) {
}
private fun initRecy() {
var datas = mutableListOf<WayBillBean>(
WayBillBean(),
WayBillBean(),
WayBillBean(),
WayBillBean(),
WayBillBean(),
WayBillBean(),
WayBillBean(),
WayBillBean()
)
var adapter = binding.recyclerView.run {
layoutManager = LinearLayoutManager(mContext,RecyclerView.VERTICAL,false)
addItemDecoration(
RecycleViewDivider(
LinearLayout.VERTICAL,
ConvertUtils.dp2px(16.0f),
Color.TRANSPARENT
)
)
setHasFixedSize(true)
adapter = MessageAdapter()
adapter as MessageAdapter
}
adapter.submitList(datas)
}
}

View File

@ -0,0 +1,146 @@
package com.dhsd.glowner.ui.mine
import android.os.Bundle
import android.view.View
import com.dahe.gldriver.bean.GridBean
import com.dahe.mylibrary.base.BaseFragment
import com.dahe.mylibrary.utils.ActivityUtils
import com.dahe.mylibrary.utils.ToastUtils
import com.dhsd.glowner.R
import com.dhsd.glowner.adapter.GridItemAdapter
import com.dhsd.glowner.databinding.FragmentMineBinding
import com.tencent.bugly.crashreport.CrashReport
class MineFragment : BaseFragment<FragmentMineBinding>(), View.OnClickListener {
private val tools = mutableListOf(
GridBean("车队管理", R.drawable.car_team),
GridBean("车辆管理", R.drawable.car_manage),
GridBean("司机课堂", R.drawable.mine_class),
GridBean("评价管理", R.drawable.rate)
)
private val plats = mutableListOf(
GridBean("平台规则", R.drawable.rules),
GridBean("常见问题", R.drawable.question),
GridBean("联系我们", R.drawable.call_us),
GridBean("意见反馈", R.drawable.opin),
GridBean("红色方向盘", R.drawable.part_dir),
GridBean("检查更新", R.drawable.update),
GridBean("关于我们", R.drawable.about),
GridBean("设置", R.drawable.setting)
)
override fun onFragmentVisibleChange(isVisible: Boolean) {
if (isVisible) {
} else {
}
}
override fun onFragmentFirstVisible() {
// val userInfo = SPUtils.instance.getUserInfo(mContext)
// if (null==userInfo)
// return
binding.run {
//初始化常用工具
gvTools.run {
adapter = GridItemAdapter(mContext, tools, R.layout.grid_mine_item)
setOnItemClickListener { _, _, i, _ ->
goTools(i)
}
}
//初始化平台规则
gvPlat.run {
adapter = GridItemAdapter(mContext, plats, R.layout.grid_mine_item)
setOnItemClickListener { _, _, i, _ ->
goPlats(i)
}
}
rlMoney.setOnClickListener {
// ActivityUtils.startActivity(mContext, WalletActivity::class.java)
}
}
}
override fun onClick(v: View) {
when (v.id) {
// R.id.rlPass->ActivityUtils.startActivity(mContext,ChangePwdActivity::class.java)
// R.id.rlPhone-> AppActivityUtils.openWebViewActivity(mContext, "隐私政策",
// "http://tms.down.user.test.dahehuodongbao.com/user-privacy.html")
//// R.id.rlPhone->ActivityUtils.startActivity(mContext,ChangePhoneActivity::class.java)
// R.id.btnOut-> CrashReport.testJavaCrash();
}
}
fun logOut() {
// UserUtils.instance.loginOut(requireActivity())
// val intent = Intent(mContext, LoginActivity::class.java)
// intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK
// requireActivity().startActivity(intent)
}
/**
* 常用工具跳转逻辑
*/
private fun goTools(pos: Int) {
when (pos) {
0 -> {
// ActivityUtils.startActivity(mContext, RulesActivity::class.java)
}
1 -> {
// ActivityUtils.startActivity(mContext, CarsManActivity::class.java)
}
2 -> {
// var bundle = Bundle()
// bundle.putString("title","我的百度")
// bundle.putString("url","www.baidu.com")
// ActivityUtils.startActivity(mContext,WebActivity::class.java,bundle)
// ToastUtils.showToast(mContext, tools[pos].title)
}
3 -> {
ToastUtils.showToast(mContext, tools[pos].title)
}
}
}
/**
* 平台规则跳转逻辑
*/
private fun goPlats(pos: Int) {
when (pos) {
0 -> {
// ActivityUtils.startActivity(mContext, RulesActivity::class.java)
}
1 -> {
// ActivityUtils.startActivity(mContext, CarsManActivity::class.java)
}
2 -> {
ToastUtils.showToast(mContext, tools[pos].title)
}
3 -> {
ToastUtils.showToast(mContext, tools[pos].title)
}
4 -> {
// ActivityUtils.startActivity(mContext, AuthPartyActivity::class.java)
}
5 -> {
ToastUtils.showToast(mContext, tools[pos].title)
}
}
}
}

View File

@ -0,0 +1,127 @@
package com.dhsd.glowner.ui.waybill
import android.content.Context
import android.graphics.Color
import androidx.fragment.app.Fragment
import com.dahe.mylibrary.base.BaseFragment
import com.dahe.mylibrary.callback.RefreshCallBack
import com.dhsd.glowner.R
import com.dhsd.glowner.databinding.FragmentWaybillBinding
import com.dhsd.glowner.ui.waybill.fragment.AllWaybillFragment
import net.lucode.hackware.magicindicator.FragmentContainerHelper
import net.lucode.hackware.magicindicator.buildins.UIUtil
import net.lucode.hackware.magicindicator.buildins.commonnavigator.CommonNavigator
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.CommonNavigatorAdapter
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerIndicator
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerTitleView
import net.lucode.hackware.magicindicator.buildins.commonnavigator.indicators.LinePagerIndicator
import net.lucode.hackware.magicindicator.buildins.commonnavigator.titles.ColorTransitionPagerTitleView
/**
* @ClassName HomeFragment
* @Author 用户
* @Date 2023/9/21 10:13
* @Description TODO
*/
class WaybillFragment : BaseFragment<FragmentWaybillBinding>(), RefreshCallBack {
private val mFragmentContainerHelper = FragmentContainerHelper()
var mFragments = listOf<Fragment>(AllWaybillFragment(),AllWaybillFragment(),AllWaybillFragment(),AllWaybillFragment(),AllWaybillFragment())
val titles = mutableListOf(
"全部",
"待装货",
"待卸货",
"待评价",
"取消"
)
override fun onFragmentVisibleChange(isVisible: Boolean) {
if (isVisible) {
}
}
override fun onFragmentFirstVisible() {
initRecy()
mFragmentContainerHelper.handlePageSelected(0,true)
switchPages(0)
var commonNavigator = CommonNavigator(mContext)
commonNavigator.run {
isAdjustMode = true
adapter = object : CommonNavigatorAdapter() {
override fun getCount(): Int {
return titles.size
}
override fun getTitleView(context: Context?, index: Int): IPagerTitleView {
val colorTransitionPagerTitleView = ColorTransitionPagerTitleView(context)
colorTransitionPagerTitleView.normalColor = Color.BLACK
colorTransitionPagerTitleView.selectedColor = Color.RED
colorTransitionPagerTitleView.text = titles[index]
colorTransitionPagerTitleView.setOnClickListener {
mFragmentContainerHelper.handlePageSelected(index)
switchPages(index)
}
return colorTransitionPagerTitleView
}
override fun getIndicator(context: Context?): IPagerIndicator {
// val indicator = LinePagerIndicator(context)
// indicator.mode = LinePagerIndicator.MODE_WRAP_CONTENT
// return indicator
val indicator = LinePagerIndicator(context)
indicator.mode = LinePagerIndicator.MODE_WRAP_CONTENT
indicator.yOffset =
UIUtil.dip2px(context, 3.0).toFloat()
indicator.setColors(Color.RED)
return indicator
}
}
}
binding.magicIndicator.navigator = commonNavigator
mFragmentContainerHelper.attachMagicIndicator(binding.magicIndicator)
// ViewPagerHelper.bind(binding.magicIndicator, binding.viewPager);
}
override fun getRefreshDate(stat: Int, page: Int, count: Int) {
}
private fun initRecy() {
}
private fun switchPages(index: Int) {
val fragmentManager = requireActivity().supportFragmentManager
val fragmentTransaction = fragmentManager.beginTransaction()
var fragment: Fragment
var i = 0
val j: Int = mFragments.size
while (i < j) {
if (i == index) {
i++
continue
}
fragment = mFragments[i]
if (fragment.isAdded) {
fragmentTransaction.hide(fragment)
}
i++
}
fragment = mFragments[index]
if (fragment.isAdded) {
fragmentTransaction.show(fragment)
} else {
fragmentTransaction.add(R.id.fragmentContainer, fragment)
}
fragmentTransaction.commitAllowingStateLoss()
}
}

View File

@ -0,0 +1,23 @@
package com.dhsd.glowner.ui.waybill.activity
import android.os.Bundle
import com.dahe.mylibrary.base.BaseActivity
import com.dhsd.glowner.databinding.ActivitySourceDetailBinding
/**
* @ClassName WaybillDetailActivity
* @Author john
* @Date 2024/2/5 14:50
* @Description 货源详情
*/
class SourceDetailActivity :BaseActivity<ActivitySourceDetailBinding>(){
override fun initView(savedInstanceState: Bundle?) {
binding.btnReceiving.setOnClickListener {
// ActivityUtils.startActivity(mContext,WaybillSuccActivity::class.java,Bundle().apply { putInt(AppConfig.SUCCESS_TYPE,0) })
}
}
override fun initDate() {
// SelectPicUtils().getInstance(mContext)
}
}

View File

@ -0,0 +1,65 @@
package com.dhsd.glowner.ui.waybill.activity
import android.os.Bundle
import android.view.View
import com.amap.api.maps2d.AMap
import com.dahe.gldriver.base.AppConfig
import com.dahe.mylibrary.base.BaseActivity
import com.dahe.mylibrary.utils.ActivityUtils
import com.dahe.mylibrary.utils.ToastUtils
import com.dhsd.glowner.databinding.ActivityWaybillDetailBinding
/**
* @ClassName WaybillLoadActivity
* @Author john
* @Date 2024/1/29 16:52
* @Description 运单详情
*/
class WaybillLDetailActivity : BaseActivity<ActivityWaybillDetailBinding>() {
var aMap: AMap? = null
override fun initView(savedInstanceState: Bundle?) {
setTitleBar("运单详情", View.OnClickListener { finish() }, true, "查看单据") {
ToastUtils.showToast(mContext, "查看单据")
}
binding.run {
mapView.onCreate(savedInstanceState)
if (aMap == null) mapView.map
btnRight.setOnClickListener {
// ActivityUtils.startActivity(
// mContext,
// WaybillUpPicActivity::class.java,
// Bundle().apply { putInt(AppConfig.SUCCESS_TYPE, 1) })
}
}
}
override fun initDate() {
}
override fun onResume() {
super.onResume()
binding.mapView.onResume();
}
override fun onPause() {
super.onPause()
binding.mapView.onPause();
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
binding.mapView.onSaveInstanceState(outState);
}
override fun onDestroy() {
if (binding.mapView != null)
binding.mapView.onDestroy();
super.onDestroy()
}
}

View File

@ -0,0 +1,42 @@
package com.dhsd.glowner.ui.waybill.fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.dahe.glex.bean.WayBillBean
import com.dahe.mylibrary.base.BaseFragment
import com.dhsd.glowner.adapter.WaybillListAdapter
import com.dhsd.glowner.databinding.FragmentWaybillListBinding
/**
* @ClassName AllWaybillFragment
* @Author 用户
* @Date 2024/1/24 14:06
* @Description TODO
*/
class AllWaybillFragment : BaseFragment<FragmentWaybillListBinding>() {
override fun onFragmentVisibleChange(isVisible: Boolean) {
}
override fun onFragmentFirstVisible() {
var datas = mutableListOf<WayBillBean>(
WayBillBean(),
WayBillBean(),
WayBillBean(),
WayBillBean(),
WayBillBean(),
WayBillBean(),
WayBillBean(),
WayBillBean()
)
var adapter = binding.recyclerView.run {
layoutManager = LinearLayoutManager(mContext,RecyclerView.VERTICAL,false)
setHasFixedSize(true)
adapter = WaybillListAdapter()
adapter as WaybillListAdapter
}
adapter.submitList(datas)
}
}

View File

@ -0,0 +1,34 @@
package com.dhsd.glowner.utils
import android.view.View
import com.dahe.mylibrary.utils.ToastUtils
import java.util.Calendar
/**
* @ClassName OnLimitClickHelper
* @Author john
* @Date 2024/4/22 14:28
* @Description TODO
*/
class OnLimitClickHelper(onLimitClickListener: OnLimitClickListener?) : View.OnClickListener {
private var lastClickTime: Long = 0
private var onLimitClickListener: OnLimitClickListener? = null
init {
this.onLimitClickListener = onLimitClickListener
}
override fun onClick(v: View) {
val curTime = Calendar.getInstance().timeInMillis
if (curTime - lastClickTime > LIMIT_TIME) {
lastClickTime = curTime
onLimitClickListener?.onClick(v)
} else {
ToastUtils.showToast(v.context, "点击速度过快,请稍后重试")
}
}
companion object {
const val LIMIT_TIME = 2000
}
}

View File

@ -0,0 +1,17 @@
package com.dhsd.glowner.utils
import android.view.View
/**
* @ClassName OnLimitClickListener
* @Author john
* @Date 2024/4/22 14:28
* @Description TODO
*/
interface OnLimitClickListener {
/**
* 按钮点击事件
* @param view
*/
fun onClick(view: View?)
}

View File

@ -0,0 +1,135 @@
package com.dhsd.glowner.utils
import android.content.Context
import com.dahe.glex.bean.UserBean
import com.dahe.mylibrary.net.JsonUtils
import com.dahe.mylibrary.utils.BaseSPUtils
/**
* @ClassName SPUtils2
* @Author 用户
* @Date 2023/12/29 08:52
* @Description TODO
*/
class SPUtils private constructor() : BaseSPUtils() {
companion object{
val instance = Holder.holder
}
object Holder {
val holder = SPUtils()
}
/**
* 存用户信息
*
* @param context
* @param json
*/
fun setUserInfo(context: Context?, json: String?) {
BaseSPUtils.put(context, BaseSPUtils.USER_INFO_KEY, json)
}
/**
* 拿用户信息
*
* @param context
*/
fun getUserInfo(context: Context?): UserBean? {
return JsonUtils.getInstance()
.fromJson(BaseSPUtils.get(context, BaseSPUtils.USER_INFO_KEY, "") as String,
UserBean::class.java)
}
fun setUserToken(context: Context?, token: String) {
put(context, USER_TOKEN_KEY, token)
}
fun getUserToken(context: Context?): String {
return get(context, USER_TOKEN_KEY, "") as String
}
/**
* 存服务器类型
*
* @param context
* @param isTestService
*/
fun setNetServiceType(context: Context?, isTestService: Boolean) {
BaseSPUtils.put(context, BaseSPUtils.NET_SERVICE_TEST, isTestService)
}
/**
* 拿服务器类型
*
* @param context
*/
fun geNetServiceType(context: Context?): Boolean {
return BaseSPUtils.get(context, BaseSPUtils.NET_SERVICE_TEST, false) as Boolean
}
/**
* 存搜索数据
*
* @param context
* @param json
*/
fun setSearchCache(context: Context?, json: String?) {
BaseSPUtils.put(context, BaseSPUtils.SEARRH_CACHE, json)
}
fun getSearchCache(context: Context?): String? {
return JsonUtils.getInstance()
.fromJson(BaseSPUtils.get(context, BaseSPUtils.SEARRH_CACHE, "") as String,
String::class.java)
}
fun removeSearchCache(context: Context?) {
BaseSPUtils.remove(context, BaseSPUtils.SEARRH_CACHE)
}
/**
* 导航偏好设置
*/
fun setNaviPreferenceCache(context: Context?, json: String?) {
BaseSPUtils.put(context, BaseSPUtils.NAVI_PH_EDIT_CACHE, json)
}
fun getNaviPreferenceCache(context: Context?): String? {
return JsonUtils.getInstance()
.fromJson(BaseSPUtils.get(context, BaseSPUtils.NAVI_PH_EDIT_CACHE, "") as String,
String::class.java)
}
fun removeNaviPreference(context: Context?) {
BaseSPUtils.remove(context, BaseSPUtils.NAVI_PH_EDIT_CACHE)
}
//第一次登录
fun getIsFirstOpen(context: Context?): Boolean {
return BaseSPUtils.get(context, BaseSPUtils.FIRST_OPEN, true) as Boolean
}
fun setIsFirstOpen(context: Context?, json: Boolean) {
BaseSPUtils.put(context, BaseSPUtils.FIRST_OPEN, json)
}
/**
* 设置隐私协议是否同意
*
* @param value 是否同意
*/
fun setAgreePrivacyAgreement(context: Context?, value: Boolean) {
BaseSPUtils.put(context, BaseSPUtils.KEY_PRIVACY_AGREEMENT, value)
}
/**
* 是否同意了隐私协议
*
* @return true 已经同意false 还没有同意
*/
fun hasAgreePrivacyAgreement(context: Context?): Boolean {
return BaseSPUtils.get(context, BaseSPUtils.KEY_PRIVACY_AGREEMENT, false) as Boolean
}
}

View File

@ -0,0 +1,26 @@
package com.dhsd.glowner.utils
import android.content.Context
import com.dahe.mylibrary.utils.BaseSPUtils
class UserUtils private constructor(){
companion object{
val instance = Holder.holder
}
private object Holder {
val holder = UserUtils()
}
fun loginOut(context : Context){
if (null== SPUtils.instance.getUserInfo(context))
return
// PushAgent.getInstance(context).deleteAlias(SPUtils.getUserInfo(context).userInfo.userId,"uid"){ b, s -> }
BaseSPUtils.cleanUserInfo(context)
// val intent = Intent(context, LauncherActivity::class.java)
// intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK
// context.startActivity(intent)
// ToastUtils.showToast(context, "您的账号再异地登录,请重新登录")
}
}

View File

@ -0,0 +1,72 @@
package com.dhsd.glowner.weight
import android.content.Context
import android.util.AttributeSet
import androidx.viewpager.widget.ViewPager
import android.view.MotionEvent
/**
* Created by Administrator on 2018/7/16 0016.
*/
class NoScrollViewPager : ViewPager {
private val isCanScroll = false
constructor(context: Context?) : super(context!!) {}
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {}
/**
* 去掉viewpage滑动动画
*
* @param item
*/
override fun setCurrentItem(item: Int) {
super.setCurrentItem(item, false)
}
/**
* 1.dispatchTouchEvent一般情况不做处理
* ,如果修改了默认的返回值,子孩子都无法收到事件
*/
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
return super.dispatchTouchEvent(ev) // node_return true;不行
}
/**
* 是否拦截
* 拦截:会走到自己的onTouchEvent方法里面来
* 不拦截:事件传递给子孩子
*/
override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
// node_return false;//可行,不拦截事件,
// node_return true;//不行,孩子无法处理事件
//node_return super.onInterceptTouchEvent(ev);//不行,会有细微移动
return if (isCanScroll) {
super.onInterceptTouchEvent(ev)
} else {
false
}
}
/**
* 是否消费事件
* 消费:事件就结束
* 不消费:往父控件传
*/
override fun onTouchEvent(ev: MotionEvent): Boolean {
//node_return false;// 可行,不消费,传给父控件
//node_return true;// 可行,消费,拦截事件
//super.onTouchEvent(ev); //不行,
//虽然onInterceptTouchEvent中拦截了,
//但是如果viewpage里面子控件不是viewgroup,还是会调用这个方法.
return if (isCanScroll) {
super.onTouchEvent(ev)
} else {
true // 可行,消费,拦截事件
}
}
fun setScroll(isCanScroll: Boolean) {
var isCanScroll = isCanScroll
isCanScroll = isCanScroll
}
}

View File

@ -0,0 +1,25 @@
package com.dhsd.glowner.weight
import android.content.Context
import net.lucode.hackware.magicindicator.buildins.commonnavigator.titles.ColorTransitionPagerTitleView
/**
* 带颜色渐变和缩放的指示器标题
* 博客: http://hackware.lucode.net
* Created by hackware on 2016/6/26.
*/
class ScaleTransitionPagerTitleView(context: Context?) : ColorTransitionPagerTitleView(context) {
var minScale = 0.75f
override fun onEnter(index: Int, totalCount: Int, enterPercent: Float, leftToRight: Boolean) {
super.onEnter(index, totalCount, enterPercent, leftToRight) // 实现颜色渐变
scaleX = minScale + (1.0f - minScale) * enterPercent
scaleY = minScale + (1.0f - minScale) * enterPercent
}
override fun onLeave(index: Int, totalCount: Int, leavePercent: Float, leftToRight: Boolean) {
super.onLeave(index, totalCount, leavePercent, leftToRight) // 实现颜色渐变
scaleX = 1.0f + (minScale - 1.0f) * leavePercent
scaleY = 1.0f + (minScale - 1.0f) * leavePercent
}
}

View File

@ -0,0 +1,30 @@
<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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 997 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1020 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Some files were not shown because too many files have changed in this diff Show More