This code is an implementation of a list adapter (BaseAdapter
) to display audio tracks in an Android interface. It is used in the NewPipe application, which allows video playback and manages audio/video streams.
🔍 Code Breakdown
1️⃣ Definition of the AudioTrackAdapter
class
public class AudioTrackAdapter extends BaseAdapter {
- Inherits from
BaseAdapter
→ Allows displaying a list of elements in aListView
orGridView
. - Manages groups of audio streams (
AudioStream
).
2️⃣ Attributes and Constructor
private final AudioTracksWrapper tracksWrapper;
tracksWrapper
is a container (AudioTracksWrapper
) that stores groups of audio streams.
public AudioTrackAdapter(final AudioTracksWrapper tracksWrapper) {
this.tracksWrapper = tracksWrapper;
}
- The constructor takes an
AudioTracksWrapper
, which contains multiple groups of audio tracks.
3️⃣ Main Methods of BaseAdapter
🟢 Number of items in the list
@Override
public int getCount() {
return tracksWrapper.size();
}
- Returns the number of audio track groups.
🟢 Get an item at a given position
@Override
public List<AudioStream> getItem(final int position) {
return tracksWrapper.getTracksList().get(position).getStreamsList();
}
- Returns the list of audio tracks associated with a given position.
🟢 Get an item ID
@Override
public long getItemId(final int position) {
return position;
}
- The ID of an item is simply its position in the list.
🟢 Create and display a list item
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
- This method creates the visual item for the list at a given position.
🔹 View reuse
final View view;
if (convertView == null) {
view = LayoutInflater.from(context).inflate(R.layout.stream_quality_item, parent, false);
} else {
view = convertView;
}
- If
convertView
isnull
, a new view (stream_quality_item.xml
) is inflated. - Otherwise, the existing view is reused to optimize performance.
🔹 Retrieving child views
final ImageView woSoundIconView = view.findViewById(R.id.wo_sound_icon);
final TextView formatNameView = view.findViewById(R.id.stream_format_name);
final TextView qualityView = view.findViewById(R.id.stream_quality);
final TextView sizeView = view.findViewById(R.id.stream_size);
- Retrieves interface elements:
woSoundIconView
→ Mute icon (possibly to indicate no sound).formatNameView
→ Audio track format name.qualityView
→ Audio stream quality.sizeView
→ Audio file size.
🔹 Assigning values
final List<AudioStream> streams = getItem(position);
final AudioStream stream = streams.get(0);
- Gets the first audio track of the current group.
woSoundIconView.setVisibility(View.GONE);
sizeView.setVisibility(View.VISIBLE);
- Hides the mute icon.
- Displays the audio file size.
if (stream.getAudioTrackId() != null) {
formatNameView.setText(stream.getAudioTrackId());
}
qualityView.setText(Localization.audioTrackName(context, stream));
- Displays the audio track ID (
AudioTrackId
). - Sets the audio quality via a
Localization
method.
4️⃣ AudioTracksWrapper
class
This class serves as a container for groups of audio streams.
public static class AudioTracksWrapper implements Serializable {
- Implements
Serializable
, allowing this object to be saved/transmitted.
private final List<StreamSizeWrapper<AudioStream>> tracksList;
- Stores a list of
StreamSizeWrapper<AudioStream>
, which groups audio tracks.
🟢 Constructor
public AudioTracksWrapper(@NonNull final List<List<AudioStream>> groupedAudioStreams,
@Nullable final Context context) {
this.tracksList = groupedAudioStreams.stream().map(streams ->
new StreamSizeWrapper<>(streams, context)).collect(Collectors.toList());
}
- Takes a list of audio track groups (
List<List<AudioStream>>
). - Converts each group into a
StreamSizeWrapper<AudioStream>
.
🟢 Access methods
public List<StreamSizeWrapper<AudioStream>> getTracksList() {
return tracksList;
}
public int size() {
return tracksList.size();
}
getTracksList()
→ Returns the list of audio stream groups.size()
→ Returns the number of groups.
Ce code est une implémentation d'un adaptateur de liste (BaseAdapter
) pour afficher des pistes audio dans une interface Android. Il est utilisé dans l'application NewPipe, qui permet de lire des vidéos et de gérer des flux audio/vidéo en streaming.
🔍 Décomposition du code
1️⃣ Définition de la classe AudioTrackAdapter
public class AudioTrackAdapter extends BaseAdapter {
- Hérite de
BaseAdapter
→ Permet d'afficher une liste d'éléments dans uneListView
ouGridView
. - Gère des groupes de flux audio (
AudioStream
).
2️⃣ Attributs et Constructeur
private final AudioTracksWrapper tracksWrapper;
tracksWrapper
est un conteneur (AudioTracksWrapper
) qui stocke des groupes de flux audio.
public AudioTrackAdapter(final AudioTracksWrapper tracksWrapper) {
this.tracksWrapper = tracksWrapper;
}
- Le constructeur prend un
AudioTracksWrapper
, qui contient plusieurs groupes de pistes audio.
3️⃣ Méthodes principales de BaseAdapter
🟢 Nombre d'éléments dans la liste
@Override
public int getCount() {
return tracksWrapper.size();
}
- Retourne le nombre de groupes de pistes audio.
🟢 Récupérer un élément à une position donnée
@Override
public List<AudioStream> getItem(final int position) {
return tracksWrapper.getTracksList().get(position).getStreamsList();
}
- Retourne la liste des pistes audio associée à une position donnée.
🟢 Obtenir l'identifiant d'un élément
@Override
public long getItemId(final int position) {
return position;
}
- L'identifiant d'un élément est simplement sa position dans la liste.
🟢 Création et affichage d'un élément de la liste
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
- Cette méthode crée l'élément visuel de la liste pour une position donnée.
🔹 Réutilisation de la vue
final View view;
if (convertView == null) {
view = LayoutInflater.from(context).inflate(R.layout.stream_quality_item, parent, false);
} else {
view = convertView;
}
- Si
convertView
estnull
, on gonfle (inflate
) une nouvelle vue (stream_quality_item.xml
). - Sinon, on réutilise la vue existante pour optimiser les performances.
🔹 Récupération des vues enfant
final ImageView woSoundIconView = view.findViewById(R.id.wo_sound_icon);
final TextView formatNameView = view.findViewById(R.id.stream_format_name);
final TextView qualityView = view.findViewById(R.id.stream_quality);
final TextView sizeView = view.findViewById(R.id.stream_size);
- On récupère les éléments d'interface :
woSoundIconView
→ Icône muette (peut-être pour indiquer une absence de son).formatNameView
→ Nom du format de la piste audio.qualityView
→ Qualité du flux audio.sizeView
→ Taille du fichier audio.
🔹 Affectation des valeurs
final List<AudioStream> streams = getItem(position);
final AudioStream stream = streams.get(0);
- Récupère la première piste audio du groupe actuel.
woSoundIconView.setVisibility(View.GONE);
sizeView.setVisibility(View.VISIBLE);
- Masque l'icône de son coupé.
- Affiche la taille du fichier audio.
if (stream.getAudioTrackId() != null) {
formatNameView.setText(stream.getAudioTrackId());
}
qualityView.setText(Localization.audioTrackName(context, stream));
- Affiche l'ID de la piste audio (
AudioTrackId
). - Définit la qualité audio via une méthode
Localization
.
4️⃣ Classe AudioTracksWrapper
Cette classe sert de conteneur pour les groupes de flux audio.
public static class AudioTracksWrapper implements Serializable {
- Implémente
Serializable
, ce qui permet de sauvegarder/transmettre cet objet.
private final List<StreamSizeWrapper<AudioStream>> tracksList;
- Stocke une liste de
StreamSizeWrapper<AudioStream>
, qui regroupe les pistes audio.
🟢 Constructeur
public AudioTracksWrapper(@NonNull final List<List<AudioStream>> groupedAudioStreams,
@Nullable final Context context) {
this.tracksList = groupedAudioStreams.stream().map(streams ->
new StreamSizeWrapper<>(streams, context)).collect(Collectors.toList());
}
- Prend une liste de groupes de pistes audio (
List<List<AudioStream>>
). - Convertit chaque groupe en un
StreamSizeWrapper<AudioStream>
.
🟢 Méthodes d'accès
public List<StreamSizeWrapper<AudioStream>> getTracksList() {
return tracksList;
}
public int size() {
return tracksList.size();
}
getTracksList()
→ Retourne la liste des groupes de flux audio.size()
→ Retourne le nombre de groupes.
🛠 Résumé du fonctionnement
AudioTrackAdapter
affiche une liste de groupes de pistes audio dans uneListView
.- Il utilise
AudioTracksWrapper
pour stocker ces groupes. - Chaque élément de la liste affiche :
- Le format (
formatNameView
). - La qualité (
qualityView
). - La taille (
sizeView
).
- Le format (
- Optimisations :
- Réutilisation des vues (
convertView
). - Utilisation de
StreamSizeWrapper<AudioStream>
pour gérer les tailles des fichiers audio.
- Réutilisation des vues (
C'est un adaptateur optimisé pour gérer des listes de flux audio et les afficher de manière efficace dans une interface Android. 🚀