NIM : 20190801072
Mata Kuliah : Pemrograman Mobile
Dosen Pengampu : Ir. Sawali Wahyu, S. Kom, M.Kom.
UTS
Note!
• Section pertama adalah jawaban essai
• Section kedua adalah penjelasan serta screenshoot aplikasi studi kasus
• Section ketiga adalah source code aplikasi
• Section terakhir adalah perancangan seperti flowchart, use case diagram, class diagram,
sequence diagram dan activity diagram
No.1
Jelaskan dengan detail menurut pemahaman anda, Konsep Dasar Android dan
Arsitekturnya dan Apa Kelebihannya !
Android merupakan perangkat lunak dalam perangkat mobile yang mencakup system operasi,
middleware dan aplikasi utama mobile. Android adalah sistem operasi berbasis Linux yang
dipergunakan sebagai pengelola sumber daya perangkat keras, baik untuk ponsel, smartphone
dan juga PC tablet. Secara umum Android adalah platform yang terbuka (Open Source) bagi para
pengembang untuk menciptakan aplikasi mereka sendiri yang digunakan oleh berbagai piranti
bergerak.
Karakteristik Android
Sistem operasi open source untuk perangkat mobile dan proyek open source yang sesuai yang
dipimpin oleh Google. Situs ini dan repositori Android Open Source Project (AOSP)
menawarkan informasi dan source code yang diperlukan untuk membuat varian custom dari OS
Android, perangkat Port dan aksesori ke platform Android, dan memastikan perangkat
memenuhi persyaratan kompatibilitas yangmenjaga ekosistem Android sebagai lingkungan yang
sehat dan stabil bagi jutaan pengguna.
Berikut karakteristik android
1. Lengkap
2. Terbuka (Open Source)
3. Free
4. Semua aplikasi dibuat sama
5. Memecahkan hambatan pada aplikasi
6. Pengembangan aplikasi yang cepat dan mudah
Arsitektur Android
Google sebagai pencipta Android yang kemudian diasuh oleh Handset Alliance mengibaratkan
Android sebagai sebuah tumpukan software. Setiap lapisan pada tumpukan ini menghimpun
beberapa program yang mendukung fungsi-fungsi spesifik dari sistem operasi.
1. Linux Kernel
Linux Kernel adalah layer di mana inti dari operating system dari Android itu berada.
Berisi file-file sistem yang mengatur system processing, memory, resource, drivers, dan
sistem-sistem operasi Android lainnya.
2. Android Runtime
Lapisan setelah Kernel Linux adalah Android Runtime. Android Runtime ini berisi Core
Libraries dan Dalvik Virtual Machine. Core Libraries mencakup serangkaian inti library
Java, artinya Android menyertakan satu set librarylibrary dasar yang menyediakan
sebagian besar fungsi-fungsi yang ada pada library-library dasar bahasa pemrograman
Java.
3. Libraries
Bertempat di level yang sama dengan Android Runtime adalah Libraries. Android
menyertakan satu set library-library dalam bahasa C/C++ yang digunakan oleh berbagai
komponen yang ada pada sistem Android.
4. Application Framework
Lapisan selanjutnya adalah yang mencakup program untuk mengatur fungsi-fungsi dasar
smartphone. Application Framework merupakan 10 serangkaian tool dasar seperti alokasi
resource smartphone, aplikasi telepon, pergantian antar – proses atau program, dan
pelacakan lokasi fisik telepon.
5. Application dan Widgets
Di lapisan teratas bertempat pada aplikasi itu sendiri. Di lapisan inilah anda menemukan
fungsi-fungsi dasar smartphone seperti menelepon dan mengirim pesan singkat,
menjalankan web browser, mengakses daftar kontak, dan lainlain. Bagi rata-rata
pengguna, lapisan inilah yang paling sering mereka akses. Mereka mengakses fungsi-
fungsi dasar tersebut melalui user interface.
Kelebihan dan Kekurangan
No.4
Jelaskan dengan detail menurut pemahaman anda, Mengenai Konsep Dasar Location
Based Service, Baik Secara Arsitektur dan Secara Service Apa yang ditampilkan dalam
Konsep LBS !
Sistem Layanan Berbasis Lokasi atau bisa disebut LBS merupakan layanan informasi yang
berbentuk geografis yang dapat diakses menggunakan smartphone melalui konejsi jaringan
internet agar dapat memetakan lokasi secara tepat. LBS digunakan dalam penggambaran
teknologi yang diperuntukkan untuk menemukan lokasi perangkat yang digunakan. Terdapat dua
unsur utama pada LBS, yakni :
• Location Manager (API Maps)
• Location Provide (API Location)
Arsitektur LBS
a. Mobile Device
Alat untuk meminta informasi yang akan dibutuhkan.
b. Communication Network
Jaringan yang akan mengirimkan data pengguna dan permintaan layanan.
c. Positioning Component
Posisi pengguna dapat diperoleh menggunakan jaringan internet atau dengan GPS.
d. Service and Application Provider
Penyedia layanan yang bertanggung jawab untuk memproses layanan. Provider
melakukan proses komputasi yakni menentukan rute perjalanan, informasi terdekat,
mencari ke database external seperti google API untuk menghasilkan informasi yang
dibutuhkan oleh pengguna.
e. Data dan Content Provider
Penyedia layanan yang dapat diminta oleh pengguna
Service LBS
Secara garis besar, LBS dibagi menjadi dua, yaitu :
1. Pull Service
Diberikan Ketika ada permintaan dari pengguna
2. Push Service
Diberikan langsung oleh service provider tanpa menunggu permintaan dari pengguna.
Layanan LBS dapat sebagai berikut
1. Lokasi
Dapat menentukan dimana lokasi suatu titik dipermukaan bumu
2. Navigasi
Membantu mencari lokasi titik wilayah
3. Tracking
Memonitoring pergerakan obyek, memetakan posisi tertentu dan melakukan perhitungan
dengan jarak terdekat.
No.5
Berikan Penjelasan Mengenai Simpel Location Based Service Berikut Ini
Pada Tabel di atas Temukan Kode Lokasi Di Google Maps, Temukan Informasi Lintang&
Bujur dan Jelaskan Analisis Anda !
Kesimpulan : Pada nomor pertama merupakan sebuah daerah gunung sahari ke Kampus
Universitas Esa Unggul Kebon Jeruk. Pada nomor kedua merupakan tempat Universitas Esa
Unggul Kebon Jeruk ke Universitas Esa Unggul Harapan Indah.
Penjelasan
Pembuatan Apps Sistem Penggajian yang sesuai dengan ketentuan soal UTS Pada pembuatan
apss ini digunakan SQFlite sebagai tempat database yang akan menampung informasi pada
mobile apps ini. Terdapat penghitungan gaji karyawan dan database rincian gaji karyawan untuk
report.
LAMPIRAN I
1.1 First Page
Halaman pertama berisi splashscreen sebelum memasuki aplikasi.
2
LAMPIRAN II
2.1 Aplikasi Penggajian
Pengguna dapat menginput nama, id, memilih status, memilih type, memilih posisition, dan
memasukkan jam lembur
2.1.1 Tampilan Aplikasi Penggajian
Merupakan section yang berisi berita pembangunan desa.
Main.dart
import 'package:flutter/material.dart';
import 'package:gajikaryawan/daftarpegawai.dart';
import 'package:gajikaryawan/gaji.dart';
import 'package:gajikaryawan/gajii.dart';
import 'package:gajikaryawan/homepage.dart';
Homepage.dart
import 'package:flutter/material.dart';
import 'package:gajikaryawan/gajii.dart';
import 'package:gajikaryawan/daftarpegawai.dart';
ListTile(
title: new Text("Aplikasi Penggajian"),
onTap: () {
Navigator.push(context, MaterialPageRoute(builder: ((context) {
return gajiPage();
})));
},
),
ListTile(
title: new Text("Database Pegawai"),
onTap: () {
Navigator.push(context,
MaterialPageRoute(builder: ((context) {
return ListPegawaiPage();
})));
}),
],
)),
body: new ListView(
children: <Widget>[
new Container(
padding: new EdgeInsets.all(30.0),
),
new Padding(
padding: new EdgeInsets.only(top: 5.0, bottom: 15.0),
child: new Text("Aplikasi Penghitung Gaji",
textAlign: TextAlign.center,
style: new TextStyle(
fontSize: 40.0, fontWeight: FontWeight.bold)),
),
new Text("Hitung Gaji Anda",
textAlign: TextAlign.center,
style: new TextStyle(fontSize: 20.0)),
],
));
}
}
Gajii.dart
import 'package:flutter/material.dart';
import "dart:math";
String? typeValue;
String? statusValue;
String? position;
String? insentifValue;
bool staffValue = false;
bool spvValue = false;
bool managerValue = false;
bool hodValue = false;
bool direkturValue = false;
double insentif = 0;
double tunjangan = 0;
double basesalary = 0;
double overtime = 0;
double bonus = 0;
double gross = 0;
double tax = 0;
double pph = 0;
double bpjs = 0;
double status = 0;
double type = 0;
double nett = 0;
void resetAllValue() {
namaController.text = " ";
idController.text = " ";
insentifValue = null;
direkturValue = false;
spvValue = false;
hodValue = false;
managerValue = false;
staffValue = false;
typeValue = null;
statusValue = null;
position = null;
tunjangan = 0;
basesalary = 0;
overtime = 0;
bonus = 0;
gross = 0;
tax = 0;
pph = 0;
bpjs = 0;
nett = 0;
insentif = 0;
void validateInput() {
FormState? form = formKey.currentState;
SnackBar message = const SnackBar(
content: Text("Proses Selesai"),
);
if (form!.validate()) {
ScaffoldMessenger.of(context).showSnackBar(message);
}
}
void rumus() {
setState(() {
int? overtime;
if (overtimeController.text != '') {
overtime = int.parse(overtimeController.text);
//Type Staff
if (typeValue == 'Permanen') {
basesalary = 5500000;
} else if (typeValue == 'Tidak') {
basesalary = 4500000;
}
//TUNJANGAN STATUS
if (statusValue == 'Menikah') {
tunjangan = 1000000;
} else if (statusValue == 'Belum') {
tunjangan = 0;
}
//INSENTIF PILIHAN
if (position == 'Staf') {
insentif = 1000000;
} else if (position == 'Supervisor') {
insentif = 3000000;
} else if (position == 'HoDpt') {
insentif = 10000000;
} else if (position == 'Direktur') {
insentif = 25000000;
} else if (position == 'Manager') {
insentif = 4500000;
}
//totalgaji
//pph 10%
pph = gross * 0.11;
pphController.text = pph.toString();
//bpjs 2,5%
bpjs = gross * 0.025;
bpjsController.text = bpjs.toString();
//Total Potongan
tax = pph + bpjs;
taxController.text = tax.toString();
//gaji bersih
nett = gross - tax;
nettController.text = nett.toString();
}
});
}
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
Padding(
padding: EdgeInsets.only(top: 20.0, bottom: 25.0),
child: Text(
"Aplikasi Penggaji Karyawan",
style: TextStyle(fontSize: 25.0),
),
),
TextField(
controller: namaController,
keyboardType: TextInputType.text,
decoration: InputDecoration(
hintText: "Masukkan Nama Anda",
labelText: "Nama",
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10.0),
)),
),
TextField(
controller: idController,
keyboardType: TextInputType.text,
decoration: InputDecoration(
hintText: "Masukkan ID Anda",
labelText: "ID Pegawai",
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10.0),
)),
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text(
'Status',
style: TextStyle(
fontSize: 20,
),
),
SizedBox(
width: 250,
child: DropdownButtonFormField(
value: statusValue,
items: [
'Menikah',
'Belum',
].map((String items) {
return DropdownMenuItem(
value: items,
child: Text(items),
);
}).toList(),
onChanged: (String? newValue) {
setState(() {
statusValue = newValue!;
});
},
))
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text(
'Type',
style: TextStyle(
fontSize: 20,
),
),
SizedBox(
width: 250,
child: DropdownButtonFormField(
value: typeValue,
items: [
'Permanen',
'Tidak',
].map((String typ) {
return DropdownMenuItem(
value: typ,
child: Text(typ),
);
}).toList(),
onChanged: (String? ve) {
setState(() {
typeValue = ve!;
});
},
))
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text(
'Posisition',
style: TextStyle(
fontSize: 20,
),
),
SizedBox(
width: 250,
child: DropdownButton<String>(
value: position,
items: [
'Staf',
'Supervisor',
'Manager',
'HoDpt',
'Direktur',
].map((String pos) {
return DropdownMenuItem(
value: pos,
child: Text(pos),
);
}).toList(),
onChanged: (String? qw) {
setState(() {
position = qw!;
});
},
))
],
),
TextField(
controller: overtimeController,
keyboardType: TextInputType.text,
decoration: InputDecoration(
hintText: "Masukkan Jam Lembur",
labelText: "Lembur",
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10.0),
),
),
),
Padding(
padding: new EdgeInsets.only(top: 20.0, bottom: 20.0),
child: new Row(children: <Widget>[
ElevatedButton(
onPressed: rumus,
style: ElevatedButton.styleFrom(primary: Colors.purpleAccent),
child: new Text("Hitung Gaji!"),
),
Padding(
padding: new EdgeInsets.only(left: 10.0),
child: ElevatedButton(
onPressed: resetAllValue,
child: new Text("Hapus!"),
style:
ElevatedButton.styleFrom(primary:
Colors.purpleAccent)),
),
])),
Text("Gaji Kotor : $basesalary", style: new TextStyle(fontSize: 20.0)),
Text("Tunjangan Status : $tunjangan",
style: new TextStyle(fontSize: 20.0)),
Text("Insentif : $insentif", style: new TextStyle(fontSize: 20.0)),
Text("Lembur : $bonus", style: new TextStyle(fontSize: 20.0)),
Text("BPJS : $pph", style: new TextStyle(fontSize: 20.0)),
Text("BPJS : $bpjs", style: new TextStyle(fontSize: 20.0)),
Text("Gaji Bersih : $gross", style: new TextStyle(fontSize: 20.0)),
],
);
}
}
Pegawai.dart
class Pegawai {
int? id;
String? nama;
String? nokaryawan;
String? tunjangan;
String? insentif;
String? bonus;
String? lembur;
String? nett;
String? tax;
Entryform.dart
import 'package:flutter/material.dart';
import 'package:gajikaryawan/Pegawai.dart';
import 'package:gajikaryawan/dbhelper.dart';
FormPegawai({this.pegawai});
@override
_FormPegawaiState createState() => _FormPegawaiState();
}
TextEditingController? nama;
TextEditingController? nokaryawan;
TextEditingController? tunjangan;
TextEditingController? insentif;
TextEditingController? bonus;
TextEditingController? tax;
TextEditingController? nett;
@override
void initState() {
nama = TextEditingController(
text: widget.pegawai == null ? '' : widget.pegawai!.nama);
nokaryawan = TextEditingController(
text: widget.pegawai == null ? '' : widget.pegawai!.nokaryawan);
tunjangan = TextEditingController(
text: widget.pegawai == null ? '' : widget.pegawai!.tunjangan);
insentif = TextEditingController(
text: widget.pegawai == null ? '' : widget.pegawai!.insentif);
bonus = TextEditingController(
text: widget.pegawai == null ? '' : widget.pegawai!.bonus);
tax = TextEditingController(
text: widget.pegawai == null ? '' : widget.pegawai!.tax);
nett = TextEditingController(
text: widget.pegawai == null ? '' : widget.pegawai!.nett);
super.initState();
}
@override
Widget build(BuildContext context) {
final ButtonStyle style = ElevatedButton.styleFrom(
primary: Colors.purpleAccent,
shape: RoundedRectangleBorder(borderRadius:
BorderRadius.circular(20)));
return Scaffold(
appBar: AppBar(
title: Text('Form Pegawai'),
backgroundColor: Colors.purple,
),
body: ListView(
padding: EdgeInsets.all(16.0),
children: [
TextField(
controller: nama,
decoration: InputDecoration(
labelText: 'Nama Pegawai',
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
)),
),
TextField(
controller: nokaryawan,
decoration: InputDecoration(
labelText: 'ID Pegawai',
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
)),
),
TextField(
controller: tunjangan,
decoration: InputDecoration(
labelText: 'Tunjangan',
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
)),
),
TextField(
controller: insentif,
decoration: InputDecoration(
labelText: 'Insentif',
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
)),
),
TextField(
controller: bonus,
decoration: InputDecoration(
labelText: 'Bonus',
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
)),
),
TextField(
controller: tax,
decoration: InputDecoration(
labelText: 'Potongan',
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
)),
),
TextField(
controller: nett,
decoration: InputDecoration(
labelText: 'Gaji yang Diterima',
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
)),
),
ElevatedButton(
child: (widget.pegawai == null)
? Text(
'Add',
style: TextStyle(color: Colors.white),
)
: Text(
'Update',
style: TextStyle(color: Colors.white),
),
style: style,
onPressed: () {
upsertPegawai();
},
)
],
),
);
}
await db.updatePegawai(Pegawai.fromMap({
'id': widget.pegawai!.id,
'Nama': nama!.text,
'Id Karyawan': nokaryawan!.text,
'Tunjangan': tunjangan!.text,
'Insentif': insentif!.text,
'Bonus': bonus!.text,
'Potongan': tax!.text,
'Gaji yang Diterima': nett!.text,
}));
Navigator.pop(context, 'update');
} else {
//update
Navigator.pop(context, 'save');
}
}
}
Detail.dart
import 'package:flutter/material.dart';
import 'package:gajikaryawan/Pegawai.dart';
DetailPage(this.pegawai);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Detail Page'),
),
body: Center(
child: Column(
children: [
Text('ID Karyawan: ${pegawai!.nokaryawan}'),
Text('Nama Pegawai : ${pegawai!.nama}'),
Text('Tunjangan : ${pegawai!.tunjangan}'),
Text('Insentif : ${pegawai!.insentif}'),
Text('Bonus : ${pegawai!.bonus}'),
Text('Potongan : ${pegawai!.tax}'),
Text('Gaji yang diterima : ${pegawai!.nett}'),
],
),
),
);
}
}
dbhelper.dart
import 'package:gajikaryawan/Pegawai.dart';
import 'package:sqflite/sqflite.dart';
import 'dart:async';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'dart:io';
class DbHelper {
static final DbHelper _instance = DbHelper._internal();
static Database? _database;
DbHelper._internal();
factory DbHelper() => _instance;
return result.toList();
}
Future<int?> updatePegawai(Pegawai pegawai) async {
var dbClient = await _db;
return await dbClient!.update(tableName, pegawai.toMap(),
where: '$kolomid = ?', whereArgs: [pegawai.id]);
}
daftarpegawai.dart
import 'package:gajikaryawan/detail.dart';
@override
_ListPegawaiPageState createState() => _ListPegawaiPageState();
}
@override
void initState() {
_getAllPegawai();
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Daftar Pegawai'),
backgroundColor: Colors.red,
),
body: ListView.builder(
itemCount: listPegawai.length,
itemBuilder: (context, index) {
Pegawai pegawai = listPegawai[index];
return ListTile(
onTap: () {
//edit
_openFormEdit(pegawai);
},
contentPadding: EdgeInsets.all(16),
title: Text(
'${pegawai.nama} ${pegawai.nokaryawan}',
style: TextStyle(
fontSize: 18,
fontStyle: FontStyle.italic,
color: Colors.deepOrangeAccent),
),
subtitle: Text('${pegawai.nett}'),
trailing: IconButton(
icon: Icon(Icons.delete),
onPressed: () {
AlertDialog hapus = AlertDialog(
title: Text('Information'),
content: Container(
height: 100,
child: Column(
children: [
Text(
'Apakah anda yakin ingin menghapus data
${pegawai.nett}'),
],
),
),
actions: [
TextButton(
child: Text('Ya'),
onPressed: () {
//delete
_deletePegawai(pegawai, index);
Navigator.pop(context);
},
),
TextButton(
child: Text('Tidak'),
onPressed: () {
Navigator.pop(context);
},
),
],
);
showDialog(context: context, builder: (context) => hapus);
},
),
leading: IconButton(
onPressed: () {
//detail
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => DetailPage(pegawai)));
},
icon: Icon(Icons.visibility),
),
);
}),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.add),
backgroundColor: Colors.red,
onPressed: () {
//add
_openFormCreate();
},
),
);
}
setState(() {
listPegawai.removeAt(position);
});
}