Commit 52746943 authored by 许译文's avatar 许译文

file manager select

parent 6d5b62b6
/build
\ No newline at end of file
plugins { plugins {
id 'com.android.application' id 'com.android.application'
id 'org.jetbrains.kotlin.android' id 'org.jetbrains.kotlin.android'
id 'applovin-quality-service'
// id 'com.google.firebase.crashlytics'
// id 'com.google.gms.google-services'
}
applovin {
apiKey "7M6t_fBDFPKdlDdekL1bw1OntM7gd4Vk5yK_p7yEdl9BCKCfGZpmZMvL2LDHcuNGWIHLXPD0w_SFDDv94WMaSw"
} }
android { android {
...@@ -48,5 +55,24 @@ dependencies { ...@@ -48,5 +55,24 @@ dependencies {
implementation("androidx.datastore:datastore-preferences:1.0.0") implementation("androidx.datastore:datastore-preferences:1.0.0")
implementation("com.github.pokercc:ExpandableRecyclerView:0.9.3") implementation("com.github.pokercc:ExpandableRecyclerView:0.9.3")
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.6.1"
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1'
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1")
implementation("androidx.lifecycle:lifecycle-process:2.6.2")
implementation 'com.github.bumptech.glide:glide:4.16.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.16.0'
implementation 'com.github.xuxuliooo:RoundImageView:1.1.2'
implementation 'com.applovin:applovin-sdk:11.5.5'
// implementation 'com.applovin.mediation:google-adapter:21.4.0.0'
implementation 'com.applovin.mediation:facebook-adapter:6.12.0.0'
implementation 'com.applovin.mediation:mintegral-adapter:16.3.41.0'
implementation 'androidx.recyclerview:recyclerview:1.3.2'
implementation 'com.applovin.mediation:bytedance-adapter:+'
//// implementation 'com.google.android.gms:play-services-ads:22.6.0'
// implementation platform('com.google.firebase:firebase-bom:25.2.2')
// implementation 'com.google.firebase:firebase-analytics:21.5.0'
// implementation 'com.google.firebase:firebase-crashlytics:18.6.1'
implementation group: 'com.google.code.gson', name: 'gson', version: '2.10.1'
implementation 'org.xutils:xutils:3.5.0'
} }
\ No newline at end of file
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
\ No newline at end of file
package com.zxhyis.tools
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.zxhyis.tools", appContext.packageName)
}
}
\ No newline at end of file
...@@ -2,48 +2,164 @@ ...@@ -2,48 +2,164 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools">
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"
tools:ignore="ProtectedPermissions" />
<uses-permission
android:name="android.permission.DELETE_CACHE_FILES"
tools:ignore="ProtectedPermissions" />
<uses-permission
android:name="android.permission.CLEAR_APP_CACHE"
tools:ignore="ProtectedPermissions" />
<uses-permission
android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" />
<uses-permission android:name="android.permission.BATTERY_STATS"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<application <application
android:name=".FileApp" android:name=".FileApp"
android:allowBackup="true" android:allowBackup="true"
android:hardwareAccelerated="true"
android:dataExtractionRules="@xml/data_extraction_rules" android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules" android:fullBackupContent="@xml/backup_rules"
android:networkSecurityConfig="@xml/network_security_config"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/Theme.FileManagerSelect" android:theme="@style/Theme.FileManagerSelect"
tools:targetApi="31"> tools:targetApi="31">
<meta-data
android:name="applovin.sdk.key"
android:value="GGPreND6SRmCt1zJgn5faiLGD8c2PVGPLgPpSg7cHanVTud1DhtuI9MmteTqlEviaJ57WnxW68kQDaATJ5z3cW" />
<activity <activity
android:name=".ui.fun.ResultActivity" android:name=".ui.home.MainActivity"
tools:ignore="LockedOrientationActivity"
android:exported="false" /> android:exported="false" />
<activity <activity
android:name=".ui.fun.PictureDetailActivity" android:name=".ui.fun.JunkCleanActivity"
tools:ignore="LockedOrientationActivity"
android:exported="false"
android:theme="@style/Theme.clean" />
<activity
android:name=".ui.fun.RecentlyActivity"
tools:ignore="LockedOrientationActivity"
android:exported="false" /> android:exported="false" />
<activity
android:name=".ui.fun.StorageInfoActivity"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity" />
<activity
android:name=".ui.fun.GarbageActivity"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity" />
<activity
android:name=".ui.fun.BatteryInfoActivity"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/Theme.top"
tools:ignore="LockedOrientationActivity" />
<activity
android:name=".ui.fun.RecycleBinActivity"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity" />
<activity
android:name=".ui.fun.EmptyFileActivity"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/Theme.top"
tools:ignore="LockedOrientationActivity" />
<activity
android:name=".ui.fun.LargeFilesActivity"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/Theme.top"
tools:ignore="LockedOrientationActivity" />
<activity
android:name=".ui.fun.DocumentsActivity"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/Theme.top"
tools:ignore="LockedOrientationActivity" />
<activity
android:name=".ui.fun.ZipFileActivity"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/Theme.top"
tools:ignore="LockedOrientationActivity" />
<activity
android:name=".ui.fun.ResultActivity"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/Theme.result"
tools:ignore="LockedOrientationActivity" />
<activity
android:name=".ui.fun.PictureDetailActivity"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/Theme.top"
tools:ignore="LockedOrientationActivity" />
<activity <activity
android:name=".ui.fun.ApkListActivity" android:name=".ui.fun.ApkListActivity"
android:exported="false" /> android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/Theme.top"
tools:ignore="LockedOrientationActivity" />
<activity <activity
android:name=".ui.fun.AudioActivity" android:name=".ui.fun.AudioActivity"
android:exported="false" /> android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/Theme.top"
tools:ignore="LockedOrientationActivity" />
<activity <activity
android:name=".ui.fun.VideoActivity" android:name=".ui.fun.VideoActivity"
android:exported="false" /> android:theme="@style/Theme.top"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity" />
<activity <activity
android:name=".ui.fun.PictureActivity" android:name=".ui.fun.PictureActivity"
android:exported="false" /> android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/Theme.top"
tools:ignore="LockedOrientationActivity" />
<activity <activity
android:name=".ui.home.MainActivity" android:name=".net.xin.SplashActivity"
android:exported="true"> android:theme="@style/Theme.clean"
android:exported="true"
android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity> </activity>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application> </application>
</manifest> </manifest>
\ No newline at end of file
This diff is collapsed.
{"v":"4.6.8","fr":60,"ip":0,"op":106,"w":500,"h":500,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 5","ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":20,"s":[0],"e":[360]},{"t":110}]},"p":{"a":0,"k":[251,250,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[10,10]},"p":{"a":0,"k":[0,-100]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":0},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"fl","c":{"a":0,"k":[0,0.7294118,1,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":20,"op":620,"st":20,"bm":0,"sr":1},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 4","ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":15,"s":[0],"e":[360]},{"t":105}]},"p":{"a":0,"k":[251,250,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[20,20]},"p":{"a":0,"k":[0,-100]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":0},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"fl","c":{"a":0,"k":[0,0.7294118,1,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":15,"op":615,"st":15,"bm":0,"sr":1},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 3","ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":10,"s":[0],"e":[360]},{"t":100}]},"p":{"a":0,"k":[251,250,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30]},"p":{"a":0,"k":[0,-100]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":0},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"fl","c":{"a":0,"k":[0,0.7294118,1,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":10,"op":610,"st":10,"bm":0,"sr":1},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 2","ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":5,"s":[0],"e":[360]},{"t":95}]},"p":{"a":0,"k":[251,250,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[40,40]},"p":{"a":0,"k":[0,-100]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":0},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"fl","c":{"a":0,"k":[0,0.7294118,1,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":5,"op":605,"st":5,"bm":0,"sr":1},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 1","ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":0,"s":[0],"e":[360]},{"t":90}]},"p":{"a":0,"k":[250,250,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0"],"t":0,"s":[50,50],"e":[40,40]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0"],"t":84,"s":[40,40],"e":[50,50]},{"t":100}]},"p":{"a":0,"k":[0,-100]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":0},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"fl","c":{"a":0,"k":[0,0.7294118,1,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":600,"st":0,"bm":0,"sr":1}]}
\ No newline at end of file
{"v":"5.5.5","fr":25,"ip":0,"op":79,"w":300,"h":150,"nm":"Loading-2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"icon 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":39,"s":[-90]},{"t":79,"s":[270]}],"ix":10},"p":{"a":0,"k":[150,75,0],"ix":2},"a":{"a":0,"k":[53,53,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-15.464],[15.464,0],[0,15.464],[-15.464,0]],"o":[[0,15.464],[-15.464,0],[0,-15.464],[15.464,0]],"v":[[28,0],[0,28],[-28,0],[0,-28]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.6,0.2,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[53,53],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":51,"s":[0]},{"t":79,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":39,"s":[0]},{"t":64,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":39,"op":79,"st":39,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"icon","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[-90]},{"t":40,"s":[270]}],"ix":10},"p":{"a":0,"k":[150,75,0],"ix":2},"a":{"a":0,"k":[53,53,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-15.464],[15.464,0],[0,15.464],[-15.464,0]],"o":[[0,15.464],[-15.464,0],[0,-15.464],[15.464,0]],"v":[[28,0],[0,28],[-28,0],[0,-28]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.07450980392156863,0.5333333333333333,0.03137254901960784,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[53,53],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":12,"s":[0]},{"t":40,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"t":25,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":40,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
...@@ -3,6 +3,7 @@ package com.zxhyis.tools ...@@ -3,6 +3,7 @@ package com.zxhyis.tools
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Application import android.app.Application
import android.content.Context import android.content.Context
import com.applovin.sdk.AppLovinSdk
class FileApp : Application() { class FileApp : Application() {
...@@ -17,5 +18,12 @@ class FileApp : Application() { ...@@ -17,5 +18,12 @@ class FileApp : Application() {
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
fContext=this fContext=this
sdkInit()
} }
private fun sdkInit(){
AppLovinSdk.getInstance(this).mediationProvider = "max"
AppLovinSdk.getInstance(this).initializeSdk {}
}
} }
\ No newline at end of file
package com.zxhyis.tools.ad
import android.app.Activity
import android.content.Context
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.ProcessLifecycleOwner
import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxAdListener
import com.applovin.mediation.MaxError
import com.applovin.mediation.ads.MaxAppOpenAd
import com.applovin.mediation.ads.MaxInterstitialAd
import com.applovin.sdk.AppLovinSdk
import com.zxhyis.tools.logic.testLog
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.util.concurrent.TimeUnit
class CommonOpenManager(adId:String,appContext: Context?) :DefaultLifecycleObserver{
private lateinit var appOpenAd: MaxAppOpenAd
private lateinit var context: Context
init {
ProcessLifecycleOwner.get().lifecycle.addObserver(this)
context = appContext!!
appOpenAd = MaxAppOpenAd(adId, appContext)
appOpenAd.setListener(object : MaxAdListener{
override fun onAdLoaded(ad: MaxAd?) {
}
override fun onAdDisplayed(ad: MaxAd?) {
}
override fun onAdHidden(ad: MaxAd?) {
appOpenAd.loadAd()
}
override fun onAdClicked(ad: MaxAd?) {
}
override fun onAdLoadFailed(adUnitId: String?, error: MaxError?) {
}
override fun onAdDisplayFailed(ad: MaxAd?, error: MaxError?) {
appOpenAd.loadAd()
}
})
appOpenAd.loadAd()
}
private fun showAdIfReady() {
if (appOpenAd == null || !AppLovinSdk.getInstance(context).isInitialized) return
if (appOpenAd.isReady)
{
appOpenAd.showAd()
}
else
{
appOpenAd.loadAd()
}
}
override fun onStart(owner: LifecycleOwner) {
super.onStart(owner)
showAdIfReady()
}
}
fun preLoadOpenAd(
) {
}
fun preLoadInterAd(
maxId: String,
activity: Activity,
isShow: Boolean = false,
isLimitCount: Boolean = false,
isMoment: Boolean = false,
loaded: (ad:MaxInterstitialAd?) -> Unit,
loadFailed: () -> Unit,
displayFailed: () -> Unit,
clicked: () -> Unit,
closed: () -> Unit,
scope: CoroutineScope
) {
val currentTime = System.currentTimeMillis()
var retryAttempt = 0.0
val maxAd = MaxInterstitialAd(maxId, activity)
maxAd.setListener(object : MaxAdListener {
override fun onAdLoaded(ad: MaxAd?) {
testLog("ad loaded")
retryAttempt = 0.0
loaded(maxAd)
}
override fun onAdDisplayed(ad: MaxAd?) {
testLog("ad displayed")
}
override fun onAdHidden(ad: MaxAd?) {
testLog("ad closed")
closed()
}
override fun onAdClicked(ad: MaxAd?) {
testLog("ad clicked")
clicked()
}
override fun onAdLoadFailed(adUnitId: String?, error: MaxError?) {
testLog("ad failed")
loadFailed()
retryAttempt++
scope.launch {
val delayMillis =
TimeUnit.SECONDS.toMillis(Math.pow(2.0, Math.min(6.0, retryAttempt)).toLong())
delay(delayMillis)
maxAd.loadAd()
}
}
override fun onAdDisplayFailed(ad: MaxAd?, error: MaxError?) {
testLog("ad displayed")
displayFailed()
}
})
maxAd.loadAd()
}
package com.zxhyis.tools.logic
import android.util.Base64
import java.security.SecureRandom
import javax.crypto.Cipher
import javax.crypto.spec.GCMParameterSpec
import javax.crypto.spec.SecretKeySpec
object AESHelper {
private const val aesKey = "q0t6cz3f0pkg14zp"
private val cipher by lazy {
Cipher.getInstance("AES/GCM/NoPadding")
}
fun encrypt(content: String): String {
try {
val iv = ByteArray(12).apply {
SecureRandom().nextBytes(this)
}
val contentBytes = content.toByteArray(Charsets.UTF_8)
val params = GCMParameterSpec(128, iv)
cipher.init(
Cipher.ENCRYPT_MODE,
secretKey, params
)
val encryptData = cipher.doFinal(contentBytes)
assert(encryptData.size == contentBytes.size + 16)
val message = ByteArray(12 + contentBytes.size + 16)
System.arraycopy(iv, 0, message, 0, 12)
System.arraycopy(encryptData, 0, message, 12, encryptData.size)
return String(Base64.encode(message, Base64.NO_WRAP), Charsets.UTF_8)
} catch (_: Exception) {
}
return content
}
@Synchronized
fun decrypt(content: String): String {
try {
val con = content.replace(" ".toRegex(), "+")
val contentByte = Base64.decode(con, Base64.NO_WRAP)
require(contentByte.size >= 12 + 16)
val params = GCMParameterSpec(128, contentByte, 0, 12)
cipher.init(
Cipher.DECRYPT_MODE,
secretKey, params
)
val decryptData = cipher.doFinal(contentByte, 12, contentByte.size - 12)
return String(decryptData, Charsets.UTF_8)
} catch (_: Exception) {
}
return content
}
private val secretKey by lazy {
SecretKeySpec(aesKey.toByteArray(), "AES")
}
}
\ No newline at end of file
package com.zxhyis.tools.logic package com.zxhyis.tools.logic
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.net.Uri
import java.io.File import java.io.File
data class ImageInfoBean( data class ImageInfoBean(
val imagePath:String, val imagePath: String,
val imageBitmap:Bitmap, val imageBitmap: Bitmap,
val file:File, val file: File,
var isShow:Boolean=false, val imageUri: Uri,
var isSelected:Boolean=false var isShow: Boolean = false,
var isSelected: Boolean = false
)
data class ImageAndVideoBean(
val path: String,
val file: File,
val type: Int
)
data class VideoBean(
val videoPath: String,
val file: File,
val videoUri: Uri,
var isShow: Boolean = false,
var isSelected: Boolean = false
)
data class AudioBean(
val audioPath: String,
val audioName: String,
val audioUri: Uri,
val file: File,
val apkSize: Long,
val apkTime: String?,
var isShow: Boolean = false,
var isSelected: Boolean = false
)
data class ApkInfoBean(
val apkIcon: Drawable,
val apkName: String,
val apkPath: String,
val apkSize: Long,
val apkTime: String?,
val file: File,
var isShow: Boolean = false,
var isSelected: Boolean = false
)
data class EmptyFileBean(
val filePath: String,
val fileName: String,
val file: File,
val fileSize: Long,
val fileTime: String?,
var isShow: Boolean = false,
var isSelected: Boolean = false
)
data class FileBean(
val filepath: String,
val file: File,
val fileName: String,
val fileSize: Long,
val fileTime: String?,
var isShow: Boolean = false,
var isSelected: Boolean = false
)
data class ParentBean(
val title: String,
val childItem: ArrayList<ChildBean>,
val parentSize: Long,
var isParentSelected: Boolean,
var expanded: Boolean = true
)
data class ChildBean(
val image: Int,
val type: String,
var isChildSelected: Boolean,
val childSize: Long,
val file:File
) )
...@@ -3,7 +3,7 @@ package com.zxhyis.tools.logic ...@@ -3,7 +3,7 @@ package com.zxhyis.tools.logic
object Counts { object Counts {
const val REQUEST_ALL_FILE=30 const val REQUEST_ALL_FILE=30
const val TAG_LOG="test_file"
} }
\ No newline at end of file
...@@ -3,10 +3,28 @@ package com.zxhyis.tools.logic ...@@ -3,10 +3,28 @@ package com.zxhyis.tools.logic
import android.app.Activity import android.app.Activity
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.net.Uri
import android.os.Build
import android.util.Log
import android.view.View import android.view.View
import android.widget.Toast import android.widget.Toast
import androidx.core.content.ContextCompat.startActivity
import androidx.core.content.FileProvider
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.SharedPreferencesMigration
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.emptyPreferences
import androidx.datastore.preferences.core.stringPreferencesKey
import androidx.datastore.preferences.preferencesDataStore
import androidx.recyclerview.widget.DiffUtil
import com.zxhyis.tools.FileApp import com.zxhyis.tools.FileApp
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.map
import java.io.File
import java.io.IOException
inline fun <reified T : Activity> Context.startActivity(vararg params: Pair<String, Any?>) { inline fun <reified T : Activity> Context.startActivity(vararg params: Pair<String, Any?>) {
val intent = Intent(this, T::class.java) val intent = Intent(this, T::class.java)
...@@ -22,4 +40,180 @@ fun String.showToast(duration: Int = Toast.LENGTH_SHORT) { ...@@ -22,4 +40,180 @@ fun String.showToast(duration: Int = Toast.LENGTH_SHORT) {
Toast.makeText(FileApp.fContext, this, duration).show() Toast.makeText(FileApp.fContext, this, duration).show()
} }
const val TEST_MODE = true
fun testLog(msg: String) {
if (TEST_MODE) {
Log.d(Counts.TAG_LOG, msg)
}
}
interface Logic {
fun doLogic()
}
interface ClickCallBack {
fun clickBack()
}
interface OnItemClickListener{
fun onItemClick(file: File)
}
class FileDiffCallback(
private val oldList: List<ApkInfoBean>,
private val newList: List<ApkInfoBean>
) : DiffUtil.Callback() {
override fun getOldListSize(): Int {
return oldList.size
}
override fun getNewListSize(): Int {
return newList.size
}
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
return oldList[oldItemPosition] == newList[newItemPosition]
}
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
return oldList[oldItemPosition] == newList[newItemPosition]
}
}
fun shareImage(imageUri: Uri, context: Context) {
val shareIntent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_STREAM, imageUri)
type = "image/*"
}
context.startActivity(Intent.createChooser(shareIntent, "Share image"))
}
fun shareMultipleImages(
imageUris: ArrayList<Uri>,
context: Context
) {
val intent = Intent().apply {
action = Intent.ACTION_SEND_MULTIPLE
putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris)
type = "image/*"
}
context.startActivity(Intent.createChooser(intent, "Share image"))
}
fun shareMultipleVideos(
videoUris: ArrayList<Uri>,
context: Context
) {
val intent = Intent().apply {
action = Intent.ACTION_SEND_MULTIPLE
putParcelableArrayListExtra(Intent.EXTRA_STREAM, videoUris)
type = "video/*"
}
context.startActivity(Intent.createChooser(intent, "Share video"))
}
fun shareAudio(imageUri: Uri, context: Context) {
val shareIntent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_STREAM, imageUri)
type = "audio/*"
}
context.startActivity(Intent.createChooser(shareIntent, "Share image"))
}
fun shareMultipleAudios(
audioFiles:List<File>,
context: Context
) {
val shareIntent = Intent().apply {
action = Intent.ACTION_SEND_MULTIPLE
type = "audio/*"
putParcelableArrayListExtra(Intent.EXTRA_STREAM, ArrayList<Uri>().apply {
// 将文件转换为Uri并添加到Intent
audioFiles.forEach { file ->
val fileUri = FileProvider.getUriForFile(
context,
"${context.applicationContext.packageName}.provider",
file
)
add(fileUri)
}
})
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
context.startActivity(Intent.createChooser(shareIntent, "Share audio files"))
}
fun shareMultipleApks(
apkFiles: List<File>,
context: Context
){
val shareIntent = Intent().apply {
action = Intent.ACTION_SEND_MULTIPLE
type = "application/vnd.android.package-archive"
putParcelableArrayListExtra(Intent.EXTRA_STREAM, ArrayList<Uri>().apply {
apkFiles.forEach { apkFile ->
val apkUri = FileProvider.getUriForFile(context, "${context.applicationContext.packageName}.provider", apkFile)
add(apkUri)
}
})
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
context.startActivity(Intent.createChooser(shareIntent, "Share APKs"))
}
fun setStatusBarTextDark(activity: Activity) {
activity.window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
}
fun setStatusBarTextLight(activity: Activity) {
activity.window.decorView.systemUiVisibility = 0
}
private const val USER_PREFERENCES_NAME = "settings"
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(
name = USER_PREFERENCES_NAME,
produceMigrations = { context ->
listOf(SharedPreferencesMigration(context, USER_PREFERENCES_NAME))
}
)
object FileDS {
suspend fun <T> putData(context: Context, data: T, key: Preferences.Key<T>) {
context.dataStore.edit { preferences ->
preferences[key] = data
}
}
fun <T> getData(context: Context, key: Preferences.Key<T>, defaultValue: T): Flow<T> {
return context.dataStore.data
.catch { exception ->
if (exception is IOException) {
emit(emptyPreferences())
} else {
throw exception
}
}
.map { preferences ->
preferences[key] ?: defaultValue
}
}
suspend fun clearOneData(context: Context, key: String) {
context.dataStore.edit {
it.remove(stringPreferencesKey(key))
}
}
suspend fun clearAllData(context: Context) {
context.dataStore.edit {
it.clear()
}
}
}
package com.zxhyis.tools.net.xin
import android.annotation.SuppressLint
import androidx.lifecycle.lifecycleScope
import com.zxhyis.tools.base.TopActivity
import com.zxhyis.tools.databinding.ActivitySplashBinding
import com.zxhyis.tools.logic.startActivity
import com.zxhyis.tools.ui.home.MainActivity
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
@SuppressLint("CustomSplashScreen")
class SplashActivity : TopActivity<ActivitySplashBinding>() {
override fun getViewBinding1(): ActivitySplashBinding {
return ActivitySplashBinding.inflate(layoutInflater)
}
override fun init() {
lifecycleScope.launch {
delay(2000)
startActivity<MainActivity>()
finish()
}
}
}
\ No newline at end of file
package com.zxhyis.tools.ui.adapter
import android.annotation.SuppressLint
import android.content.Context
import android.text.format.Formatter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.AppCompatImageView
import androidx.appcompat.widget.AppCompatTextView
import androidx.recyclerview.widget.RecyclerView
import com.zxhyis.tools.R
import com.zxhyis.tools.logic.ApkInfoBean
import com.zxhyis.tools.logic.Logic
import com.zxhyis.tools.logic.setOnClick
@SuppressLint("NotifyDataSetChanged")
class ApkAdapter(
private val dataList: ArrayList<ApkInfoBean>,
private val context: Context,
private val logic: Logic
) : RecyclerView.Adapter<ApkAdapter.ApkViewHolder>() {
inner class ApkViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
val apkIcon: AppCompatImageView = itemView.findViewById(R.id.apk_icon)
val apkName : AppCompatTextView = itemView.findViewById(R.id.apk_name)
val apkTime : AppCompatTextView = itemView.findViewById(R.id.apk_time)
val apkSize : AppCompatTextView = itemView.findViewById(R.id.apk_size)
val apkSelect : AppCompatImageView = itemView.findViewById(R.id.apk_select)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ApkViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_apk, parent, false)
return ApkViewHolder(view)
}
override fun getItemCount(): Int = dataList.size
@SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: ApkViewHolder, position: Int) {
val type = dataList[position]
holder.apkIcon.setImageDrawable(type.apkIcon)
holder.apkName.text = type.apkName
holder.apkSize.text = " --- ${Formatter.formatFileSize(context, type.apkSize)}"
holder.apkTime.text = type.apkTime
holder.apkSelect.isSelected = type.isSelected
if (type.isShow) {
holder.apkSelect.visibility = View.VISIBLE
} else {
holder.apkSelect.visibility = View.GONE
}
holder.apkSelect.setOnClick {
dataList[position].isSelected = !dataList[position].isSelected
logic.doLogic()
notifyItemChanged(position)
}
}
//select all
fun selectAll() {
dataList.forEach {
it.isSelected = true
}
notifyDataSetChanged()
}
fun deselectAll() {
dataList.forEach {
it.isSelected = false
}
notifyDataSetChanged()
}
fun setShow() {
dataList.forEach {
it.isShow=true
}
notifyDataSetChanged()
}
}
\ No newline at end of file
package com.zxhyis.tools.ui.adapter
import android.annotation.SuppressLint
import android.content.Context
import android.text.format.Formatter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.AppCompatImageView
import androidx.appcompat.widget.AppCompatTextView
import androidx.recyclerview.widget.RecyclerView
import com.zxhyis.tools.R
import com.zxhyis.tools.logic.ApkInfoBean
import com.zxhyis.tools.logic.AudioBean
import com.zxhyis.tools.logic.Logic
import com.zxhyis.tools.logic.setOnClick
@SuppressLint("NotifyDataSetChanged")
class AudioAdapter(
private val dataList: ArrayList<AudioBean>,
private val context: Context,
private val logic: Logic
) : RecyclerView.Adapter<AudioAdapter.ApkViewHolder>() {
inner class ApkViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
val apkIcon: AppCompatImageView = itemView.findViewById(R.id.apk_icon)
val apkName : AppCompatTextView = itemView.findViewById(R.id.apk_name)
val apkTime : AppCompatTextView = itemView.findViewById(R.id.apk_time)
val apkSize : AppCompatTextView = itemView.findViewById(R.id.apk_size)
val apkSelect : AppCompatImageView = itemView.findViewById(R.id.apk_select)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ApkViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_apk, parent, false)
return ApkViewHolder(view)
}
override fun getItemCount(): Int = dataList.size
@SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: ApkViewHolder, position: Int) {
val type = dataList[position]
holder.apkIcon.setImageResource(R.drawable.home_audio)
holder.apkName.text = type.audioName
holder.apkSize.text = " --- ${Formatter.formatFileSize(context, type.apkSize)}"
holder.apkTime.text = type.apkTime
holder.apkSelect.isSelected = type.isSelected
if (type.isShow) {
holder.apkSelect.visibility = View.VISIBLE
} else {
holder.apkSelect.visibility = View.GONE
}
holder.apkSelect.setOnClick {
dataList[position].isSelected = !dataList[position].isSelected
logic.doLogic()
notifyItemChanged(position)
}
}
//select all
fun selectAll() {
dataList.forEach {
it.isSelected = true
}
notifyDataSetChanged()
}
fun deselectAll() {
dataList.forEach {
it.isSelected = false
}
notifyDataSetChanged()
}
fun setShow() {
dataList.forEach {
it.isShow=true
}
notifyDataSetChanged()
}
}
\ No newline at end of file
package com.zxhyis.tools.ui.adapter
import android.annotation.SuppressLint
import android.content.Context
import android.text.format.Formatter
import android.view.LayoutInflater
import android.view.ViewGroup
import com.zxhyis.tools.R
import com.zxhyis.tools.databinding.JunkChildBinding
import com.zxhyis.tools.databinding.JunkParentBinding
import com.zxhyis.tools.logic.Logic
import com.zxhyis.tools.logic.ParentBean
import com.zxhyis.tools.logic.setOnClick
import pokercc.android.expandablerecyclerview.ExpandableAdapter
class CleanAdapter(
private val parentList: List<ParentBean>,
private val context: Context,
private val logic: Logic
): ExpandableAdapter<ExpandableAdapter.ViewHolder>() {
internal class ParentViewHolder(val binding: JunkParentBinding) :
ViewHolder(binding.root)
internal class ChildViewHolder(val binding: JunkChildBinding) :
ViewHolder(binding.root)
override fun getChildCount(groupPosition: Int): Int {
return parentList[groupPosition].childItem.size
}
override fun getGroupCount(): Int {
return parentList.size
}
override fun onCreateChildViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(viewGroup.context)
val binding = JunkChildBinding.inflate(inflater, viewGroup, false)
return ChildViewHolder(binding)
}
override fun onCreateGroupViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(viewGroup.context)
val binding = JunkParentBinding.inflate(inflater, viewGroup, false)
return ParentViewHolder(binding)
}
override fun onGroupViewHolderExpandChange(
holder: ViewHolder,
groupPosition: Int,
animDuration: Long,
expand: Boolean
) {
}
@SuppressLint("NotifyDataSetChanged")
override fun onBindGroupViewHolder(
holder: ViewHolder,
groupPosition: Int,
expand: Boolean,
payloads: List<Any>
) {
val viewHolder = holder as? ParentViewHolder ?: return
val parentType=parentList[groupPosition]
viewHolder.binding.parentName.text=parentType.title
parentType.expanded=expand
viewHolder.binding.groupSize.text=Formatter.formatFileSize(context,parentType.parentSize)
if (groupPosition!=2){
if (parentType.expanded){
viewHolder.binding.ivExpanded.setImageResource(R.drawable.xiala_n)
}else{
viewHolder.binding.ivExpanded.setImageResource(R.drawable.xiala_s)
}
viewHolder.binding.icSelect.isSelected=parentType.isParentSelected
viewHolder.binding.icSelect.setOnClick {
viewHolder.binding.icSelect.isSelected =
!viewHolder.binding.icSelect.isSelected
parentType.isParentSelected=!parentType.isParentSelected
if (parentType.isParentSelected){
for (app in parentType.childItem){
app.isChildSelected=true
notifyDataSetChanged()
logic.doLogic()
}
}else{
for (app in parentType.childItem){
app.isChildSelected=false
logic.doLogic()
notifyDataSetChanged()
}
}
}
}
}
@SuppressLint("NotifyDataSetChanged", "SetTextI18n")
override fun onBindChildViewHolder(
holder: ViewHolder,
groupPosition: Int,
childPosition: Int,
payloads: List<Any>
) {
val viewHolder = holder as? ChildViewHolder ?: return
val childType= parentList[groupPosition].childItem[childPosition]
viewHolder.binding.childName.text = childType.type
viewHolder.binding.childIcon.setImageResource(childType.image)
viewHolder.binding.childSelect.isSelected = childType.isChildSelected
viewHolder.binding.childSize.text = " -- ${Formatter.formatFileSize(context, childType.childSize)}"
viewHolder.binding.childSelect.setOnClickListener {
viewHolder.binding.childSelect.isSelected =
!viewHolder.binding.childSelect.isSelected
childType.isChildSelected = !childType.isChildSelected
if (!childType.isChildSelected){
parentList[groupPosition].isParentSelected=false
notifyDataSetChanged()
}
logic.doLogic()
}
viewHolder.itemView.setOnClickListener {
when (childPosition) {
childPosition -> {
viewHolder.binding.childSelect.isSelected =
!viewHolder.binding.childSelect.isSelected
childType.isChildSelected = !childType.isChildSelected
if (!childType.isChildSelected){
parentList[groupPosition].isParentSelected=false
notifyDataSetChanged()
}
logic.doLogic()
}
}
}
}
}
\ No newline at end of file
...@@ -15,6 +15,12 @@ open class CommonAdapter<T> constructor( ...@@ -15,6 +15,12 @@ open class CommonAdapter<T> constructor(
private var itemClick: T.() -> Unit = {} private var itemClick: T.() -> Unit = {}
fun updateItem(position: Int, newItem: T) {
if (position >= 0 && position < dataList.size) {
dataList[position] = newItem
notifyItemChanged(position)
}
}
constructor(layoutId: Int, constructor(layoutId: Int,
itemList: ArrayList<T>, itemList: ArrayList<T>,
......
package com.zxhyis.tools.ui.adapter
import android.annotation.SuppressLint
import android.content.Context
import android.text.format.Formatter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.AppCompatImageView
import androidx.appcompat.widget.AppCompatTextView
import androidx.recyclerview.widget.RecyclerView
import com.zxhyis.tools.R
import com.zxhyis.tools.logic.AudioBean
import com.zxhyis.tools.logic.EmptyFileBean
import com.zxhyis.tools.logic.Logic
import com.zxhyis.tools.logic.setOnClick
@SuppressLint("NotifyDataSetChanged")
class EmptyAdapter(
private val dataList: ArrayList<EmptyFileBean>,
private val context: Context,
private val logic: Logic
) : RecyclerView.Adapter<EmptyAdapter.EmptyVH>() {
inner class EmptyVH(itemView: View) : RecyclerView.ViewHolder(itemView){
val apkIcon: AppCompatImageView = itemView.findViewById(R.id.apk_icon)
val apkName : AppCompatTextView = itemView.findViewById(R.id.apk_name)
val apkTime : AppCompatTextView = itemView.findViewById(R.id.apk_time)
val apkSize : AppCompatTextView = itemView.findViewById(R.id.apk_size)
val apkSelect : AppCompatImageView = itemView.findViewById(R.id.apk_select)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): EmptyVH {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_apk, parent, false)
return EmptyVH(view)
}
override fun getItemCount(): Int = dataList.size
@SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: EmptyVH, position: Int) {
val type = dataList[position]
holder.apkIcon.setImageResource(R.drawable.home_empty_file)
holder.apkName.text = type.fileName
holder.apkSize.text = " --- ${Formatter.formatFileSize(context, type.fileSize)}"
holder.apkTime.text = type.fileTime
holder.apkSelect.isSelected = type.isSelected
if (type.isShow) {
holder.apkSelect.visibility = View.VISIBLE
} else {
holder.apkSelect.visibility = View.GONE
}
holder.apkSelect.setOnClick {
dataList[position].isSelected = !dataList[position].isSelected
logic.doLogic()
notifyItemChanged(position)
}
}
//select all
fun selectAll() {
dataList.forEach {
it.isSelected = true
}
notifyDataSetChanged()
}
fun deselectAll() {
dataList.forEach {
it.isSelected = false
}
notifyDataSetChanged()
}
fun setShow() {
dataList.forEach {
it.isShow=true
}
notifyDataSetChanged()
}
}
\ No newline at end of file
package com.zxhyis.tools.ui.adapter
import android.content.Context
import android.text.format.Formatter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.AppCompatImageView
import androidx.appcompat.widget.AppCompatTextView
import androidx.recyclerview.widget.RecyclerView
import com.zxhyis.tools.R
import com.zxhyis.tools.logic.FileBean
import com.zxhyis.tools.logic.Logic
import com.zxhyis.tools.logic.OnItemClickListener
import com.zxhyis.tools.logic.setOnClick
class FileAdapter(
private val dataList: List<FileBean>,
private val context: Context,
private val itemClickListener: OnItemClickListener,
private val logic: Logic
) : RecyclerView.Adapter<FileAdapter.FileVH>() {
inner class FileVH(itemView: View) : RecyclerView.ViewHolder(itemView) {
val fileImage: AppCompatImageView = itemView.findViewById(R.id.file_image)
val fileName: AppCompatTextView = itemView.findViewById(R.id.file_name)
val fileTime: AppCompatTextView = itemView.findViewById(R.id.file_time)
val itemCount: AppCompatTextView = itemView.findViewById(R.id.item_count)
val icNext: AppCompatImageView = itemView.findViewById(R.id.ic_next)
val fileSelect: AppCompatImageView = itemView.findViewById(R.id.file_select)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FileVH {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_file, parent, false)
return FileVH(view)
}
override fun getItemCount(): Int {
return dataList.size
}
override fun onBindViewHolder(holder: FileVH, position: Int) {
val folder = dataList[position]
if (folder.file.isDirectory) {
holder.fileImage.setImageResource(R.drawable.ic_file)
} else {
if (folder.file.isFile) {
when {
folder.file.name.endsWith(".apk") -> {
holder.fileImage.setImageResource(R.drawable.home_apk)
}
folder.file.name.endsWith(".png") or
folder.file.name.endsWith(".jpg") or
folder.file.name.endsWith(".jpeg") -> {
holder.fileImage.setImageResource(R.drawable.home_picture)
}
folder.file.name.endsWith(".zip") -> {
holder.fileImage.setImageResource(R.drawable.home_zip)
}
folder.file.name.endsWith(".mp4") or
folder.file.name.endsWith(".3gp") or
folder.file.name.endsWith(".mkv") or
folder.file.name.endsWith(".avi") -> {
holder.fileImage.setImageResource(R.drawable.home_video)
}
folder.file.name.endsWith(".m4a") or
folder.file.name.endsWith(".mp3") or
folder.file.name.endsWith(".wav") -> {
holder.fileImage.setImageResource(R.drawable.home_audio)
}
else -> {
holder.fileImage.setImageResource(R.drawable.ic_file)
}
}
}
}
holder.fileName.text = folder.fileName
holder.fileTime.text = folder.fileTime
if (folder.isShow) {
holder.fileSelect.visibility = View.VISIBLE
holder.icNext.visibility=View.GONE
} else {
holder.fileSelect.visibility = View.GONE
holder.icNext.visibility=View.GONE
}
holder.itemCount.text =
if (folder.file.isFile) " -- ${Formatter.formatFileSize(context, folder.fileSize)}"
else " -- ${folder.file.list().size} item"
holder.fileSelect.setOnClick {
dataList[position].isSelected = !dataList[position].isSelected
logic.doLogic()
notifyItemChanged(position)
}
holder.itemView.setOnClick {
when(position){
position ->{
if (!folder.isShow){
if (folder.file.isDirectory){
itemClickListener.onItemClick(folder.file)
}
}
}
}
}
}
fun setShow() {
dataList.forEach {
it.isShow=true
}
notifyDataSetChanged()
}
fun setAllSelected() {
dataList.forEach {
it.isSelected = true
}
notifyDataSetChanged()
}
fun setEmptySelected() {
dataList.forEach {
it.isSelected = false
}
notifyDataSetChanged()
}
}
\ No newline at end of file
package com.zxhyis.tools.ui.adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.AppCompatImageView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.cbman.roundimageview.RoundImageView
import com.zxhyis.tools.R
import com.zxhyis.tools.logic.ImageAndVideoBean
class HomeAdapter(
private val dataList:ArrayList<ImageAndVideoBean>,
) :RecyclerView.Adapter<HomeAdapter.ImageAndVideoVH>(){
inner class ImageAndVideoVH(itemView: View) : RecyclerView.ViewHolder(itemView){
val image: RoundImageView = itemView.findViewById(R.id.iv_image_video)
val videoFlag : AppCompatImageView = itemView.findViewById(R.id.video_flag)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ImageAndVideoVH {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_image_video, parent, false)
return ImageAndVideoVH(view)
}
override fun getItemCount(): Int = dataList.size
override fun onBindViewHolder(holder: ImageAndVideoVH, position: Int) {
val oneData=dataList[position]
Glide.with(holder.itemView.context)
.load(oneData.path)
.into(holder.image)
if (oneData.type==1){
holder.videoFlag.visibility=View.GONE
}else{
holder.videoFlag.visibility=View.VISIBLE
}
}
}
\ No newline at end of file
package com.zxhyis.tools.ui.adapter
import android.annotation.SuppressLint
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.AppCompatImageView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.cbman.roundimageview.RoundImageView
import com.zxhyis.tools.R
import com.zxhyis.tools.logic.ImageInfoBean
import com.zxhyis.tools.logic.Logic
import com.zxhyis.tools.logic.setOnClick
import com.zxhyis.tools.logic.startActivity
import com.zxhyis.tools.ui.`fun`.PictureDetailActivity
@SuppressLint("NotifyDataSetChanged")
class ImageAdapter(
private val dataList: ArrayList<ImageInfoBean>,
private val context: Context,
private val logic: Logic
) : RecyclerView.Adapter<ImageAdapter.ImageViewHolder>() {
inner class ImageViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
val apkIcon: RoundImageView = itemView.findViewById(R.id.iv_image)
val ivSelect : AppCompatImageView = itemView.findViewById(R.id.iv_select)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ImageViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_image_info, parent, false)
return ImageViewHolder(view)
}
override fun getItemCount(): Int = dataList.size
@SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: ImageViewHolder, position: Int) {
val type = dataList[position]
Glide.with(holder.itemView.context)
.load(type.imagePath)
.into(holder.apkIcon)
holder.ivSelect.isSelected = type.isSelected
if (type.isShow) {
holder.ivSelect.visibility = View.VISIBLE
} else {
holder.ivSelect.visibility = View.GONE
}
holder.ivSelect.setOnClick {
dataList[position].isSelected = !dataList[position].isSelected
logic.doLogic()
notifyItemChanged(position)
}
holder.itemView.setOnClick {
when(position){
position ->{
if (!type.isShow){
context.startActivity<PictureDetailActivity>("image_path" to type.imagePath)
}
}
}
}
}
//select all
fun selectAll() {
dataList.forEach {
it.isSelected = true
}
notifyDataSetChanged()
}
fun deselectAll() {
dataList.forEach {
it.isSelected = false
}
notifyDataSetChanged()
}
fun setShow() {
dataList.forEach {
it.isShow=true
}
notifyDataSetChanged()
}
}
\ No newline at end of file
package com.zxhyis.tools.ui.adapter
import android.annotation.SuppressLint
import android.content.Context
import android.text.format.Formatter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.AppCompatImageView
import androidx.appcompat.widget.AppCompatTextView
import androidx.recyclerview.widget.RecyclerView
import com.zxhyis.tools.R
import com.zxhyis.tools.logic.ApkInfoBean
import com.zxhyis.tools.logic.AudioBean
import com.zxhyis.tools.logic.Logic
import com.zxhyis.tools.logic.setOnClick
@SuppressLint("NotifyDataSetChanged")
class LarageFileAdapter(
private val dataList: ArrayList<AudioBean>,
private val context: Context,
private val logic: Logic
) : RecyclerView.Adapter<LarageFileAdapter.ApkViewHolder>() {
inner class ApkViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
val apkIcon: AppCompatImageView = itemView.findViewById(R.id.apk_icon)
val apkName : AppCompatTextView = itemView.findViewById(R.id.apk_name)
val apkTime : AppCompatTextView = itemView.findViewById(R.id.apk_time)
val apkSize : AppCompatTextView = itemView.findViewById(R.id.apk_size)
val apkSelect : AppCompatImageView = itemView.findViewById(R.id.apk_select)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ApkViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_apk, parent, false)
return ApkViewHolder(view)
}
override fun getItemCount(): Int = dataList.size
@SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: ApkViewHolder, position: Int) {
val type = dataList[position]
holder.apkIcon.setImageResource(R.drawable.home_largefiles)
holder.apkName.text = type.audioName
holder.apkSize.text = " --- ${Formatter.formatFileSize(context, type.apkSize)}"
holder.apkTime.text = type.apkTime
holder.apkSelect.isSelected = type.isSelected
if (type.isShow) {
holder.apkSelect.visibility = View.VISIBLE
} else {
holder.apkSelect.visibility = View.GONE
}
holder.apkSelect.setOnClick {
dataList[position].isSelected = !dataList[position].isSelected
logic.doLogic()
notifyItemChanged(position)
}
}
//select all
fun selectAll() {
dataList.forEach {
it.isSelected = true
}
notifyDataSetChanged()
}
fun deselectAll() {
dataList.forEach {
it.isSelected = false
}
notifyDataSetChanged()
}
fun setShow() {
dataList.forEach {
it.isShow=true
}
notifyDataSetChanged()
}
}
\ No newline at end of file
package com.zxhyis.tools.ui.adapter
import android.annotation.SuppressLint
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.AppCompatImageView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.cbman.roundimageview.RoundImageView
import com.zxhyis.tools.R
import com.zxhyis.tools.logic.Logic
import com.zxhyis.tools.logic.VideoBean
import com.zxhyis.tools.logic.setOnClick
@SuppressLint("NotifyDataSetChanged")
class VideoAdapter(
private val dataList: ArrayList<VideoBean>,
private val context: Context,
private val logic: Logic
) : RecyclerView.Adapter<VideoAdapter.VideoViewHolder>() {
inner class VideoViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
val firstImage: RoundImageView = itemView.findViewById(R.id.first_image)
val ivSelect : AppCompatImageView = itemView.findViewById(R.id.iv_select)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VideoViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_video, parent, false)
return VideoViewHolder(view)
}
override fun getItemCount(): Int = dataList.size
@SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: VideoViewHolder, position: Int) {
val type = dataList[position]
Glide.with(holder.itemView.context)
.load(type.videoUri)
.into(holder.firstImage)
holder.ivSelect.isSelected = type.isSelected
if (type.isShow) {
holder.ivSelect.visibility = View.VISIBLE
} else {
holder.ivSelect.visibility = View.GONE
}
holder.ivSelect.setOnClick {
dataList[position].isSelected = !dataList[position].isSelected
logic.doLogic()
notifyItemChanged(position)
}
}
//select all
fun selectAll() {
dataList.forEach {
it.isSelected = true
}
notifyDataSetChanged()
}
fun deselectAll() {
dataList.forEach {
it.isSelected = false
}
notifyDataSetChanged()
}
fun setShow() {
dataList.forEach {
it.isShow=true
}
notifyDataSetChanged()
}
}
\ No newline at end of file
package com.zxhyis.tools.ui.adapter
import android.annotation.SuppressLint
import android.content.Context
import android.text.format.Formatter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.AppCompatImageView
import androidx.appcompat.widget.AppCompatTextView
import androidx.recyclerview.widget.RecyclerView
import com.zxhyis.tools.R
import com.zxhyis.tools.logic.ApkInfoBean
import com.zxhyis.tools.logic.AudioBean
import com.zxhyis.tools.logic.Logic
import com.zxhyis.tools.logic.setOnClick
@SuppressLint("NotifyDataSetChanged")
class ZipAdapter(
private val dataList: ArrayList<AudioBean>,
private val context: Context,
private val value:Int,
private val logic: Logic
) : RecyclerView.Adapter<ZipAdapter.ApkViewHolder>() {
inner class ApkViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
val apkIcon: AppCompatImageView = itemView.findViewById(R.id.apk_icon)
val apkName : AppCompatTextView = itemView.findViewById(R.id.apk_name)
val apkTime : AppCompatTextView = itemView.findViewById(R.id.apk_time)
val apkSize : AppCompatTextView = itemView.findViewById(R.id.apk_size)
val apkSelect : AppCompatImageView = itemView.findViewById(R.id.apk_select)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ApkViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_apk, parent, false)
return ApkViewHolder(view)
}
override fun getItemCount(): Int = dataList.size
@SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: ApkViewHolder, position: Int) {
val type = dataList[position]
if (value==0){
holder.apkIcon.setImageResource(R.drawable.home_zip)
}else{
holder.apkIcon.setImageResource(R.drawable.home_documents)
}
holder.apkName.text = type.audioName
holder.apkSize.text = " --- ${Formatter.formatFileSize(context, type.apkSize)}"
holder.apkTime.text = type.apkTime
holder.apkSelect.isSelected = type.isSelected
if (type.isShow) {
holder.apkSelect.visibility = View.VISIBLE
} else {
holder.apkSelect.visibility = View.GONE
}
holder.apkSelect.setOnClick {
dataList[position].isSelected = !dataList[position].isSelected
logic.doLogic()
notifyItemChanged(position)
}
}
//select all
fun selectAll() {
dataList.forEach {
it.isSelected = true
}
notifyDataSetChanged()
}
fun deselectAll() {
dataList.forEach {
it.isSelected = false
}
notifyDataSetChanged()
}
fun setShow() {
dataList.forEach {
it.isShow=true
}
notifyDataSetChanged()
}
}
\ No newline at end of file
package com.zxhyis.tools.ui.dialog
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.AppCompatTextView
import androidx.fragment.app.DialogFragment
import com.zxhyis.tools.R
import com.zxhyis.tools.logic.ActivityCollector
import com.zxhyis.tools.logic.setOnClick
class ExitDialog : DialogFragment() {
private lateinit var exitView: View
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
exitView = inflater.inflate(R.layout.dialog_exit, container, false)
return exitView
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
val window = dialog?.window
window?.setGravity(Gravity.CENTER)
window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
val windowManager = activity?.windowManager
val display = windowManager?.defaultDisplay
val lp = dialog?.window!!.attributes
lp.width = (display?.width!! * 0.73).toInt() //设置宽度
dialog?.window!!.attributes = lp
exitView.findViewById<AppCompatTextView>(R.id.tv_cancle).setOnClick {
dialog?.dismiss()
}
exitView.findViewById<AppCompatTextView>(R.id.tv_confirm).setOnClick {
ActivityCollector.finishAll()
}
}
}
\ No newline at end of file
package com.zxhyis.tools.ui.dialog package com.zxhyis.tools.ui.dialog
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.AppCompatTextView
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import com.zxhyis.tools.R
import com.zxhyis.tools.logic.ClickCallBack
import com.zxhyis.tools.logic.setOnClick
class FIleDialog:DialogFragment() { class FIleDialog:DialogFragment() {
private lateinit var fileView: View
private var clickCallBack: ClickCallBack? = null
fun setCallBack(callBack: ClickCallBack) {
clickCallBack = callBack
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
fileView = inflater.inflate(R.layout.dialog_create_file, container, false)
return fileView
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
val window = dialog?.window
window?.setGravity(Gravity.CENTER)
window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
val windowManager = activity?.windowManager
val display = windowManager?.defaultDisplay
val lp = dialog?.window!!.attributes
lp.width = (display?.width!! * 0.73).toInt() //设置宽度
dialog?.window!!.attributes = lp
fileView.findViewById<AppCompatTextView>(R.id.tv_cancle).setOnClick {
dialog?.dismiss()
}
fileView.findViewById<AppCompatTextView>(R.id.tv_establish).setOnClick {
clickCallBack?.clickBack()
dismiss()
}
}
} }
\ No newline at end of file
package com.zxhyis.tools.ui.dialog
import android.app.Dialog
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.DialogFragment
import com.airbnb.lottie.LottieAnimationView
import com.zxhyis.tools.R
class LoadingDialog:DialogFragment() {
private lateinit var loadVIew:View
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
loadVIew= inflater.inflate(R.layout.dialog_loading,container,false)
return loadVIew
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
val window = dialog?.window
window?.setGravity(Gravity.CENTER)
window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
val windowManager = activity?.windowManager
val display = windowManager?.defaultDisplay
val lp = dialog?.window!!.attributes
lp.width = (display?.width!! * 0.3).toInt() //设置宽度
dialog?.window!!.attributes = lp
loadVIew.findViewById<LottieAnimationView>(R.id.lav_load).playAnimation()
}
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
package com.zxhyis.tools.ui.`fun`
import com.zxhyis.tools.base.TopActivity
import com.zxhyis.tools.databinding.ActivityGarbageBinding
class GarbageActivity : TopActivity<ActivityGarbageBinding>() {
override fun getViewBinding1(): ActivityGarbageBinding {
return ActivityGarbageBinding.inflate(layoutInflater)
}
override fun init() {
}
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment