Skip to content

Commit

Permalink
Implement hidden files analysis; fixes in billing system
Browse files Browse the repository at this point in the history
  • Loading branch information
VishalNehra committed May 10, 2023
1 parent 075729c commit 12eb93c
Show file tree
Hide file tree
Showing 12 changed files with 250 additions and 90 deletions.
1 change: 1 addition & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,7 @@ dependencies {
implementation 'com.burhanrashid52:photoeditor:2.0.0'
implementation 'com.github.CanHub:Android-Image-Cropper:4.3.1'
api 'com.github.TeamAmaze:mupdf-android-viewer:1.0.25'
implementation "androidx.documentfile:documentfile:1.0.1"

//Detect memory leaks
// debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ import com.amaze.fileutilities.databinding.AudioPlayerDialogActivityBinding
import com.amaze.fileutilities.utilis.PreferencesConstants
import com.amaze.fileutilities.utilis.Utils.Companion.showProcessingDialog
import com.amaze.fileutilities.utilis.getAppCommonSharedPreferences
import com.amaze.fileutilities.utilis.getFileFromUri
import com.amaze.fileutilities.utilis.getDocumentFileFromUri
import com.amaze.fileutilities.utilis.showToastInCenter
import com.google.android.material.slider.Slider
import com.masoudss.lib.WaveformSeekBar
Expand Down Expand Up @@ -114,7 +114,7 @@ class AudioPlayerDialogActivity : PermissionsActivity(), IAudioPlayerInterfaceHa
dialog.show()
} else {
dialog.dismiss()
audioUri.getFileFromUri(this)?.length()?.also {
audioUri.getDocumentFileFromUri(this)?.length()?.also {
if (it > AudioPlayerInterfaceHandlerViewModel.WAVEFORM_THRESHOLD_BYTES) {
viewModel.forceShowSeekbar = true
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import android.content.Context
import android.net.Uri
import android.os.Parcelable
import com.amaze.fileutilities.utilis.BaseIntentModel
import com.amaze.fileutilities.utilis.getFileFromUri
import com.amaze.fileutilities.utilis.getDocumentFileFromUri
import kotlinx.parcelize.Parcelize
import java.io.InputStream

Expand All @@ -42,8 +42,8 @@ data class LocalDocxModel(
}

override fun getName(context: Context): String {
uri.getFileFromUri(context)?.run {
return this.name
uri.getDocumentFileFromUri(context)?.name?.run {
return this
}
uri.path?.run {
return this
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -640,6 +640,19 @@ class AnalyseFragment : AbstractMediaFileInfoOperationsFragment() {
}
}
}

filesViewModel.getHiddenFilesLiveData().observe(viewLifecycleOwner) {
mediaFileInfoList ->
hiddenFilesPreview.invalidateProgress(true, null)
mediaFileInfoList?.let {
hiddenFilesPreview.invalidateProgress(false, null)
hiddenFilesPreview.loadPreviews(mediaFileInfoList) {
cleanButtonClick(it) {
filesViewModel.hiddenFilesLiveData = null
}
}
}
}
if (analyseViewModel.fragmentScrollPosition != null) {
Handler().postDelayed({
analyseScrollView.scrollY = analyseViewModel.fragmentScrollPosition!!
Expand Down Expand Up @@ -988,6 +1001,12 @@ class AnalyseFragment : AbstractMediaFileInfoOperationsFragment() {
this@AnalyseFragment
)
}
hiddenFilesPreview.setOnClickListener {
ReviewImagesFragment.newInstance(
ReviewImagesFragment.TYPE_HIDDEN_FILES,
this@AnalyseFragment
)
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
gamesPreview.setOnClickListener {
shouldCallbackAppUninstall = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ class ReviewImagesFragment : ItemsActionBarFragment() {
const val TYPE_RECENTLY_UPDATED_APPS = 28
const val TYPE_NETWORK_INTENSIVE_APPS = 29
const val TYPE_SIMILAR_IMAGES = 30
const val TYPE_HIDDEN_FILES = 31

fun newInstance(type: Int, fragment: Fragment) {
val analyseFragment = ReviewImagesFragment()
Expand Down Expand Up @@ -648,6 +649,16 @@ class ReviewImagesFragment : ItemsActionBarFragment() {
}
}
}
TYPE_HIDDEN_FILES -> {
filesViewModel.getHiddenFilesLiveData()
.observe(viewLifecycleOwner) { hiddenFiles ->
invalidateProcessing(true, false)
hiddenFiles?.let {
setMediaInfoList(it, false)
invalidateProcessing(false, false)
}
}
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ class FilesViewModel(val applicationContext: Application) :
var recentlyUpdatedAppsLiveData: MutableLiveData<ArrayList<MediaFileInfo>?>? = null
var junkFilesLiveData: MutableLiveData<Pair<ArrayList<MediaFileInfo>, String>?>? = null
var apksLiveData: MutableLiveData<ArrayList<MediaFileInfo>?>? = null
var hiddenFilesLiveData: MutableLiveData<ArrayList<MediaFileInfo>?>? = null
var gamesInstalledLiveData: MutableLiveData<ArrayList<MediaFileInfo>?>? = null
var largeFilesMutableLiveData: MutableLiveData<ArrayList<MediaFileInfo>?>? = null
var whatsappMediaMutableLiveData: MutableLiveData<ArrayList<MediaFileInfo>?>? = null
Expand Down Expand Up @@ -1228,7 +1229,7 @@ class FilesViewModel(val applicationContext: Application) :
)
val usageStats = Utils.getAppsUsageStats(applicationContext, days)
val usageStatsPackages = usageStats.filter {
it.lastTimeUsed != 0L
it.lastTimeUsed != 0L || it.packageName == applicationContext.packageName
}.map {
it.packageName
}.toSet()
Expand Down Expand Up @@ -1367,7 +1368,7 @@ class FilesViewModel(val applicationContext: Application) :
val usageStats = Utils.getAppsUsageStats(applicationContext, days)
val freqMap = linkedMapOf<String, Long>()
usageStats.filter {
it.lastTimeUsed != 0L
it.lastTimeUsed != 0L && it.packageName != applicationContext.packageName
}.forEach {
if (!freqMap.contains(it.packageName)) {
freqMap[it.packageName] = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
Expand Down Expand Up @@ -1609,6 +1610,27 @@ class FilesViewModel(val applicationContext: Application) :
return apksLiveData!!
}

fun getHiddenFilesLiveData(): LiveData<ArrayList<MediaFileInfo>?> {
if (hiddenFilesLiveData == null) {
hiddenFilesLiveData = MutableLiveData()
hiddenFilesLiveData?.value = null
viewModelScope.launch(Dispatchers.IO) {
if (allMediaFilesPair == null) {
allMediaFilesPair = CursorUtils.listAll(applicationContext)
}
allMediaFilesPair?.filter {
it.title.startsWith(".")
}?.sortedBy { -1 * it.longSize }?.map {
it.extraInfo?.mediaType = MediaFileInfo.MEDIA_TYPE_UNKNOWN
it
}?.let {
hiddenFilesLiveData?.postValue(ArrayList(it))
}
}
}
return hiddenFilesLiveData!!
}

fun getLargeFilesLiveData(): LiveData<ArrayList<MediaFileInfo>?> {
if (largeFilesMutableLiveData == null) {
largeFilesMutableLiveData = MutableLiveData()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ import android.widget.TextView
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.content.res.ResourcesCompat
import androidx.core.view.isVisible
import androidx.documentfile.provider.DocumentFile
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.ViewModelProvider
import com.amaze.fileutilities.R
Expand Down Expand Up @@ -113,12 +112,17 @@ class ImageViewerFragment : AbstractMediaFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val quickViewType = requireArguments().getParcelable<LocalImageModel>(VIEW_TYPE_ARGUMENT)
if (quickViewType == null) {
requireContext().showToastInCenter(getString(R.string.operation_failed))
requireActivity().onBackPressed()
return
}
if (activity is ImageViewerDialogActivity) {
_binding?.layoutBottomSheet?.visibility = View.GONE
_binding?.imageView?.setOnClickListener {
val intent = Intent(requireContext(), ImageViewerActivity::class.java)
intent.setDataAndType(quickViewType?.uri, quickViewType?.mimeType)
if (!quickViewType?.uri?.authority.equals(
intent.setDataAndType(quickViewType.uri, quickViewType.mimeType)
if (!quickViewType.uri.authority.equals(
requireContext()
.packageName,
true
Expand All @@ -140,10 +144,11 @@ class ImageViewerFragment : AbstractMediaFragment() {
}
frameLayout.setProxyView(imageView)
customToolbar.root.visibility = View.VISIBLE
customToolbar.title.text = DocumentFile.fromSingleUri(
requireContext(),
quickViewType!!.uri
)?.name ?: quickViewType.uri.getFileFromUri(requireContext())?.name
customToolbar.title.text = quickViewType.uri.getDocumentFileFromUri(
requireContext()
)?.name ?: quickViewType.uri.getFileFromUri(
requireContext()
)?.name
customToolbar.backButton.setOnClickListener {
requireActivity().onBackPressed()
}
Expand All @@ -165,7 +170,7 @@ class ImageViewerFragment : AbstractMediaFragment() {
// viewBinding.metadata.text = result
}
}
quickViewType?.let { showImage(it) }
showImage(quickViewType)
}

private fun setupPropertiesSheet(quickViewType: LocalImageModel) {
Expand Down
42 changes: 22 additions & 20 deletions app/src/main/java/com/amaze/fileutilities/utilis/CursorUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -253,18 +253,20 @@ class CursorUtils {
}
if (dataColumnIdx >= 0) {
val path = cursor.getString(dataColumnIdx)
val f = File(path)
if (d.compareTo(Date(f.lastModified())) != 1 && !f.isDirectory) {
mediaTypeRaw = cursor.getInt(mediaColumnIdxValues.mediaTypeIdx)
val mediaFileInfo = MediaFileInfo.fromFile(
f,
queryMetaInfo(
cursor,
getMediaTypeFromSystemMediaStoreType(mediaTypeRaw),
mediaColumnIdxValues
if (path != null) {
val f = File(path)
if (d.compareTo(Date(f.lastModified())) != 1 && !f.isDirectory) {
mediaTypeRaw = cursor.getInt(mediaColumnIdxValues.mediaTypeIdx)
val mediaFileInfo = MediaFileInfo.fromFile(
f,
queryMetaInfo(
cursor,
getMediaTypeFromSystemMediaStoreType(mediaTypeRaw),
mediaColumnIdxValues
)
)
)
recentFiles.add(mediaFileInfo)
recentFiles.add(mediaFileInfo)
}
}
}
} while (cursor.moveToNext())
Expand Down Expand Up @@ -505,32 +507,32 @@ class CursorUtils {
title = cursor.getString(mediaColumnIdxValues.commonTitleIdx)
}
if (title == null) {
if (file == null) {
if (file == null && path != null) {
file = File(path)
}
title = file.name
title = file?.name
}
} else {
if (file == null) {
if (file == null && path != null) {
file = File(path)
}
title = file.name
title = file?.name
}
if (mediaColumnIdxValues.commonLastModifiedIdx >= 0) {
lastModified = cursor.getLong(mediaColumnIdxValues.commonLastModifiedIdx) * 1000
} else {
if (file == null) {
if (file == null && path != null) {
file = File(path)
}
lastModified = file.lastModified()
lastModified = file?.lastModified()
}
if (mediaColumnIdxValues.commonSizeIdx >= 0) {
size = cursor.getLong(mediaColumnIdxValues.commonSizeIdx)
} else {
if (file == null) {
if (file == null && path != null) {
file = File(path)
}
size = file.length()
size = file?.length()
}
var mediaTypeNew = mediaType
if (mediaColumnIdxValues.mediaTypeIdx >= 0) {
Expand All @@ -540,7 +542,7 @@ class CursorUtils {
return MediaFileInfo.fromFile(
mediaTypeNew,
id ?: -1L,
title, path, lastModified, size,
title ?: "", path, lastModified ?: 0L, size ?: 0L,
context,
queryMetaInfo(cursor, mediaTypeNew, mediaColumnIdxValues)
)
Expand Down
49 changes: 40 additions & 9 deletions app/src/main/java/com/amaze/fileutilities/utilis/Extensions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.FileProvider
import androidx.documentfile.provider.DocumentFile
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.files.FileFilter
import com.afollestad.materialdialogs.files.fileChooser
Expand Down Expand Up @@ -115,6 +116,32 @@ fun Uri.getSiblingUriFiles(filter: (File) -> Boolean): ArrayList<Uri>? {
return null
}

fun Uri.getDocumentFileFromUri(context: Context): DocumentFile? {
if (this == Uri.EMPTY) {
return null
}
try {
val documentFile = DocumentFile.fromSingleUri(
context,
this
)
if (documentFile?.exists() == true) {
return documentFile
}
} catch (e: Exception) {
log.warn("failed to get document file from single uri", e)
}
try {
val treeDocumentFile = DocumentFile.fromTreeUri(context, this)
if (treeDocumentFile?.exists() == true) {
return treeDocumentFile
}
} catch (e: Exception) {
log.warn("failed to get document file from tree uri", e)
}
return null
}

fun Uri.getFileFromUri(context: Context): File? {
if (this == Uri.EMPTY) {
return null
Expand All @@ -135,17 +162,21 @@ fun Uri.getFileFromUri(context: Context): File? {
)
parcelFileDescriptor?.let {
val fileDescriptor: FileDescriptor = parcelFileDescriptor.fileDescriptor
val fis = FileInputStream(fileDescriptor)
val outputFile = File(
context.cacheDir,
getContentName(context.contentResolver) ?: "sharedFile"
)
outputStream = outputFile.outputStream()
outputStream?.let {
fis.copyTo(it)
if (fileDescriptor.valid()) {
val fis = FileInputStream(fileDescriptor)
val outputFile = File(
context.cacheDir,
getContentName(context.contentResolver) ?: "sharedFile"
)
outputStream = outputFile.outputStream()
outputStream?.let {
fis.copyTo(it)
}
songFile = outputFile
}
songFile = outputFile
}
} catch (e: Exception) {
log.warn("failed to find file from uri {}", e)
} finally {
parcelFileDescriptor?.close()
outputStream?.close()
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/com/amaze/fileutilities/utilis/Utils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -1408,7 +1408,7 @@ class Utils {
packageUid
)
} catch (e: RemoteException) {
log.warn("failed to get mobile bytes for package {}", packageUid)
log.info("failed to get mobile bytes for package {}", packageUid)
return 0
}
var txBytes = 0L
Expand Down
8 changes: 8 additions & 0 deletions app/src/main/res/layout/fragment_analyse.xml
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,14 @@
app:showPreview="true"
android:layout_marginTop="@dimen/material_generic"
/>
<com.amaze.fileutilities.home_page.ui.analyse.AnalysisTypeView
android:id="@+id/hidden_files_preview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:analysisTitle="Hidden Files"
app:showPreview="true"
android:layout_marginTop="@dimen/material_generic"
/>
<com.amaze.fileutilities.home_page.ui.analyse.AnalysisTypeView
android:id="@+id/large_video_preview"
android:layout_width="match_parent"
Expand Down
Loading

0 comments on commit 12eb93c

Please sign in to comment.