KKP(くるくるピ)にアプリを対応させる〜UI編

# UMAFocusManager

アプリをリモコンで操作する状況では、フォーカスがあたっているUIをハイライトさせたり、音声アシスト機能がないと、フォーカスがどこのUIを指しているのか分からない。その管理をUMAFocusManagerが行ってくれる。

```java
UMAFocusManager focusManager = umaApplication.getFocusManager();
```

# setFocusRoot
KKPコントローラのロータリースイッチや方向キーを使って、フォーカスを指定できる範囲をきめることができる。ループ選択にも対応してくれる。


```java
focusManager.setFocusRoot((ViewGroup) findViewById(R.id.wrapper));
```

```xml
 <LinearLayout
        android:id="@+id/wrapper"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <Button
            android:id="@+id/A"
            android:text="A"
            android:contentDescription="A"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <Button
            android:id="@+id/B"
            android:text="B"
            android:contentDescription="B"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <Button
            android:id="@+id/C"
            android:text="C"
            android:contentDescription="C"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>
```



# requestFocusForView
フォーカスを当てハイライトさせるviewを指定

```java

focusManager.requestFocusForView(findViewById(R.id.A));

```

#ボイスフィードバック
UMATTSManagerが提供する機能で、メニューにフォーカスが当たると、そのメニューにつけられているタイトルを読み上げてくれる音声アシスト機能。デフォルトでは無効になっている。

###有効
```java

UMATTSManager ttsManager = (UMATTSManager)umaApplication.getUMAService(umaApplication.UMA_TTS_SERVICE);       
ttsManager.setEnabled(true);

```

android:contentDescription="読み上げる内容を記述"


```xml

   <Button
            android:id="@+id/A"
            android:text="A"
            android:contentDescription="A"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

```

# エンター

KKPのエンターボタンを押せば、クリックイベントが呼ばれる。

```java

 findViewById(R.id.A).setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "KKPのメインボタンが押された", Toast.LENGTH_SHORT).show();
            }
        });

```



#listViewへの対応

![（件名なし）_-_info_yusuke_arai_gmail_com_-_Gmail.png](https://qiita-image-store.s3.amazonaws.com/0/99731/49bff92a-3585-6bfa-60ca-aee6f3bcb539.png)



```java:MainActivity.java

  private UMAApplication umaApplication = UMAApplication.INSTANCE;
    private ListView mListView;
    private Context context;
    UMAFocusManager mFocusManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        umaApplication.create(this);
        UMAHIDManager HIDManager = (UMAHIDManager) umaApplication.getUMAService(UMAApplication.UMA_HID_SERVICE);
        if (HIDManager.isBLESupported()) {
            HIDManager.enableAutoConnection(5000, 5000, 5000);
            if (!HIDManager.connectLastConnectedDevice(5000)) {
                HIDManager.startDiscoverDevice();
            }
        }

        UMATTSManager ttsManager = (UMATTSManager)umaApplication.getUMAService(umaApplication.UMA_TTS_SERVICE);
        ttsManager.setEnabled(true);
        mFocusManager = umaApplication.getFocusManager();

        context = this;
        mListView = (ListView)findViewById(R.id.list_view);
        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(MainActivity.this, mListView.getItemAtPosition(position).toString(), Toast.LENGTH_SHORT).show();
            }
        });
        mListView.setAdapter(new ListAdapter());
        mListView.setItemsCanFocus(true);

        mFocusManager.setFocusRoot((ViewGroup) findViewById(R.id.list_view));
    }
    private class ListAdapter extends BaseAdapter {

        public int getCount() {
            return 30;
        }

        public Object getItem (int position) {
            return "Item" + String.valueOf(position);
        }

        public long getItemId(int position) {
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {

            TextView textView;
            if (convertView == null) {
                LayoutInflater layoutInflater = LayoutInflater.from(context);
                convertView = layoutInflater.inflate(R.layout.sample_list_view_item, null);
                textView = (TextView)convertView.findViewById(R.id.text_view);
                convertView.setTag(textView);
            } else {
                textView = (TextView)convertView.getTag();
            }
            textView.setText("Item" + String.valueOf(position));
            convertView.setFocusable(true);
            return convertView;
        }
    }

```

```xml:sample_list_view_item.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:orientation="horizontal"
    >

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/image_view"
        android:src="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:textSize="20sp"
        android:padding="2dp"/>

</LinearLayout>

```

```xml:activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">

    <ListView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/list_view"
        android:focusable="true"
        android:layout_alignParentStart="true" />
</LinearLayout>

```

#Dialogへの対応

![（件名なし）_-_info_yusuke_arai_gmail_com_-_Gmail.png](https://qiita-image-store.s3.amazonaws.com/0/99731/3c497770-dfa1-fd64-ae3a-faa6cc774b33.png)


```java

   super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        umaApplication.create(this);
        UMAHIDManager HIDManager = (UMAHIDManager) umaApplication.getUMAService(UMAApplication.UMA_HID_SERVICE);
        if (HIDManager.isBLESupported()) {
            HIDManager.enableAutoConnection(5000, 5000, 5000);
            if (!HIDManager.connectLastConnectedDevice(5000)) {
                HIDManager.startDiscoverDevice();
            }
        }

        UMATTSManager ttsManager = (UMATTSManager)umaApplication.getUMAService(umaApplication.UMA_TTS_SERVICE);
        ttsManager.setEnabled(true);

        mAlert = new AlertDialog.Builder(MainActivity.this)
                .setTitle("タイトル")
                .setMessage("こんにちは")
                .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(MainActivity.this, "OK", Toast.LENGTH_SHORT).show();
                    }
                })
                .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(MainActivity.this, "キャンセル", Toast.LENGTH_SHORT).show();
                    }
                })
                .create();


        mAlert.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog) {
                View focusView = null;
                Button negativeButton = mAlert.getButton(AlertDialog.BUTTON_NEGATIVE);
                if (negativeButton != null) {
                    negativeButton.setFocusable(true);
                    negativeButton.setFocusableInTouchMode(true);
                    focusView = negativeButton;
                }

                Button positiveButton = mAlert.getButton(AlertDialog.BUTTON_POSITIVE);
                if (positiveButton != null) {
                    positiveButton.setFocusable(true);
                    positiveButton.setFocusableInTouchMode(true);
                    focusView = positiveButton;
                }
                if (focusView != null) {
                    UMAFocusManager focusManager = umaApplication.getFocusManager();
                    focusManager.pushState();
                    focusManager.setFocusRoot((ViewGroup) focusView.getRootView());
                    focusManager.requestFocusForView(focusView);
                }
            }
        });
        mAlert.show();  
```