Office de la Formation Professionnelle et de la Promotion du Travail
Direction de la Recherche et de l’Ingénierie de la Formation
Division Conception des Examens
Examen National de Fin de Formation
Session de Juin 2025
Examen de Fin de Formation (Epreuve de synthèse)
Eléments de correction
Secteur : Digital et Intelligence Artificielle Niveau : Technicien Spécialisé
Filière : Développement Digital option Applications Mobiles
Variante V2 Durée : 4H00 Barème 100
Consignes et Précisions aux correcteurs :
Veuillez respecter impérativement les consignes suivantes :
Le corrigé est élaboré à titre indicatif,
Eviter de sanctionner doublement le stagiaire sur les questions liées,
Pour toutes les questions de synthèse et de compréhension le correcteur s’attachera à
évaluer la crédibilité et la pertinence de la réponse du stagiaire. Et à apprécier toute
réponse cohérente du stagiaire,
Le stagiaire n’est pas tenu de fournir des réponses aussi détaillées que celles mentionnées
dans le corrigé,
Pour les exercices de calcul :
- Prendre en considération la méthode de calcul correcte (formule et relation de calcul
correcte) même si le résultat final de calcul est faux
- Le résultat final correct non justifié ne doit pas avoir la totalité de la note.
En cas de suspicion d’erreur au niveau du corrigé, prière de contacter la Division de
Conception des Examens.
Détail du Barème :
N° Des Dossiers Travaux à réaliser Barème
Partie Théorique
1 Généralités sur Android 15 points
2 Théorie Kotlin 25 points
Total Partie Théorique /40points
Partie Pratique
3 Développement Android 45 points
4 Développement Cross-plateforme 15 points
Total Partie Pratique /60points
Total Général /100points
Filière DDOAM Variante V2 Page Page 1 sur 6
Corrigé Examen Fin de Formation Session Juin 2024
[Link]
Partie Théorique : 40 Points
Dossier 1 : Généralités sur Android (15 pts)
1. Mécanisme afin de détecter des évènements comme la Mise en Mode avion ?
broadcastReceiver (b)
2. menu à gauche/SideBar
NavigationDrawer (c )
3. l’autorisation d’accès aux SMS ?
[Link] (c )
4. Dans Hilt, pour définir une durée de vie dépendance équivalente à l'application entière ?
@Singleton (b)
5. composant Jetpack Compose pour afficher une image
Image (b)
Dossier 2 : Théorie Kotlin (25 pts)
1. Créer la classe Tablette avec ses propriétés. (5 pts)
//classe Tablette sur 5 pts
class Tablette (val id:Int,
val marque:String,
val modele:String,
val prix:Double,
var quantite:Int){}
2. Créer la classe BureauVente avec ses propriétés et 3 méthodes mentionnées ci-dessus. (20 pts)
NB : Notez que dans cet exercice, on NE VOUS demande AUCUNE interface graphique
//classe BureauVente, signature sur 5 pts et chaque méthode sur 5 pts
class BureauVente(val nom:String, val adresse:String, val
listTablettes:ArrayList<Tablette>) {
fun ajouterTablette(tablette: Tablette) {
[Link](tablette)
}
fun rechercherTablette(id: Int): Tablette? {
if ([Link] { [Link] == id }.size == 1)
return [Link] { [Link] == id }[0]
return null
}
fun supprimerTablette(id: Int) {
[Link] { [Link] == id }
}}
Filière DDOAM Variante V2 Page Page 2 sur 6
Corrigé Examen Fin de Formation Session Juin 2025
[Link]
Partie Pratique : / 60 points
Dossier 3 : Développement Android (45 pts)
NB. Des classes, interfaces et fonctions sont supposées déjà existantes, donc il n’EST PAS demandé de
les implémenter. Se référer à l’énoncé pour cela
1- Bouton Add (9 pts)
val name = findViewById<EditText>([Link]).[Link]().trim()
val priceStr = findViewById<EditText>([Link]).[Link]().trim()
val image = findViewById<EditText>([Link]).[Link]().trim()
val isWR = findViewById<CheckBox>([Link]).isChecked
val price = [Link]()
val smartWatch = SmartWatch(0, name, price, isWR, image)
// NB : Abréviation retrofit = [Link](…..) acceptée
val retrofit = [Link]()
.baseUrl("[Link]
.addConverterFactory([Link]())
.build()
val apiService = [Link](ApiService::[Link])
[Link](smartWatch).enqueue(object : Callback<AddResponse> {
override fun onResponse(call: Call<AddResponse>, response:
Response<AddResponse>) {
// Code isSuccessful et Toast non obligatoire
if ([Link]) {
[Link](this@MainActivity, [Link]()?[Link]?:"Erreur
d'ajout", Toast.LENGTH_LONG).show())}})
2- Liste des smartWatchs
a- (9 pts)
NB : le candidat a la possibilité d’utiliser des abréviations pour les balises et attributs xml, aussi il
n’est pas obligé d’inclure les namespaces et très longes balises comme xmlns…
NB : D’autres alternatives d’alignement existe aussi comme ConstarintLayout et RelativeLayout
Filière DDOAM Variante V2 Page Page 3 sur 6
Corrigé Examen Fin de Formation Session Juin 2025
[Link]
b- (9 pts)
c- (9 pts)
NB : Abréviation [Link](…..) acceptée
Filière DDOAM Variante V2 Page Page 4 sur 6
Corrigé Examen Fin de Formation Session Juin 2025
[Link]
3- Switch « Dark Mode »
//Code db = …. et themeDao = … à mettre ou bien dans a/ ou bien b/ pas obligatoirement les deux
a- (4.5 pts)
b- (4.5 pts)
Dossier 4 : Développement cross-platform (15 pts)
Notez que le stagiaire a aussi la possibilité d’implémenter la logique de calcul dans une
fonction indépendante, veuillez l’accepter
Le bouton "Calculer" affiche le total de la commande
Création de l’interface : 5 pts
Gestion des boutons radio : 5 pts
Calcul et affichage du total à payer : 5 pts
enum Taille { taille9, taille10, taille11 }
class _MyHomePageState extends State<MyHomePage> {
final _quantite = TextEditingController();
Taille? _taille = Taille.taille9;
String _resultat = '';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: [Link](context).[Link],
title: const Text(
'Commander Tablette',
),),
body: Center(
child: Column(
children: [
Filière DDOAM Variante V2 Page Page 5 sur 6
Corrigé Examen Fin de Formation Session Juin 2025
[Link]
Padding(
padding: const [Link](left: 30.0, top: 30, right: 30, bottom:15),
child: Row(
children: [
const Text('Taille écran',),
const SizedBox(
width: 30,),
Radio<Taille>(
value: Taille.taille9,
groupValue: _taille,
onChanged: (value){
setState(() {
_taille = value;
}); },),
const Text('9"',),
Radio<Taille>(
value: Taille.taille10,
groupValue: _taille,
onChanged: (value){
setState(() {
_taille = value;
}); }, ),
const Text('10"',),
Radio<Taille>(
value: Taille.taille11,
groupValue: _taille,
onChanged: (value){
setState(() {
_taille = value;
}); }, ),
const Text('11"',),
], ),),
Padding(
padding: const [Link](left: 30.0, top: 5, right: 30, bottom:15),
child: Row(
children: [
const Text('Quantité : ',),
SizedBox(
width: 300,
child: TextField(
controller: _quantite,
),), ],),),
Padding(
padding: const [Link](5),
child: Row(
mainAxisAlignment: [Link],
children: [
ElevatedButton(
onPressed: (){
int quantite = [Link](_quantite.text);
double prix = 3000;
if(_taille == Taille.taille10)
prix = 4000;
else if(_taille == Taille.taille11)
prix = 5000;
double resultat = quantite * prix;
setState(() {
_resultat = 'Total à payer ${[Link]()} DH';
});
},
child: const Text('CALCULER')
), ],),),
Padding(
padding: const [Link](10),
child: Text(_resultat,),
)],),),);}}
Filière DDOAM Variante V2 Page Page 6 sur 6
Corrigé Examen Fin de Formation Session Juin 2025
[Link]