Commit e6c230bb authored by yanglin's avatar yanglin

init commit

parents
Pipeline #1046 canceled with stages
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties
# Default ignored files
/shelf/
/workspace.xml
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<option name="LINE_SEPARATOR" value="&#13;&#10;" />
<JetCodeStyleSettings>
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</JetCodeStyleSettings>
<codeStyleSettings language="XML">
<option name="FORCE_REARRANGE_MODE" value="1" />
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" />
</indentOptions>
<arrangement>
<rules>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:android</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:id</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>style</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>ANDROID_ATTRIBUTE_ORDER</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>.*</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
</rules>
</arrangement>
</codeStyleSettings>
<codeStyleSettings language="kotlin">
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</codeStyleSettings>
</code_scheme>
</component>
\ No newline at end of file
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</state>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="17" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetDropDown">
<value>
<entry key="CleanActivity">
<State />
</entry>
<entry key="app">
<State />
</entry>
</value>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="resolveExternalAnnotations" value="false" />
</GradleProjectSettings>
</option>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="KotlinJpsPluginSettings">
<option name="version" value="1.9.0" />
</component>
</project>
\ No newline at end of file
<?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>
\ No newline at end of file
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>
\ No newline at end of file
/build
\ No newline at end of file
plugins {
alias(libs.plugins.androidApplication)
alias(libs.plugins.jetbrainsKotlinAndroid)
}
android {
namespace 'com.test.mydemo3'
compileSdk 34
defaultConfig {
applicationId "com.tttt.datarecoveryrenew"
minSdk 25
targetSdk 33
versionCode 1
versionName "1.0"
renderscriptTargetApi 21
renderscriptSupportModeEnabled true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
dataBinding {
enable = true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
buildscript {
repositories {
maven { url 'https://artifacts.applovin.com/android' }
flatDir {
dirs 'libs'
}
}
dependencies {
classpath "com.applovin.quality:AppLovinQualityServiceGradlePlugin:+"
}
buildFeatures {
viewBinding = true
}
}
}
apply plugin: 'com.android.application'
dependencies {
implementation libs.androidx.core.ktx
implementation libs.androidx.appcompat
implementation libs.material
implementation libs.androidx.activity
implementation libs.androidx.constraintlayout
implementation libs.androidx.legacy.support.v4
implementation libs.androidx.lifecycle.livedata.ktx
implementation libs.androidx.lifecycle.viewmodel.ktx
implementation libs.androidx.fragment.ktx
testImplementation libs.junit
androidTestImplementation libs.androidx.junit
androidTestImplementation libs.androidx.espresso.core
implementation 'androidx.viewpager2:viewpager2:1.0.0'
//Lottie动画
implementation "com.airbnb.android:lottie:3.6.0"
def dialogx_version = "0.0.49"
implementation "com.kongzue.dialogx:DialogX:${dialogx_version}"
// implementation 'com.github.aicoin:ImageHash:1.0.0'
implementation 'com.guolindev.permissionx:permissionx:1.7.1'
implementation 'com.github.bumptech.glide:glide:4.12.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
implementation 'com.applovin:applovin-sdk:+'
implementation 'com.google.android.gms:play-services-location:21.2.0'
implementation 'com.google.android.ump:user-messaging-platform:2.1.0'
implementation "androidx.lifecycle:lifecycle-process:2.2.0"
implementation 'com.google.code.gson:gson:2.8.8'
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
// compile(name:'trustlook_cleanjunk_sdk_release_3.0.4.20240322',ext:'aar')
implementation files('libs/trustlook_cleanjunk_sdk_release_3.0.4.20240322.aar')
implementation files('libs/cloudscan_sdk_5.0.5.20240306.aar')
}
# 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.test.mydemo3
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.test.mydemo3", appContext.packageName)
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission
android:name="android.permission.BATTERY_STATS"
tools:ignore="ProtectedPermissions" />
<uses-permission
android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<application
android:name=".MyApplication"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@drawable/ic_app_icon"
android:label="@string/app_name"
android:requestLegacyExternalStorage="true"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyDemo3"
tools:targetApi="31">
<activity
android:name=".activity.ScanResultActivity"
android:theme="@style/BatteryActivityTheme"
android:screenOrientation="portrait"
android:exported="false"
tools:ignore="DiscouragedApi" />
<activity
android:name=".antivirus.AntivirusActivity"
android:screenOrientation="portrait"
android:exported="false"
android:theme="@style/MediaActivityTheme"
tools:ignore="DiscouragedApi" />
<activity
android:name=".activity.BatteryActivity"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi"
android:theme="@style/BatteryActivityTheme" />
<activity
android:name=".activity.CleanActivity"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi"
android:theme="@style/BatteryActivityTheme" />
<activity
android:name=".activity.MediaActivity"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi"
android:theme="@style/MediaActivityTheme" />
<activity
android:name=".activity.MoveOrCopyActivity"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi"
android:theme="@style/MediaActivityTheme" />
<activity
android:name=".activity.FileManagerActivity"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi"
android:theme="@style/MediaActivityTheme" />
<activity
android:name=".activity.SimilarImagesActivity"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi"
android:theme="@style/MediaActivityTheme" />
<activity
android:name=".activity.ScanEmptyFilesActivity"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi"
android:theme="@style/MediaActivityTheme" />
<activity
android:name=".activity.ScanLargeFilesActivity"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi"
android:theme="@style/MediaActivityTheme" />
<activity
android:name=".activity.InternalStorageActivity"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi"
android:theme="@style/MediaActivityTheme" />
<activity
android:name=".activity.HomeActivity"
android:exported="false" />
<activity
android:name=".MainActivity"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> <!-- 病毒扫描,key是和包名绑定的 -->
<meta-data
android:name="com.trustlook.ApiKey"
android:value="b8ade465f682b1ae8bcf942eb4e07aab435ee02a10196283b38daa66" /> <!-- 垃圾清理 -->
<meta-data
android:name="com.trustlook.cleansdk.ApiKey"
android:value="b8ade465f682b1ae8bcf942eb4e07aab435ee02a10196283b38daa66" />
</application>
</manifest>
\ No newline at end of file
package com.test.mydemo3
import android.annotation.SuppressLint
import android.content.Intent
import android.os.Bundle
import android.os.Handler
import android.widget.ProgressBar
import androidx.appcompat.app.AppCompatActivity
import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxAdListener
import com.applovin.mediation.MaxError
import com.applovin.mediation.ads.MaxInterstitialAd
import com.applovin.sdk.AppLovinMediationProvider
import com.applovin.sdk.AppLovinSdk
import com.applovin.sdk.AppLovinSdkInitializationConfiguration
import com.kongzue.dialogx.DialogX
import com.test.mydemo3.activity.HomeActivity
import com.test.mydemo3.util.UrlManager
import java.util.concurrent.TimeUnit
class MainActivity : AppCompatActivity() , MaxAdListener {
private lateinit var mProgressBar: ProgressBar
private lateinit var interstitialAd: MaxInterstitialAd
private var retryAttempt = 0.0
@SuppressLint("SuspiciousIndentation")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
DialogX.init(this)
mProgressBar = findViewById(R.id.main_page_progress)
initView()
}
private fun initView() {
// Create the initialization configuration
// Perform any additional configuration/setting changes
val initConfig = AppLovinSdkInitializationConfiguration.builder(UrlManager.AD_APP_KEY, this)
.setMediationProvider(AppLovinMediationProvider.MAX)
.build();
val handler = Handler()
var count: Int = 0
val runnable = object : Runnable{
override fun run() {
if (count <= 100){
runOnUiThread {
mProgressBar.setProgress(count)
count += 10
}
handler.postDelayed(this, 300)
}else{
startVi()
}
}
}
AppLovinSdk.getInstance(this).initialize(initConfig) {
// Start loading ads
handler.postDelayed(runnable, 300)
}
}
fun startVi(){
startActivity(Intent(this, HomeActivity::class.java))
finish()
}
fun createInterstitialAd() {
interstitialAd = MaxInterstitialAd(UrlManager.AD_UNIT_ID, this)
interstitialAd.setListener(this)
// Load the first ad
interstitialAd.loadAd()
}
// MAX Ad Listener
override fun onAdLoaded(maxAd: MaxAd) {
// Interstitial ad is ready to be shown. interstitialAd.isReady() will now return 'true'
// Reset retry attempt
retryAttempt = 0.0
}
override fun onAdLoadFailed(adUnitId: String, error: MaxError) {
// Interstitial ad failed to load
// AppLovin recommends that you retry with exponentially higher delays up to a maximum delay (in this case 64 seconds)
retryAttempt++
val delayMillis =
TimeUnit.SECONDS.toMillis(Math.pow(2.0, Math.min(6.0, retryAttempt)).toLong())
Handler().postDelayed({ interstitialAd.loadAd() }, delayMillis)
}
override fun onAdDisplayFailed(ad: MaxAd, error: MaxError) {
// Interstitial ad failed to display. AppLovin recommends that you load the next ad.
interstitialAd.loadAd()
}
override fun onAdDisplayed(maxAd: MaxAd) {}
override fun onAdClicked(maxAd: MaxAd) {}
override fun onAdHidden(maxAd: MaxAd) {
// Interstitial ad is hidden. Pre-load the next ad
interstitialAd.loadAd()
}
}
\ No newline at end of file
package com.test.mydemo3
import android.app.Application
import android.content.Context
import android.util.Log
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent
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.sdk.AppLovinSdk
import com.applovin.sdk.AppLovinSdkConfiguration
import com.cloud.cleanjunksdk.task.CheckSdkCallback
import com.cloud.cleanjunksdk.task.Clean
import com.cloud.cleanjunksdk.task.CleanSDK
import com.cloud.cleanjunksdk.tools.Region
import com.test.mydemo3.util.UrlManager
import com.trustlook.sdk.cloudscan.CloudScanClient
class MyApplication : Application() {
private lateinit var appOpenManager: ExampleAppOpenManager
companion object{
var mCleanSdk: Clean? = null
var mCloudScan: CloudScanClient? = null
}
override fun onCreate() {
super.onCreate()
// AppLovinSdk.getInstance( this ).initializeSdk({ configuration: AppLovinSdkConfiguration ->
// {
// appOpenManager = ExampleAppOpenManager(applicationContext)
// }
// )
// }
CleanSDK.init(MyApplication(), this, Region.INTL, object : CheckSdkCallback {
override fun onSuccess(p0: Clean?) {
mCleanSdk = p0!!
Log.e("yanglin", "onSuccess: clean INIT", )
}
override fun onError(p0: Int) {
Log.e("yanglin", "onError: INIT", )
}
})
mCloudScan = CloudScanClient.Builder(this)
.setRegion(com.trustlook.sdk.data.Region.INTL)
.setConnectionTimeout(30000)
.setSocketTimeout(30000)
.build()
AppLovinSdk.getInstance(this).initializeSdk {
appOpenManager = ExampleAppOpenManager(applicationContext)
}
}
class ExampleAppOpenManager(applicationContext: Context?) : LifecycleObserver, MaxAdListener {
private lateinit var appOpenAd: MaxAppOpenAd
private lateinit var context: Context
init {
ProcessLifecycleOwner.get().lifecycle.addObserver(this)
context = applicationContext!!
appOpenAd = MaxAppOpenAd(UrlManager.AD_UNIT_ID, applicationContext!!)
appOpenAd.setListener(this)
appOpenAd.loadAd()
}
private fun showAdIfReady() {
if (appOpenAd == null || !AppLovinSdk.getInstance(context).isInitialized) return
if (appOpenAd.isReady) {
appOpenAd.showAd(UrlManager.TEST_PLACEMENT_HERE)
} else {
appOpenAd.loadAd()
}
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onStart() {
showAdIfReady()
}
override fun onAdLoaded(ad: MaxAd) {}
override fun onAdLoadFailed(adUnitId: String, error: MaxError) {}
override fun onAdDisplayed(ad: MaxAd) {}
override fun onAdClicked(ad: MaxAd) {}
override fun onAdHidden(ad: MaxAd) {
appOpenAd.loadAd()
}
override fun onAdDisplayFailed(ad: MaxAd, error: MaxError) {
appOpenAd.loadAd()
}
}
}
\ No newline at end of file
package com.test.mydemo3.activity
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class BaseActivityViewModel : ViewModel() {
// private var mSelectNumber = MutableLiveData<SelectNumber>()
private val _myInt = MutableLiveData<Int>()
val myInt: LiveData<Int> get() = _myInt
fun setNumber(number: Int){
_myInt.value = number
}
// fun getNumber() : LiveData<SelectNumber>{
// return mSelectNumber
// }
//
// fun setNumber(number: Int){
// mSelectNumber.value = SelectNumber(number)
// }
}
\ No newline at end of file
package com.test.mydemo3.activity
import android.content.ContentResolver
import android.content.Context
import android.content.Intent
import android.os.BatteryManager
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.os.SystemClock
import android.provider.Settings
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.test.mydemo3.R
import com.test.mydemo3.util.BatteryUtil
import com.test.mydemo3.util.PermissionUtil
import com.test.mydemo3.util.SystemServerState
import java.util.Calendar
import java.util.Date
class BatteryActivity : AppCompatActivity() {
private lateinit var mQuitView: ImageView
private lateinit var mBatteryCapacity: TextView
private lateinit var mBatteryUseTime: TextView
private lateinit var mBatteryTemperature: TextView
private lateinit var mBatteryVolatile: TextView
private lateinit var mBatteryPower: TextView
private lateinit var mHotspotTitle: TextView
private lateinit var mHotspotHint: TextView
private lateinit var mHotspotSwitch: TextView
private lateinit var mBluetoothTitle: TextView
private lateinit var mBluetoothHint: TextView
private lateinit var mBluetoothSwitch: TextView
private lateinit var mAutoBrightTitle: TextView
private lateinit var mAutoBrightHint: TextView
private lateinit var mAutoBrightSwitch: TextView
private lateinit var mGpsTitle: TextView
private lateinit var mGpsHint: TextView
private lateinit var mGpsSwitch: TextView
private lateinit var mAnimation: View
private var isHotspotOpen = false
private var isBluetoothOpen = false
private var isAutoBrightOpen = false
private var isGpsOpen = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_battery)
BatteryUtil.ReceiverBatteryOhterInfo(this)
PermissionUtil.requestLocationPermission(this)
initView()
setOnClickListener()
}
private fun setOnClickListener() {
mQuitView.setOnClickListener {
finish()
}
mHotspotSwitch.setOnClickListener {
// isHotspotOpen = !isHotspotOpen
// setViewSwitch(mHotspotSwitch, isHotspotOpen)
startActivity(Intent(Settings.ACTION_DATA_ROAMING_SETTINGS))
}
mBluetoothSwitch.setOnClickListener {
// isBluetoothOpen = !isBluetoothOpen
// setViewSwitch(mBluetoothSwitch, isBluetoothOpen)
startActivity(Intent(Settings.ACTION_BLUETOOTH_SETTINGS))
}
mAutoBrightSwitch.setOnClickListener {
// isAutoBrightOpen = !isAutoBrightOpen
// setViewSwitch(mAutoBrightSwitch, isAutoBrightOpen)
startActivity(Intent(Settings.ACTION_DISPLAY_SETTINGS))
}
mGpsSwitch.setOnClickListener {
// isGpsOpen = !isGpsOpen
// setViewSwitch(mGpsSwitch, isGpsOpen)
startActivity(Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS))
}
findViewById<View>(R.id.battery_quit_btn_2).setOnClickListener {
finish()
}
}
private fun setViewSwitch(textView: TextView, isOpen: Boolean){
textView.text = if (isOpen) "Off" else "On"
textView.setTextColor(if (isOpen) getColor(R.color.style_grey)
else getColor(R.color.style_background))
}
private fun getBatteryInfo() {
val batteryManager = getSystemService(Context.BATTERY_SERVICE) as BatteryManager
mBatteryCapacity.text = BatteryUtil.level.toString()
// mBatteryPower.text = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER).toString()
val uptime = SystemClock.elapsedRealtime() // 获取系统启动时间
val currantTime = Calendar.getInstance().time
val batteryUseTime = currantTime.time - uptime
val batteryDate = Date(batteryUseTime)
mBatteryUseTime.text = "${batteryDate.day} day, ${batteryDate.hours} hours ${batteryDate.minutes} min "
val mAh =
(batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER) / (batteryManager.getIntProperty(
BatteryManager.BATTERY_PROPERTY_CAPACITY
).toFloat() / 100f)) / 1000f
mBatteryPower.text = mAh.toInt().toString()
mBatteryTemperature.text = BatteryUtil.temperature.toString()
mBatteryVolatile.text = BatteryUtil.voltage.toString()
// mBatteryPower.text = batteryManager.getIntProperty(
// BatteryManager.BATTERY_PROPERTY_CAPACITY).toString()
}
private fun initView() {
mQuitView = findViewById(R.id.battery_quit_btn)
mBatteryCapacity = findViewById(R.id.battery_num_text)
mBatteryUseTime = findViewById(R.id.battery_use_time_text)
mBatteryTemperature = findViewById(R.id.battery_temperature)
mBatteryVolatile = findViewById(R.id.battery_voltage_text)
mBatteryPower = findViewById(R.id.battery_power_text)
mHotspotTitle = findViewById(R.id.hotspot_title_text)
mHotspotHint = findViewById(R.id.hotspot_hint_text)
mHotspotSwitch = findViewById(R.id.hotspot_switch_text)
mBluetoothTitle = findViewById(R.id.bluetooth_title_text)
mBluetoothHint = findViewById(R.id.bluetooth_hint_text)
mBluetoothSwitch = findViewById(R.id.bluetooth_switch_text)
mAutoBrightTitle = findViewById(R.id.auto_bright_title_text)
mAutoBrightHint = findViewById(R.id.auto_bright_hint_text)
mAutoBrightSwitch = findViewById(R.id.auto_bright_switch_text)
mGpsTitle = findViewById(R.id.gps_title_text)
mGpsHint = findViewById(R.id.gps_hint_text)
mGpsSwitch = findViewById(R.id.gps_switch_text)
mAnimation = findViewById(R.id.battery_animation_view)
}
override fun onResume() {
super.onResume()
getBatteryInfo()
Handler(Looper.getMainLooper()).postDelayed(Runnable {
mAnimation.visibility = View.GONE
}, 2000)
setViewSwitch(mBluetoothSwitch, SystemServerState.isBluetoothEnabled())
setViewSwitch(mHotspotSwitch, SystemServerState.isHotspotEnabled(this))
setViewSwitch(mAutoBrightSwitch, SystemServerState.isAutoBrightnessEnabled(contentResolver))
setViewSwitch(mGpsSwitch, SystemServerState.isGPSEnabled(this))
mHotspotTitle.text = String.format(getString(R.string.turn_off_the_hotspot), if (SystemServerState.isHotspotEnabled(this)) "On" else "Off")
mBluetoothTitle.text = String.format(getString(R.string.turn_off_bluetooth), if (SystemServerState.isBluetoothEnabled()) "On" else "Off")
mAutoBrightTitle.text = String.format(getString(R.string.turn_on_auto_brightness), if (SystemServerState.isAutoBrightnessEnabled(contentResolver)) "On" else "Off")
mGpsTitle.text = String.format(getString(R.string.turn_off_gps), if (SystemServerState.isGPSEnabled(this)) "On" else "Off")
}
}
\ No newline at end of file
package com.test.mydemo3.activity
import android.os.Bundle
import com.kongzue.dialogx.dialogs.WaitDialog
import com.test.mydemo3.R
import com.test.mydemo3.base.BaseActivity
import com.test.mydemo3.model.FileBean
import com.test.mydemo3.util.FileUtil
class FileManagerActivity : BaseActivity() {
private var mFileBeanList = ArrayList<FileBean>()
private lateinit var mFileTypeBeanList : ArrayList<FileBean>
private lateinit var mFileType: String
override fun getLayout(): Int {
return R.layout.activity_file_manager
}
companion object{
val fileTypes = arrayOf(
arrayOf("png","jpg"),
arrayOf("mp4","3gp", "avi"),
arrayOf("mp3","aac", "wav"),
arrayOf("zip"),
arrayOf("apk"),
arrayOf("log"),
arrayOf("png","jpg","doc","docm","docx","xlsx","xlsm","xlsb","xltx","ppt","pdf","txt"),
arrayOf("doc","docm","docx"),
arrayOf("xlsx","xlsm","xlsb","xltx",),
arrayOf("ppt"),
arrayOf("pdf"),
arrayOf("txt"),
)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
isNewShow(false)
mFileType = intent.getStringExtra("fileType").toString()
setTitle(mFileType)
isCurrantTvShow(false)
initData()
setOnClickBtn()
}
private fun initData() {
WaitDialog.show("please wait..")
Thread(Runnable {
if (mFileType.contains("audio")) {
mFileBeanList.addAll(FileUtil.getFileType(FileUtil.MP3_MIME_TYPE, this))
mFileBeanList.addAll(FileUtil.getFileType(FileUtil.WAV_MIME_TYPE, this))
} else if (mFileType.contains("zip")) {
mFileBeanList.addAll(FileUtil.getFileType(FileUtil.ZIP_MIME_TYPE, this))
mFileBeanList.addAll(FileUtil.getFileType(FileUtil.ZIP_7Z_MIME_TYPE, this))
mFileBeanList.addAll(FileUtil.getFileType(FileUtil.RAR_MIME_TYPE, this))
} else if (mFileType.contains("all")) {
mFileBeanList.addAll(FileUtil.getFileType(FileUtil.ZIP_MIME_TYPE, this))
mFileBeanList.addAll(FileUtil.getFileType(FileUtil.ZIP_7Z_MIME_TYPE, this))
mFileBeanList.addAll(FileUtil.getFileType(FileUtil.RAR_MIME_TYPE, this))
mFileBeanList.addAll(FileUtil.getFileType(FileUtil.TEXT_MIME_TYPE, this))
mFileBeanList.addAll(FileUtil.getFileType(FileUtil.WORD_MIME_TYPE, this))
mFileBeanList.addAll(FileUtil.getFileType(FileUtil.EXCEL_MIME_TYPE, this))
mFileBeanList.addAll(FileUtil.getFileType(FileUtil.PPT_MIME_TYPE, this))
} else {
mFileBeanList = when (mFileType) {
"apk" -> {
FileUtil.getFileType(FileUtil.APK_MIME_TYPE, this)
}
"log" -> {
FileUtil.getFileType(FileUtil.TEXT_MIME_TYPE, this)
}
"word" -> {
FileUtil.getFileType(FileUtil.WORD_MIME_TYPE, this)
}
"excel" -> {
FileUtil.getFileType(FileUtil.EXCEL_MIME_TYPE, this)
}
"ppt" -> {
FileUtil.getFileType(FileUtil.PPT_MIME_TYPE, this)
}
"pdf" -> {
FileUtil.getFileType(FileUtil.PDF_MIME_TYPE, this)
}
"txt" -> {
FileUtil.getFileType(FileUtil.TEXT_MIME_TYPE, this)
}
else -> {
mFileBeanList
}
}
}
runOnUiThread(Runnable {
setAdapter(findViewById(R.id.files_item_listview), mFileBeanList)
WaitDialog.dismiss()
})
}).start()
}
}
\ No newline at end of file
package com.test.mydemo3.activity
import android.Manifest
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.Environment
import android.provider.MediaStore.Audio.Radio
import android.provider.Settings
import android.view.View
import android.widget.RadioButton
import android.widget.RadioGroup
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.annotation.IdRes
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.get
import androidx.fragment.app.Fragment
import androidx.viewpager.widget.ViewPager
import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2
import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback
import com.permissionx.guolindev.PermissionX
import com.permissionx.guolindev.callback.RequestCallback
import com.test.mydemo3.R
import com.test.mydemo3.fragment.FileManagerFragment
import com.test.mydemo3.fragment.HomeFragment
import com.test.mydemo3.fragment.InternalStorageFragment
import com.test.mydemo3.util.PermissionUtil
import java.security.Permission
import javax.security.auth.callback.Callback
class HomeActivity : AppCompatActivity() {
private val REQUEST_MANAGE_EXTERNAL_STORAGE_PERMISSION = 101
var mViewPage: ViewPager2? = null
companion object{
var mRadioGroup: RadioGroup? = null
var isPermission = false
fun groupShow(isShow: Boolean){
mRadioGroup?.visibility = if (isShow) View.VISIBLE else View.GONE
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.activity_home)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
initView()
}
private fun initView() {
mViewPage = findViewById(R.id.view_page)
mRadioGroup = findViewById(R.id.home_btn_group)
mViewPage?.isUserInputEnabled = false
var list = ArrayList<Fragment>()
list.add(HomeFragment())
list.add(InternalStorageFragment())
list.add(FileManagerFragment())
getPermission()
this.mViewPage?.adapter = object : FragmentStateAdapter(this){
override fun getItemCount(): Int {
return list.size
}
override fun createFragment(position: Int): Fragment {
return list[position]
}
}
this.mViewPage?.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback(){
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
if (position ==0){
findViewById<RadioButton>(R.id.radio_home_btn).isChecked = true
findViewById<RadioButton>(R.id.radio_file_manage_btn).isChecked = false
findViewById<RadioButton>(R.id.radio_view_btn).isChecked = false
}else if (position == 1){
findViewById<RadioButton>(R.id.radio_home_btn).isChecked = false
findViewById<RadioButton>(R.id.radio_view_btn).isChecked = true
findViewById<RadioButton>(R.id.radio_file_manage_btn).isChecked = false
}else if (position == 2){
findViewById<RadioButton>(R.id.radio_home_btn).isChecked = false
findViewById<RadioButton>(R.id.radio_view_btn).isChecked = false
findViewById<RadioButton>(R.id.radio_file_manage_btn).isChecked = true
}
}
})
mRadioGroup?.setOnCheckedChangeListener{
_group, _id ->
when(_id){
R.id.radio_home_btn->{
mViewPage?.currentItem = 0
}
R.id.radio_view_btn ->{
mViewPage?.currentItem = 1
}
R.id.radio_file_manage_btn->{
mViewPage?.currentItem = 2
}
}
}
}
fun getPermission(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU){
isPermission = false
}else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.R && !isPermission){
isPermission = false
} else {
PermissionX.init(this).permissions(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
).request(RequestCallback { allGranted, grantedList, deniedList ->
if (allGranted){
isPermission = true
}else{
isPermission = false
}
})
}
}
override fun onResume() {
super.onResume()
if (PermissionUtil.checkGrantedPermission(this)){
isPermission = true
}
}
}
\ No newline at end of file
package com.test.mydemo3.activity
import android.Manifest
import android.content.Context
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
import android.os.Environment
import android.util.Log
import android.util.SparseBooleanArray
import android.widget.ListView
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.content.ContextCompat
import com.kongzue.dialogx.dialogs.WaitDialog
import com.test.mydemo3.R
import com.test.mydemo3.base.BaseActivity
import com.test.mydemo3.model.FileBean
import com.test.mydemo3.model.FilesItemBean
import com.test.mydemo3.util.FileUtil
import com.test.mydemo3.util.PermissionUtil
import java.io.File
class InternalStorageActivity : BaseActivity() {
private lateinit var mFilesItemListView: ListView
companion object{
var mFileItemList = ArrayList<FileBean>()
}
override fun getLayout(): Int {
return R.layout.activity_internal_storage
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
super.setTitle("Internal storage")
mInitView()
}
fun mInitView(){
mFilesItemListView = findViewById<ListView>(R.id.files_item_listview)
if (HomeActivity.isPermission){
requestDataList()
}else{
setAdapter(mFilesItemListView, mFileItemList)
}
}
private fun requestDataList() {
if (mFileItemList.size == 0){
WaitDialog.show("Please Wait..")
Thread(Runnable {
// val allFilesAndDirectories = FileUtil.getAllFilesAndDirectories(this)
val allFilesAndDirectories = FileUtil.getFileList(Environment.getExternalStorageDirectory())
mFileItemList = FileUtil.fileListSort(allFilesAndDirectories)
runOnUiThread(Runnable {
setAdapter(mFilesItemListView, mFileItemList)
WaitDialog.dismiss()
})
}).start()
}else{
setAdapter(mFilesItemListView, mFileItemList)
}
}
override fun onResume() {
super.onResume()
if (PermissionUtil.checkGrantedPermission(this)){
requestDataList()
}
}
}
\ No newline at end of file
package com.test.mydemo3.activity
import android.annotation.SuppressLint
import android.os.Bundle
import android.util.SparseBooleanArray
import android.view.View
import android.widget.CheckBox
import android.widget.GridView
import android.widget.ImageView
import android.widget.ScrollView
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModelProvider
import com.kongzue.dialogx.dialogs.WaitDialog
import com.test.mydemo3.R
import com.test.mydemo3.adapter.MediaAdapter
import com.test.mydemo3.model.FileBean
import com.test.mydemo3.util.FileUtil
class MediaActivity : AppCompatActivity() {
private lateinit var mGridView: GridView
private lateinit var mTitleBar: View
private lateinit var mSelectBar: View
private lateinit var mQuitBtn: ImageView
private lateinit var mCancelBtn: ImageView
private lateinit var mDeleteBtn: ImageView
private lateinit var mEditBtn: ImageView
private lateinit var mShareBtn: ImageView
private lateinit var mCheckedBtn: CheckBox
private lateinit var mSelectTv: TextView
private lateinit var mTitleTv: TextView
lateinit var mItemCheckedArray: SparseBooleanArray
private var mItemDataList = ArrayList<FileBean>()
private lateinit var mItemAdapter: MediaAdapter
private var mDataList: ArrayList<String> = ArrayList<String>()
private var mCheckedDataList: ArrayList<String> = ArrayList<String>()
private var mCheckedNumber = 0
private lateinit var mModel: BaseActivityViewModel
val mFileTypeBeanList : ArrayList<String> = ArrayList()
var mShowBeanData: ArrayList<String> = ArrayList()
var mStartNumber: Int = 0
var mIsCheckClick = false
companion object{
var isClickEditBtn = false
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_media)
initView()
}
@SuppressLint("ClickableViewAccessibility")
private fun initView() {
mGridView = findViewById(R.id.image_item_grid)
mTitleBar = findViewById(R.id.title_bar)
mSelectBar = findViewById(R.id.switch_and_select_layout)
// mScrollView = findViewById(R.id.grid_view_scroll)
mQuitBtn = mTitleBar.findViewById<ImageView>(R.id.btn_quit)
mCancelBtn = mTitleBar.findViewById<ImageView>(R.id.btn_cancel)
mDeleteBtn = mTitleBar.findViewById<ImageView>(R.id.btn_delete)
mEditBtn = mTitleBar.findViewById<ImageView>(R.id.btn_edit)
mShareBtn = mTitleBar.findViewById<ImageView>(R.id.btn_share)
mCheckedBtn = mTitleBar.findViewById<CheckBox>(R.id.checkbox_item_all)
mSelectTv = mTitleBar.findViewById<TextView>(R.id.select_num)
mTitleTv = mTitleBar.findViewById<TextView>(R.id.title_bar_text)
mEditBtn.visibility = View.VISIBLE
mShareBtn.visibility = View.GONE
findViewById<TextView>(R.id.current_file_path).visibility = View.GONE
mItemCheckedArray = SparseBooleanArray()
val fileType = intent.getStringExtra("fileType").toString()
mItemAdapter = MediaAdapter(mItemDataList, this, mItemCheckedArray, fileType, 118)
mGridView.adapter = mItemAdapter
Thread(Runnable {
WaitDialog.show("please wait..")
mItemDataList = FileUtil.getMediaFiles(this, fileType, 20)
runOnUiThread {
mItemAdapter.setData(mItemDataList)
WaitDialog.dismiss()
for (fileBean in mItemDataList){
mDataList.add(fileBean.filePath)
}
}
}).start()
mTitleTv.text = fileType
mModel = ViewModelProvider(this)[BaseActivityViewModel::class.java]
mModel.setNumber(0)
mModel.myInt.observe(this) {
mSelectTv.text = String.format(getString(R.string.select_0, mCheckedNumber.toString()))
}
setOnGridViewItemClickListener()
setOnclickListener()
}
private fun setOnclickListener() {
mEditBtn.setOnClickListener {
mQuitBtn.visibility = View.GONE
mEditBtn.visibility = View.GONE
mSelectBar.visibility = View.VISIBLE
mDeleteBtn.visibility = View.VISIBLE
mCancelBtn.visibility = View.VISIBLE
isClickEditBtn = true
mItemAdapter.notifyDataSetChanged()
}
mCancelBtn.setOnClickListener {
cancelBtn()
}
mQuitBtn.setOnClickListener {
finish()
}
mCheckedBtn.setOnClickListener {
mIsCheckClick = !mIsCheckClick
selectAll()
}
}
private fun setOnGridViewItemClickListener(){
mGridView.setOnItemClickListener { parent, view, position, id ->
if (isClickEditBtn){
updateCheckBoxStatus(view, position)
}else{
//TODO 点击进入图片或视频播放
}
}
}
private fun setStateCheckedMap(isChecked: Boolean){
for(i in mDataList.indices){
mItemCheckedArray.put(i, isChecked)
mGridView.setItemChecked(i, isChecked)
}
}
private fun updateCheckBoxStatus(view: View, position: Int){
val viewHolder = view.tag as MediaAdapter.ViewHolder
viewHolder.checkedBox.toggle()
mGridView.setItemChecked(position, viewHolder.checkedBox.isChecked)
mItemCheckedArray.put(position, viewHolder.checkedBox.isChecked)
if (viewHolder.checkedBox.isChecked){
mCheckedDataList.add(mDataList[position])
}else{
mCheckedDataList.remove(mDataList[position])
}
mItemAdapter.notifyDataSetChanged()
mCheckedNumber = mCheckedDataList.size
mModel.setNumber(mCheckedNumber)
}
private fun selectAll(){
mCheckedDataList.clear()
mCheckedNumber = if (mIsCheckClick){
setStateCheckedMap( true)
mCheckedDataList.addAll(mDataList)
mCheckedDataList.size
}else{
setStateCheckedMap( false)
0
}
mModel.setNumber(mCheckedNumber)
mItemAdapter.notifyDataSetChanged()
}
override fun onBackPressed() {
mItemAdapter.notifyDataSetChanged()
if (isClickEditBtn){
cancelBtn()
}else{
super.onBackPressed()
}
}
private fun cancelBtn() {
mQuitBtn.visibility = View.VISIBLE
mEditBtn.visibility = View.VISIBLE
mSelectBar.visibility = View.GONE
mDeleteBtn.visibility = View.GONE
mCancelBtn.visibility = View.GONE
isClickEditBtn = false
mItemAdapter.notifyDataSetChanged()
}
}
\ No newline at end of file
package com.test.mydemo3.activity
import android.os.Bundle
import android.util.Log
import android.util.SparseBooleanArray
import android.view.View
import android.widget.LinearLayout
import android.widget.ListView
import android.widget.TextView
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.isVisible
import com.test.mydemo3.R
import com.test.mydemo3.adapter.FilesItemViewAdapter
import com.test.mydemo3.base.BaseActivity
import com.test.mydemo3.fragment.InternalStorageFragment
import com.test.mydemo3.model.FileBean
import com.test.mydemo3.util.FileUtil
class MoveOrCopyActivity : ComponentActivity() {
var mListView: ListView? = null
var mItemAdapter: FilesItemViewAdapter? = null
var mCurrentBean: FileBean? = null
var mItemDatas: ArrayList<FileBean>? = null
var mFilesItemLists = ArrayList<ArrayList<FileBean>>()
lateinit var mCurrantFilePathTv: TextView
lateinit var mNotFileFoundLayout: View
var mCurrentBeans = ArrayList<FileBean>()
var mCheckedItems = ArrayList<FileBean>()
var mOperate = ""
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_move_or_copy)
initView()
setTitle("$mOperate To..")
setViewOnClickListener()
setAdapter()
}
private fun setViewOnClickListener() {
findViewById<View>(R.id.btn_quit).setOnClickListener {
if(backQuit()) finish()
}
findViewById<View>(R.id.btn_cancel_bottom).setOnClickListener(View.OnClickListener {
finish()
})
findViewById<View>(R.id.btn_move_bottom).setOnClickListener(View.OnClickListener {
var moveFile = if (mCurrentBean != null) {
FileUtil.moveFile(mCheckedItems[0].filePath, mCurrentBean!!.filePath)
} else {
FileUtil.moveFile(mCheckedItems[0].filePath, FileUtil.EXTERNAL_STORAGE)
}
if (moveFile) {
Toast.makeText(this, "move success!", Toast.LENGTH_LONG).show()
} else {
Toast.makeText(this, "move failed!", Toast.LENGTH_LONG).show()
}
finish()
})
findViewById<View>(R.id.btn_copy_bottom).setOnClickListener(View.OnClickListener {
var moveFile = if (mCurrentBean != null) {
FileUtil.copyFile(mCheckedItems[0].filePath, mCurrentBean!!.filePath)
} else {
FileUtil.copyFile(mCheckedItems[0].filePath, FileUtil.EXTERNAL_STORAGE)
}
if (moveFile) {
Toast.makeText(this, "copy success!", Toast.LENGTH_LONG).show()
} else {
Toast.makeText(this, "copy failed!", Toast.LENGTH_LONG).show()
}
finish()
})
}
private fun initView() {
mItemDatas = InternalStorageFragment.mFileDataBean
mCheckedItems = intent.getSerializableExtra("checkedItemBeans") as ArrayList<FileBean>
mOperate = intent.getStringExtra("operate").toString()
mListView = findViewById(R.id.files_item_listview)
mCurrantFilePathTv = findViewById(R.id.current_file_path)
mNotFileFoundLayout = findViewById(R.id.not_file_found_layout)
findViewById<View>(R.id.btn_share).visibility = View.GONE
findViewById<View>(R.id.btn_new).visibility = View.GONE
findViewById<View>(R.id.btn_edit).visibility = View.GONE
findViewById<View>(R.id.btn_cancel).visibility = View.GONE
findViewById<View>(R.id.btn_quit).visibility = View.VISIBLE
findViewById<View>(R.id.bottom_btn_group).visibility = View.VISIBLE
findViewById<View>(R.id.btn_rename_bottom).visibility = View.GONE
findViewById<View>(R.id.btn_copy_bottom).visibility =
if (mOperate.equals("copy")) View.VISIBLE else View.GONE
findViewById<View>(R.id.btn_move_bottom).visibility =
if (mOperate.equals("move")) View.VISIBLE else View.GONE
findViewById<View>(R.id.btn_delete_bottom).visibility = View.GONE
findViewById<View>(R.id.btn_cancel_bottom).visibility = View.VISIBLE
}
fun setAdapter(){
if (mItemDatas?.size!! > 0){
mNotFileFoundLayout.visibility = View.GONE
mListView?.visibility = View.VISIBLE
}
val sparseBooleanArray = SparseBooleanArray()
mItemAdapter = FilesItemViewAdapter(mItemDatas!!, this, sparseBooleanArray)
mListView?.adapter = mItemAdapter
mItemAdapter?.setEditClickState(false)
setOnListViewItemClickListener()
}
fun setOnListViewItemClickListener(){
findViewById<ListView>(R.id.files_item_listview).setOnItemClickListener { parent, view, position, id ->
mCurrentBean = mItemDatas?.get(position)
if (!mCurrentBean?.fileType.equals("dir")){
return@setOnItemClickListener
}
mFilesItemLists.add(mItemDatas!!)
mCurrentBeans.add(mCurrentBean!!)
mCurrantFilePathTv.text = "Internal Storage/ ${mCurrentBean?.fileName}"
if (mCurrentBean?.fileType.equals("dir") && mCurrentBean?.childList?.size!! > 0){
Thread(Runnable {
runOnUiThread {
mItemDatas = mCurrentBean!!.childList
val fileListSort = FileUtil.fileListSort(mItemDatas!!)
mItemAdapter?.setData(fileListSort)
}
}).start()
}else if(mCurrentBean?.fileType.equals("dir") && mCurrentBean?.childList?.size == 0){
mListView?.visibility = View.GONE
mNotFileFoundLayout.visibility = View.VISIBLE
}
}
}
override fun onDestroy() {
if(backQuit()) finish()
mItemAdapter?.setEditClickState(true)
super.onDestroy()
// BaseActivity.isClickEditBtn = true
}
fun backQuit(): Boolean{
val size = mFilesItemLists.size
if (size-1 == 0){
mCurrantFilePathTv.text = "Internal Storage/"
}
if (size < 1){
if (mNotFileFoundLayout.isVisible && mItemDatas?.size!! > 0){
mListView?.visibility = View.VISIBLE
mNotFileFoundLayout.visibility = View.GONE
mItemAdapter?.setData(mItemDatas!!)
return false
}
mCurrentBeans.clear()
return true
}else{
mItemAdapter?.setData(mFilesItemLists[size-1])
mItemDatas = mFilesItemLists[size-1]
mListView?.visibility = View.VISIBLE
mNotFileFoundLayout.visibility = View.GONE
mFilesItemLists.remove(mFilesItemLists[size-1])
mCurrentBeans.remove(mCurrentBeans[size-1])
if (size - 1 > 0){
mCurrentBean = mCurrentBeans[size-2]
mCurrantFilePathTv.text = "Internal Storage/ ${mCurrentBean?.fileName}"
}else{
mCurrantFilePathTv.text = "Internal Storage/"
}
return false
}
}
override fun onBackPressed() {
if (backQuit()){
super.onBackPressed()
}
}
}
\ No newline at end of file
package com.test.mydemo3.activity
import android.os.Bundle
import android.util.Log
import android.util.SparseBooleanArray
import android.view.View
import android.widget.ListView
import com.kongzue.dialogx.dialogs.WaitDialog
import com.test.mydemo3.R
import com.test.mydemo3.adapter.FilesItemViewAdapter
import com.test.mydemo3.base.BaseActivity
import com.test.mydemo3.model.FileBean
import com.test.mydemo3.model.FilesItemBean
import com.test.mydemo3.util.FileUtil
class ScanEmptyFilesActivity : BaseActivity() {
private lateinit var mFilesItemListView: ListView
companion object{
private var mFileItemList = ArrayList<FileBean>()
}
override fun getLayout(): Int {
return R.layout.activity_scan_empt_layout
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
super.setTitle("Scan Empty Files")
mInitView()
}
fun mInitView(){
mFilesItemListView = findViewById<ListView>(R.id.files_item_listview)
isCurrantTvShow(false)
isNewShow(false)
setOnClickBtn()
getFileDatas()
}
private fun getFileDatas() {
if (mFileItemList.size == 0) {
WaitDialog.show("Please Wait..")
Thread(Runnable {
FileUtil.scanEmptyFiles(FileUtil.EXTERNAL_STORAGE, mFileItemList)
runOnUiThread {
setAdapter(mFilesItemListView, mFileItemList)
WaitDialog.dismiss()
}
}).start()
} else {
setAdapter(mFilesItemListView, mFileItemList)
}
}
}
\ No newline at end of file
package com.test.mydemo3.activity
import android.net.Uri
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.provider.MediaStore
import android.util.Log
import android.util.SparseBooleanArray
import android.view.View
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.ListView
import android.widget.Toast
import com.airbnb.lottie.utils.Utils
import com.kongzue.dialogx.dialogs.WaitDialog
import com.test.mydemo3.R
import com.test.mydemo3.base.BaseActivity
import com.test.mydemo3.model.FileBean
import com.test.mydemo3.model.FilesItemBean
import com.test.mydemo3.util.FileUtil
import java.io.File
class ScanLargeFilesActivity : BaseActivity() {
private lateinit var mFilesItemListView: ListView
private var mFileItemList = ArrayList<FileBean>()
override fun getLayout(): Int {
return R.layout.activity_scan_large_files
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setTitle("Scan Large Files")
isNewShow(false)
mInitView()
}
fun mInitView(){
mFilesItemListView = findViewById<ListView>(R.id.files_item_listview)
WaitDialog.show("Please Wait!")
Thread(Runnable {
mFileItemList = FileUtil.search10MFiles(this, 10 * 1024 * 1024)
runOnUiThread {
setAdapter(mFilesItemListView, mFileItemList)
WaitDialog.dismiss()
}
}).start()
setOnClickBtn()
}
override fun onBackPressed() {
WaitDialog.dismiss()
super.onBackPressed()
isNewShow(false)
}
}
\ No newline at end of file
package com.test.mydemo3.activity
import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.ImageView
import android.widget.ListView
import android.widget.TextView
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.isVisible
import com.test.mydemo3.R
import com.test.mydemo3.adapter.ScanResultAdapter
import com.test.mydemo3.view.CustomDialog
import com.trustlook.sdk.data.AppInfo
class ScanResultActivity : AppCompatActivity() {
private var mResult: ArrayList<AppInfo>? = null
private lateinit var mListView: ListView
private lateinit var mAppinfoPage: View
private lateinit var mDeleteGroupView: View
private lateinit var mGoItBtn: TextView
private lateinit var mScanResultListLyout: View
private var mScanResultAdapter: ScanResultAdapter? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_scan_result)
mResult = intent.getSerializableExtra("result") as ArrayList<AppInfo>
findViewById<TextView>(R.id.scan_result_secure_num_text).text = intent.getStringExtra("total")
initView()
setViewClickListener()
}
private fun setViewClickListener() {
mListView.setOnItemClickListener { parent, view, position, id ->
// Intent(this, )
val appIcon = findViewById<ImageView>(R.id.scan_app_info_icon)
val appName = findViewById<TextView>(R.id.scan_app_info_name)
val appDate = findViewById<TextView>(R.id.scan_app_info_date)
appName.text = mResult!![position].appName
// mResult!![position]
mAppinfoPage.visibility = View.VISIBLE
mDeleteGroupView.visibility = View.VISIBLE
mScanResultListLyout.visibility = View.GONE
mGoItBtn.visibility = View.GONE
}
findViewById<View>(R.id.scan_delete_yes).setOnClickListener {
val customDialog = CustomDialog(this)
customDialog.setsCancel(View.OnClickListener {
customDialog.dismiss()
}).setsConfirm(View.OnClickListener {
}).show()
customDialog.isShowEditText(false)
customDialog.setsTitle("Delete")
customDialog.setsHint("Do you want to uninstall this app?")
customDialog.setsRightDelete("Delete")
}
findViewById<View>(R.id.scan_delete_ignore).setOnClickListener {
}
}
private fun initView() {
mListView = findViewById(R.id.scan_result_list)
mAppinfoPage = findViewById(R.id.app_info_page_layout)
mDeleteGroupView = findViewById(R.id.scan_result_delete_group_layout)
mGoItBtn = findViewById(R.id.scan_result_go_it_text)
mScanResultListLyout = findViewById(R.id.scan_result_list_layout)
mScanResultAdapter = ScanResultAdapter(mResult!!, this)
mListView.adapter = mScanResultAdapter
}
override fun onBackPressed() {
if (mAppinfoPage.isVisible){
mAppinfoPage.visibility = View.GONE
mDeleteGroupView.visibility = View.GONE
mGoItBtn.visibility = View.VISIBLE
mScanResultListLyout.visibility = View.VISIBLE
}else{
super.onBackPressed()
}
}
}
\ No newline at end of file
package com.test.mydemo3.activity
import android.os.Bundle
import android.view.View
import android.view.View.OnClickListener
import android.widget.CheckBox
import android.widget.ImageView
import android.widget.ListView
import android.widget.RelativeLayout
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.RecyclerView
import com.cloud.cleanjunksdk.similar.PicSimilarInfo
import com.cloud.cleanjunksdk.task.JunkScanCallback
import com.cloud.cleanjunksdk.task.SimilarScanCallBack
import com.test.mydemo3.MyApplication
import com.test.mydemo3.R
import com.test.mydemo3.adapter.ImageItemAdapter
import com.test.mydemo3.adapter.SimilarBeanAdapter
import com.test.mydemo3.base.BaseActivity
import com.test.mydemo3.model.FileBean
import java.io.File
class SimilarImagesActivity : AppCompatActivity(), OnClickListener{
private lateinit var mTitleText: TextView
private lateinit var mShareBtn: ImageView
private lateinit var mDeleteBtn: ImageView
private lateinit var mNewBtn: ImageView
private lateinit var mCancelBtn: ImageView
private lateinit var mQuitBtn: ImageView
private lateinit var mEditBtn: ImageView
private lateinit var mBottomBar: View
private lateinit var mSelectNumText: TextView
private lateinit var mCheckItemSelectAllBtn: CheckBox
private lateinit var mSwitchSelectView: RelativeLayout
private lateinit var mStartAnimation: View
private lateinit var mListView: ListView
private lateinit var mRecycleView: RecyclerView
private lateinit var mFileCheckedItemList: ArrayList<String>
private var mImageItemAdapter: ImageItemAdapter? = null
private var mSimilarBeanAdapter: SimilarBeanAdapter? = null
private var mDataBeans = ArrayList<ArrayList<FileBean>>()
private var mSimilarDatas = ArrayList<PicSimilarInfo>()
companion object{
var isClickEditBtn: Boolean = false
var switchNumber: Int = 0
var isClickCheckBoxAllBtn: Boolean = false
lateinit var mBaseViewModel : BaseActivityViewModel
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_duplicate_images)
initView()
findViewById<View>(R.id.current_file_path).visibility = View.GONE
}
private fun initView() {
mTitleText = findViewById(R.id.title_bar_text)
mShareBtn = findViewById(R.id.btn_share)
mDeleteBtn = findViewById(R.id.btn_delete)
mNewBtn = findViewById(R.id.btn_new)
mCancelBtn = findViewById(R.id.btn_cancel)
mQuitBtn = findViewById(R.id.btn_quit)
mEditBtn = findViewById(R.id.btn_edit)
mBottomBar = findViewById(R.id.bottom_btn_group)
mSwitchSelectView = findViewById(R.id.switch_and_select_layout)
mSelectNumText = findViewById(R.id.select_num)
mCheckItemSelectAllBtn = findViewById(R.id.checkbox_item_all)
mStartAnimation = findViewById(R.id.similar_start_animation)
mCancelBtn.setOnClickListener(this)
mQuitBtn.setOnClickListener(this)
mEditBtn.setOnClickListener(this)
mCheckItemSelectAllBtn.setOnClickListener(this)
mListView = findViewById(R.id.files_item_listview)
mRecycleView = findViewById(R.id.recy_cler_v)
mSimilarBeanAdapter = SimilarBeanAdapter(this)
mRecycleView.adapter = mSimilarBeanAdapter
// mImageItemAdapter = ImageItemAdapter(this, mDataBeans )
// mListView.adapter = mImageItemAdapter
startDuplicateImages()
mBaseViewModel = ViewModelProvider(this)[BaseActivityViewModel::class.java]
mBaseViewModel.setNumber(0)
mBaseViewModel.myInt.observe(this, Observer {
mSelectNumText.text = String.format(getString(R.string.select_0, BaseActivity.switchNumber.toString()))
})
}
private fun startDuplicateImages() {
Thread(Runnable {
MyApplication.mCleanSdk?.startSimilarScan(object : SimilarScanCallBack {
override fun onSmilarleError(p0: Int) {
println("error : $p0")
runOnUiThread {
mStartAnimation.visibility = View.GONE
}
}
override fun onSmilarEmitOne(p0: PicSimilarInfo?) {
var listPath = ArrayList<FileBean>()
// for (i in p0?.getmList()!!) {
// val fileBean = FileBean()
// fileBean.filePath = i.path
// listPath.add(fileBean)
// }
// mDataBeans.add(listPath)
mSimilarDatas.add(p0!!)
}
override fun onSmilarScanFinish() {
runOnUiThread {
mStartAnimation.visibility = View.GONE
mEditBtn.visibility = View.VISIBLE
// if (mDataBeans.size == 0) {
if (mSimilarDatas.size == 0) {
findViewById<View>(R.id.not_file_found_layout).visibility = View.VISIBLE
}else{
// mImageItemAdapter?.setData(mDataBeans)
mSimilarBeanAdapter?.setData(mSimilarDatas)
}
}
}
}, 15)
}).start()
}
override fun onClick(v: View?) {
when(v?.id){
R.id.btn_cancel ->{
cancel()
}
R.id.btn_quit ->{
finish()
}
R.id.btn_new ->{
// createNewDir()
}
R.id.btn_edit ->{
mNewBtn.visibility = View.GONE
mQuitBtn.visibility = View.GONE
mEditBtn.visibility =View.GONE
mDeleteBtn.visibility = View.VISIBLE
mCancelBtn.visibility = View.VISIBLE
// mShareBtn.visibility = View.VISIBLE
// mBottomBar.visibility = View.VISIBLE
mSwitchSelectView.visibility = View.VISIBLE
isClickEditBtn = true
}
R.id.btn_delete ->{
val customDialog = com.test.mydemo3.view.CustomDialog(this)
customDialog.setsCancel(View.OnClickListener {
customDialog.dismiss()
}).setsConfirm(View.OnClickListener {
for (fileBean in mImageItemAdapter?.mCheckedLists!!){
MyApplication.mCleanSdk?.delete(File(fileBean.filePath))
}
startDuplicateImages()
}).show()
customDialog.isShowEditText(false)
customDialog.setsTitle("Delete")
customDialog.setsHint("Are you sure you want to delete ${mImageItemAdapter?.mCheckedLists!!.size} item?")
}
R.id.checkbox_item_all ->{
isClickCheckBoxAllBtn = !isClickCheckBoxAllBtn
mCheckItemSelectAllBtn.isChecked = isClickCheckBoxAllBtn
// mImageItemAdapter?.selectAll(isClickCheckBoxAllBtn)
mSimilarBeanAdapter?.selectAll(isClickCheckBoxAllBtn)
}
}
}
fun cancel(){
// setStateCheckedMap(false)
mNewBtn.visibility = View.VISIBLE
mQuitBtn.visibility = View.VISIBLE
mEditBtn.visibility =View.VISIBLE
mCancelBtn.visibility = View.GONE
mDeleteBtn.visibility = View.GONE
mShareBtn.visibility = View.GONE
mBottomBar.visibility = View.GONE
mNewBtn.visibility = View.GONE
mSwitchSelectView.visibility = View.GONE
isClickEditBtn = false
switchNumber = 0
// if (mFileAdapter != null){
// mFileAdapter.notifyDataSetChanged()
// }
}
}
\ No newline at end of file
//package com.test.mydemo3.adapter
//
//import android.view.View
//import android.view.ViewGroup
//import androidx.recyclerview.widget.RecyclerView
//import androidx.recyclerview.widget.RecyclerView.ViewHolder
//import com.test.mydemo3.model.FileBean
//
//class FileSimilarAdapter<T : ViewHolder?>() : RecyclerView.Adapter<T>(){
//
// val fileList = arrayListOf<FileBean>()
// private var firstRefresh = true
//
// fun setData(data: List<FileBean>) {
// fileList.clear()
// fileList.addAll(data)
//// notifyDataSetChanged()
// }
//
// fun addData(data: List<FileBean>) {
// fileList.addAll(data)
//// notifyDataSetChanged()
// }
//
//
// fun clearData() {
// if (fileList.size == 0) return
// fileList.clear()
//// notifyDataSetChanged()
// }
//
//// @SuppressLint("NotifyDataSetChanged")
// fun removeData(data: List<FileBean>) {
// data.forEach {
// val index = fileList.indexOf(it)
// if (index != -1) {
// fileList.removeAt(index)
//// notifyItemRemoved(index)
// }
// }
// }
//
//// override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): T & Any {
////
////
//// }
//
// override fun getItemCount(): Int {
// return fileList.size
// }
//
// override fun onBindViewHolder(holder: T & Any, position: Int) {
// return
// }
//
//
//}
\ No newline at end of file
package com.test.mydemo3.adapter
import android.content.Context
import android.util.SparseBooleanArray
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.CheckBox
import android.widget.ImageView
import android.widget.TextView
import com.airbnb.lottie.utils.Utils
import com.test.mydemo3.R
import com.test.mydemo3.base.BaseActivity
import com.test.mydemo3.model.FileBean
import com.test.mydemo3.util.FileUtil
class FilesItemViewAdapter(
mItemFileList: List<FileBean>,mContext: Context,
stateCheckedMap: SparseBooleanArray
): BaseAdapter() {
private var mFileBeanList: List<FileBean>
private var mInflater: LayoutInflater
private var mContext: Context
private var mStateCheckedMap: SparseBooleanArray
private var isEditBtnClick = false
private var isFileShow = true
init {
this.mFileBeanList = mItemFileList
this.mContext = mContext
this.mInflater = LayoutInflater.from(mContext)
this.mStateCheckedMap = stateCheckedMap
}
fun setData(fileList: List<FileBean>){
this.mFileBeanList = fileList
this.notifyDataSetChanged()
}
override fun getCount(): Int {
return mFileBeanList.size
}
override fun getItem(position: Int): Any {
return mFileBeanList[position]
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
var viewHolder: ViewHolder? = null
var view : View? = null
if (convertView != null){
view = convertView
viewHolder = view.tag as ViewHolder
}else{
view = mInflater.inflate(R.layout.files_item_layout, null)
viewHolder = ViewHolder()
viewHolder.fileIcon = view.findViewById(R.id.files_item_icon)
viewHolder.fileJoinTo = view.findViewById(R.id.file_join_to_img)
viewHolder.fileName = view.findViewById(R.id.file_item_name)
viewHolder.fileNone = view.findViewById(R.id.file_item_none)
viewHolder.selectSwitch = view.findViewById(R.id.file_select_switch)
view.tag = viewHolder
}
val filesItemBean = mFileBeanList[position]
viewHolder.fileName.text = filesItemBean.fileName
if (filesItemBean.isDir){
viewHolder.fileIcon.setImageResource(R.drawable.ic_files)
viewHolder.fileJoinTo.visibility = if(isEditBtnClick) View.GONE else View.VISIBLE
viewHolder.selectSwitch.visibility = if(isEditBtnClick) View.VISIBLE else View.GONE
val (year, month, day) = FileUtil.getFileCreateTime(filesItemBean.filePath)
viewHolder.fileNone.text = "${filesItemBean.childList.size} item | $month-$day, $year"
}else {
val icon = when(filesItemBean.fileType){
"png","jpg"->{R.drawable.ic_image}
"mp4", "3gp", "avi"->{R.drawable.ic_video}
"mp3","aac","wav"->{R.drawable.ic_audio}
"zip"->{R.drawable.ic_zip}
"apk"->{R.drawable.ic_apk}
"log"->{R.drawable.ic_log_file}
"doc","docm","docx"->{R.drawable.ic_word}
"xlsx", "xlsm", "xlsb", "xltx"->{R.drawable.ic_excel}
"ppt"->{R.drawable.ic_ppt}
"pdf"->{R.drawable.ic_pdf}
"txt"->{R.drawable.ic_txt}
else -> {R.drawable.ic_copy}
}
viewHolder.fileIcon.setImageResource(icon)
viewHolder.fileJoinTo.visibility = View.GONE
viewHolder.selectSwitch.visibility = if(isEditBtnClick) View.VISIBLE else View.GONE
var sizeStr : String = ""
sizeStr = if (filesItemBean.fileSize > 1024 * 1024 * 1024){
"size ${filesItemBean.fileSize / 1024 / 1024 / 1024} GB"
}else if (filesItemBean.fileSize > 1024 * 1024){
"size ${filesItemBean.fileSize / 1024 / 1024} MB"
}else if (filesItemBean.fileSize > 1024){
"size ${filesItemBean.fileSize / 1024} KB"
}else{
"size ${filesItemBean.fileSize} B"
}
viewHolder.fileNone.text = "$sizeStr,type ${filesItemBean.fileType}"
}
viewHolder.selectSwitch.isChecked = mStateCheckedMap[position]
// viewHolder.selectSwitch.visibility =
// if (BaseActivity.isClickEditBtn) View.VISIBLE else View.GONE
// viewHolder.fileJoinTo.visibility =
// if (!BaseActivity.isClickEditBtn) View.VISIBLE else View.GONE
return view!!
}
fun setEditClickState(isClick: Boolean){
this.isEditBtnClick = isClick
}
fun setFileShow(isShow: Boolean){
isFileShow = isShow
}
class ViewHolder{
lateinit var fileIcon: ImageView
lateinit var fileJoinTo: ImageView
lateinit var fileName: TextView
lateinit var fileNone: TextView
lateinit var selectSwitch: CheckBox
}
}
\ No newline at end of file
package com.test.mydemo3.adapter
import androidx.fragment.app.Fragment
import androidx.viewpager2.adapter.FragmentStateAdapter
class HomeViewPagerAdapter() {
}
\ No newline at end of file
package com.test.mydemo3.adapter
import android.content.Context
import android.graphics.BitmapFactory
import android.graphics.drawable.BitmapDrawable
import android.util.Log
import android.util.SparseBooleanArray
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.CheckBox
import android.widget.GridView
import android.widget.ImageView
import android.widget.TextView
import com.cloud.cleanjunksdk.similar.PicSimilarInfo
import com.test.mydemo3.R
import com.test.mydemo3.activity.SimilarImagesActivity
import com.test.mydemo3.model.FileBean
import com.test.mydemo3.util.FileUtil
class ImageItemAdapter(mContext: Context
, mDataList: ArrayList<ArrayList<FileBean>>): BaseAdapter() {
private var mContext: Context
private var mDataList: ArrayList<ArrayList<FileBean>>
private var mInfler: LayoutInflater
private var mItemCheckedArray = ArrayList<SparseBooleanArray>()
private lateinit var mImageViewHolder: ViewHolder
var itemAdapter = ArrayList<ItemAdapter>()
var mCheckedLists = ArrayList<FileBean>()
init {
this.mInfler = LayoutInflater.from(mContext)
this.mContext = mContext
this.mDataList = mDataList
}
override fun getCount(): Int {
Log.e("yanglin", "getCount: mdatalist ${mDataList.size}", )
return mDataList.size
}
override fun getItem(position: Int): Any {
return mDataList[position]
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
var view = convertView
if (convertView != null){
mImageViewHolder = view?.tag as ViewHolder
}else{
mImageViewHolder = ViewHolder()
view = mInfler.inflate(R.layout.image_item_layout, null)
mImageViewHolder.similar = view.findViewById(R.id.similar_image_num_text)
mImageViewHolder.itemGrid = view.findViewById(R.id.image_item_grid)
view.tag = mImageViewHolder
}
if (mItemCheckedArray.size != mDataList.size){
mItemCheckedArray.add(SparseBooleanArray())
// itemAdapter.add(ItemAdapter(mDataList[position], mContext, mItemCheckedArray[position], position))
}
mImageViewHolder.similar.text =
String.format(mContext.getString(R.string.similar, mDataList[position].size.toString()))
val layoutParams = mImageViewHolder.itemGrid.layoutParams
if (itemAdapter[position].count.toFloat() / 4.0 == 1.0){
layoutParams.height = FileUtil.dpToPx(83*(itemAdapter[position].count / 4), mContext)
}else{
layoutParams.height = FileUtil.dpToPx(83*(itemAdapter[position].count / 4 + 1 ), mContext)
}
mImageViewHolder.itemGrid.setOnItemClickListener { itemParent, itemView, itemPosition, itemId ->
if (SimilarImagesActivity.isClickEditBtn){
println("yanglin positioin $position itemPostion $itemPosition")
updateCheckBoxStatus(position, itemView, itemPosition, mImageViewHolder.itemGrid, mDataList[position])
}
}
mImageViewHolder.itemGrid.adapter = itemAdapter[position]
return view!!
}
fun selectAll(isChecked: Boolean){
Log.e("yanglin", "selectAll: $isChecked", )
mCheckedLists.clear()
if (!isChecked){
for (i in 0..< mDataList.size){
mItemCheckedArray[i].clear()
}
}else{
for (i in 0..< mDataList.size){
mCheckedLists.clear()
setStateCheckedMap(i, isChecked)
mCheckedLists.addAll(mDataList[i])
itemAdapter[i].notifyDataSetChanged()
}
}
}
fun setStateCheckedMap(position: Int,isChecked: Boolean){
for(i in mDataList[position].indices){
mItemCheckedArray[position].put(i, isChecked)
mImageViewHolder.itemGrid.setItemChecked(i, isChecked)
}
}
fun updateCheckBoxStatus(position: Int, view: View, itemPosition: Int, lv: GridView, fileBeanList: ArrayList<FileBean>){
val viewHolder = view.tag as ItemAdapter.ViewHolder
viewHolder.checkBox.toggle()
lv.setItemChecked(itemPosition, viewHolder.checkBox.isChecked)
mItemCheckedArray[position].put(itemPosition, viewHolder.checkBox.isChecked)
if (viewHolder.checkBox.isChecked){
mCheckedLists.add(fileBeanList[itemPosition])
}else{
mCheckedLists.remove(fileBeanList[itemPosition])
}
itemAdapter[position].notifyDataSetChanged()
}
fun setData(datas: ArrayList<ArrayList<FileBean>>){
this.mDataList = datas
notifyDataSetChanged()
}
class ViewHolder{
lateinit var similar: TextView
lateinit var itemGrid: GridView
}
class ItemAdapter(list: ArrayList<PicSimilarInfo>, context: Context,
mStateCheckedMap: SparseBooleanArray, mPosition: Int): BaseAdapter(){
private var context: Context
private var dataList: ArrayList<PicSimilarInfo>
private var stateCheckedMap: SparseBooleanArray
private var inflater: LayoutInflater
private var mPosition: Int
init {
this.context = context
this.dataList = list
this.stateCheckedMap = mStateCheckedMap
this.inflater = LayoutInflater.from(context)
this.mPosition = mPosition
}
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
val itemHolder: ViewHolder
if (convertView != null){
itemHolder = view?.tag as ViewHolder
}else{
view = inflater.inflate(R.layout.item_layout, null)
itemHolder = ViewHolder()
itemHolder.imageView = view.findViewById(R.id.item_image)
itemHolder.checkBox = view.findViewById(R.id.check_item_image_switch)
view.tag = itemHolder
}
// BitmapDrawable(context.resources, BitmapFactory.decodeFile(dataList[position].filePath))
itemHolder.checkBox.visibility = if (SimilarImagesActivity.isClickEditBtn) View.VISIBLE else View.GONE
itemHolder.imageView.setImageDrawable(BitmapDrawable(context.resources, BitmapFactory.decodeFile(dataList[mPosition].getmList()[position].path)))
itemHolder.imageView.layoutParams.height = FileUtil.dpToPx(83, context)
// if (DuplicateImagesActivity.isClickCheckBoxAllBtn){
// itemHolder.checkBox.isChecked = true
// }else{
itemHolder.checkBox.isChecked = stateCheckedMap[position]
// }
return view!!
}
fun setData(datas: ArrayList<PicSimilarInfo>){
this.dataList = datas
}
class ViewHolder{
lateinit var checkBox: CheckBox
lateinit var imageView: ImageView
}
}
}
\ No newline at end of file
package com.test.mydemo3.adapter
import android.content.Context
import android.graphics.BitmapFactory
import android.graphics.drawable.BitmapDrawable
import android.os.Looper
import android.util.SparseBooleanArray
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.CheckBox
import android.widget.ImageView
import com.bumptech.glide.Glide
import com.test.mydemo3.R
import com.test.mydemo3.activity.MediaActivity
import com.test.mydemo3.model.FileBean
import com.test.mydemo3.util.FileUtil
import com.test.mydemo3.util.MediaUtil
import java.util.logging.Handler
class MediaAdapter(
mListData: ArrayList<FileBean>,
mContext: Context,
mStateCheckedMap: SparseBooleanArray,
fileType: String,
mItemHeight: Int
): BaseAdapter() {
private var mListData: ArrayList<FileBean>
private var mContext: Context
private var mInflater: LayoutInflater
private var mStateCheckedMap: SparseBooleanArray
private var mFileType: String
private var mItemHeight: Int = 0
private var dpToPx = 0
init {
this.mListData = mListData
this.mContext = mContext
this.mStateCheckedMap = mStateCheckedMap
this.mInflater = LayoutInflater.from(mContext)
this.mFileType = fileType
this.mItemHeight =mItemHeight
this.dpToPx = FileUtil.dpToPx(mItemHeight, mContext)
}
override fun getCount(): Int {
return mListData.size
}
override fun getItem(position: Int): Any {
return mListData[position]
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
var mViewHolder: ViewHolder
var view:View? = convertView
if (view != null){
mViewHolder = view.tag as ViewHolder
}else{
mViewHolder = ViewHolder()
view = mInflater.inflate(R.layout.item_layout,null)
mViewHolder.image = view.findViewById(R.id.item_image)
mViewHolder.checkedBox = view.findViewById(R.id.check_item_image_switch)
view.tag = mViewHolder
}
if (mFileType.equals("image")){
mViewHolder.image.setImageDrawable(mListData[position].drawable)
mViewHolder.image.layoutParams.height = dpToPx
}else{
mViewHolder.image.setImageResource(R.drawable.ic_video)
mViewHolder.image.layoutParams.height = dpToPx
}
mViewHolder.checkedBox.visibility = if (MediaActivity.isClickEditBtn) View.VISIBLE else View.GONE
mViewHolder.checkedBox.isChecked = mStateCheckedMap[position]
return view!!
}
fun setItemHeight(height: Int){
this.mItemHeight = height
}
fun setData(data: ArrayList<FileBean>) {
this.mListData = data
this.notifyDataSetChanged()
}
class ViewHolder{
lateinit var image: ImageView
lateinit var checkedBox: CheckBox
}
}
\ No newline at end of file
package com.test.mydemo3.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.test.mydemo3.R
import com.trustlook.sdk.data.AppInfo
class ScanResultAdapter(dataList: ArrayList<AppInfo>,
context: Context) : BaseAdapter() {
private var dataList: ArrayList<AppInfo>
private var inflater: LayoutInflater
private var context: Context
init {
this.dataList = dataList
this.context = context
this.inflater = LayoutInflater.from(context)
}
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: View
var viewHolder : ScanResultViewHolder
if (convertView != null){
view = convertView
viewHolder = view.tag as ScanResultViewHolder
}else{
viewHolder = ScanResultViewHolder()
view = inflater.inflate(R.layout.scan_result_list_item_layout, null)
viewHolder.appIcon = view.findViewById(R.id.scan_app_icon)
viewHolder.appName = view.findViewById(R.id.scan_app_name)
viewHolder.appHint = view.findViewById(R.id.scan_app_hint)
view.tag = viewHolder
}
viewHolder.appIcon
viewHolder.appName.text = dataList[position].appName
viewHolder.appHint.text = dataList[position].virusName
return view
}
class ScanResultViewHolder{
lateinit var appIcon: ImageView
lateinit var appName: TextView
lateinit var appHint: TextView
}
}
\ No newline at end of file
package com.test.mydemo3.adapter
import android.content.Context
import android.util.Log
import android.util.SparseBooleanArray
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.GridView
import androidx.recyclerview.widget.RecyclerView
import com.cloud.cleanjunksdk.similar.PicInfo
import com.cloud.cleanjunksdk.similar.PicSimilarInfo
import com.test.mydemo3.R
import com.test.mydemo3.activity.SimilarImagesActivity
import com.test.mydemo3.databinding.ImageItemLayoutBinding
import com.test.mydemo3.util.FileUtil
class SimilarBeanAdapter(context: Context) : RecyclerView.Adapter<SimilarBeanAdapter.AA>() {
private val list = arrayListOf< PicSimilarInfo>()
private var context: Context
var mCheckedLists: MutableList<PicInfo> = mutableListOf<PicInfo>()
private var mItemCheckedArray = ArrayList<SparseBooleanArray>()
val mGridAdapters = ArrayList<SimilarGridAdapter>()
val holders = ArrayList<AA>()
init {
this.context = context
}
fun Int.inflate(parent: ViewGroup, attachToRoot: Boolean = false): View {
return LayoutInflater.from(parent.context).inflate(this, parent, attachToRoot)
}
class AA(view: View) : RecyclerView.ViewHolder(view) {
val binding = ImageItemLayoutBinding.bind(view)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AA {
val root = R.layout.image_item_layout.inflate(parent)
return AA(root)
}
override fun getItemCount(): Int {
return list.size
}
override fun onBindViewHolder(holder: AA, position: Int) {
holders.add(holder)
if (mItemCheckedArray.size != list.size){
mItemCheckedArray.add(SparseBooleanArray())
// itemAdapter.add(ItemAdapter(mDataList[position], mContext, mItemCheckedArray[position], position))
}
mGridAdapters.add(SimilarGridAdapter(list[position].getmList(), context, mItemCheckedArray[position], position))
// val data = list[position]
holder.binding.similarImageNumText.text =
String.format(context.getString(R.string.similar, list[position].getmList().size.toString()))
val layoutParams = holder.binding.imageItemGrid.layoutParams
if (list[position].getmList().size.toFloat() / 4.0 == 1.0){
layoutParams.height = FileUtil.dpToPx(83*(list[position].getmList().size / 4), context)
}else{
layoutParams.height = FileUtil.dpToPx(83*(list[position].getmList().size / 4 + 1 ), context)
}
holder.binding.imageItemGrid.setOnItemClickListener { parent, view, itemPosition, id ->
if (SimilarImagesActivity.isClickEditBtn){
println("yanglin positioin $position itemPostion $itemPosition")
updateCheckBoxStatus(position, view, itemPosition, holder.binding.imageItemGrid, list[position].getmList())
}
}
holder.binding.imageItemGrid.adapter = mGridAdapters[position]
}
fun updateCheckBoxStatus(position: Int, view: View, itemPosition: Int, lv: GridView, fileBeanList: MutableList<PicInfo>){
val viewHolder = view.tag as ImageItemAdapter.ItemAdapter.ViewHolder
viewHolder.checkBox.toggle()
lv.setItemChecked(itemPosition, viewHolder.checkBox.isChecked)
mItemCheckedArray[position].put(itemPosition, viewHolder.checkBox.isChecked)
if (viewHolder.checkBox.isChecked){
mCheckedLists.add(fileBeanList[itemPosition])
}else{
mCheckedLists.remove(fileBeanList[itemPosition])
}
mGridAdapters[position].notifyDataSetChanged()
}
fun setData(data: List<PicSimilarInfo>) {
list.clear()
list.addAll(data)
notifyDataSetChanged()
}
fun selectAll(isChecked: Boolean){
Log.e("yanglin", "selectAll: $isChecked", )
mCheckedLists.clear()
if (!isChecked){
for (i in 0..< list.size){
mItemCheckedArray[i].clear()
}
}else{
for (i in 0..< list.size){
mCheckedLists.clear()
setStateCheckedMap(i, isChecked)
mCheckedLists.addAll(list[i].getmList())
mGridAdapters[i].notifyDataSetChanged()
}
}
}
fun setStateCheckedMap(position: Int, isChecked: Boolean){
for(i in list[position].getmList().indices){
mItemCheckedArray[position].put(i, isChecked)
holders[position].binding.imageItemGrid.setItemChecked(i, isChecked)
}
}
}
\ No newline at end of file
package com.test.mydemo3.adapter
import android.content.Context
import android.graphics.BitmapFactory
import android.graphics.drawable.BitmapDrawable
import android.util.SparseBooleanArray
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.CheckBox
import android.widget.ImageView
import com.cloud.cleanjunksdk.similar.PicInfo
import com.cloud.cleanjunksdk.similar.PicSimilarInfo
import com.test.mydemo3.R
import com.test.mydemo3.activity.SimilarImagesActivity
import com.test.mydemo3.util.FileUtil
class SimilarGridAdapter(
list: MutableList<PicInfo>, context: Context,
mStateCheckedMap: SparseBooleanArray, mPosition: Int): BaseAdapter(){
private var context: Context
private var dataList: MutableList<PicInfo>
private var stateCheckedMap: SparseBooleanArray
private var inflater: LayoutInflater
private var mPosition: Int
init {
this.context = context
this.dataList = list
this.stateCheckedMap = mStateCheckedMap
this.inflater = LayoutInflater.from(context)
this.mPosition = mPosition
}
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
val itemHolder: ViewHolder
if (convertView != null){
itemHolder = view?.tag as ViewHolder
}else{
view = inflater.inflate(R.layout.item_layout, null)
itemHolder = ViewHolder()
itemHolder.imageView = view.findViewById(R.id.item_image)
itemHolder.checkBox = view.findViewById(R.id.check_item_image_switch)
view.tag = itemHolder
}
// BitmapDrawable(context.resources, BitmapFactory.decodeFile(dataList[position].filePath))
itemHolder.checkBox.visibility = if (SimilarImagesActivity.isClickEditBtn) View.VISIBLE else View.GONE
itemHolder.imageView.setImageDrawable(BitmapDrawable(context.resources, BitmapFactory.decodeFile(dataList[position].path)))
itemHolder.imageView.layoutParams.height = FileUtil.dpToPx(83, context)
// if (DuplicateImagesActivity.isClickCheckBoxAllBtn){
// itemHolder.checkBox.isChecked = true
// }else{
itemHolder.checkBox.isChecked = stateCheckedMap[position]
// }
return view!!
}
fun setData(datas: MutableList<PicInfo>){
this.dataList = datas
}
class ViewHolder{
lateinit var checkBox: CheckBox
lateinit var imageView: ImageView
}
}
\ No newline at end of file
package com.test.mydemo3.antivirus
import android.content.Intent
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.util.Log
import android.view.View
import android.widget.ProgressBar
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.test.mydemo3.MyApplication
import com.test.mydemo3.R
import com.test.mydemo3.activity.ScanResultActivity
import com.trustlook.sdk.cloudscan.CloudScanListener
import com.trustlook.sdk.data.AppInfo
class AntivirusActivity : AppCompatActivity() {
private lateinit var mPage1: View
private lateinit var mPage2: View
private lateinit var mPagerCheck: View
private lateinit var mProgress: ProgressBar
private lateinit var mScaningView: View
private lateinit var mScanSuccessView: View
private lateinit var mScanAppNameText: TextView
private var mIntent : Intent? = null
private var mTotal = "22"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_antivirus)
mIntent = Intent(this, ScanResultActivity::class.java)
initView()
setOnclickListener()
}
private fun setOnclickListener() {
findViewById<View>(R.id.interrupt_cancel_text).setOnClickListener {
MyApplication.mCloudScan?.cancelScan()
finish()
}
findViewById<View>(R.id.antivirus_quit_btn).setOnClickListener {
MyApplication.mCloudScan?.cancelScan()
finish()
}
findViewById<View>(R.id.antivirus_quit_btn_2).setOnClickListener {
MyApplication.mCloudScan?.cancelScan()
finish()
}
findViewById<View>(R.id.Start_scanning).setOnClickListener {
startAntivirus()
mPage2.visibility = View.GONE
mPagerCheck.visibility = View.VISIBLE
}
findViewById<View>(R.id.antivirus_stop_text).setOnClickListener {
MyApplication.mCloudScan?.cancelScan()
finish()
}
}
private fun initView() {
mPage1 = findViewById(R.id.antivirus_page_1)
mPage2 = findViewById(R.id.antivirus_page_2)
mPagerCheck = findViewById(R.id.check_the_source_layout)
mProgress = findViewById(R.id.antivirus_progress)
mScaningView = findViewById(R.id.scan_ing_layout)
mScanSuccessView = findViewById(R.id.antivirus_success_layout)
mScanAppNameText = findViewById(R.id.scan_name_text)
}
private fun startAntivirus(){
MyApplication.mCloudScan?.startQuickScan(object : CloudScanListener(){
override fun onScanStarted() {
Log.e("yanglin", "onScanStarted: start", )
}
override fun onScanProgress(curr: Int, total: Int, result: AppInfo?) {
Log.e("yanglin", "onScanProgress, " + "curr=" + curr + " total=" + total + " app name=" +
result?.appName, )
mScanAppNameText.text = result?.appName
mProgress.setProgress(curr)
mTotal = total.toString()
}
override fun onScanError(errCode: Int, p1: String?) {
Log.e("yanglin", "onScanError=" + errCode, )
}
override fun onScanCanceled() {
Log.e("yanglin", "onScanStarted: cancel", )
}
override fun onScanInterrupt() {
Log.e("yanglin", "onScanStarted: onScanInterrupt", )
}
override fun onScanFinished(result: MutableList<AppInfo>?) {
Log.e("yanglin", "onScanFinished: start" + result!![0].toString(), )
mProgress.setProgress(100)
mScaningView.visibility = View.GONE
mScanSuccessView.visibility = View.VISIBLE
val appInfos = ArrayList<AppInfo>()
val bundle = Bundle()
bundle.putSerializable("result", appInfos)
mIntent?.putExtra("total", mTotal)
for (appInfo in result){
appInfos.add(appInfo)
}
Thread(Runnable {
Handler(Looper.getMainLooper()).postDelayed(Runnable {
mIntent?.putExtras(bundle)
startActivity(mIntent)
finish()
}, 2000)
}).start()
}
})
}
}
\ No newline at end of file
package com.test.mydemo3.base
import android.content.Context
import android.util.AttributeSet
import android.view.View
import androidx.activity.ComponentActivity
abstract class BaseAbsView : ComponentActivity(),View.OnClickListener {
override fun onCreateView(name: String, context: Context, attrs: AttributeSet): View? {
return super.onCreateView(name, context, attrs)
}
abstract fun initView()
}
\ No newline at end of file
package com.test.mydemo3.base
interface BaseActivityListener {
fun setTitle(str: String)
fun isDeleteShow(isShow: Boolean)
fun isShareShow(isShow: Boolean)
fun isNewShow(isShow: Boolean)
fun isCancelShow(isShow: Boolean)
fun isQuitShow(isShow: Boolean)
fun isEditShow(isShow: Boolean)
}
\ No newline at end of file
package com.test.mydemo3.fragment
import android.content.Intent
import androidx.fragment.app.viewModels
import android.os.Bundle
import android.util.SparseBooleanArray
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.GridView
import android.widget.LinearLayout
import android.widget.RelativeLayout
import com.test.mydemo3.R
import com.test.mydemo3.activity.FileManagerActivity
import com.test.mydemo3.activity.MediaActivity
import com.test.mydemo3.adapter.MediaAdapter
import com.test.mydemo3.model.FileBean
import com.test.mydemo3.util.FileUtil
import com.test.mydemo3.util.MediaUtil
import com.test.mydemo3.util.PermissionUtil
import com.test.mydemo3.view.CustomDialog
class FileManagerFragment : Fragment(), View.OnClickListener {
private lateinit var mView: View
private lateinit var mImageBtn: View
private lateinit var mVideoBtn: View
private lateinit var mAudioBtn: View
private lateinit var mZipBtn: View
private lateinit var mApkBtn: View
private lateinit var mLogBtn: View
private lateinit var mAllBtn: View
private lateinit var mWordBtn: View
private lateinit var mExcelBtn: View
private lateinit var mPptBtn: View
private lateinit var mPdfBtn: View
private lateinit var mTxtBtn: View
private lateinit var mRecentGrid: GridView
private var mFileBeanList: ArrayList<FileBean>? = null
private var mIntent: Intent? = null
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
mView = inflater.inflate(R.layout.fragment_file_manager, container, false)
initView()
return mView
}
private fun initView() {
mImageBtn = mView.findViewById(R.id.btn_image)
mVideoBtn = mView.findViewById(R.id.btn_video)
mAudioBtn = mView.findViewById(R.id.btn_audio)
mZipBtn = mView.findViewById(R.id.btn_zip)
mApkBtn = mView.findViewById(R.id.btn_apk)
mLogBtn = mView.findViewById(R.id.btn_log_file)
mAllBtn = mView.findViewById(R.id.btn_all)
mWordBtn = mView.findViewById(R.id.btn_word)
mExcelBtn = mView.findViewById(R.id.btn_excel)
mPptBtn = mView.findViewById(R.id.btn_ppt)
mPdfBtn = mView.findViewById(R.id.btn_pdf)
mTxtBtn = mView.findViewById(R.id.btn_txt)
mRecentGrid = mView.findViewById(R.id.recent_file_grid)
mImageBtn.setOnClickListener(this)
mVideoBtn.setOnClickListener(this)
mAudioBtn.setOnClickListener(this)
mZipBtn.setOnClickListener(this)
mApkBtn.setOnClickListener(this)
mLogBtn.setOnClickListener(this)
mAllBtn.setOnClickListener(this)
mWordBtn.setOnClickListener(this)
mExcelBtn.setOnClickListener(this)
mPptBtn.setOnClickListener(this)
mPdfBtn.setOnClickListener(this)
mTxtBtn.setOnClickListener(this)
mIntent = Intent(context, FileManagerActivity::class.java)
mImageBtn.setOnClickListener{
val intent = Intent(context, MediaActivity::class.java)
intent.putExtra("fileType", "image")
context?.startActivity(intent)
}
mVideoBtn.setOnClickListener{
val intent = Intent(context, MediaActivity::class.java)
intent.putExtra("fileType", "video")
context?.startActivity(intent)
}
val recentImages = MediaUtil.getRecentImages(requireContext(), 4)
val sparseBooleanArray = SparseBooleanArray()
val recentAdapter = MediaAdapter(recentImages, requireContext(), sparseBooleanArray, "image", 80)
recentAdapter.setItemHeight(80)
mRecentGrid.adapter = recentAdapter
}
override fun onClick(v: View?) {
if (checkPermission()){
when(v?.id){
R.id.btn_audio->{mIntent?.putExtra("fileType", "audio")}
R.id.btn_zip->{mIntent?.putExtra("fileType", "zip")}
R.id.btn_apk->{mIntent?.putExtra("fileType", "apk")}
R.id.btn_log_file->{mIntent?.putExtra("fileType", "log")}
R.id.btn_all->{mIntent?.putExtra("fileType", "all")}
R.id.btn_word->{mIntent?.putExtra("fileType", "word")}
R.id.btn_excel->{mIntent?.putExtra("fileType", "excel")}
R.id.btn_ppt->{mIntent?.putExtra("fileType", "ppt")}
R.id.btn_pdf->{mIntent?.putExtra("fileType", "pdf")}
R.id.btn_txt->{mIntent?.putExtra("fileType", "txt")}
}
context?.startActivity(mIntent)
}
}
private fun checkPermission(): Boolean {
if (!PermissionUtil.checkGrantedPermission(activity)) {
val customDialog = CustomDialog(context)
customDialog.setsConfirm(View.OnClickListener {
PermissionUtil.requestPermission(context)
customDialog.dismiss()
}).setsCancel(View.OnClickListener {
customDialog.dismiss()
}).show()
customDialog.isShowEditText(false)
customDialog.setsTitle("not permission")
customDialog.setsHint("Please grant file management permissions")
return false
}
return true
}
}
package com.test.mydemo3.fragment
import androidx.lifecycle.ViewModel
class FileManagerViewModel : ViewModel() {
// TODO: Implement the ViewModel
}
\ No newline at end of file
package com.test.mydemo3.fragment
import android.app.ActivityManager
import android.content.Context
import android.content.Intent
import androidx.fragment.app.viewModels
import android.os.Bundle
import android.os.Environment
import android.os.StatFs
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.View.OnClickListener
import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.ProgressBar
import android.widget.TextView
import com.test.mydemo3.R
import com.test.mydemo3.activity.BatteryActivity
import com.test.mydemo3.activity.CleanActivity
import com.test.mydemo3.activity.SimilarImagesActivity
import com.test.mydemo3.activity.ScanEmptyFilesActivity
import com.test.mydemo3.activity.ScanLargeFilesActivity
import com.test.mydemo3.antivirus.AntivirusActivity
import com.test.mydemo3.util.PermissionUtil
import com.test.mydemo3.view.CirclePgBar
import com.test.mydemo3.view.CustomDialog
class HomeFragment : Fragment(), OnClickListener{
private lateinit var mView: View
private lateinit var mScanLargeFiles: LinearLayout
private lateinit var mScanPictureFiles: LinearLayout
private lateinit var mScanEmptyFiles: LinearLayout
private lateinit var mProgressText: TextView
private lateinit var mUseStorageText: TextView
private lateinit var mUseStorageProgress: ProgressBar
private lateinit var mMemoryUseText: TextView
private lateinit var mMemoryUseProgress: ProgressBar
private lateinit var mBatteryInfo: View
private lateinit var mCirclePgBar: CirclePgBar
companion object {
fun newInstance() = HomeFragment()
}
private val viewModel: HomeViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// TODO: Use the ViewModel
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
mView = inflater.inflate(R.layout.fragment_home, container, false)
initView()
return mView
}
private fun initView() {
mScanLargeFiles = mView.findViewById(R.id.scan_large_files)
mScanPictureFiles = mView.findViewById(R.id.scan_for_duplicate_picture)
mScanEmptyFiles = mView.findViewById(R.id.scan_empty_files)
mProgressText = mView.findViewById(R.id.scan_progress_text)
mBatteryInfo = mView.findViewById(R.id.battery_info)
mUseStorageText = mView.findViewById(R.id.use_storage_text)
mMemoryUseText = mView.findViewById(R.id.memory_used_text)
mUseStorageProgress = mView.findViewById(R.id.use_storage_progress)
mMemoryUseProgress = mView.findViewById(R.id.memory_used_progress)
mCirclePgBar = mView.findViewById(R.id.progress_circular)
setUseStorage()
setMemoryUsagePercentage()
mScanPictureFiles.setOnClickListener(this)
mScanLargeFiles.setOnClickListener(this)
mScanEmptyFiles.setOnClickListener(this)
mBatteryInfo.setOnClickListener(this)
mView.findViewById<CirclePgBar>(R.id.progress_circular).setOnClickListener(this)
mView.findViewById<View>(R.id.home_clean_btn).setOnClickListener(this)
mView.findViewById<View>(R.id.antivirus_btn).setOnClickListener (this)
}
override fun onClick(v: View?) {
if (checkPermission()){
when(v?.id){
R.id.scan_for_duplicate_picture ->{
activity?.startActivity(Intent(context, SimilarImagesActivity::class.java))
}
R.id.scan_large_files ->{
activity?.startActivity(Intent(context, ScanLargeFilesActivity::class.java))
}
R.id.scan_empty_files ->{
activity?.startActivity(Intent(context, ScanEmptyFilesActivity::class.java))
}
R.id.home_clean_btn ->{
activity?.startActivity(Intent(context, CleanActivity::class.java))
}
}
if (v?.id == R.id.battery_info){
activity?.startActivity(Intent(context, BatteryActivity::class.java))
}else if (v?.id == R.id.antivirus_btn){
activity?.startActivity(Intent(context, AntivirusActivity::class.java))
}
}
}
private fun checkPermission(): Boolean {
if (!PermissionUtil.checkGrantedPermission(activity)) {
val customDialog = CustomDialog(context)
customDialog.setsConfirm(OnClickListener {
PermissionUtil.requestPermission(context)
customDialog.dismiss()
}).setsCancel(OnClickListener {
customDialog.dismiss()
}).show()
customDialog.isShowEditText(false)
customDialog.setsTitle("not permission")
customDialog.setsHint("Please grant file management permissions")
return false
}
return true
}
fun setUseStorage(){
val storageDirectory = Environment.getExternalStorageDirectory()
val statFs = StatFs(storageDirectory.path)
val totalBytes = (statFs.totalBytes / 1024 / 1024).toInt()
val freeSpase = (statFs.availableBytes / 1024 /1024).toInt()
val used = totalBytes - freeSpase
val sdUsed = ((used.toFloat() / totalBytes.toFloat()) * 100.0)
mUseStorageText.text = String.format("%.1f", sdUsed)
mUseStorageProgress.progress = sdUsed.toInt()
mProgressText.text = String.format("%.1f", sdUsed)
mCirclePgBar.setTargetProgress(sdUsed.toInt())
}
fun setMemoryUsagePercentage(){
val activityManager = context?.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
Thread(Runnable {
while (true){
val memoryInfo = ActivityManager.MemoryInfo()
activityManager.getMemoryInfo(memoryInfo)
// 获取系统总内存
val totalMemory = memoryInfo.totalMem
// 获取系统剩余内存
val availableMemory = memoryInfo.availMem
// 获取系统已用内存
val usedMemory = totalMemory - availableMemory
// 计算内存占用率
val memoryUsagePercentage = (usedMemory.toFloat() / totalMemory.toFloat()) * 100
activity?.runOnUiThread {
mMemoryUseText.text = String.format("%.1f", memoryUsagePercentage)
mMemoryUseProgress.progress = (memoryUsagePercentage).toInt()
}
Thread.sleep(1000)
}
}).start()
}
}
\ No newline at end of file
package com.test.mydemo3.fragment
import androidx.lifecycle.ViewModel
class HomeViewModel : ViewModel() {
// TODO: Implement the ViewModel
}
\ No newline at end of file
package com.test.mydemo3.model
data class GlobalConfig(
val cacheTime: Int,
val rateWindowInterval: Int,
val buyInsertInterval: Int,
val natureInsertInterval: Int,
val notDialogInterval: Int
)
data class PushManagement(
val pushShow: Int,
val newUserAvoidTime: Int,
val allPushInterval: Int,
val oPushInterval: Int,
val pushCircleOrder: List<Int>,
val scenePush: List<Int>
)
data class AdsCfg(
val adOpen: AdInfo,
val adInsertBattery: AdInfo
)
data class AdInfo(
val isShow: Boolean,
val showInterval: Int,
val newUserAvoidTime: Int,
val unitId: String,
val type: String,
val openAdIsShow: Int,
val loadingPageTime: Int
)
data class PushCfg(
val batteryPush: PushInfo,
val batteryLowBoost: PushInfo
)
data class PushInfo(
val pushStayTime: Int,
val lastUseInterval: Int,
val featureEx1: Int,
val pushInterval: Int
)
data class Result(
val data: Data
)
data class Data(
val globalConfig: GlobalConfig,
val pushManagement: PushManagement,
val adsCfg: AdsCfg,
val pushCfg: PushCfg
)
data class AdConfigData(
val status: Int,
val msg: String,
val sign: String,
val result: Result,
val extras: Any?,
val enc: Any?,
val security: String
)
package com.test.mydemo3.model
import java.io.Serializable
class CleanBean: Serializable {
lateinit var typeName: String
var isListViewShow = false
var fileBeans = ArrayList<FileBean>()
}
\ No newline at end of file
package com.test.mydemo3.model
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import java.io.Serializable
class FileBean : Serializable{
var fileName: String = ""
var filePath: String = ""
var hint: String? = null
var isDir: Boolean = false
var drawable : Drawable? = null
var fileType: String = ""
var fileSize: Long = 0
var fileBitmap: Bitmap? = null
var childList = ArrayList<FileBean>()
override fun toString(): String {
return "FileBean(fileName='$fileName', filePath='$filePath', isDir=$isDir, fileType='$fileType', childList=${childList.toString()})"
}
}
\ No newline at end of file
package com.test.mydemo3.model
class FilesItemBean{
var resId: Int = 0
lateinit var mItemFileName: String
lateinit var mItemFileNone: String
var mItemSelectChecked: Boolean = false
lateinit var mItemFilePath: String
var mFileItemCount: Int = 0
var mFileSize: Int = 0
var mFileType: Int = 0 // type 1 empty, 2 ..., 3 ...
}
\ No newline at end of file
package com.test.mydemo3.util
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import java.util.Objects
object BatteryUtil {
lateinit var technology : String
var voltage: Int = 0 //瓦特
var level: Int = 0 //电量
var temperature: Double = 0.0 //温度
lateinit var status : String
lateinit var health : String
lateinit var plugged : String
/**
* 获取电池容量
* */
/*fun getBatteryCapacity(context: Context): String{
val mPowerProfile : Objects
var batteryCapacity = 0.0
val POWER_PROFILE_CLASS = "com.android.internal.os.PowerProfile"
try {
mPowerProfile = Class.forName(POWER_PROFILE_CLASS)
.getConstructor(Context::class.java)
.newInstance(context) as Objects
batteryCapacity = Class
.forName(POWER_PROFILE_CLASS)
.getMethod("getBatteryCapacity")
.invoke(mPowerProfile) as Double
}catch (e: Exception){
e.printStackTrace()
}
return batteryCapacity.toString()
}*/
fun ReceiverBatteryOhterInfo(context: Context){
val intentFilter = IntentFilter(Intent.ACTION_BATTERY_CHANGED)
val receiver = context.registerReceiver(null, intentFilter)
technology = receiver?.getStringExtra("technology").toString()
if (technology.equals("") || technology.equals(null)){
technology = "Unknown"
}
voltage = receiver?.getIntExtra("voltage",0) as Int
level = receiver.getIntExtra("level", 0) as Int
temperature = receiver.getIntExtra("temperature", 0 ) / 10.0
}
}
\ No newline at end of file
This diff is collapsed.
package com.test.mydemo3.util
import com.google.gson.Gson
import com.test.mydemo3.model.AdConfigData
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
object HttpRequest {
fun getMaxAdConfig(){
Thread(Runnable {
val okHttpClient = OkHttpClient()
val request = Request.Builder()
.url(UrlManager.URL_)
.build()
val response = okHttpClient.newCall(request).execute()
if (response.isSuccessful){
Gson().fromJson(response.body().toString(), AdConfigData::class.java)
}
}).start()
}
}
\ No newline at end of file
package com.test.mydemo3.util
import android.annotation.SuppressLint
import android.content.ContentResolver
import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.provider.MediaStore
import android.util.TypedValue
import com.test.mydemo3.model.FileBean
import java.io.File
object MediaUtil {
fun cropImage(imagePath: String, desiredWidth: Int, desiredHeight: Int, context: Context): Bitmap {
val desiredHeight_ = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
desiredHeight.toFloat(),
context.resources.displayMetrics
).toInt()
val desiredWidth_ = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
desiredWidth.toFloat(),
context.resources.displayMetrics
).toInt()
// 从图片路径中加载 Bitmap
val options = BitmapFactory.Options()
options.inJustDecodeBounds = true
BitmapFactory.decodeFile(imagePath, options)
// 计算采样率以便加载图片时节省内存
options.inSampleSize = calculateInSampleSize(options, desiredWidth_, desiredHeight_)
// 加载 Bitmap
options.inJustDecodeBounds = false
val bitmap = BitmapFactory.decodeFile(imagePath, options)
// 裁剪 Bitmap
return Bitmap.createScaledBitmap(bitmap, desiredWidth_, desiredHeight_, false)
}
fun calculateInSampleSize(options: BitmapFactory.Options, desiredWidth: Int, desiredHeight: Int): Int {
val height = options.outHeight
val width = options.outWidth
var inSampleSize = 1
if (height > desiredHeight || width > desiredWidth) {
val halfHeight = height / 2
val halfWidth = width / 2
while ((halfHeight / inSampleSize) >= desiredHeight && (halfWidth / inSampleSize) >= desiredWidth) {
inSampleSize *= 2
}
}
return inSampleSize
}
@SuppressLint("Range")
fun getRecentImages(context: Context, limit: Int): ArrayList<FileBean> {
// val images = mutableListOf<String>()
val images = ArrayList<FileBean>()
val contentResolver: ContentResolver = context.contentResolver
val projection = arrayOf(MediaStore.Images.Media.DATA)
val sortOrder = "${MediaStore.Images.Media.DATE_MODIFIED} DESC"
val cursor = contentResolver.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection,
null,
null,
sortOrder
)
cursor?.use {
var count = 0
while (it.moveToNext() && count < limit) {
val fileBean = FileBean()
val imagePath = it.getString(it.getColumnIndex(MediaStore.Images.Media.DATA))
// images.add(imagePath)
val file = File(imagePath)
fileBean.fileName = file.name
fileBean.filePath = file.absolutePath
fileBean.fileType = FileUtil.getFileType(file)
fileBean.fileBitmap = BitmapFactory.decodeFile(imagePath)
images.add(fileBean)
count++
}
}
cursor?.close()
return images
}
// fun findSimilarImages(baseImagePath: String, imageDirectoryPath: String, threshold: Double): List<String> {
// val similarImages = mutableListOf<String>()
//
// val baseImage = File(baseImagePath)
// val baseImageHash = ImageHash.getHash(baseImage)
//
// val imageDirectory = File(imageDirectoryPath)
// val imageFiles = imageDirectory.listFiles { file -> file.isFile }
//
// imageFiles?.let {
// for (imageFile in it) {
// val imageHash = ImageHash.getHash(imageFile)
// val similarity = ImageHash.getSimilarity(baseImageHash, imageHash)
// if (similarity >= threshold) {
// similarImages.add(imageFile.absolutePath)
// }
// }
// }
//
// return similarImages
// }
}
\ No newline at end of file
package com.test.mydemo3.util
import android.Manifest
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.os.Environment
import android.provider.Settings
import androidx.activity.ComponentActivity
import androidx.activity.result.contract.ActivityResultContract
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.fragment.app.FragmentActivity
import com.permissionx.guolindev.PermissionX
import com.permissionx.guolindev.callback.RequestCallback
import com.test.mydemo3.activity.HomeActivity
import com.test.mydemo3.base.BaseActivity
import java.security.Permissions
object PermissionUtil {
var LOCATION_PERMISSION = false
fun requestPermission(context: Context?){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU){
}else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.R) {
val intent = Intent().apply {
action = Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION
data = Uri.fromParts("package", context?.packageName, null)
flags = Intent.FLAG_ACTIVITY_NEW_TASK
}
context?.startActivity(intent)
}else{
val intent = Intent().apply {
action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
data = Uri.fromParts("package", context?.packageName, null)
}
context?.startActivity(intent)
}
}
fun checkGrantedPermission(activity: ComponentActivity?) : Boolean{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU){
//TODO android 14以上
HomeActivity.isPermission = Environment.isExternalStorageManager()
return HomeActivity.isPermission
}else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.R) {
HomeActivity.isPermission = Environment.isExternalStorageManager()
return HomeActivity.isPermission
}else{
HomeActivity.isPermission = ActivityCompat.checkSelfPermission(activity!!, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
return HomeActivity.isPermission
}
}
fun requestLocationPermission(context: FragmentActivity?){
PermissionX.init(context!!).permissions(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
).request(RequestCallback{ allGranted, grantedList, deniedList ->
if (allGranted){
LOCATION_PERMISSION = true
}else{
LOCATION_PERMISSION = false
}
})
}
}
\ No newline at end of file
package com.test.mydemo3.util
import android.bluetooth.BluetoothAdapter
import android.content.ContentResolver
import android.content.Context
import android.location.LocationManager
import android.net.wifi.WifiManager
import android.provider.Settings
object SystemServerState {
fun isGPSEnabled(context: Context): Boolean {
val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) ?: false
}
fun isBluetoothEnabled(): Boolean {
val bluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
return bluetoothAdapter?.isEnabled ?: false
}
fun isHotspotEnabled(context: Context): Boolean {
val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager
return wifiManager.isWifiEnabled ?: false
}
fun isAutoBrightnessEnabled(contentResolver: ContentResolver?): Boolean {
try {
val mode: Int =
Settings.System.getInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS_MODE)
return mode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC
} catch (e: Settings.SettingNotFoundException) {
e.printStackTrace()
}
return false
}
}
\ No newline at end of file
package com.test.mydemo3.util
object UrlManager {
const val AD_APP_KEY = "GGPreND6SRmCt1zJgn5faiLGD8c2PVGPLgPpSg7cHanVTud1DhtuI9MmteTqlEviaJ57WnxW68kQDaATJ5z3cW"
const val AD_UNIT_ID = ""
const val TEST_PLACEMENT_HERE = ""
const val URL_ = "https://api.magicfolder.xyz/cccfig?pkg=testonline"
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFFFFF"/>
<corners android:radius="10dp"/>
</shape>
\ No newline at end of file
This diff is collapsed.
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#EEF2F5"/>
<corners android:radius="30dp"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#286EFD"/>
<corners android:radius="30dp"/>
</shape>
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#286EFD"/>
<corners android:radius="10dp"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/white"/>
<corners android:radius="10dp"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_switch_yes" android:state_selected="true" />
<item android:drawable="@drawable/ic_switch_yes" android:state_checked="true" />
<item android:drawable="@drawable/ic_switch_yes" android:state_pressed="true" />
<item android:drawable="@drawable/ic_all_switch" />
</selector>
\ 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.
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.
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.
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