# Moniteur d'interface

Le moniteur est utilisé pour écouter en temps réel les changements de l'interface et exécuter des actions prédéfinies, telles que cliquer sur des éléments, appuyer sur des touches ou enregistrer le nombre d'occurrences, lorsque des conditions prédéfinies sont remplies. Vous pouvez le considérer comme l'implémentation sous-jacente de fonctionnalités similaires aux outils de saut automatique de publicités. Étant donné que cette fonctionnalité effectue automatiquement des clics ou des pressions de touches, des actions inattendues peuvent se produire lorsqu'une intervention manuelle est nécessaire. Veuillez donc l'utiliser avec prudence.

```{tip}
Normalement, l'activation du moniteur et l'enregistrement des événements doivent être effectués au tout début du script. En général, ces opérations ne sont pas répétées pendant l'exécution.
```

## Activer le moniteur

L'interface suivante activera le moniteur d'interface. Par défaut, le moniteur est désactivé.

```{attention}
Toute action correspondant à un événement survenant sur l'interface avant l'activation du moniteur ou de l'événement de surveillance ne sera pas traitée !
```

```python
d.set_watcher_loop_enabled(True)
```

## Obtenir l'état d'activation du moniteur

Vous pouvez utiliser l'interface suivante pour savoir si le moniteur d'interface est actuellement activé.

```python
d.get_watcher_loop_enabled()
```

## Désactiver le moniteur

Désactive la boucle du moniteur, ce qui empêchera le traitement automatique des événements enregistrés tels que les clics.

```python
d.set_watcher_loop_enabled(False)
```

```{attention}
L'enregistrement d'un trop grand nombre d'événements de surveillance peut affecter les performances du système ou la réactivité des opérations.
```

## Supprimer tous les moniteurs

Supprime tous les événements de surveillance déjà appliqués, ce qui permet de nettoyer les règles appliquées par des scripts précédents ou interrompus anormalement. Il est recommandé d'exécuter cette commande avant chaque démarrage de script pour éviter que les événements enregistrés par des tâches antérieures n'interfèrent avec le processus de traitement actuel.

```python
d.remove_all_watchers()
```

## Enregistrer un événement de clic

L'événement de clic effectuera automatiquement des opérations de clic lorsqu'un sélecteur correspondant apparaît sur l'interface. Par exemple, pour contourner automatiquement les fenêtres contextuelles de logiciels telles que les accords d'utilisation ou les notifications de mise à jour, ou pour effectuer des clics automatiques sur certaines interfaces spécifiques.

```{attention}
Toute action correspondant à un événement survenant sur l'interface avant l'activation du moniteur ou de l'événement de surveillance ne sera pas traitée !
```

```python
d.register_click_target_selector_watcher("ClickAcceptWhenShowAggrement", [Selector(textContains="用户协议")], Selector(textContains="同意", clickable=True))
```

```{hint}
Le deuxième paramètre prend en charge plusieurs `Selector`. Cela signifie que l'événement ne sera traité que si toutes les conditions des `Selector` sont remplies.
```

En enregistrant l'événement ci-dessus, lorsque l'interface contenant le texte « 用户协议 » (Accord d'utilisation) apparaît, le bouton « 同意 » (Accepter) sera automatiquement cliqué.

## Enregistrer un événement de pression de touche

L'événement de pression de touche effectuera automatiquement une action de touche lorsqu'un sélecteur correspondant apparaît sur l'interface, comme un retour automatique, ce qui peut éviter d'entrer dans certaines interfaces. Bien sûr, un événement de clic peut également être utilisé pour réaliser la même opération.

```{attention}
Toute action correspondant à un événement survenant sur l'interface avant l'activation du moniteur ou de l'événement de surveillance ne sera pas traitée !
```

```python
d.register_press_key_watcher("PressBackWhenHomePageShows", [Selector(textContains="个人中心")], Keys.KEY_HOME)
```

```{hint}
Le deuxième paramètre prend en charge plusieurs `Selector`. Cela signifie que l'événement ne sera traité que si toutes les conditions des `Selector` sont remplies.
```

En enregistrant l'événement ci-dessus, lorsque l'interface contenant le texte « 个人中心 » (Centre personnel) apparaît, la touche HOME du téléphone sera automatiquement pressée.

## Enregistrer un événement de comptage

L'événement de comptage incrémente un compteur de 1 lorsque des éléments correspondant à certains sélecteurs apparaissent sur l'interface. Lorsque des informations importantes apparaissent brièvement à l'écran, cette fonctionnalité peut être utilisée pour vérifier si certaines interfaces sont apparues et combien de fois.

```{attention}
Toute action correspondant à un événement survenant sur l'interface avant l'activation du moniteur ou de l'événement de surveillance ne sera pas traitée !
```

```python
d.register_none_op_watcher("RecordElementAppearTimes", [Selector(textContains="好的")])
```

```{hint}
Le deuxième paramètre prend en charge plusieurs `Selector`. Cela signifie que l'événement ne sera traité que si toutes les conditions des `Selector` sont remplies.
```

L'événement ci-dessus enregistre le nombre d'apparitions de l'interface contenant « 好的 » (OK). Utilisez l'interface suivante pour obtenir le nombre de déclenchements de cet événement de comptage.

```python
d.get_watcher_triggered_count("RecordElementAppearTimes")
```

## Activer un événement

Une fois un événement enregistré, il doit être activé pour être pris en compte par la boucle du moniteur d'interface, sinon il ne sera pas appliqué.

```{attention}
Toute action correspondant à un événement survenant sur l'interface avant l'activation du moniteur ou de l'événement de surveillance ne sera pas traitée !
```

```python
d.set_watcher_enabled("RecordElementAppearTimes", True)
```


## Désactiver un événement

Vous pouvez appeler l'interface suivante pour que le moniteur d'interface cesse de surveiller un événement spécifique.

```{attention}
Toute action correspondant à un événement survenant sur l'interface avant l'activation du moniteur ou de l'événement de surveillance ne sera pas traitée !
```

```python
d.set_watcher_enabled("RecordElementAppearTimes", False)
```

## Supprimer un événement

Supprime complètement un événement du moniteur, et il sera également retiré de la liste des événements enregistrés.

```python
d.remove_watcher(name)
```

## Obtenir l'état d'activation d'un événement

Appelez l'interface suivante pour vérifier si un événement est correctement activé, afin d'éviter les cas où un événement est enregistré mais pas activé.

```python
d.get_watcher_enabled(name)
```

## Sélecteur avancé

En plus des sélecteurs simples, vous pouvez également fournir des sélecteurs plus complexes pour la correspondance d'éléments. L'exemple suivant montre comment écrire un sélecteur complexe.

```python
d.register_press_key_watcher("PressBackWhenHomePageShows", [Selector(resourceId="com.android.market:id/v_app_item").child(index=3).sibling(index=2).child(index=2).child()], Keys.KEY_HOME)
```

## Exemple de code complet

Voici un bloc de code d'exemple qui active la boucle du moniteur et enregistre trois types d'événements de surveillance. Lorsque du texte contenant « 用户协议 » (Accord d'utilisation) apparaît à l'écran, il clique automatiquement sur Accepter. Lorsque du texte contenant « 个人中心 » (Centre personnel) apparaît, il retourne immédiatement à l'écran d'accueil. Lorsque du texte contenant « 好的 » (OK) apparaît, il enregistre le nombre d'apparitions de cette interface.

```{attention}
Toute action correspondant à un événement survenant sur l'interface avant l'activation du moniteur ou de l'événement de surveillance ne sera pas traitée !
```

```python
d.remove_all_watchers()
d.set_watcher_loop_enabled(True)

d.register_click_target_selector_watcher("ClickAcceptWhenShowAggrement", [Selector(textContains="用户协议")],
                                         Selector(textContains="同意", clickable=True))
d.register_press_key_watcher("PressBackWhenHomePageShows", [Selector(textContains="个人中心")], Keys.KEY_HOME)
d.register_none_op_watcher("RecordElementAppearTimes", [Selector(textContains="好的")])

d.set_watcher_enabled("ClickAcceptWhenShowAggrement", True)
d.set_watcher_enabled("PressBackWhenHomePageShows", True)
d.set_watcher_enabled("RecordElementAppearTimes", True)
```