Skip to content

Commit

Permalink
Merge pull request #108 from TeamAmaze/feature
Browse files Browse the repository at this point in the history
Update translations; add hidden analysis; bump version; fixes in billing system
  • Loading branch information
VishalNehra committed May 11, 2023
2 parents 075729c + 493ca9a commit 1e38316
Show file tree
Hide file tree
Showing 14 changed files with 264 additions and 99 deletions.
7 changes: 4 additions & 3 deletions app/build.gradle
Expand Up @@ -52,8 +52,8 @@ android {
minSdk 21
targetSdk 31

Integer sudoVersionCode = 23
String versionNameText = "1.83"
Integer sudoVersionCode = 25
String versionNameText = "1.85"

String[] abiFilterList = property("abiFilters").toString().split(';')
Integer minorVersion = 0
Expand Down Expand Up @@ -190,7 +190,7 @@ android {
// track.set("internal")
track.set("production")
userFraction.set(1.0d)
updatePriority.set(3)
updatePriority.set(4)
releaseStatus.set(com.github.triplet.gradle.androidpublisher.ReleaseStatus.COMPLETED)
}
}
Expand Down 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
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
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
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
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
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 @@ -1113,16 +1114,19 @@ class FilesViewModel(val applicationContext: Application) :

fun checkInternetConnection(timeoutMs: Int): LiveData<Boolean> {
return liveData(context = viewModelScope.coroutineContext + Dispatchers.Default) {
try {
val socket = Socket()
val socketAddress = InetSocketAddress("8.8.8.8", 53)

socket.connect(socketAddress, timeoutMs)
socket.close()
emit(true)
} catch (ex: IOException) {
log.info("failed to ping for connection", ex)
if (BuildConfig.IS_VERSION_FDROID) {
emit(applicationContext.isNetworkAvailable())
} else {
val socket = Socket()
try {
val socketAddress = InetSocketAddress("208.67.222.222", 53)
socket.connect(socketAddress, timeoutMs)
socket.close()
emit(true)
} catch (ex: IOException) {
log.info("failed to ping for connection", ex)
emit(applicationContext.isNetworkAvailable())
}
}
}
}
Expand Down Expand Up @@ -1228,7 +1232,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 +1371,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 +1613,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
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
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

0 comments on commit 1e38316

Please sign in to comment.