Gestionnaire d’écran Surface Duo

Important

Les fonctionnalités et l’aide décrites dans cet article sont en préversion publique et peuvent faire l’objet de modifications importantes avant leur lancement en disponibilité générale. Microsoft ne donne aucune garantie, expresse ou implicite, concernant les informations fournies ici.

SurfaceDuoScreenManager est le protocole commun pour deux implémentations différentes du gestionnaire d’écran : l’une utilisant la bibliothèque Microsoft DisplayMask et l’autre utilisant la bibliothèque SurfaceDuoScreenManager de Google. Cette interface définit les méthodes que vous devez utiliser pour inscrire et désinscrire les écouteurs d’informations sur l’écran.

Pour pouvoir créer le gestionnaire d’écran, vous devez utiliser ScreenManagerProvider.getScreenManager(), qui va retourner l’instance singleton de l’implémentation de SurfaceDuoScreenManager. Avant d’appeler cette méthode, vous devez appeler ScreenManagerProvider.init(Application) à l’intérieur de votre Application.onCreate() pour initialiser l’instance singleton de SurfaceDuoScreenManager. Cet appel est obligatoire ; sinon, une exception IllegalStateException("SurfaceDuoScreenManager must be initialized inside Application#onCreate()") est levée. Une fois que vous avez l’instance de SurfaceDuoScreenManager, vous pouvez inscrire le rappel ScreenInfoListener en utilisant SurfaceDuoScreenManager.addScreenInfoListener(ScreenInfoListener?) pour être averti du changement de mode de l’écran. Gardez à l’esprit que vous pouvez aussi ajouter plusieurs écouteurs : vous devez donc les désinscrire en utilisant SurfaceDuoScreenManager.removeScreenInfoListener(ScreenInfoListener?) afin d’éviter les fuites de mémoire.

En outre, si vous avez décidé de gérer les modifications de configuration, vous devez appeler SurfaceDuoScreenManager.onConfigurationChanged(Configuration) à partir de votre Activity, sinon, le rappel ne sera pas déclenché.

class SampleApp : Application() {
    override fun onCreate() {
        super.onCreate()
        ScreenManagerProvider.init(this)
    }
}
class SampleActivity : AppCompatActivity(), ScreenInfoListener {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sample)
    }

    override fun onScreenInfoChanged(screenInfo: ScreenInfo) {
        if (screenInfo.isDualMode()) {
            // TODO: Add dual-screen behavior.
        } else {
            // TODO: Add single-screen behavior.
        }
    }

    override fun onResume() {
        super.onResume()
        ScreenManagerProvider.getScreenManager().addScreenInfoListener(this)
    }

    override fun onPause() {
        super.onPause()
        ScreenManagerProvider.getScreenManager().removeScreenInfoListener(this)
    }

    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        ScreenManagerProvider.getScreenManager().onConfigurationChanged()
    }
}

Une autre option pour récupérer l’objet ScreenInfo sans devoir inscrire un rappel consiste à utiliser la méthode ScreenInfoProvider.getScreenInfo(Context). Gardez à l’esprit que vous devez appeler cette méthode une fois que la vue est attachée à la fenêtre ; sinon, certaines méthodes de ScreenInfo vont retourner null ou lever des exceptions.

class SampleActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sample)

        window?.decorView?.rootView?.let { rootView ->
            if (ViewCompat.isAttachedToWindow(rootView)) {
                val screenInfo = ScreenInfoProvider.getScreenInfo(this)
            } else {
                rootView.addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener {
                    override fun onViewAttachedToWindow(view: View) {
                        rootView.removeOnAttachStateChangeListener(this)
                        val screenInfo = ScreenInfoProvider.getScreenInfo(this)
                    }

                    override fun onViewDetachedFromWindow(view: View) {}
                })
            }
        }
    }
}

Si vous utilisez la bibliothèque Core Ktx, procédez comme suit :

class SampleActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sample)

        window?.decorView?.rootView?.doOnAttach {
            val screenInfo = ScreenInfoProvider.getScreenInfo(this)
        }
    }
}