Skip to content

Commit

Permalink
Merge pull request #2890 from TeamAmaze/bugfix/3.6.4
Browse files Browse the repository at this point in the history
Bugfix/3.6.4 fix android tv overscan
  • Loading branch information
VishalNehra authored Oct 10, 2021
2 parents eda0c47 + ba0ea31 commit 3d984ba
Show file tree
Hide file tree
Showing 14 changed files with 228 additions and 100 deletions.
176 changes: 133 additions & 43 deletions app/src/main/java/com/amaze/filemanager/adapters/AppsRecyclerAdapter.kt
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import android.view.View
import android.view.ViewGroup
import android.widget.PopupMenu
import android.widget.Toast
import androidx.annotation.IntDef
import androidx.appcompat.view.ContextThemeWrapper
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.RecyclerView
Expand All @@ -45,6 +46,8 @@ import com.amaze.filemanager.R
import com.amaze.filemanager.adapters.data.AppDataParcelable
import com.amaze.filemanager.adapters.glide.AppsAdapterPreloadModel
import com.amaze.filemanager.adapters.holders.AppHolder
import com.amaze.filemanager.adapters.holders.EmptyViewHolder
import com.amaze.filemanager.adapters.holders.SpecialViewHolder
import com.amaze.filemanager.asynchronous.asynctasks.DeleteTask
import com.amaze.filemanager.asynchronous.management.ServiceWatcherUtil
import com.amaze.filemanager.asynchronous.services.CopyService
Expand All @@ -66,6 +69,8 @@ import com.amaze.filemanager.utils.Utils
import com.amaze.filemanager.utils.safeLet
import java.io.File
import java.util.*
import kotlin.collections.ArrayList
import kotlin.math.roundToInt

class AppsRecyclerAdapter(
private val fragment: Fragment,
Expand All @@ -74,59 +79,128 @@ class AppsRecyclerAdapter(
private val adjustListViewCallback: AdjustListViewForTv<AppHolder>,
private val appDataParcelableList: MutableList<AppDataParcelable>
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

private val myChecked = SparseBooleanArray()
private var appDataListItem: MutableList<ListItem> = mutableListOf()
set(value) {
value.clear()
val headerFlags = BooleanArray(2)
appDataParcelableList.forEach {
if (!isBottomSheet && it.isSystemApp && !headerFlags[0]) {
value.add(ListItem(TYPE_HEADER_SYSTEM))
modelProvider.addItem("")
headerFlags[0] = true
} else if (!isBottomSheet && !it.isSystemApp && !headerFlags[1]) {
value.add(ListItem(TYPE_HEADER_THIRD_PARTY))
modelProvider.addItem("")
headerFlags[1] = true
}
modelProvider.addItem(it.path)
value.add(ListItem(it))
}
if (!isBottomSheet) {
modelProvider.addItem("")
value.add(ListItem(EMPTY_LAST_ITEM))
}
field = value
}

init {
appDataListItem = mutableListOf()
}

private val mInflater: LayoutInflater get() = fragment.requireActivity()
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE) as LayoutInflater

companion object {
const val TYPE_ITEM = 0
const val TYPE_HEADER_SYSTEM = 1
const val TYPE_HEADER_THIRD_PARTY = 2
const val EMPTY_LAST_ITEM = 3
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val view = mInflater.inflate(R.layout.rowlayout, parent, false)
return AppHolder(view)
var view = View(fragment.requireContext())
when (viewType) {
TYPE_ITEM -> {
view = mInflater.inflate(R.layout.rowlayout, parent, false)
return AppHolder(view)
}
TYPE_HEADER_SYSTEM, TYPE_HEADER_THIRD_PARTY -> {
view = mInflater.inflate(R.layout.list_header, parent, false)
return SpecialViewHolder(
fragment.requireContext(), view,
(fragment.requireActivity() as MainActivity).utilsProvider,
if (viewType == TYPE_HEADER_SYSTEM)
SpecialViewHolder.HEADER_SYSTEM_APP
else
SpecialViewHolder.HEADER_THIRD_PARTY_APP
)
}
EMPTY_LAST_ITEM -> {
view.minimumHeight =
(
fragment.requireActivity().resources.getDimension(R.dimen.fab_height) +
fragment.requireContext().resources
.getDimension(R.dimen.fab_margin)
).roundToInt()
return EmptyViewHolder(view)
}
else -> {
throw IllegalStateException("Illegal $viewType in apps adapter")
}
}
}

override fun getItemViewType(position: Int): Int {
return appDataListItem[position].listItemType
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is AppHolder) {
val rowItem: AppDataParcelable = appDataParcelableList[position]
if (isBottomSheet) {
holder.about.visibility = View.GONE
holder.txtDesc.text = rowItem.openFileParcelable?.className
holder.txtDesc.isSingleLine = true
holder.txtDesc.ellipsize = TextUtils.TruncateAt.MIDDLE
modelProvider.loadApkImage(rowItem.packageName, holder.apkIcon)
} else {
modelProvider.loadApkImage(rowItem.path, holder.apkIcon)
}
if (holder.about != null && !isBottomSheet) {
if ((fragment.requireActivity() as MainActivity).appTheme == AppTheme.LIGHT) {
holder.about.setColorFilter(
Color.parseColor("#ff666666")
appDataListItem[position].appDataParcelable?.let { rowItem ->
if (isBottomSheet) {
holder.about.visibility = View.GONE
holder.txtDesc.text = rowItem.openFileParcelable?.className
holder.txtDesc.isSingleLine = true
holder.txtDesc.ellipsize = TextUtils.TruncateAt.MIDDLE
modelProvider.loadApkImage(rowItem.packageName, holder.apkIcon)
} else {
modelProvider.loadApkImage(rowItem.path, holder.apkIcon)
}
if (holder.about != null && !isBottomSheet) {
if ((fragment.requireActivity() as MainActivity).appTheme == AppTheme.LIGHT) {
holder.about.setColorFilter(
Color.parseColor("#ff666666")
)
}
showPopup(holder.about, rowItem)
}
holder.rl.setOnFocusChangeListener { _, _ ->
adjustListViewCallback.adjustListViewForTv(
holder,
fragment.requireActivity() as MainActivity
)
}
showPopup(holder.about, rowItem)
}
holder.rl.setOnFocusChangeListener { _, _ ->
adjustListViewCallback.adjustListViewForTv(
holder,
fragment.requireActivity() as MainActivity
)
}
holder.txtTitle.text = rowItem.label
val enableMarqueeFilename =
(fragment.requireActivity() as MainActivity)
.getBoolean(PreferencesConstants.PREFERENCE_ENABLE_MARQUEE_FILENAME)
if (enableMarqueeFilename) {
holder.txtTitle.ellipsize = if (enableMarqueeFilename)
TextUtils.TruncateAt.MARQUEE else TextUtils.TruncateAt.MIDDLE
marqueeAfterDelay(2000, holder.txtTitle)
}
holder.txtTitle.text = rowItem.label
val enableMarqueeFilename =
(fragment.requireActivity() as MainActivity)
.getBoolean(PreferencesConstants.PREFERENCE_ENABLE_MARQUEE_FILENAME)
if (enableMarqueeFilename) {
holder.txtTitle.ellipsize = if (enableMarqueeFilename)
TextUtils.TruncateAt.MARQUEE else TextUtils.TruncateAt.MIDDLE
marqueeAfterDelay(2000, holder.txtTitle)
}

// File f = new File(rowItem.getDesc());
if (!isBottomSheet) {
holder.txtDesc.text = rowItem.fileSize
}
holder.rl.isClickable = true
holder.rl.nextFocusRightId = holder.about.id
holder.rl.setOnClickListener {
startActivityForRowItem(rowItem)
// File f = new File(rowItem.getDesc());
if (!isBottomSheet) {
holder.txtDesc.text = rowItem.fileSize
}
holder.rl.isClickable = true
holder.rl.nextFocusRightId = holder.about.id
holder.rl.setOnClickListener {
startActivityForRowItem(rowItem)
}
}
if (myChecked[position]) {
holder.rl.setBackgroundColor(
Expand All @@ -143,7 +217,7 @@ class AppsRecyclerAdapter(
}

override fun getItemCount(): Int {
return appDataParcelableList.size
return appDataListItem.size
}

/**
Expand All @@ -155,7 +229,7 @@ class AppsRecyclerAdapter(
clear()
val list = if (!showSystemApps) data.filter { !it.isSystemApp } else data
addAll(list)
modelProvider.setItemList(list.map { it.path })
appDataListItem = mutableListOf()
notifyDataSetChanged()
}
}
Expand Down Expand Up @@ -424,4 +498,20 @@ class AppsRecyclerAdapter(
.build()
.show()
}

@Target(AnnotationTarget.TYPE)
@IntDef(
TYPE_ITEM,
TYPE_HEADER_SYSTEM,
TYPE_HEADER_THIRD_PARTY,
EMPTY_LAST_ITEM,
)
annotation class ListItemType

data class ListItem(
var appDataParcelable: AppDataParcelable?,
var listItemType: @ListItemType Int = TYPE_ITEM
) {
constructor(listItemType: @ListItemType Int) : this(null, listItemType)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ class AppDataSorter(var sort: Int, isAscending: Boolean) :
override fun compare(file1: AppDataParcelable?, file2: AppDataParcelable?): Int {
safeLet(file1, file2) {
f1, f2 ->
if (f1.isSystemApp != f2.isSystemApp) {
return if (f1.isSystemApp) -1 else 1
}

when (sort) {
SORT_NAME -> {
// sort by name
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

package com.amaze.filemanager.adapters.glide;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

Expand Down Expand Up @@ -58,6 +59,13 @@ public void setItemList(List<String> items) {
this.items = items;
}

public void addItem(String item) {
if (items == null) {
items = new ArrayList<>();
}
items.add(item);
}

@NonNull
@Override
public List<String> getPreloadItems(int position) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,16 @@ class SpecialViewHolder(
companion object {
const val HEADER_FILES = 0
const val HEADER_FOLDERS = 1
const val HEADER_SYSTEM_APP = 2
const val HEADER_THIRD_PARTY_APP = 3
}

init {
when (type) {
HEADER_FILES -> txtTitle.setText(R.string.files)
HEADER_FOLDERS -> txtTitle.setText(R.string.folders)
HEADER_SYSTEM_APP -> txtTitle.setText(R.string.system_apps)
HEADER_THIRD_PARTY_APP -> txtTitle.setText(R.string.third_party_apps)
else -> throw IllegalStateException(": $type")
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,19 +36,18 @@
import android.content.pm.PackageManager;
import android.text.format.Formatter;

import androidx.core.util.Pair;
import androidx.loader.content.AsyncTaskLoader;

/**
* Created by vishal on 23/2/17.
*
* <p>Class loads all the packages installed
*/
public class AppListLoader extends AsyncTaskLoader<AppListLoader.AppsDataPair> {
public class AppListLoader extends AsyncTaskLoader<List<AppDataParcelable>> {

private PackageManager packageManager;
private PackageReceiver packageReceiver;
private AppsDataPair mApps;
private List<AppDataParcelable> mApps;
private final int sortBy;
private final boolean isAscending;

Expand All @@ -66,15 +65,14 @@ public AppListLoader(Context context, int sortBy, boolean isAscending) {
}

@Override
public AppsDataPair loadInBackground() {
public List<AppDataParcelable> loadInBackground() {
List<ApplicationInfo> apps =
packageManager.getInstalledApplications(
PackageManager.MATCH_UNINSTALLED_PACKAGES
| PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS);

if (apps == null) return new AppsDataPair(Collections.emptyList(), Collections.emptyList());

mApps = new AppsDataPair(new ArrayList<>(apps.size()), new ArrayList<>(apps.size()));
if (apps == null) return Collections.emptyList();
mApps = new ArrayList<>(apps.size());
PackageInfo androidInfo = null;
try {
androidInfo = packageManager.getPackageInfo("android", PackageManager.GET_SIGNATURES);
Expand Down Expand Up @@ -110,27 +108,22 @@ public AppsDataPair loadInBackground() {
isSystemApp,
null);

mApps.first.add(elem);
}

Collections.sort(mApps.first, new AppDataSorter(sortBy, isAscending));

for (AppDataParcelable p : mApps.first) {
mApps.second.add(p.getPath());
mApps.add(elem);
}

Collections.sort(mApps, new AppDataSorter(sortBy, isAscending));
return mApps;
}

@Override
public void deliverResult(AppsDataPair data) {
public void deliverResult(List<AppDataParcelable> data) {
if (isReset()) {

if (data != null) onReleaseResources(data); // TODO onReleaseResources() is empty
}

// preserving old data for it to be closed
AppsDataPair oldData = mApps;
List<AppDataParcelable> oldData = mApps;
mApps = data;
if (isStarted()) {
// loader has been started, if we have data, return immediately
Expand Down Expand Up @@ -168,7 +161,7 @@ protected void onStopLoading() {
}

@Override
public void onCanceled(AppsDataPair data) {
public void onCanceled(List<AppDataParcelable> data) {
super.onCanceled(data);

onReleaseResources(data); // TODO onReleaseResources() is empty
Expand Down Expand Up @@ -197,7 +190,7 @@ protected void onReset() {

/** We would want to release resources here List is nothing we would want to close */
// TODO do something
private void onReleaseResources(AppsDataPair layoutElementList) {}
private void onReleaseResources(List<AppDataParcelable> layoutElementList) {}

/**
* Check if an App is under /system or has been installed as an update to a built-in system
Expand All @@ -216,18 +209,4 @@ public boolean isSignedBySystem(PackageInfo piApp, PackageInfo piSys) {
&& piApp.signatures != null
&& piSys.signatures[0].equals(piApp.signatures[0]));
}

/** typedef Pair<List<AppDataParcelable>, List<String>> AppsDataPair */
public static class AppsDataPair extends Pair<List<AppDataParcelable>, List<String>> {

/**
* Constructor for a Pair.
*
* @param first the first object in the Pair
* @param second the second object in the pair
*/
public AppsDataPair(List<AppDataParcelable> first, List<String> second) {
super(first, second);
}
}
}
Loading

0 comments on commit 3d984ba

Please sign in to comment.