Android Untuk Pemula
Android Untuk Pemula
Oleh:
Lailatul Badria D.A.A
180411100149
Pembimbing:
Devie Rosa Anamisa, S.Kom., M.Kom.
Menyetujui ,
Dosen Pembimbing,
Mengetahui,
Koordinator Kerja Praktek
3
KATA PENGANTAR
Buku ini dibuat sebagai media untuk mempelajari android. Buku
ini dibuat untuk siapapun yang ingin menjadi Pengembang
Aplikasi berbasis Android. Karena pada buku ini akan dipandu
mulai dari proses pengenalan tools Android Studio dan bahasa
pemrograman kotlin yang kini menjadi First Class Language
(Bahasa kelas utama) .
Pada buku ini anda juga akan dipandu dalam proses instalasi
tools JDK dan Android Studio serta langkah-langkah membuat
aplikasi Pariwisata Madura.
Penulis
4
DAFTAR ISI
LEMBAR KESEPAKATAN...............................................................................ii
LEMBAR PENGESAHAN................................................................................iii
KATA PENGANTAR.........................................................................................iv
DAFTAR ISI........................................................................................................v
BAB 2 ACTIVITY..........................................................................................16
BAB 3 INTENT.............................................................................................. 24
4.1. Teori....................................................................................................37
DAFTAR PUSTAKA.........................................................................................91
6
BAB 1
PENGENALAN ANDROID STUDIO
Pada tahun 2013, Android menjadi sistem operasi (OS) terlaris untuk tablet
dan smartphone. Android kini memiliki setidaknya 70 pangsa pasar dalam total
penjualan smartphone global (statisca.com).
Versi android mulai pertama android Astro muncul hingga sekarang ini
banyak versi dari tahun ke tahun, versi android di upgrade untuk memenuhi
kebuhan yang lebih canggih lagi dan mulai dari awal hingga sekarang ini android
masih memiliki banyak peminat dari tahun 2008 hingga sekarang seperti table
dibawah ini.
1. Java
Java merupakan salah satu Bahasa yang digunakan oleh development
Android. Dan ada juga beberapa Bahasa lain yang digunakan seperti C/C++, Go,
dan juga Kotlin. Pada tutorial ini kita akan focus menggunakan Bahasa Kotlin dan
Java sebagai Bahasa pemrograman. Oleh karena itu kita harus menginstall
software apa saja yang akan kita gunakan.
Pertama kita download jdk terlebih dahulu, anda dapat mendownload jdk
ini di website resmi Oracle. Pilihlah link download sesuai dengan OS
yang Anda pakai.
9
Gambar 1.1 Web JDK
Anda akan diminta untuk login, jika belum memiliki akun silahkan
mendaftar terlebih dahulu.
2. Android Studio
Pada tutorial kali ini kita akan belajar Langkah-langkah untuk menginstall
Android studio.
Download Android studio
10
Hal pertama yang dilakukan adalah mendownload file Android Studio.
Anda bisa mendownload file Android Studio di website resmi Developers
Android. Klik tombol ‘Download Android Studio’ kemudian tunggu proses
download selesai.
11
Gambar 1.4 Setup Android Studio
Memilih Komponen Tambahan
Kemudian kita akan menambahkan komponen tambahan untuk proses
instalasi Android Studio. Kita centang ‘Android Virtual Device (AVD)’ berfungsi
untuk mengkonfigurasi perangkat yang dijalankan menggunakan emulator
Android. Sesuaikan komponen tambahan yang di pilih seperti contoh gambar
dibawah ini.
12
Menentukan Lokasi Instalasi
Selanjutnya kita pilih lokasi untuk instalasi Android Studio pada
computer anda. Pada buku tutorial ini untuk lokasi instalasi berada di C:\
Program Files\Android\Android Studio. Setelah menentukan lokasi instalasi
Android Studio, kemudian klik ‘Next’ untuk melanjutkan instalasi.
13
Gambar 1.7 Memilih folder menu
Memulai Proses Instalasi
Selanjutnya proses instalasi Android Studio sudah bisa dimulai. Contoh
gambar dibawah ini merupakan proses instalasi Android Studio, tunggu sampai
proses intalasi selesai. Klik Next lalu Finish.
14
1.4 Pengenalan Project Pada Android Studio
15
Memilih Template yang akan kita gunakan
16
Gambar 1.11 Rename project
17
Gambar diatas merupakan tampilan full dari IDE Android Studio berbasis IntelliJ
IDEA. Tampilan yang ada pada layar anda mungkin saja berbeda dengan
tampilan diatas, karena perbedaan konfigurasi dan versi dari Android Studio.
Tools
Merupakan tools yang sering digunakan development seperti ketika
copy/paste, build program, running aplikasi, dan juga menjalankan emulator.
Navigasi
Ini membantu untuk melihat struktur dan lokasi dimana file disimpan.
Status Bar
Status Bar ini berada pada bagian paling bawah dalam Android Studio,
status bar ini memiliki fungsi jika ada menampilkan status proyek kita dan pesan
peringatan.
18
Gambar 1.16 Status Bar
3. Struktur Project
Setiap proyek di Android Studio berisi satu atau beberapa modul dengan
file sumber dan file sumber daya. Jenis modul mencakup modul aplikasi Android,
modul library, dan modul Google App Engine.
Secara default, Tampilan berkas project pada project Android Studio akan
sama seperti gambar dibawah ini.
Android Manifest
19
Salah satu berkas Android Studio yang paling penting adalah manifest.
Manifest berfungsi untuk menyampaikan informasi penting kepada sistem
Android, karena sistem perlu mengetahui apa saja yang digunakan oleh aplilkasi
sebelum aplikasi tersebut dijalankan.
Java
Adalah salah satu folder yang paling sering digunakan, dimana folder ini
berisi file-file source code yang sudah kita buat dalam Bahasa Java maupun
Kotlin.
Res / Resource
Folder res ini berisi beberapa folder yang dikelompokkan ke dalam
kategori sesuai kebutuhan, seperti:
Gradle
Gradle merupakan sebuah program yang biasa melakukan sebuah build
dengan otomatis. Gradle biasa juga disebut sebagai build-tool. Build disini bisa
diartikan sebagai melakukan compile dan juga packaging.
21
BAB 2
ACTIVITY
22
email pada aplikasi gmail pada ponsel Android. Didalamnya Anda dapat
berinteraksi dengan aplikasi Anda, baik dengan menekan tombola tau
menampilkan list.
Seperti ketika kita membuat project baru pada Android Studio, biasanya
terdapat dua file yang otomatis sudah ada, yaitu MainActivity dan
activity_main.xml. MainActivity ini disebut sebagai class Activity karena
mewarisi (extends) superclass Activity. Yang bertugas untuk menampilkan layout
dari activity_main.xml dan juga mengelola interaksi yang ada di dalamnya.
Umumnya pada sebuah aplikasi terdapat lebbih dari satu activity yang saling
terhubung dengan tugas yang berbeda. Yang perlu diperhatikan adalah setiap
Activity harus terdapat di AndroidManifest.xml. Secara default, ia akan
didaftarkan secara otomatis jika membuat Activity dengan cara yang benar.
Caranya yaitu klik kanan pada nama package → New → Activity → Pilih
template Activity yang tersedia.
23
2.2 Activity Lifecycle
Kita perlu mengetahui life cycle secara detail pada sebuah Activity agar
dapat melakukan tindakan yang tepat jika state Activity melakukan sebuah
perubahan. Callback methods yang ada dapat digunakan untuk melakukan
berbagai proses yang terkait dengan state dari Activity. Misal kita melakukan
semua inisialisasi komponen pada onCreate(), memutuskan koneksi ke server
pada onStop() atau onDestroy() dan seterusnya.
24
Untuk meningkatkan implementasi pada desain aplikasi anda diperlukan
pemahaman yang baik tentang alur sebuah Activity, karena hal ini dapat akan
meminimalisir terjadinya error/bug/force close yang tidak diinginkan.
Method Description
25
onRestart() Method ini dipanggil setelah Activity berhenti
dan ditampilkan ulang oleh pengguna.
Empty process, adalah sebuah proses yang dapat merubah dari aplikasi
yang digunakan oleh user seperti service dan BroadcastReciver. proses
26
ini biasanya digunakan untuk mengurangi penggunaan memori yang
berlebihan, sehingga proses untuk mengubah tampilan aplikasi tersebut
berjalan di background process dan tidak mempengaruhi performa dari
handphone.
Dalam tutorial kali ini juga, kita akan membahas juga apa itu MainActivity,
jika kalian memahami program Bahasa Java otomatis kalian juga bisa memahami
code logic yang ada pada MainActivity.java / MainActivity.kt. yang
membedakan hanyalah kumpulan class atau library nya saja.
Untuk langkah awal silahkan membut Project baru pada Android Studio,
setelah itu maka secara otomatis akan langsung diarahkan ke halaman
MainActivity.java kosong, yang mana hanya berisi halaman Hello World. Dan
seperti inilah tampilan awal dari MainActivity.java.
27
Sebagai langkah untuk tindak lanjut dari gambar diatas, perhatikan penjelasan
beberapa poin-poin dibawah ini :
MainActivity.kt
Jika kita mempunyai sebuah file dengan nama
MainActivity.java/MainActivity.kt (.java jika menggunakan Bahasa Java
dan .kt jika menggunakan Bahasa kotlin). maka kita juga harus memiliki
nama class yang sama dengan nama file.
Package com.example.myapplication
Merupakan sebuah package yang berfungsi untuk sebuah direktori dan
pengelompokan dari program java. Package ini berfungsi ketika kita akan
mengembangkan sebuah aplikasi yang kompleks sehingga kita akan
membutuhkan banyak package.
Import android.appcompat.app.AppCompatActivity
Merupakan kumpulan dari class atau library yang digunakan untuk
mewariskan semua sifat-sifat dari Super Class AppCompatActivity ke
dalam Sub Class MainACtivity, dengan cara overriding.
Import android.os.Bundle
Kumpulan class atau library dari Bundle digunakan untuk meneruskan
atau membagi data antar activity dan juga untuk komponen dari aplikasi
lainnya pada Android. Dimana pada seperti gambar diatas, yang
digunakan untuk menyimpan sebuah state dari aplikasi yang sedang
dijalankan.
class MainActivity : AppCompatActivity() {
28
fungsi dari code diatas adalah kita mempunya sebuah Sub Class yang
Bernama MainActivity yang digunakan untuk mewariskan sifat-sifat yang
ada dalam Super Class AppCompatActivity.
Override
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
BAB 3
INTENT
29
Melakukan sinkronisasi terhadap server dan menjalankan proses berulang
(periodic/scheduler task) yaitu dengan menjalankan sebuah background
service.
1. Explicit Intent
Merupakan intent yang berfungsi untuk jalannya sebuah komponen dari
dalam sebuah aplikasi. Explicit intent bekerja dengan menggunakan nama kelas
yang dituju. Biasanya intent digunakan untuk mengaktifkan sebuah komponen
pada satu aplikasi.
Lalu mengapa disebut dengan Explicit Intent? Karena tujuannya sudah
jelas (explicit), missal dari MainActivity menuju ke DetailActivity. Tidak ada
pilihan lain.
30
Gambar 3.1 Gambaran explicit intent
Berikut adalah contoh kode dari gambaran Explicit Intent menggunakan Bahasa
Kotlin.
startActivity(moveIntent)
2. Implicit Intent
Merupakan tipe intent yang tidak memerlukan detail nama kelas yang
ingin diaktifkan. Model ini membuat kemungkinan komponen dari sebuah
aplikasi lain dapat merespon request intent yang akan dijalankan. Pada umumnya
penggunaan tipe intent ini diperuntukkan untuk menjalankan fitur/fungsi dari
31
komponen aplikasi lain. Contohnya ketika kita membutuhkan seuah fitur untuk
mengambil foto. Lebih baik kita menggunakan aplikasi bawaan yang sudah
terinstal pada peranti, dari pada kita membuat sendiri fungsi dari kamera tersebut.
Lalu mengapa disebut Implicit Intent? Hal ini karena memiliki tujuan
yang belum jelas (implicit), misalnya kita ingin membuka gallery, maka
pilihannya yaitu bisa menggunakan default gallery atau menggunakan Google
Photos. Jika terdapat aplikasi lainnya yang dapat menangani aksi ini, maka
aplikasi tersebut akan muncul.
32
val galleryIntent = Intent(Intent.ACTION_PICK)
galleryIntent.setType("image/*")
startActivityForResult(Intent.createChooser(galleryInte
nt, "Select Picture"), SELECT_PICTURE)
Buat project baru di Android Studio dengan kriteria seperti dibawah ini:
33
Gambar 3.4 Code activity_main.xml
36
Selanjutnya kita akan menambahkan obyek intent pada MainActivity.kt
seperti baris yang ditebalkan dibawah ini.
37
Gambar 3.9 Hasil running Activity 2
Pada tutorial diatas kita sudah tau dan bisa bagaimana cara memindahkan
suatu Activity dengan membawa sebuah data. Dah hal tersebut sangatlah penting
kita pelajari karena ketika kita mengembangkan suatu aplikasi Android yang
kompleks, aka nada banyak Activity yang akan terlibat.
1. Konstanta
38
Konstanta merupakan variable yang memiliki nilai tetap. Biasanya
digunakan sebagai key (kunci) yang digunakan untuk mengirim dan juga
menerima data.
2. Put Extra
Perhatikan contoh code dibawah ini.
39
Hal paling mendasar untuk membedakan antara memindahkan Activity
dengan membawa data atau tidak yaitu dengan cara menempatkan data ke obyek
Intent pada baris ini.
putExtra() mendukung hamper semua tipe data untuk sebuah input value.
moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_
NAME, "Contoh teks");
41
4.1. Teori
43
Gambar 4.1 Komponen view
Viewgroup adalah objek yang berisi objek-objek view dan viewgroup itu
sendiri sehingga terbentuk sebuah tampilan aplikasi yang utuh. Contoh komponen
dari viewgroup adalah:
LinearLayout
android:orientation=”vertical”
android:orientation=”horizontal”
44
Gambar 4.3 Linearlayout horizontal
FrameLayout
45
RelativeLayout
TableLayout
46
Gambar 4.6 Table layout
Dimana susunan komponennya berada dalam baris dan kolom. Yang mana
layout jenis ini tidak akan menampilkan garis pembatas untuk baris, kolom,
maupun cell-nya.
47
Gambar 4.8 Komponen view dan viewgroup
Dibawah ini merupakan contoh dalam tampilan file layout xml untuk menerapkan
kolaborasi view dan viewgroup :
48
merupakan komponen paling sering digunakan untuk menjadi parent/root dari
komponen view seperti linearlayout, relativelayout, framelayout, dan tablelayout.
2. Lalu kita buka file build.gradle (Module: app) dan tambahkan satu baris
code dibawah ini pada bagian “dependencies”.
implementationa'de.hdodenhof:circleimageview:
3.1.0'
49
Lalu tekan Sync Now untuk mendownload library dari CircleImageView
kedalam project android studio anda. Pastikan sebelunya laptop/pc sudah
tesambung internet.
3. Kemudian buka file strings.xml yang terletak di res values dan buat
seperti dibawah ini.
50
6. Maka tampilannya akan seperti dibawah ini
51
BAB 5
STYLE DAN THEME
Pada kali ini kita akan mempelajari apa saja prinsip-prinsip desain yang ada
di android. Kita juga akan mempelajari bagaimana cara menerapkan struktur dan
tampilan view dalam sebuah berkas style. Design Guideline menetapkan sebuah
prinsip dasar yang harus dipatuhi dalam desain interface aplikasi Android.
Guideline ini merupan prinsip yang dibuat oleh Android, diantaranya adalah:
Berikut adalah 5 langkah terbaik (best practice) yang perlu diingat ketika
ingin mengembangkan aplikasi Android , diantaranya:
53
5. Desain untuk efisiensi penggunaan koneksi jaringan.
5.3. Teori Style dan Theme
Jika anda pernah mengembangkan sebuah aplikasi berbasis web, maka pasti
sudah tidak asing lagi dengan CSS (Cascanding Style Sheet). CSS adalah tempat
untuk mengatur sebuah tampilan untuk halaman web, tapi jika pada android
dinamakan style. Style adalah sekumpulan properti yang dibutuhkan untuk
mendefinisikan bagaimana sebuah komponen pada view dan activity maupun
fragment ditampilkan. Contoh property disini adalah height, width, background
color.
Style didefinisikan dalam file XML sendiri. Anda dapat menemukannya di res ->
values -> styles.xml. Misalnya, Anda memiliki textview dengan beberapa atribut,
seperti yang diperlihatkan dalam kode contoh berikut. Textview ini dapat
digunakan untuk menampilkan informasi detail yang terdapat dalam keseluruhan
aplikasi.
3. Semua atribut yang ditentukan dalam style harus disertakan dalam tag
item.
<itemgname="android:layout_width">match_paren
t</item>
Name : nama atribut yang ingin didefinisikan
Match_parent : nilai dari atribut yang sudah kita definisikan.
55
Misalnya, Anda ingin membuat instance style yang Anda buat dalam suatu
situasi. Misalnya, jika Anda ingin style CodeFont menjadi merah, Anda dapat
melakukan seperti dibawah ini:
android:theme="@style/Theme.MyViewAndViews"
56
Styles yang inherit dari varian DayNight yang memiliki tema
MaterialComponents dan memiliki DarkActionBar. Semua nilai pada atribut ada
di dalam file colors.xml yang berisi.
57
BAB 6
RECYCLERVIEW
58
Gambar 6.1 Perbedaan ListView dan RecyclerView
Apa dampaknya? Mungkin jika datanya sedikit tidak terlihat, tapi bagaimana
jika datanya 1000? Tentunya dengan menggunakan RecyclerView membuat
aplikasi lebih hemat dan tidak memakan memori. Sebenarnya, masalah dengan
ListView dapat diselesaikan dengan menggunakan ViewHolder pattern, tetapi
tidak diperlukan untuk menggunakannya di ListView. Berbeda dengan
RecyclerView, yang membutuhkan penggunaan ViewHolders. Selanjutnya, lihat
gambar implementasi RecyclerView berikut:
59
Gambar 6.2 Komponen RecyclerView
3. Dataset: Kumpulan data yang Anda miliki dan yang ingin Anda lihat. Ini
bisa berupa array, list, atau objek map.
60
4. Item Animator: Ini adalah sesuatu yang istimewa. Kita dapat
menambahkan animasi ke elemen apa pun di dalamnya. Contoh animasi
umum adalah menambahkan (add) dan menghapus (removal) elemen.
Logika
Klik ke button → memanggil fragment atau activity dengan atau tanpa
data → menampilkan activity atau fragment yang dituju.
Codelab
1. Buat project baru di Android Studio dengan kriteria sebagai berikut:
62
Sehingga file build.gradle(module: app) akan seperti dibawah ini:
63
Akan ada tanda merah di @layout/item_row_hero. Ini karena layout
item_row_hero belum ditambahkan.
4. Saatnya kita membuat elemen view berupa file XML layout yang akan
ditampilkan di RecyclerView. Karena data didaftar terlebih dahulu, mari
buat tata letak dengan mengklik kanan layout → new → layout resource
file, lalu beri nama item_row_hero Jangan lupa ubah RootElement
menjadi LinearLayout.
64
Gambar 6.4 Elemen view
65
Tools:text yang bisa kita gunakan untuk placeholder yang nantinya ada
didalam editor pada layout. Atribut ini tidak akan terbawa saat runtime
dan hanya akan ditampilkan pada preview editor saja.
Catatan :
Pastikan kita menggunakan wrap_content untuk android:layout_height,
jadi ketika kita menjalankan aplikasi tidak ada layout kosong atau space
lebar karena penggunaan match_parent, hal ini karena 1 itemnya
dihitung 1 layar.
Ketika terjadi sebuah error pada bagian @string/heroes_name dan
@string_from. Maka yang perlu kita lakukan adalah menambahkan
string pada bagian res → values → strings.xml.
66
6. Kemudian kita akan membuat sebuah class baru dengan nama Hero
dengan cara klik kanan pada nama package → new → Java/kotlin class.
7. Karena pada latihan ini kita akan menampilkan gambar pahlawan, maka
silahkan download foto pahlawan dan letakkan pada folder drawable.
Catatan:
67
Untuk penamaan file gambarnya yang ada di drawable harus
menggunakan huruf kecil dan underscore saja.
8. Kemudian kita akan membuat beberapa kelas untuk koleksi data yang
akan kita tampilkan.
Lalu kita akan membuat object baru dengan cara yang sama seperti point
6 dengan nama HeroesData.
68
69
9. Sekarang kita akan membuat sebuah class yang akan memformat tiap
elemen dari koleksi data ditampilkan. Lalu kita buat class baru dengan
cara yang sama seperti point 6 dan beri nama ListHeroAdapter.
Setelah class berhasil dibuat, maka tambahkan code seperti dibawah ini:
Ketika ada garis merah pada ListviewHolder, lalu kita tekan alt+enter
pada ListviewHolder kemudian pilih Create class ‘ListviewHolder’.
70
Maka kode saat ini menjadi seperti ini:
71
Maka code nya akan menjadi seperti ini:
72
10. Masih ada garis merah kita lakukan lagi alt+enter / klik tombol
merah dan pilih Create constructor matching super(Java) atau Add
constructor paremeter from ViewHolder(View).
73
Setelah itu kita dapat menyelesaikan code yang dihasilkan dari turunan
RecyclerView.Adapter. Kode lengkap untuk kelas ListHeroAdapter
adalah sebagai berikut:
74
Anda akan berbeda (mis. induk, bukan viewGroup), sesuaikan dengan
nama parameter atau variabel.
13. Lalu kita panggil data yang telah kita buat di class HeroesData.
75
14. Dan aplikasi kurang lebihnya akan seperti ini.
BAB 7
SISTEM INFORMASI PARIWISATA MADURA
BERBASIS ANDROID
Aplikasi ini merupakan aplikasi yang menampilkan informasi pariwisata apa saja
yang ada di madura. Dimana didalamnya terdapat Nama wisata, lokasi, harga
tiket, dan sedikit penjelasan tentang wisata yang ingin dikunjungi. Berikut
langkah-langkah pembuatan aplikasinya.
76
1. Kita buat project baru dengan kriteria seperti dibawah ini:
3. Untuk mengatasi font merah diatas maka kita akan membuat file xml baru
dengan cara klik kanan pada folder layout → New→ Layout Resource
File.
77
Lalu beri nama item_cardview_wisata.
78
79
4. Selanjutnya kita ke halaman MainActivity.kt dan tambahkan code seperti
dibawah ini.
Untuk mengatasi tulisan merah pada wisata maka kita akan membuat
sebuah class baru dengan nama Wisata dengan cara klik kanan pada
package paling atas → New → Kotlin class/file.
80
6. Masih di halaman MainActivity.kt, kita tambahkan code seperti dibawah
ini
81
Selanjutya tulis code seperti dibawah ini, sebelumnya silahkan pindahkan
gambar yang diperlurlukan pada folder drawable;
82
83
Selanjutnya kita Kembali lagi ke halaman MainActivity.kt dan mengatasi font merah pada
showRecyclerCardView dengan car akita membuat function baru “create function
‘showRecyclerCardView’”.
84
7. Selanjutnya kita membuat sebuah class baru dengan klik kanan pada
package paling atas → New → Kotlin class/file → pilih “class” dan beri
nama CardViewWisataAdapter
85
8. Pada file MainActivity.kt, kita tambahkan code seperti dibawah ini pada
bagian private fun showRecyclerCardView() .
9. Kita tambahkan code seperti dibawah ini untuk memanggil detail wisata.
86
10. Kita buat activity baru dengan nama DetailWisata dengan cara klik kanan
pada package paling atas → New → Activity → pilih Empty Activity.
87
Selanjutnya kita buka file activity_detail_wisata.xml dan tambahkan code
seperti dibawah ini.
88
89
Selanjutnya kita ke file DetailWisata.kt dan tambahkan code seperti
dibawah ini.
90
11. Selanjutnya kita ke MainActivity.kt dan tambahkan code seperti dibawah
ini:
91
12. Kemudian kita membuat activity baru dengan nama AboutMe.
Setelahnya kita tambahkan code seperti dibawah ini pada
activity_about_me.xml untuk membuat tampilan halaman about me.
92
Kemudian tambahkan code seperti dibawah ini pada bagian AboutMe.kt
untuk prosesnya.
93
94
95
Tampilan ketika wisata di klik.
96
DAFTAR PUSTAKA
Enterprise, Jubilee. 2015. Mengenal Dasar-Dasar Pemrograman Android. Jakarta
Pusat:Elex Media Komputindo.
Hansun,seng dkk.2016. Pemrograman Android Dengan Android Studio Ide.
Yogyakarta:Andi Publisher.
97