This guide describes how to migrate your game to use the latest
Input SDK. The 1.0.0-beta SDK has substantial improvements over the
previous 0.0.4 preview. You should migrate from the earlier previews as soon as
possible. The 0.0.4 SDK will continue function through March 2023.

## Update the dependency

Delete the 0.0.4 library from your `libs` directory since the library is now
available on maven. Then Find this line in your module-level `build.grade`
file:  

    implementation files('libs/inputmapping-0.0.4.aar')

Replace it with the following code:  

    implementation 'com.google.android.libraries.play.games:inputmapping:1.0.0-beta'

## Implement the new InputMappingProvider interface

The former abstract class `InputMappingProvider` turned into an interface in
version `1.0.0-beta`. The method `onProvideInputMap()` is still part of the
interface.

<br />

### Kotlin

<br />

Remove `()` from the class definition since there's no constructor to invoke in
`InputMappingProvider`.

Locate your `InputMappingProvider` implementation:  

    class MyInputMapProvider : InputMappingProvider() {
        override fun onProvideInputMap(): InputMap {
            TODO("Not yet implemented")
        }
    }

And update it to this:  

    class MyInputMapProvider : InputMappingProvider {
        override fun onProvideInputMap(): InputMap {
            TODO("Not yet implemented")
        }
    }

<br />

### Java

<br />

Replace `extends` with `implements` to indicate that your implementing an
interface rather than extending a class.

Locate where you extend `InputMappingProvider`:  

    public class MyInputMapProvider extends InputMappingProvider {
        @NonNull
        @Override
        public InputMap onProvideInputMap() {
            // TODO: return an InputMap
        }
    }

And change it to implement `InputMappingProvider`:  

    public class MyInputMapProvider implements InputMappingProvider {
        @NonNull
        @Override
        public InputMap onProvideInputMap() {
            // TODO: return an InputMap
        }
    }

<br />

<br />

## Use the new InputClient

`registerInputMappingProvider` and `unregisterInputMappingProvider` have been
replaced with `setInputMappingProvider` and `clearInputMappingProvider`.
Further, `clearInputMappingProvider` no longer takes an argument so you no
longer need to keep a reference to your provider to unregister it later.

<br />

### Kotlin

To register your input map provider, locate your call to `registerInputMappingProvider`:

<br />

    private val myInputMapProvider by lazy {
        MyInputMapProvider()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val inputMappingClient = Input.getInputMappingClient(this)
        inputMappingClient.registerInputMappingProvider(myInputMapProvider)
    }

And replace it with `setInputMappingProvider`:  

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val inputMappingClient = Input.getInputMappingClient(this)
        inputMappingClient.setInputMappingProvider(MyInputMapProvider())
    }

To clear your input map, locate your call to `unregisterInputMappingProvider`:  

    override fun onDestroy() {
        val inputMappingClient = Input.getInputMappingClient(this)
        inputMappingClient.unregisterInputMappingProvider(myInputMapProvider)

        super.onDestroy()
    }

And replace it with `clearInputMappingprovider`:  

    override fun onDestroy() {
        val inputMappingClient = Input.getInputMappingClient(this)
        inputMappingClient.clearInputMappingProvider()

        super.onDestroy()
    }

<br />

### Java

<br />

To register your input map provider, locate your call to
`registerInputMappingProvider`:  

    private final MyInputMapProvider myInputMapProvider = new MyInputMapProvider();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        InputMappingClient inputMappingClient = Input.getInputMappingClient(this);
        inputMappingClient.registerInputMappingProvider(myInputMapProvider);
    }

And replace it with `setInputMappingProvider`:  

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        InputMappingClient inputMappingClient = Input.getInputMappingClient(this);
        inputMappingClient.setInputMappingProvider(new MyInputMapProvider());
    }

To clear your input mapping provider, locate your call to
`unregisterInputMappingProvider`:  

    @Override
    protected void onDestroy() {
        InputMappingClient inputMappingClient = Input.getInputMappingClient(this);
        inputMappingClient.unregisterInputMappingProvider(myInputMapProvider);

        super.onDestroy();
    }

And replace it with `clearInputMappingProvider`:  

    @Override
    protected void onDestroy() {
        InputMappingClient inputMappingClient = Input.getInputMappingClient(this);
        inputMappingClient.clearInputMappingProvider();

        super.onDestroy();
    }

<br />

<br />