Tutorial Membuat Aplikasi Mobile GIS Menggunakan Android Studio: Detail Studio Activity [Bagian 9]

Lanjut untuk pembahasan kali ini, penulis akan membuat detail informasi dari studio musik. Untuk pmebuatannya dibutuhkan sebuah layout .xml dan file activity .java. Untuk dapat menampilkan Detail Studio, user akan melalukan 2 kali klik pada marker, dimana klik pertama hanya menampilkan informasi awal pada marker, dan klik kedua kalinya akan pindah ke layout detail studio musik.

Untuk melihat langkah yang telah dikerjakan sebelumnya, kalian dapat melihatnya lagi pada link dibawah ini :

Berikut ini merupakan tahapan untuk menampilkan detail informasi dari studio musik :

1. Buat sebuah layout dan activity dengan klik kanan pada navigasi app > new > acticvity > Empty Activity. Beri nama DetailStudio. Jika sudah maka akan terbentuk activity dan layout seperti di dalam kotak merah :

detail studio activity layout

2. Selanjutnya buka activity_detail_studio.xml masukan skrip dibawah ini :

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.ivaan.aplikasigis.DetailStudio"
android:fitsSystemWindows="true">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="280dp"
android:fitsSystemWindows="true"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapse_toolbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
app:contentScrim="#1D2247"
app:expandedTitleMarginBottom="32dp"
app:expandedTitleMarginEnd="64dp"
app:expandedTitleMarginStart="48dp"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<com.daimajia.slider.library.SliderLayout
android:id="@+id/slider"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:fitsSystemWindows="true"
app:layout_collapseMode="parallax"/>
<android.support.v7.widget.Toolbar
android:id="@+id/anim_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:minHeight="?attr/actionBarSize"
app:layout_collapseMode="pin"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffffff"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#FBC02D">
<TextView
android:id="@+id/studioname"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="10dp"
android:text="NAMA STUDIO"
android:textColor="#FFFDE7"
android:textSize="25dp"
android:textStyle="bold" />
<ImageView
android:id="@+id/favbuttonwhite"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_alignRight="@id/studioname"
android:layout_marginLeft="35dp"
android:layout_marginRight="20dp"
android:layout_marginTop="13dp"
android:background="@drawable/starwhite" />
</RelativeLayout>
<TextView
android:id="@+id/studio_address"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#FDD835"
android:gravity="center"
android:padding="5dp"
android:textColor="#22313F"
android:text="alamat studio"
android:textSize="15dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/textline"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal">
<ImageView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:layout_weight="1"
android:src="@drawable/money" />
<ImageView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:layout_weight="1"
android:src="@drawable/time2" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/studio_price"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:layout_weight="1"
android:gravity="center"
android:textColor="#6C7A89"
android:text="Price 50K/Hour"
android:textSize="15dp" />
<TextView
android:id="@+id/studio_hour"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:layout_weight="1"
android:gravity="center"
android:textColor="#6C7A89"
android:text="Open At 09.00 AM"
android:textSize="15dp" />
</LinearLayout>
</LinearLayout>
<com.google.android.gms.maps.MapView
android:id="@+id/mapdetail"
android:layout_width="match_parent"
android:layout_height="220dp"
android:fitsSystemWindows="true"/>
<android.support.v7.widget.CardView
android:id="@+id/cardview1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
app:cardElevation="3dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:background="#1D2247"
android:padding="5dp"
android:text="Music Instrument"
android:textColor="#FFFDE7"
android:textSize="20sp"
android:textStyle="bold" />
<TextView
android:id="@+id/textalatmusik"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:layout_marginLeft="30dp"
android:layout_marginTop="10dp"
android:textColor="#6C7A89"
android:text="Music Instrument Detail"
android:textSize="16sp" />
<TextView
android:id="@+id/lastupdate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:background="#E7DF86"
android:gravity="center"
android:padding="5dp"
android:text="Last updated : 3 Maret 2016"
android:textColor="#FFFDE7"
android:textSize="15sp"
android:textStyle="bold" />
</LinearLayout>
</android.support.v7.widget.CardView>
<android.support.v7.widget.CardView
android:id="@+id/cardview2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
app:cardElevation="3dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#1D2247"
android:padding="5dp"
android:text="REVIEW"
android:textColor="#FFFDE7"
android:textSize="20sp"
android:textStyle="bold" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="horizontal">
<TextView
android:id="@+id/alatmusik"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_marginTop="20dp"
android:layout_weight="1"
android:background="#D32F2F"
android:gravity="center"
android:text="Music Instrument"
android:textColor="#FFFFFF"
android:textSize="18dp" />
<RatingBar
android:id="@+id/rating_alatmusik"
style="?android:attr/ratingBarStyleIndicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:gravity="center"
android:numStars="5"
android:padding="1dp"
android:rating="5" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="horizontal">
<TextView
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_marginTop="20dp"
android:layout_weight="1"
android:background="#1976D2"
android:gravity="center"
android:text="Recording"
android:textColor="#FFFFFF"
android:textSize="18dp" />
<RatingBar
android:id="@+id/rating_recording"
style="?android:attr/ratingBarStyleIndicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:gravity="center"
android:numStars="5"
android:padding="2dp"
android:rating="3.5" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginBottom="5dp"
android:orientation="horizontal">
<TextView
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_marginTop="20dp"
android:layout_weight="1"
android:background="#00796B"
android:gravity="center"
android:text="Place"
android:textColor="#FFFFFF"
android:textSize="18dp" />
<RatingBar
android:id="@+id/rating_tempat"
style="?android:attr/ratingBarStyleIndicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:gravity="center"
android:isIndicator="true"
android:numStars="5"
android:padding="2dp"
android:rating="4" />
</LinearLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="10dp"
android:layout_marginTop="5dp"
android:orientation="horizontal">
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/textline"
android:orientation="vertical">
<ImageView
android:id="@+id/share_button"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_gravity="center"
android:padding="8dp"
android:src="@drawable/share" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:gravity="center"
android:text="Share"
android:textColor="#6C7A89"
android:textSize="20dp"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/textline"
android:orientation="vertical">
<ImageView
android:id="@+id/call_button"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_gravity="center"
android:padding="8dp"
android:src="@drawable/call" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:gravity="center"
android:text="Call"
android:textColor="#6C7A89"
android:textSize="20dp"
android:textStyle="bold" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>

Pada layout diatas penulis menggunakan CardView agar tampilan lebih rapih dan juga CollapsingToolbarLayout agar tampilan gambar tidak menutupi ketika user melakukan scroll kebawah pada aplikasi.

3. Selanjutnya pada DetailStudio.java masukan skrip berikut :

public class DetailStudio extends AppCompatActivity {
private TextView studioName, studioAddress, studioPrice, studioHour, studioAlatMusik, studioUpdate;
private RatingBar ratingBarAlat, ratingBarRec, ratingBarTmpt;
public static String id, namaStudio, alamat, harga, jam, alatmusik, lastUpdate, gambar,
callSave, ratingAlat, ratingRec, ratingTmpt;
SliderLayout mDemoSlider;
private static final String TAG = "ListDislay";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail_studio);
final Toolbar toolbar = (Toolbar) findViewById(R.id.anim_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
ratingBarAlat = (RatingBar) findViewById(R.id.rating_alatmusik);
ratingBarRec = (RatingBar) findViewById(R.id.rating_recording);
ratingBarTmpt = (RatingBar) findViewById(R.id.rating_tempat);
ratingBarAlat.setRating(Float.parseFloat(ratingAlat));
ratingBarRec.setRating(Float.parseFloat(ratingRec));
ratingBarTmpt.setRating(Float.parseFloat(ratingTmpt));
studioName = (TextView) findViewById(R.id.studioname);
studioAddress = (TextView) findViewById(R.id.studio_address);
studioPrice = (TextView) findViewById(R.id.studio_price);
studioHour = (TextView) findViewById(R.id.studio_hour);
studioAlatMusik = (TextView) findViewById(R.id.textalatmusik);
studioUpdate = (TextView) findViewById(R.id.lastupdate);
studioName.setText(namaStudio);
studioAddress.setText(alamat);
studioPrice.setText(harga);
studioHour.setText(jam);
studioAlatMusik.setText(alatmusik);
studioUpdate.setText(lastUpdate);
mDemoSlider = (SliderLayout) findViewById(R.id.slider);
getGambar();
}
private void getGambar() {
String url = "http://cloudofoasis.com/api/Ivan/getGambar.php?StudioMusik=" + id;
Log.i(TAG, url);
JsonArrayRequest request = new JsonArrayRequest
(Request.Method.GET, url, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
int numData = response.length();
if (numData == 0) mDemoSlider.setVisibility(View.GONE);
else {
JSONObject slider_studio;
Log.i(TAG, "On Response Get Gambar");
String[] gambar_studio = new String[numData], nama_studio = new String[numData];
HashMap<String, String> url_maps = new HashMap<String, String>();
for (int i = 0; i < numData; i++) {
try {
slider_studio = response.getJSONObject(i);
gambar_studio[i] = slider_studio.getString("gambar");
nama_studio[i] = slider_studio.getString("nama");
url_maps.put(nama_studio[i], "http://cloudofoasis.com/api/Ivan/slider_studio/" + gambar_studio[i]);
} catch (JSONException je) {
Toast.makeText(DetailStudio.this, "JSON ERROR", Toast.LENGTH_SHORT).show();
}
}
for (String name : url_maps.keySet()) {
TextSliderView textSliderView = new TextSliderView(DetailStudio.this);
textSliderView.description(name).image(url_maps.get(name)).setScaleType(BaseSliderView.ScaleType.Fit);
textSliderView.bundle(new Bundle());
textSliderView.getBundle().putString("extra", name);
mDemoSlider.addSlider(textSliderView);
mDemoSlider.setPresetTransformer(SliderLayout.Transformer.ZoomOut);
mDemoSlider.setPresetIndicator(SliderLayout.PresetIndicators.Center_Bottom);
mDemoSlider.setCustomAnimation(new DescriptionAnimation());
mDemoSlider.setDuration(4000);
}
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
Volley.newRequestQueue(this).add(request);
}
@Override
public void onBackPressed() {
Intent intent = new Intent(this, MapsActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
}
//untuk tombol back
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
// app icon in action bar clicked; go home
Intent intent = new Intent(this, MapsActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}

Pada skrip diatas beberapa variabel mendapat data yang dikirimkan melalui MapsActivity.java. Kemudian variabel-variabel seperti namaStudio, alamat, harga, jam, alatmusik, lastUpdate, gambar, callSave, ratingAlat, ratingRec, ratingTmpt akan ditempatkan ke komponen dari XML Detail Studio sesuai dengan id pada Layout XML dari Detail Studio.

Kemudian Untuk pamenaggilan gambar dari database menggunakan method sendiri dengan nama getGambar(). Dan method tersebut dipanggil di dalam onCreate.

getGambar.php (http://pastebin.com/6LBZJRMX)

4. Pada ActivityMaps.java tambahkan potongan program dibawah ini  di dalam method getLokasi yang telah dibuat sebelumnya :

    private void getLokasi() {
String url = "http://cloudofoasis.com/api/Ivan/getStudio.php";
JsonArrayRequest request = new JsonArrayRequest
(Request.Method.GET, url, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
numData = response.length();
Log.d("DEBUG_", "Parse JSON");
latLng = new LatLng[numData];
markerD = new Boolean[numData];
nama = new String[numData];
alamat = new String[numData];
harga = new String[numData];
jam = new String[numData];
call = new String[numData];
update = new String[numData];
alatmusik = new String[numData];
ratingalatmusik = new String[numData];
ratingrecording = new String[numData];
ratingtempat = new String[numData];
id = new String[numData];
gambar = new String[numData];
for (int i = 0; i < numData; i++) {
try {
JSONObject data = response.getJSONObject(i);
id[i] = data.getString("id");
latLng[i] = new LatLng(data.getDouble("latitude"),
data.getDouble("longitude"));
nama[i] = data.getString("nama");
alamat[i] = data.getString("alamat");
harga[i] = data.getString("harga");
jam[i] = data.getString("jam");
call[i] = data.getString("call");
update[i] = data.getString("lastupdate");
alatmusik[i] = data.getString("alatmusik");
ratingalatmusik[i] = data.getString("ratingalatmusik");
ratingrecording[i] = data.getString("ratingrecording");
ratingtempat[i] = data.getString("ratingtempat");
gambar[i] = data.getString("gambar");
latitude[i] = data.getDouble("latitude");
longitude[i] = data.getDouble("longitude");
markerD[i] = false;
mMap.addMarker(new MarkerOptions()
.position(latLng[i])
.title(nama[i])
.snippet(alamat[i])
.icon(BitmapDescriptorFactory.fromResource(R.drawable.markerstudio)));
} catch (JSONException je) {
}
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng[i], 15.5f));
}
//----------------------MARKER KLIK
mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
Log.d("DEBUG_", "Marker clicked");
for (int i = 0; i < numData; i++) {
if (marker.getTitle().equals(nama[i])) {
if (markerD[i]) {
Log.d("DEBUG_", "panggil activity");
DetailStudio.id = id[i];
DetailStudio.namaStudio = nama[i];
DetailStudio.alamat = alamat[i];
DetailStudio.harga = harga[i];
DetailStudio.jam = jam[i];
DetailStudio.callSave = call[i];
DetailStudio.alatmusik = alatmusik[i];
DetailStudio.lastUpdate = update[i];
DetailStudio.ratingAlat = ratingalatmusik[i];
DetailStudio.ratingRec = ratingrecording[i];
DetailStudio.ratingTmpt = ratingtempat[i];
DetailStudio.gambar = gambar[i];
DetailStudio.latitude = latitude[i];
DetailStudio.longitude = longitude[i];
Intent intent = new Intent(MapsActivity.this, DetailStudio.class);
startActivity(intent);
markerD[i] = false;
} else {
Log.d("DEBUG_", "show info");
// mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(marker.getPosition(), 15.5f));
markerD[i] = true;
marker.showInfoWindow();
Toast ts = Toast.makeText(MapsActivity.this,"Tap once again on marker, for detail Studio Music",Toast.LENGTH_LONG);
TextView v = (TextView) ts.getView().findViewById(android.R.id.message);
if( v != null)
v.setGravity(Gravity.CENTER);
ts.show();
}
} else {
markerD[i] = false;
}
}
return false;
}
});
}
} , new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
AlertDialog.Builder builder = new AlertDialog.Builder(MapsActivity.this);
builder.setTitle("Error!");
builder.setMessage("No Internet Connection");
builder.setIcon(android.R.drawable.ic_dialog_alert);
builder.setPositiveButton("Refresh", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
getLokasi();
}
});
AlertDialog alert = builder.create();
alert.show();
}
});
Volley.newRequestQueue(this).add(request);
}

Potongan skrip yang ditambahkan dari skrip yang sebelumnya sudah di kerjakan adalah menamahkan fungsi onClick pada marker. Ketika user melakukan klik sekali pada marker maka akan menampilkan informasi nama dan alamat studio, kemudian jika di klik kembali akan menuju detail studio musik. Lalu cara untuk membedakan data yang tampil adalah studio musik yang kita klik dengan menambahkan kondisi

  if (marker.getTitle().equals(nama[i])

Dengan demikian data yang akan ditampilkan pada detail studio adalah data dari marker yang telah kita klik.

5. Jika kalian sudah menambahkannya pada file xml dan java, selanjutnya kalian harus menambahkan library untuk CardView, daimaja.slider, dan nineoldandroids pada gradle. Berikut ini merupakan library yang harus kalian tambahkan :

compile 'com.daimajia.slider:library:1.1.5@aar'
compile 'com.android.support:cardview-v7:23.1.1'
compile 'com.nineoldandroids:library:2.4.0'

5. Langkah terakhir adalah coba untuk jalankan program. Masuk ke menu maps, kemudian klik 2x pada marker, apakah sudah masuk kedalam detail informasi studio musik terpilih? Jika sudah maka akan tampil detail studio musik seperti dibawah ini :

Output Klik sekali pada Marker:

Klik marker sekali

Output Klik 2x pada Marker, masuk ke Detail Studio Musik:

detail studio activity

Demikianlah tutorial untuk bagian membuat detail studio musik, selanjunya akan dijelaskan cara membuat peritntah Share dan Call. Nantikan tutorial selanjutnya.

6 Comments

6 Comments

  1. Baskoro Jogja

    Februari 17, 2017 at 10:19

    mas numpang tanya ketika sama masukin di ativity detail studio muncul “Rendering Problems Missing styles. Is the correct theme chosen for this layout? Use the Theme combo box above the layout to choose a different layout, or fix the theme style references. Failed to find style ‘SliderStyle’ in current theme (4 similar errors not shown) Tip: Try to refresh the layout.” pada preview nya knpa ya??
    mohon pencerahannya
    terimakasih

    • Ivan Bagus Pinuntun

      Mei 6, 2017 at 19:53

      mungkin build gradle nya beda mas, samakan saja seperti punya saya

  2. wahyu

    Maret 19, 2017 at 22:15

    mas image ku kok gak mau tampil nya padahal judulnya tampil, mohon pencerahannya

    • Ivan Bagus Pinuntun

      Mei 6, 2017 at 19:52

      imagenya input sendiri aja ke drawable mas

  3. adie

    Januari 19, 2018 at 16:49

    getGAMBAR.php

    di bagian ini gan kayak nya gak ada bikin tabel slider_studio …

    .

    .

     

    $kueri =“SELECT * FROM slider_studio WHERE id_studio = ‘”.$id.“‘”;

Leave a Reply

Your email address will not be published. Required fields are marked *

Trending Minggu Ini

Inwepo adalah media platform yang membantu setiap orang untuk belajar dan berbagi tutorial, tips dan trik cara penyelesaian suatu masalah di kehidupan sehari-hari dalam bentuk teks, gambar. dan video.

Dengan bergabung bersama kami dan membuat 1 tutorial terbaik yang kamu miliki dapat membantu jutaan orang di Indonesia untuk mendapatkan solusinya. Ayo berbagi tutorial terbaikmu.

Ikuti Kami di Sosmed

Inwepo Navigasi

Tentang Kami             Beranda

Hubungi Kami             Panduan Penulis

Kebijakan Privasi

FAQ

Partner

Copyright © 2014 - 2023 Inwepo - All Rights Reserved.

To Top