初始化
15
.gitignore
vendored
Normal 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
@ -0,0 +1,3 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
6
.idea/compiler.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="CompilerConfiguration">
|
||||
<bytecodeTargetLevel target="17" />
|
||||
</component>
|
||||
</project>
|
10
.idea/deploymentTargetDropDown.xml
Normal 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
@ -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
@ -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
@ -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
@ -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
@ -0,0 +1 @@
|
||||
/build
|
147
app/build.gradle
Normal 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
21
app/proguard-rules.pro
vendored
Normal 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
20
app/release/output-metadata.json
Normal 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"
|
||||
}
|
@ -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)
|
||||
}
|
||||
}
|
162
app/src/main/AndroidManifest.xml
Normal 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>
|
@ -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
|
||||
}
|
||||
}
|
||||
|
31
app/src/main/java/com/dhsd/glowner/adapter/MessageAdapter.kt
Normal 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)
|
||||
}
|
||||
}
|
@ -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]
|
||||
}
|
||||
}
|
@ -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)
|
||||
}
|
@ -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)
|
||||
}
|
||||
}
|
30
app/src/main/java/com/dhsd/glowner/adapter/WaybillAdapter.kt
Normal 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)
|
||||
}
|
||||
}
|
@ -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)
|
||||
}
|
||||
|
||||
}
|
83
app/src/main/java/com/dhsd/glowner/base/App.kt
Normal 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
|
||||
}
|
||||
}
|
17
app/src/main/java/com/dhsd/glowner/base/AppConfig.kt
Normal 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"
|
||||
|
||||
}
|
119
app/src/main/java/com/dhsd/glowner/base/WebActivity.kt
Normal 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)
|
||||
// }
|
||||
// }
|
||||
|
||||
}
|
9
app/src/main/java/com/dhsd/glowner/bean/CheckCodeBean.kt
Normal 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
|
||||
}
|
27
app/src/main/java/com/dhsd/glowner/bean/CodeBean.kt
Normal 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
|
||||
}
|
||||
}
|
13
app/src/main/java/com/dhsd/glowner/bean/CommListBean.kt
Normal 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
|
||||
)
|
12
app/src/main/java/com/dhsd/glowner/bean/GridBean.kt
Normal 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
|
||||
)
|
14
app/src/main/java/com/dhsd/glowner/bean/LogBean.kt
Normal 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,
|
||||
)
|
26
app/src/main/java/com/dhsd/glowner/bean/OrderBean.kt
Normal 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,
|
||||
)
|
9
app/src/main/java/com/dhsd/glowner/bean/PackTypeBean.kt
Normal 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)
|
9
app/src/main/java/com/dhsd/glowner/bean/RefreshBean.kt
Normal 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)
|
26
app/src/main/java/com/dhsd/glowner/bean/TabBean.kt
Normal 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
|
||||
}
|
||||
}
|
31
app/src/main/java/com/dhsd/glowner/bean/UserBean.kt
Normal 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
|
||||
)
|
||||
|
||||
|
82
app/src/main/java/com/dhsd/glowner/bean/WayBill.kt
Normal 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
|
||||
)
|
9
app/src/main/java/com/dhsd/glowner/bean/WayBillBean.kt
Normal 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="")
|
53
app/src/main/java/com/dhsd/glowner/net/Api.kt
Normal 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>>>
|
||||
|
||||
|
||||
}
|
42
app/src/main/java/com/dhsd/glowner/net/BaseObserver.kt
Normal 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() {}
|
||||
}
|
59
app/src/main/java/com/dhsd/glowner/net/DataManager.kt
Normal 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())
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
126
app/src/main/java/com/dhsd/glowner/net/RxHttpCallBack.kt
Normal 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)
|
||||
}
|
||||
}
|
||||
}
|
44
app/src/main/java/com/dhsd/glowner/net/TokenInterceptor.kt
Normal 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
|
||||
}
|
||||
}
|
108
app/src/main/java/com/dhsd/glowner/ui/HomeActivity.kt
Normal 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) {
|
||||
}
|
||||
|
||||
}
|
99
app/src/main/java/com/dhsd/glowner/ui/LauncherActivity.kt
Normal 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()
|
||||
}
|
||||
}
|
201
app/src/main/java/com/dhsd/glowner/ui/account/LoginActivity.kt
Normal 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)
|
||||
}
|
||||
}
|
||||
}
|
111
app/src/main/java/com/dhsd/glowner/ui/home/HomeFragment.kt
Normal 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())
|
||||
}
|
||||
}))
|
||||
}
|
||||
|
||||
}
|
@ -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() {
|
||||
}
|
||||
}
|
@ -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() {
|
||||
}
|
||||
}
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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() {
|
||||
}
|
||||
}
|
@ -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() {
|
||||
}
|
||||
}
|
@ -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)
|
||||
}
|
||||
|
||||
}
|
146
app/src/main/java/com/dhsd/glowner/ui/mine/MineFragment.kt
Normal 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)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
127
app/src/main/java/com/dhsd/glowner/ui/waybill/WaybillFragment.kt
Normal 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()
|
||||
}
|
||||
}
|
@ -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)
|
||||
}
|
||||
}
|
@ -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()
|
||||
|
||||
}
|
||||
}
|
@ -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)
|
||||
}
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
@ -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?)
|
||||
}
|
135
app/src/main/java/com/dhsd/glowner/utils/SPUtils.kt
Normal 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
|
||||
}
|
||||
}
|
26
app/src/main/java/com/dhsd/glowner/utils/UserUtils.kt
Normal 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, "您的账号再异地登录,请重新登录")
|
||||
}
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
@ -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
|
||||
}
|
||||
|
||||
}
|
30
app/src/main/res/drawable-v24/ic_launcher_foreground.xml
Normal 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>
|
BIN
app/src/main/res/drawable-xxhdpi/about.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
app/src/main/res/drawable-xxhdpi/bobao.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
app/src/main/res/drawable-xxhdpi/call_us.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
app/src/main/res/drawable-xxhdpi/car_manage.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
app/src/main/res/drawable-xxhdpi/car_team.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
app/src/main/res/drawable-xxhdpi/go_right.png
Normal file
After Width: | Height: | Size: 352 B |
BIN
app/src/main/res/drawable-xxhdpi/head_defaut.png
Normal file
After Width: | Height: | Size: 8.3 KiB |
BIN
app/src/main/res/drawable-xxhdpi/home_all.png
Normal file
After Width: | Height: | Size: 53 KiB |
BIN
app/src/main/res/drawable-xxhdpi/home_ask.png
Normal file
After Width: | Height: | Size: 9.5 KiB |
BIN
app/src/main/res/drawable-xxhdpi/home_driver.png
Normal file
After Width: | Height: | Size: 8.0 KiB |
BIN
app/src/main/res/drawable-xxhdpi/home_know.png
Normal file
After Width: | Height: | Size: 5.6 KiB |
BIN
app/src/main/res/drawable-xxhdpi/home_logo.png
Normal file
After Width: | Height: | Size: 9.9 KiB |
BIN
app/src/main/res/drawable-xxhdpi/home_my.png
Normal file
After Width: | Height: | Size: 66 KiB |
BIN
app/src/main/res/drawable-xxhdpi/home_que.png
Normal file
After Width: | Height: | Size: 7.5 KiB |
BIN
app/src/main/res/drawable-xxhdpi/home_top_bg.jpg
Normal file
After Width: | Height: | Size: 261 KiB |
BIN
app/src/main/res/drawable-xxhdpi/icon_driver.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
app/src/main/res/drawable-xxhdpi/icon_go.png
Normal file
After Width: | Height: | Size: 997 B |
BIN
app/src/main/res/drawable-xxhdpi/icon_load.png
Normal file
After Width: | Height: | Size: 2.1 KiB |
BIN
app/src/main/res/drawable-xxhdpi/icon_loading.png
Normal file
After Width: | Height: | Size: 2.6 KiB |
BIN
app/src/main/res/drawable-xxhdpi/icon_point.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
app/src/main/res/drawable-xxhdpi/icon_route.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
app/src/main/res/drawable-xxhdpi/icon_safe.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
app/src/main/res/drawable-xxhdpi/icon_succ.png
Normal file
After Width: | Height: | Size: 73 KiB |
BIN
app/src/main/res/drawable-xxhdpi/icon_trade.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
app/src/main/res/drawable-xxhdpi/icon_unload.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
app/src/main/res/drawable-xxhdpi/icon_unloading.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
BIN
app/src/main/res/drawable-xxhdpi/kuaixun.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
app/src/main/res/drawable-xxhdpi/login_car.png
Normal file
After Width: | Height: | Size: 211 KiB |
BIN
app/src/main/res/drawable-xxhdpi/login_top_bg.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
app/src/main/res/drawable-xxhdpi/message_sys.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
app/src/main/res/drawable-xxhdpi/mine_bg.png
Normal file
After Width: | Height: | Size: 1020 KiB |
BIN
app/src/main/res/drawable-xxhdpi/mine_class.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
app/src/main/res/drawable-xxhdpi/opin.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
app/src/main/res/drawable-xxhdpi/part_dir.png
Normal file
After Width: | Height: | Size: 2.3 KiB |