Membangun aplikasi yang berjalan di profil kerja

1. Sebelum memulai

Apa itu profil kerja?

Profil kerja adalah profil sekunder yang dapat diaktifkan di perangkat pribadi pengguna saat perusahaan mengizinkan karyawannya menggunakan perangkat pribadi mereka untuk bekerja.

Profil kerja dapat dikontrol oleh admin IT dan fungsi yang tersedia untuk profil tersebut ditetapkan secara terpisah dari fungsi profil utama pengguna. Pendekatan ini memungkinkan organisasi mengontrol lingkungan tempat dijalankannya aplikasi dan data khusus perusahaan di perangkat pengguna, sekaligus tetap memungkinkan pengguna untuk menggunakan aplikasi dan profil pribadinya.

Bagaimana pengaruhnya terhadap aplikasi Anda? Semua aplikasi dapat diinstal di profil kerja. Artinya, aplikasi tersebut dapat mengalami pembatasan runtime dan perubahan perilaku. Anda juga perlu memastikan bahwa aplikasi aman jika digunakan untuk tujuan kerja. Meskipun aplikasi Anda berjalan di profil pribadi, profil kerja mungkin masih memengaruhi perilakunya.

Prasyarat

Codelab ini dirancang untuk developer Android yang memiliki keterampilan dasar hingga menengah.

Anda dianggap sudah membangun aplikasi sebelumnya, menggunakan Android Studio, dan menguji aplikasi di perangkat atau emulator.

Yang akan Anda lakukan

Dalam codelab ini, Anda akan memodifikasi aplikasi agar dapat memberikan pengalaman pengguna terbaik saat diinstal di perangkat dengan profil kerja. Anda akan mempelajari cara agar aplikasi dapat:

  • Memproses kontak pribadi & kontak bisnis secara bersamaan.
  • Beralih antara profil kerja dan profil pribadi dari dalam aplikasi itu sendiri.

caf809dbd1e16c75.png

Yang Anda butuhkan

  • Perangkat Android yang tidak dikelola (bukan milik, atau tidak dikelola oleh, organisasi).

2. Memulai persiapan

Menyiapkan perangkat pengujian

Sebaiknya gunakan perangkat fisik untuk codelab ini. Namun, Anda tetap dapat melakukan penyiapan yang sama di bawah ini pada emulator menggunakan image yang menyertakan Google Play Store.

TestDPC

Google membangun aplikasi TestDPC untuk membantu Anda menyimulasikan dan menguji lingkungan terkelola di perangkat Anda sendiri. Aplikasi ini akan menyiapkan profil kerja dan memberi Anda kontrol untuk mengaktifkan/menonaktifkan fitur tertentu di perangkat, seperti yang dapat dilakukan oleh admin IT.

Menginstal aplikasi TestDPC

Dari perangkat, buka Google Play Store dan download aplikasi TestDPC

Menyiapkan profil kerja

Setelah aplikasi TestDPC diinstal, Anda akan melihat 2 ikon muncul di perangkat, yakni ikon penyiapan dan ikon aplikasi TestDPC. Ketuk ikon penyiapan dan ikuti langkah-langkahnya.

Sekarang Anda memiliki dua profil terpisah, yakni satu untuk aplikasi pribadi dan satu untuk aplikasi kerja. Anda dapat beralih di antara keduanya melalui tab di bagian atas daftar aplikasi.

Perhatikan bahwa setiap profil memiliki aplikasi Play Store sendiri. Anda dapat mengidentifikasi aplikasi kerja dari gambar koper kecil di atas ikon peluncur.

46175af7ad32979d.gif

Anda dapat menginstal aplikasi melalui Play Store seperti biasa, dan bergantung pada Play Store yang Anda luncurkan (pribadi vs. kerja), aplikasi hanya akan diinstal di profil tersebut. Aplikasi juga dapat berada di kedua profil bila diinstal dari kedua Play Store. Dalam hal ini, setiap versi aplikasi akan memiliki ruang penyimpanan dan konfigurasi yang benar-benar terpisah.

Cara menginstal aplikasi pada profil tertentu

Pada paragraf berikut, kita akan memeriksa cara beralih antara profil default dan profil kerja dengan class CrossProfileApps. Untuk mengonfirmasi perilaku tersebut, aplikasi harus diinstal di kedua profil

Anda dapat mengonfirmasi nomor ID profil dengan perintah adb di bawah.

$ adb shell pm list users

Anda dapat menginstal aplikasi ke profil yang ditetapkan dengan perintah adb di bawah.

$ adb install --user [id number of profile] [path of apk file]

Anda bisa mendapatkan hasil yang sama, dengan mengonfigurasi Konfigurasi Run/Debug di project dengan memilih opsi "Install for all users".

7634e3dcb0a744ca.png

Saat mengupdate aplikasi dengan menjalankannya dari Android Studio, aplikasi akan diinstal di kedua profil.

3. Memuat kontak

Siapkan beberapa kontak pengujian untuk digunakan dalam aplikasi demo:

  1. Luncurkan Aplikasi kontak perangkat dari profil pribadi.
  2. Tambahkan beberapa kontak pengujian yang dapat diidentifikasi sebagai kontak pribadi.
  3. Luncurkan Aplikasi kontak dari profil kerja. (Anda tidak akan melihat satu pun kontak pribadi yang baru saja ditambahkan.)
  4. Tambahkan beberapa kontak pengujian yang dapat diidentifikasi sebagai kontak bisnis.

Setelah Anda puas dengan kontak yang disiapkan, coba kode awal aplikasi demo.

4. Mendapatkan kode awal

  1. Untuk mendapatkan aplikasi contoh, coba:
  • clone repositori dari GitHub,
$ git clone https://github.com/android/enterprise-samples.git

$ cd enterprise-samples/Work-profile-codelab
  • Atau Anda dapat mendownload projectnya dari link di bawah.

Download ZIP

  1. Buka dan jalankan aplikasi di Android Studio.

Seperti inilah tampilan aplikasi saat Anda pertama kali meluncurkannya:

f9779ab476511718.png

Cobalah

Di akhir codelab ini, aplikasi Anda akan menampilkan kontak bisnis dan kontak pribadi secara bersamaan saat dijalankan di profil pribadi. Anda juga dapat beralih antar-profil dengan meluncurkan instance lain aplikasi di profil lain dari dalam aplikasi itu sendiri.

5. Menampilkan kontak kerja dan pribadi

Saat memuat kontak menggunakan ContactsContract.Contacts.CONTENT_URI, aplikasi akan menentukan kontak yang akan ditampilkan, bergantung pada profil tempat aplikasi dijalankan. Namun, dalam banyak kasus, Anda mungkin ingin aplikasi memuat kedua daftar kontak secara bersamaan. Misalnya, pengguna mungkin ingin membagikan item pribadi (foto, dokumen) kepada rekan kerja. Untuk melakukannya, Anda harus mengambil kedua daftar kontak.

Buka MainActivity.kt

Metode onCreateLoader() bertanggung jawab untuk membuat loader cursor yang akan mengambil dan memuat kontak. Saat ini, metode ini hanya menampilkan CursorLoader menggunakan ContentURI default. Anda akan memanggil metode ini dua kali, yakni sekali untuk kontak pribadi dan sekali lagi untuk kontak bisnis. Untuk membedakan keduanya, kami akan meneruskan ID berbeda ke onCreateLoader() untuk setiap kasus. Anda harus memeriksa ID yang diteruskan ke metode tersebut untuk menentukan ContentURI yang akan digunakan.

Pertama-tama, ubah nilai variabel ContentURI, bergantung pada nilai ID yang diteruskan ke metode. Dalam kasus PERSONAL_CONTACTS_LOADER_ID, tetapkan ke ContactsContract.Contacts.CONTENT_URI default. Jika tidak, Anda akan membuat ENTERPRISE_CONTENT_FILTER_URI seperti yang dijelaskan di sini.

ContactsContract.Contacts.ENTERPRISE_CONTENT_FILTER_URI
                    .buildUpon()
                    .appendPath(nameFilter)
                    .appendQueryParameter(
                        ContactsContract.DIRECTORY_PARAM_KEY,
                        ContactsContract.Directory.ENTERPRISE_DEFAULT.toString()
                    )
                    .build()

Anda akan melihat bahwa karena ini adalah Content Filter URI, builder memerlukan filter penelusuran (frasa penelusuran) untuk digunakan saat menelusuri/memuat kontak.

Untuk saat ini, lakukan hardcode frasa penelusuran dengan nama apa pun yang dimulai dengan huruf "a".

val nameFilter = Uri.encode("a") // names that start with a

Anda juga perlu menentukan direktori kontak yang akan ditelusuri. Anda akan menggunakan direktori ENTERPRISE_DEFAULT yang menelusuri kontak yang disimpan secara lokal di perangkat.

Tampilan metode onCreateLoader() akan terlihat seperti ini:

override fun onCreateLoader(id: Int, args: Bundle?): Loader<Cursor> {
        val nameFilter = Uri.encode("a") // names that start with a
        val contentURI = when (id) {
            PERSONAL_CONTACTS_LOADER_ID -> ContactsContract.Contacts.CONTENT_URI
            else -> {
                ContactsContract.Contacts.ENTERPRISE_CONTENT_FILTER_URI
                    .buildUpon()
                    .appendPath(nameFilter)
                    .appendQueryParameter(
                        ContactsContract.DIRECTORY_PARAM_KEY,
                        ContactsContract.Directory.ENTERPRISE_DEFAULT.toString()
                    )
                    .build()
            }
        }
        return CursorLoader(
            this, contentURI, arrayOf(
                ContactsContract.Contacts.DISPLAY_NAME_PRIMARY
            ), null, null, null
        )
    }

Sekarang Anda harus menginisialisasi Loader lain dengan nilai ID baru untuk memicu metode di atas.

Pertama, buat nilai ID konstanta baru untuk kontak bisnis di bagian atas MainActivity:

const val WORK_CONTACTS_LOADER_ID = 1

Lalu, dalam initLoaders(), gunakan LoaderManager untuk menginisialisasi Loader baru dengan ID baru yang dibuat di atas:

private fun initLoaders() {
        LoaderManager.getInstance(this).
            initLoader(PERSONAL_CONTACTS_LOADER_ID, null, this)
        LoaderManager.getInstance(this).
            initLoader(WORK_CONTACTS_LOADER_ID, null, this)
    }

Semua metode lainnya seharusnya berfungsi dengan cara yang sama karena Cursor data dari kedua Loader memiliki struktur yang sama.

Cobalah

Jalankan aplikasi di profil pribadi, dan kini Anda dapat melihat kontak bisnis dan kontak pribadi.

3b8f9c73feee88fb.png

Bagaimana dengan profil kerja?

Jika menjalankan aplikasi di profil kerja, Anda tetap hanya akan melihat kontak bisnis dan tak satu pun kontak pribadi. Hal itu karena salah satu sasaran utama profil kerja adalah untuk melindungi privasi pengguna, sehingga aplikasi kerja umumnya tidak dapat mengakses informasi pribadi apa pun dari profil pribadi.

9312158a2dc03891.png

6. Beralih profil dalam aplikasi

Android menyertakan API untuk meluncurkan instance lain aplikasi di profil yang berbeda, sehingga membantu pengguna beralih akun. Misalnya, aplikasi email dapat menyediakan UI yang memungkinkan pengguna beralih antara profil pribadi dan profil kerja untuk mengakses dua akun email.

Semua aplikasi dapat memanggil API ini untuk meluncurkan aktivitas utama aplikasi yang sama jika sudah diinstal di profil lain.

Untuk menambahkan peralihan akun antar-profil ke aplikasi Anda, pertama-tama kami perlu menambahkan tombol ke tata letak aktivitas utama kami, sehingga pengguna dapat beralih profil.

Buka activity_main.xml dan tambahkan widget tombol di bawah widget recycler-view:

<androidx.appcompat.widget.AppCompatButton
        android:id="@+id/button"
        app:layout_constraintTop_toBottomOf="@+id/contacts_rv"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

Kembali ke MainActivity.kt, setel peristiwa klik tombol untuk beralih profil di metode onCreate.

Untuk melakukannya, dapatkan layanan sistem CrossProfileApps terlebih dahulu:

val crossProfileApps = getSystemService(CrossProfileApps::class.java)

Class ini menyediakan semua API yang Anda butuhkan untuk mengimplementasikan fitur peralihan profil. Anda dapat mengambil daftar profil pengguna dengan memanggil targetUserProfiles yang akan menampilkan semua profil lain tempat aplikasi ini diinstal.

val userHandles = crossProfileApps.targetUserProfiles

Anda sekarang dapat menggunakan item pertama userHandle yang ditampilkan dan meluncurkan aplikasi tersebut di profil lainnya.

crossProfileApps.startMainActivity(
                    componentName,
                    userHandles.first()
                )

Anda bahkan dapat memperoleh teks yang dilokalkan yang meminta pengguna untuk beralih profil dan menggunakannya untuk menyetel nilai teks tombol.

val label = crossProfileApps.getProfileSwitchingLabel(userHandles.first())

Sekarang, dengan menyatukan semua bagian ini, inilah yang akan Anda tambahkan di bagian akhir metode onCreate di MainActivity.kt:

override fun onCreate(savedInstanceState: Bundle?) {

     ...

     val crossProfileApps = getSystemService(CrossProfileApps::class.java)
       val userHandles = crossProfileApps.targetUserProfiles
       val label = crossProfileApps.getProfileSwitchingLabel(userHandles.first())
        binding.button.apply {
            text = label
            setOnClickListener {
                crossProfileApps.startMainActivity(
                    componentName,
                    userHandles.first()
                )
            }
        }
}

Cobalah

Jika menjalankan aplikasi sekarang, Anda akan melihat tombol di bagian bawah yang menunjukkan bahwa aplikasi siap beralih antara Profil Kerja atau Profil Pribadi, bergantung pada tempat Anda meluncurkan aplikasi.

Mengklik tombol tersebut akan meluncurkan aplikasi di profil lainnya.

db741d4872052fbc.gif

7. Selamat!

Anda telah berhasil memodifikasi aplikasi yang berfungsi di profil pribadi dan profil kerja, yang mengetahui bahwa ada profil kerja yang diinstal, dan yang mengambil kontak bisnis bahkan saat dijalankan dalam mode pribadi.

Anda juga telah mengimplementasikan cara bagi pengguna untuk beralih antara profil kerja dan profil pribadi pada aplikasi yang sama saat menjalankan aplikasi tanpa harus menutup dan meluncurkannya kembali dari profil yang sesuai. Ini adalah praktik yang baik untuk membantu pengguna yang menggunakan aplikasi Anda secara berbeda di profil yang berbeda.

Pelajari lebih lanjut