Mengekspos data ke detail tampilan jam di Wear OS

1. Mengekspos Data ke Detail

Codelab ini akan mengajari Anda cara membuat sumber data detail.

Konsep dan penyiapan

Di akhir codelab, Anda akan memahami cara menyediakan data untuk detail tampilan jam di Wear OS.

Konsep

Detail adalah fitur tampilan jam di luar jam dan menit. Sebagai contoh, tampilan jam pada gambar di bawah berisi empat detail.

39f4ebe8dc4800b0.png

Complications API ditujukan untuk tampilan jam dan aplikasi sumber data:

  • Sumber data detail menyediakan data, misalnya, tingkat daya baterai, cuaca, jumlah langkah, dll.
  • Developer tampilan jam dapat menampilkan data tersebut dalam detail di tampilan jam
  • Pengguna memilih sumber data yang mereka inginkan untuk detailnya

Screen Shot 2016-05-17 at 5.14.50 PM.png

Dalam codelab ini, kita akan membahas pembuatan sumber data detail. Jika Anda juga tertarik untuk menambahkan detail ke tampilan jam, lihat contoh tampilan jam kami.

Mari kita mulai.

Meng-clone repositori project awal

Untuk membantu Anda memulai dengan cepat, kami telah menyiapkan project untuk Anda. Project ini berisi beberapa kode dasar dan setelan aplikasi yang diperlukan untuk codelab.

Jika Anda telah menginstal Git, jalankan perintah di bawah. (Anda dapat memeriksa apakah Git telah diinstal dengan mengetik git --version di command line/terminal, lalu pastikan bahwa Git dijalankan dengan benar.):

 git clone https://github.com/android/codelab-complications-data-source.git

Jika tidak memiliki Git, Anda dapat mendownload project sebagai file ZIP:

Mengimpor project

Mulai Android Studio, pilih "Open an existing Android Studio project" dari layar Welcome. Buka direktori project dan klik dua kali file build.gradle di direktori complications-data-source.

Di sudut kiri atas jendela project, jika berada dalam tampilan Android, Anda akan melihat kumpulan ikon folder yang mirip dengan screenshot di bawah ini. (Jika Anda berada dalam tampilan Project, luaskan project complications-data-source untuk melihat kumpulan ikon folder).

786caabc75caee70.png

Ada dua ikon folder. Keduanya mewakili modul. Perlu diketahui bahwa Android Studio mungkin memerlukan waktu beberapa detik untuk mengompilasi project di latar belakang untuk pertama kalinya. Selama durasi ini, Anda akan melihat indikator lingkaran berputar di status bar di bagian bawah Android Studio:

27f04b5598a2f95e.png

Tunggu hingga proses selesai sebelum membuat perubahan kode, agar Android Studio dapat mengambil semua komponen yang diperlukan.

Memahami project awal

Anda sudah siap untuk mulai mengekspos data ke detail. Kita akan memulai dengan modul base. Anda akan menambahkan kode dari setiap langkah ke base.

Anda dapat menggunakan modul complete di codelab sebagai titik referensi untuk memeriksa pekerjaan Anda (atau sebagai referensi jika Anda mengalami masalah).

Ringkasan komponen utama untuk sumber data

  • ComplicationTapBroadcastReceiver - Class yang digunakan untuk memperbarui data detail melalui PendingIntent.
  • CustomComplicationDataSourceService - Class yang digunakan untuk mengekspos data ke detail. File ini berada di direktori base/java/com/example/android/wearable/complicationsdatasource. Di Android Studio, file ini berada di base/java/com.example.android.wearable.complicationsdatasource. Dalam class ini, kita akan lebih banyak mengerjakan empat metode:
  • onComplicationActivated - Dipanggil saat detail telah diaktifkan dengan data Anda.
  • getPreviewData - Melihat pratinjau data untuk detail yang digunakan di UI editor (biasanya hanya konten statis).
  • onComplicationRequest - Sebagian besar pekerjaan kita akan menggunakan metode ini. Metode ini dipanggil setiap kali detail aktif memerlukan data yang telah diperbarui dari sumber Anda.
  • onComplicationDeactivated - Dipanggil saat detail telah dinonaktifkan.

Penyiapan emulator

Jika Anda memerlukan bantuan untuk menyiapkan emulator Wear OS, lihat bagian "Meluncurkan emulator dan menjalankan aplikasi Wear" di halaman "Membuat dan Menjalankan Aplikasi Wearable".

Menjalankan project awal

Mari kita jalankan aplikasi di smartwatch.

  • Hubungkan perangkat Wear OS atau mulai emulator.
  • Di toolbar, pilih konfigurasi "base" dari pemilih drop-down, lalu klik tombol segitiga hijau (Run) di sampingnya:

a04699aa4cf2ca12.png

  • Jika Anda mendapatkan error seperti di bawah ini (Error Launching activity), ubah Activity peluncuran default (petunjuknya di bawah). 6ea74bcba8278349.png

Sebaliknya, jika diminta menggunakan Activity saat meluncurkan aplikasi, pilih "Do not launch Activity".

  • Untuk mengubah Activity peluncuran default (jika perlu, dari langkah sebelumnya), klik pemilih drop-down di sebelah kiri panah hijau dan klik "edit configurations".

1e3e1dc73655ccd8.png

Pilih "base" lalu Anda akan melihat jendela yang serupa dengan yang di bawah ini. Pilih "Nothing" di bagian Launch Options, lalu klik Run. Nanti, jika Anda ingin mencoba meluncurkan modul lain, Anda juga harus melakukan hal ini.

5e98572969d8228.png

  • Pilih perangkat Android atau emulator, lalu klik OK. Tindakan ini akan menginstal layanan di perangkat Wear OS atau emulator.
  • Setelah beberapa detik, layanan Anda akan dibangun dan siap di-deploy. Anda akan melihat indikator lingkaran berputar di status bar di bagian bawah Android Studio.
  • Jika layanan belum ada di tab "Build" di kiri bawah Android Studio, pilih tab tersebut dan Anda akan melihat progres penginstalan. Di akhir proses penginstalan, Anda akan melihat pesan "Build: completed successfully".

5ea92276833c0446.png

  • Pilih tampilan jam yang memungkinkan Anda memilih detail. Dalam kasus ini, kami memilih Elements Digital, tetapi mungkin tidak tersedia di smartwatch Anda.

a5cf2c605206efe2.png

Harap diperhatikan, karena ini adalah pertama kalinya Anda menjalankan tampilan jam ini, Anda harus memilihnya dari "Add more watch faces". Setelah dipilih sekali, tampilan jam ini akan muncul sebagai salah satu opsi bersama opsi ini.

  • Sekarang Anda akan berada di tengah tampilan jam yang dipilih di menu Favorite (lihat gambar di bawah). Klik ikon roda gigi di bagian bawah.

f17fb6b4cfe06182.png

  • Untuk tampilan jam ini, Anda harus memilih Data. Untuk tampilan jam kustom yang Anda gunakan, UI-nya mungkin berbeda.

aef4fca32751a15a.png

  • Pilih position mana pun, yaitu tanda "+" (detail).

461f8a704fbc6496.png

  • Terakhir, scroll ke bawah dan pilih layanan Complications Data Source Codelab. (Setelah memilihnya, Anda mungkin perlu menggeser ke kiri beberapa kali atau menekan perangkat dengan telapak tangan untuk keluar).

b4d0d14140ce0120.png

  • Di output, Anda akan melihat pesan log "onComplicationActivated()" dan "onComplicationRequest ()" (meskipun tidak ada yang akan muncul di lokasi detail).
  • Jika Anda tidak melihat pesan log tersebut, coba deploy tampilan jam lagi dengan menekan tombol segitiga hijau di toolbar.
  • Jika Anda tidak mengetahui cara melihat data Log, klik tab di bagian bawah Android Studio yang berlabel "6: Logcat". Setel dropdown ke perangkat/emulator dan nama paket, com.example.android.wearable.complicationsdatasource (screenshot di bawah).

af9cf164f9c598fc.png

"Tunggu! Tidak ada yang ditampilkan dalam slot data yang saya pilih". Jangan khawatir, kami belum menyediakan data apa pun. Kami akan menambahkannya di langkah berikutnya.

Pada beberapa smartwatch, Tampilan Jam Elemen telah mengaktifkan detail, sehingga Anda mungkin melihat detail telah terisi pada smartwatch. Selain itu, jangan khawatir jika emulator Anda memiliki awan dengan coretan sebagai pengganti ikon pesawat. Kita tidak memerlukan koneksi ke ponsel atau internet untuk codelab ini.

52da39817e329e7a.png

Ringkasan

Di langkah ini, Anda telah mempelajari tentang:

  • Wear OS dan konsep di balik cara mengekspos data ke detail
  • Dasar-dasar titik awal (modul base)
  • Men-deploy dan menjalankan tampilan jam

Berikutnya

Mari mulai mengekspos beberapa data.

2. Mengekspos Data Teks Singkat

Langkah kode 2

Pada langkah ini, kita akan mulai mengekspos data. Detail menerima beberapa jenis data. Pada langkah ini, kita akan menampilkan jenis data Teks Singkat.

Jika suatu saat Anda bingung dengan konsep yang dibahas di sini, lihat modul complete lalu lihat bagaimana langkah-langkah ini dapat diterapkan.

Menentukan jenis data yang didukung oleh sumber data

Buka file AndroidManifest.xml dan lihat layanan CustomComplicationDataSourceService . Perhatikan intent-filter:

<action android:name=
    "android.support.wearable.complications.ACTION_COMPLICATION_UPDATE_REQUEST"/>

Intent-filter ini akan memberi tahu sistem bahwa layanan Anda memperluas ComplicationDataSourceService atau SuspendingComplicationDataSourceService (variasi yang mendukung Coroutine Kotlin) dan dapat mengirim data untuk detail.

Berikutnya adalah elemen meta-data yang menentukan jenis data yang kita dukung. Dalam kasus ini, kita mendukung SMALL_IMAGE, tetapi untuk langkah ini, ubah menjadi SHORT_TEXT. Ubah elemen meta-data pertama Anda menjadi berikut ini:

<meta-data
    android:name="android.support.wearable.complications.SUPPORTED_TYPES"
    android:value="SHORT_TEXT"/>

Mengekspos data

Seperti yang disebutkan sebelumnya, onComplicationActivated() dipanggil saat sumber data Anda diaktifkan. Ini adalah tempat/waktu yang baik untuk melakukan penyiapan dasar apa pun yang perlu dilakukan sekali per aktivasi. Kita tidak melakukannya dalam codelab ini, karena sampel kita relatif sederhana.

Panggilan onComplicationRequest() adalah tempat detail aktif meminta data yang diperbarui.

Metode onComplicationRequest() dipicu karena berbagai alasan:

  • Detail tampilan jam yang aktif diubah untuk menggunakan sumber ini
  • Detail yang menggunakan sumber ini menjadi aktif
  • Anda memicu pembaruan dari class Anda sendiri melalui ComplicationDataSourceUpdateRequester.requestUpdate() atau ComplicationDataSourceUpdateRequester.requestUpdateAll() .
  • Periode waktu yang Anda tentukan dalam manifes telah berlalu

Buka CustomComplicationDataSourceService .kt dan pindahkan kursor ke bawah ke metode onComplicationRequest(). Hapus baris "return null", lalu salin dan tempel kode di bawah di bagian panggilan Log.d() awal:

// Retrieves your data, in this case, we grab an incrementing number from Datastore.
val number: Int = applicationContext.dataStore.data
    .map { preferences ->
        preferences[TAP_COUNTER_PREF_KEY] ?: 0
    }
    .first()

val numberText = String.format(Locale.getDefault(), "%d!", number)

Dalam hal ini, kita mengambil int tersimpan dari DataStore yang mewakili data kita. Anda dapat dengan mudah melakukan panggilan ke database.

Berinteraksi dengan DataStore memerlukan coroutine untuk menangani pengumpulan Flow yang dihasilkannya. Anda mungkin melihat bahwa onComplicationRequest() adalah fungsi suspend, sehingga kita dapat mengumpulkan data melalui Flow tanpa meluncurkan coroutine secara khusus.

Setelah mengambil nilai bilangan bulat, kita akan mengonversinya menjadi string sederhana sebagai persiapan untuk mengonversinya menjadi objek ComplicationData, yaitu jenis data yang dipahami detail.

Selanjutnya, salin dan tempel kode di bawah kode yang baru saja Anda tambahkan.

return when (request.complicationType) {

    ComplicationType.SHORT_TEXT -> ShortTextComplicationData.Builder(
        text = PlainComplicationText.Builder(text = numberText).build(),
        contentDescription = PlainComplicationText
            .Builder(text = "Short Text version of Number.").build()
    )
        .build()

    else -> {
        if (Log.isLoggable(TAG, Log.WARN)) {
            Log.w(TAG, "Unexpected complication type ${request.complicationType}")
        }
        null
    }
}

Dalam kode ini, kita menampilkan objek ComplicationData berdasarkan jenis detail, yaitu kita akan menampilkan ShortTextComplicationData (subclass ComplicationData) untuk jenis data SHORT_TEXT.

Jenis data tertentu mungkin menyertakan kolom yang berbeda. Misalnya, SHORT_TEXT mungkin hanya berupa bagian teks tunggal, atau judul dan teks, atau gambar monokrom dan teks (semuanya harus menyertakan deskripsi konten untuk aksesibilitas).

Untuk kasus ini, kita hanya menyetel kolom wajib diisi dan tidak ada kolom opsional. Untuk mempelajari jenis dan kolom ini lebih lanjut, tinjau dokumentasi kami.

Anda mungkin bertanya mengapa kita menggunakan pernyataan when (kapan) untuk membuat data. Nantinya, kita akan mendukung berbagai bentuk data berdasarkan jenis yang diminta sistem. Dengan menggunakan pernyataan when sekarang, kita dapat dengan mudah menambahkan jenis data baru (LONG_TEXT, RANGED_VALUE, dll.) nanti.

Terakhir, kita menampilkan null jika tidak mendukung jenis data ini.

Metode akhir akan terlihat seperti ini:

override suspend fun onComplicationRequest(request: ComplicationRequest): ComplicationData? {
    Log.d(TAG, "onComplicationRequest() id: ${request.complicationInstanceId}")

    // Retrieves your data, in this case, we grab an incrementing number from Datastore.
    val number: Int = applicationContext.dataStore.data
        .map { preferences ->
            preferences[TAP_COUNTER_PREF_KEY] ?: 0
        }
        .first()

    val numberText = String.format(Locale.getDefault(), "%d!", number)

    return when (request.complicationType) {

        ComplicationType.SHORT_TEXT -> ShortTextComplicationData.Builder(
            text = PlainComplicationText.Builder(text = numberText).build(),
            contentDescription = PlainComplicationText
                .Builder(text = "Short Text version of Number.").build()
        )
            .build()

        else -> {
            if (Log.isLoggable(TAG, Log.WARN)) {
                Log.w(TAG, "Unexpected complication type ${request.complicationType}")
            }
            null
        }
    }
}

Menjalankan kembali aplikasi

Di langkah pertama, Anda telah mempelajari cara menginstal layanan data detail di perangkat atau emulator. Sekarang saatnya melakukannya lagi. Instal aplikasi Anda dan pilih ulang detail, dengan menggeser tampilan jam, memilih roda gigi, membuka detail yang sama, lalu memilih Complications Data Source Codelab. Anda akan melihat yang seperti ini:

caae484f1f2508fd.png

Ringkasan

Di langkah ini, Anda telah mempelajari:

  • Cara menentukan jenis data yang dapat didukung oleh sumber Anda
  • Seberapa sering data Anda harus diminta saat detail yang aktif menggunakannya
  • Tempat mengekspos data Anda ke Wear OS

Berikutnya

Mari kita coba mendukung jenis data lain.

3. Memicu Pembaruan Data Detail

Langkah kode 3

Pada langkah ini, kita akan memicu pembaruan data saat pengguna mengetuk detail.

Jika suatu saat Anda bingung dengan konsep yang dibahas di sini, lihat modul complete lalu lihat bagaimana langkah-langkah ini dapat diterapkan.

Menentukan seberapa sering detail harus memuat ulang data

Buka file AndroidManifest.xml dan lihat lagi layanan CustomComplicationDataSourceService .

Perhatikan kolom UPDATE_PERIOD_SECONDS di elemen meta-data. Kolom ini menentukan seberapa sering sistem perlu memeriksa pembaruan data saat sumber data Anda aktif.

Saat ini, disetel ke 600 detik (10 menit). Karena kita ingin mengupdate detail sebagai respons terhadap tindakan pengguna, kita perlu mengupdatenya lebih sering. Meskipun kita dapat mengurangi periode ini, sistem mungkin tidak memicu update untuk periode yang lebih singkat dari beberapa menit.

Pendekatan yang lebih baik adalah "push style" yang memberi tahu sistem untuk mengupdate tepat saat data berubah.

Ubah frekuensi update dari 600 menjadi 0, yang mengindikasikan bahwa kita akan langsung melakukan ping ke sistem saat data berubah, bukan mengandalkan update berkala. Perhatikan bahwa meta-data adalah persyaratan.

<meta-data
    android:name="android.support.wearable.complications.UPDATE_PERIOD_SECONDS"
    android:value="0"/>

Memberi tahu sistem bahwa data detail baru tersedia

Buka ComplicationTapBroadcastReceiver.kt. Class BroadcastReceiver ini akan memperbarui data detail saat dipicu. (Ingat, kita hanya menyimpan data ke DataStore).

Class ini juga menawarkan metode helper yang membuat PendingIntent (memicunya sebagai BroadcastReceiver).

Saat ini, metode onReceive() akan mengekstrak sumber data dan ID detail dari intent, serta memperbarui bilangan bulat di DataStore. Kita perlu memberi tahu detail bahwa data telah diperbarui.

Pindah ke bagian bawah metode onReceive(). Di atas blok terakhir, Anda akan melihat komentar "Request an update for the..." Salin dan tempel kode di bawah komentar tersebut.

// Request an update for the complication that has just been tapped, that is,
// the system call onComplicationUpdate on the specified complication data
// source.
val complicationDataSourceUpdateRequester =
    ComplicationDataSourceUpdateRequester.create(
        context = context,
        complicationDataSourceComponent = dataSource
    )
complicationDataSourceUpdateRequester.requestUpdate(complicationId)

Hal ini akan memberi tahu Wear OS bahwa data detail telah diperbarui. Kita memerlukan tiga data agar metode ini berfungsi:

  • context - Context tersedia sebagai argumen untuk metode ini: onReceive().
  • complicationDataSourceComponent - DataSource detail Anda diteruskan sebagai Extra dari PendingIntent yang memicu BroadcastReceiver ini.
  • complicationId - Bilangan bulat unik yang ditetapkan oleh tampilan jam untuk lokasi detail. int diteruskan sebagai Extra dari PendingIntent yang memicu BroadcastReceiver ini.

Kita telah menyelesaikan langkah ini dan metode akhir Anda akan terlihat seperti ini:

override fun onReceive(context: Context, intent: Intent) {

    // Retrieve complication values from Intent's extras.
    val extras = intent.extras ?: return
    val dataSource = extras.getParcelable<ComponentName>(EXTRA_DATA_SOURCE_COMPONENT) ?: return
    val complicationId = extras.getInt(EXTRA_COMPLICATION_ID)

    // Required when using async code in onReceive().
    val result = goAsync()

    // Launches coroutine to update the DataStore counter value.
    scope.launch {
        try {
            context.dataStore.edit { preferences ->
                val currentValue = preferences[TAP_COUNTER_PREF_KEY] ?: 0

                // Update data for complication.
                val newValue = (currentValue + 1) % MAX_NUMBER

                preferences[TAP_COUNTER_PREF_KEY] = newValue
            }

            // Request an update for the complication that has just been tapped, that is,
            // the system call onComplicationUpdate on the specified complication data
            // source.
            val complicationDataSourceUpdateRequester =
                ComplicationDataSourceUpdateRequester.create(
                    context = context,
                    complicationDataSourceComponent = dataSource
                )
            complicationDataSourceUpdateRequester.requestUpdate(complicationId)
        } finally {
            // Always call finish, even if cancelled
            result.finish()
        }
    }
}

Menambahkan tindakan ketuk ke detail

BroadcastReceiver tidak hanya memperbarui data, tetapi juga memberi tahu sistem bahwa data baru telah tersedia (lihat langkah sebelumnya). Kita perlu menambahkan tindakan ketuk ke detail untuk memicu BroadcastReceiver.

Buka CustomComplicationDataSourceService.kt dan pindahkan ke bawah ke metode onComplicationRequest().

Di bawah pernyataan Log.d() pertama dan di atasnya jika bilangan bulat diambil dari DataStore, salin/tempel kode di bawah:

// Create Tap Action so that the user can trigger an update by tapping the complication.
val thisDataSource = ComponentName(this, javaClass)
// We pass the complication id, so we can only update the specific complication tapped.
val complicationPendingIntent =
    ComplicationTapBroadcastReceiver.getToggleIntent(
        this,
        thisDataSource,
        request.complicationInstanceId
    )

Ingat kembali dari langkah sebelumnya bahwa kita memerlukan data ini agar BroadcastReceiver berfungsi (sumber data dan ID detail). Kita meneruskan keduanya di sini sebagai tambahan dengan PendingIntent.

Selanjutnya, kita perlu menetapkan PendingIntent ke peristiwa ketuk untuk detail.

Temukan pernyataan when untuk ST dan tambahkan baris ini di atas panggilan .build().

    .setTapAction(complicationPendingIntent)

Blok kode sekarang akan terlihat seperti ini.

ComplicationType.SHORT_TEXT -> ShortTextComplicationData.Builder(
    text = PlainComplicationText.Builder(text = numberText).build(),
    contentDescription = PlainComplicationText
        .Builder(text = "Short Text version of Number.").build()
)
    .setTapAction(complicationPendingIntent)
    .build()

Kita hanya menambahkan satu baris, metode .setTapAction() yang menetapkan PendingIntent baru ke tindakan ketuk untuk detail.

Kita sudah menyelesaikan langkah ini. Metode akhir akan terlihat seperti ini:

override suspend fun onComplicationRequest(request: ComplicationRequest): ComplicationData? {
    Log.d(TAG, "onComplicationRequest() id: ${request.complicationInstanceId}")

    // Create Tap Action so that the user can trigger an update by tapping the complication.
    val thisDataSource = ComponentName(this, javaClass)
    // We pass the complication id, so we can only update the specific complication tapped.
    val complicationPendingIntent =
        ComplicationTapBroadcastReceiver.getToggleIntent(
            this,
            thisDataSource,
            request.complicationInstanceId
        )

    // Retrieves your data, in this case, we grab an incrementing number from Datastore.
    val number: Int = applicationContext.dataStore.data
        .map { preferences ->
            preferences[TAP_COUNTER_PREF_KEY] ?: 0
        }
        .first()

    val numberText = String.format(Locale.getDefault(), "%d!", number)

    return when (request.complicationType) {

        ComplicationType.SHORT_TEXT -> ShortTextComplicationData.Builder(
            text = PlainComplicationText.Builder(text = numberText).build(),
            contentDescription = PlainComplicationText
                .Builder(text = "Short Text version of Number.").build()
        )
            .setTapAction(complicationPendingIntent)
            .build()

        else -> {
            if (Log.isLoggable(TAG, Log.WARN)) {
                Log.w(TAG, "Unexpected complication type ${request.complicationType}")
            }
            null
        }
    }
}

Menjalankan kembali aplikasi

Instal aplikasi Anda dan pilih ulang detail, dengan menggeser tampilan jam, memilih roda gigi, membuka detail yang sama, lalu memilih sumber Complications Data Source Codelab. Anda akan melihat hal yang sama seperti yang Anda lihat sebelumnya. Namun, sekarang Anda dapat mengetuk detail dan data akan diperbarui.

a9d767e37161e609.png

Ringkasan

Di langkah ini, Anda telah mempelajari:

  • Cara memberi tahu sistem bahwa data detail Anda telah diperbarui
  • Cara mengaitkan PendingIntent ke tindakan ketuk pada detail Anda

Berikutnya

Mari kita coba mendukung jenis data lain.

4. Mengekspos Data Teks Panjang

Langkah kode 4

Saat kita mengekspos data ke detail, sebaiknya dukung lebih banyak jenis data, dan lihat berbagai tampilan jenis data dalam detail.

Menentukan jenis data berbeda yang didukung

Buka file AndroidManifest.xml lagi dan lihat deklarasi layanan CustomComplicationDataSourceService .

Ubah elemen meta-data SUPPORTED_TYPES dari SHORT_TEXT menjadi LONG_TEXT. Perubahan Anda akan terlihat seperti ini:

<meta-data
    android:name="android.support.wearable.complications.SUPPORTED_TYPES"
    android:value="LONG_TEXT"/>

Menambahkan dukungan untuk TEKS PANJANG

Buka CustomComplicationDataSourceService.kt, pindahkan ke bawah ke pernyataan when dalam metode onComplicationRequest(), lalu tambahkan kode berikut di bawah akhir kasus TYPE_SHORT_TEXT dan di atas kasus default.

ComplicationType.LONG_TEXT -> LongTextComplicationData.Builder(
    text = PlainComplicationText.Builder(text = "Number: $numberText").build(),
    contentDescription = PlainComplicationText
        .Builder(text = "Long Text version of Number.").build()
)
    .setTapAction(complicationPendingIntent)
    .build()

Pernyataan when akan terlihat seperti ini:

return when (request.complicationType) {

    ComplicationType.SHORT_TEXT -> ShortTextComplicationData.Builder(
        text = PlainComplicationText.Builder(text = numberText).build(),
        contentDescription = PlainComplicationText
            .Builder(text = "Short Text version of Number.").build()
    )
        .setTapAction(complicationPendingIntent)
        .build()

    ComplicationType.LONG_TEXT -> LongTextComplicationData.Builder(
        text = PlainComplicationText.Builder(text = "Number: $numberText").build(),
        contentDescription = PlainComplicationText
            .Builder(text = "Long Text version of Number.").build()
    )
        .setTapAction(complicationPendingIntent)
        .build()

    else -> {
        if (Log.isLoggable(TAG, Log.WARN)) {
            Log.w(TAG, "Unexpected complication type ${request.complicationType}")
        }
        null
    }
}

Anda mungkin memperhatikan bahwa kita hanya mengemas ulang data yang sama dalam format baru. Mari kita lihat tampilannya.

Cara memeriksa progres dan debug

Instal layanan Anda, tetapi kali ini pilih detail slot bawah sebelum memilih sumber layanan detail:

518b646d3c3f3305.png

Anda akan melihat seperti gambar di bawah. Perhatikan bahwa setiap detail disimpan dengan kunci terpisah, sehingga Anda mungkin melihat nilai yang berbeda jika telah menyetel detail tersebut di beberapa lokasi:

17ec0506f1412676.png

Ringkasan

Di langkah ini, Anda telah mempelajari tentang:

  • Mengubah dan mendukung jenis data detail yang berbeda

Berikutnya

Kita ingin mendukung satu jenis data tambahan sebelum menggabungkan semuanya.

5. Mengekspos Data Teks Rentang

Langkah kode 5

Sambil mengekspos data ke detail, mari kita lanjutkan melihat cara mendukung lebih banyak jenis data.

Menentukan jenis data berbeda yang didukung

Buka file AndroidManifest.xml lagi dan lihat layanan CustomComplicationDataSourceService .

Ubah elemen meta-data SUPPORTED_TYPES menjadi RANGED_VALUE. Perubahan Anda akan terlihat seperti ini:

<meta-data
    android:name="android.support.wearable.complications.SUPPORTED_TYPES"
    android:value="RANGED_VALUE"/>

Menambahkan dukungan untuk NILAI RENTANG

Nilai rentang tidak hanya dapat menampilkan teks, tetapi juga menampilkan visual yang menunjukkan seberapa jauh nilai Anda berada di antara nilai minimum dan maksimum. Jenis detail ini cocok untuk menunjukkan sisa daya baterai di perangkat atau jumlah langkah yang tersisa untuk memenuhi target Anda.

1fe1943a5ad29076.png

Buka CustomComplicationDataSourceService .kt, pindahkan kursor ke bawah ke pernyataan when dalam metode onComplicationRequest(), lalu tambahkan kode ini di bawah kasus TYPE_LONG_TEXT dan di atas kasus default:

ComplicationType.RANGED_VALUE -> RangedValueComplicationData.Builder(
    value = number.toFloat(),
    min = 0f,
    max = ComplicationTapBroadcastReceiver.MAX_NUMBER.toFloat(),
    contentDescription = PlainComplicationText
        .Builder(text = "Ranged Value version of Number.").build()
)
    .setText(PlainComplicationText.Builder(text = numberText).build())
    .setTapAction(complicationPendingIntent)
    .build()

Pernyataan when Anda akan terlihat seperti ini:

return when (request.complicationType) {

    ComplicationType.SHORT_TEXT -> ShortTextComplicationData.Builder(
        text = PlainComplicationText.Builder(text = numberText).build(),
        contentDescription = PlainComplicationText
            .Builder(text = "Short Text version of Number.").build()
    )
        .setTapAction(complicationPendingIntent)
        .build()

    ComplicationType.LONG_TEXT -> LongTextComplicationData.Builder(
        text = PlainComplicationText.Builder(text = "Number: $numberText").build(),
        contentDescription = PlainComplicationText
            .Builder(text = "Long Text version of Number.").build()
    )
        .setTapAction(complicationPendingIntent)
        .build()

    ComplicationType.RANGED_VALUE -> RangedValueComplicationData.Builder(
        value = number.toFloat(),
        min = 0f,
        max = ComplicationTapBroadcastReceiver.MAX_NUMBER.toFloat(),
        contentDescription = PlainComplicationText
            .Builder(text = "Ranged Value version of Number.").build()
    )
        .setText(PlainComplicationText.Builder(text = numberText).build())
        .setTapAction(complicationPendingIntent)
        .build()

    else -> {
        if (Log.isLoggable(TAG, Log.WARN)) {
            Log.w(TAG, "Unexpected complication type ${request.complicationType}")
        }
        null
    }
}

Sekali lagi, kita hanya mengemas ulang data yang sama dalam format baru. Mari kita lihat tampilannya.

Cara memeriksa progres dan debug

Instal layanan Anda, lalu pilih lokasi lain.

461f8a704fbc6496.png

Sekarang Anda akan melihat tampilan seperti ini:

ffa6ea8f2ed3eb2a.png

Anda dapat melihat lingkaran radial di sekitar angka yang menyoroti 3/20 bagian lingkaran.

Ringkasan

Di langkah ini, Anda telah mempelajari tentang:

  • Mengubah dan mendukung jenis data detail yang berbeda

Berikutnya

Kita mengakhiri codelab dengan mengaktifkan semua variasi jenis data.

6. Mengekspos Ketiga Jenis Data

Langkah kode 6

Sekarang sumber data detail kita mendukung tiga variasi data (RANGED_VALUE, SHORT_TEXT, dan LONG_TEXT).

Di langkah terakhir ini, kita akan memberi tahu sistem bahwa kita mendukung ketiga variasi tersebut.

Menentukan beberapa jenis data yang didukung

Buka file AndroidManifest.xml lagi dan lihat layanan CustomComplicationDataSourceService .

Ubah elemen meta-data SUPPORTED_TYPES menjadi RANGED_VALUE,SHORT_TEXT,LONG_TEXT. Sekarang elemen akan terlihat seperti ini:

<meta-data
    android:name="android.support.wearable.complications.SUPPORTED_TYPES"
    android:value="RANGED_VALUE,SHORT_TEXT,LONG_TEXT"/>

Memeriksa progres

Instal layanan Anda.

b3a7c0c8063c2f60.png

Dalam hal ini, tampilan jam lebih memilih jenis data rentang daripada jenis teks pendek atau panjang, tetapi jika detail hanya mendukung jenis teks pendek, data akan tetap muncul karena tampilan jam mendukung ketiga jenis data tersebut. Perlu diingat bahwa tampilan jam sendiri menentukan jenis data yang didukung detail, dan urutan preferensi jenis tersebut.

Ringkasan

Di langkah ini, Anda telah mempelajari tentang:

  • Mendukung beberapa jenis data detail

7. Selesai! Apa selanjutnya?

Ada banyak jenis data lainnya yang dapat Anda dukung dalam detail (termasuk gambar kecil, gambar besar, dan ikon). Coba perluas codelab ini dengan menerapkan sendiri beberapa jenis tersebut.

Untuk detail selengkapnya tentang mengembangkan detail untuk tampilan jam dan membuat sumber data detail, buka Detail Tampilan Jam

Untuk detail selengkapnya tentang mengembangkan tampilan jam Wear OS, kunjungi https://developer.android.com/training/wearables/watch-faces/index.html