commit 8405122a1d1d2aaa43c9bfed817b1c3c25010fa7 Author: Nadea Mefira Date: Thu Jul 10 13:15:14 2025 +0700 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b589d56 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml new file mode 100644 index 0000000..0c0c338 --- /dev/null +++ b/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..0897082 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/migrations.xml b/.idea/migrations.xml new file mode 100644 index 0000000..f8051a6 --- /dev/null +++ b/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..8978d23 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..168aefa --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,62 @@ +plugins { + id("com.android.application") + id("com.google.gms.google-services") +} + +android { + namespace = "com.nurulwafa.nufakuproject" + compileSdk = 34 + + defaultConfig { + applicationId = "com.nurulwafa.nufakuproject" + minSdk = 24 + targetSdk = 34 + versionCode = 1 + versionName = "1.0" + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + signingConfigs { + create("release") { + storeFile = rootProject.file("keystore.jks") + storePassword = "NufaAra2025!" + keyAlias = "nufaku-key" + keyPassword = "NufaAra2025!" + } + } + + buildTypes { + getByName("release") { + isMinifyEnabled = false + isShrinkResources = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + signingConfig = signingConfigs.getByName("release") + } + } + + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + dependencies { + + implementation("androidx.appcompat:appcompat:1.7.0") + implementation("com.google.android.material:material:1.12.0") + implementation("androidx.constraintlayout:constraintlayout:2.1.4") + testImplementation("junit:junit:4.13.2") + androidTestImplementation("androidx.test.ext:junit:1.2.1") + androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1") + implementation ("com.android.volley:volley:1.2.1") + implementation ("org.json:json:20210307") + implementation ("com.github.bumptech.glide:glide:4.16.0") + annotationProcessor ("com.github.bumptech.glide:compiler:4.16.0") + implementation(platform("com.google.firebase:firebase-bom:33.16.0")) + implementation("com.google.firebase:firebase-messaging") + implementation("com.google.firebase:firebase-analytics") + } +} diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..f10c998 --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,48 @@ +{ + "project_info": { + "project_number": "527409377974", + "project_id": "notification-31080", + "storage_bucket": "notification-31080.firebasestorage.app" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:527409377974:android:af4396bdd6754dc5302c17", + "android_client_info": { + "package_name": "com.example.nufakuproject" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyAEUotmyaw6LWdylLHvpufoWTml9PYbYJI" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:527409377974:android:45b57d5470c9efd6302c17", + "android_client_info": { + "package_name": "com.nurulwafa.nufakuproject" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyAEUotmyaw6LWdylLHvpufoWTml9PYbYJI" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/nurulwafa/nufakuproject/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/nurulwafa/nufakuproject/ExampleInstrumentedTest.java new file mode 100644 index 0000000..63310c8 --- /dev/null +++ b/app/src/androidTest/java/com/nurulwafa/nufakuproject/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.nurulwafa.nufakuproject; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.example.nufakuproject", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..30d2be4 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/ApiHelper.java b/app/src/main/java/com/nurulwafa/nufakuproject/ApiHelper.java new file mode 100644 index 0000000..810a1de --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/ApiHelper.java @@ -0,0 +1,31 @@ +package com.nurulwafa.nufakuproject; + +public class ApiHelper { + + private static final String EMULATOR_BASE_URL = "http://10.0.2.2:8080/admin-nufa/api/"; + private static final String DEVICE_BASE_URL = "http://192.168.0.80:8080/admin-nufa/api/"; + private static final String HOSTING_BASE_URL = "https://admin-nufa.my.id/api/"; + + public static String getBaseUrl() { + boolean useHosting = true; // Ubah ke true nanti saat hosting aktif + + if (useHosting) { + return HOSTING_BASE_URL; + } + + if (isEmulator()) { + return EMULATOR_BASE_URL; + } else { + return DEVICE_BASE_URL; + } + } + + private static boolean isEmulator() { + return android.os.Build.FINGERPRINT.contains("generic") || + android.os.Build.MODEL.contains("Emulator") || + android.os.Build.HARDWARE.contains("goldfish") || + android.os.Build.PRODUCT.contains("sdk"); + } +} + + diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/Berita.java b/app/src/main/java/com/nurulwafa/nufakuproject/Berita.java new file mode 100644 index 0000000..f3fb431 --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/Berita.java @@ -0,0 +1,31 @@ +package com.nurulwafa.nufakuproject; + +public class Berita { + private String judul; + private String gambar; + private String tanggal; + private String deskripsi; + + public Berita(String judul, String gambar, String tanggal, String deskripsi) { + this.judul = judul; + this.gambar = gambar; + this.tanggal = tanggal; + this.deskripsi = deskripsi; + } + + public String getJudul() { + return judul; + } + + public String getGambar() { + return gambar; + } + + public String getTanggal() { + return tanggal; + } + + public String getDeskripsi() { + return deskripsi; + } +} diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/BeritaActivity.java b/app/src/main/java/com/nurulwafa/nufakuproject/BeritaActivity.java new file mode 100644 index 0000000..a048a1e --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/BeritaActivity.java @@ -0,0 +1,99 @@ +package com.nurulwafa.nufakuproject; + +import android.content.Intent; +import android.os.Bundle; +import android.widget.Toast; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.android.volley.Request; +import com.android.volley.toolbox.JsonObjectRequest; +import com.android.volley.toolbox.Volley; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +public class BeritaActivity extends AppCompatActivity { + + private RecyclerView recyclerView; + private BeritaAdapter adapter; + private List beritaList = new ArrayList<>(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_berita); + + // Tampilkan toast jika dibuka dari notifikasi +// if (getIntent().getBooleanExtra("from_notif", false)) { +// String berita = getIntent().getStringExtra("berita"); +// Toast.makeText(this, "Berita baru: " + berita, Toast.LENGTH_LONG).show(); +// } + + recyclerView = findViewById(R.id.rvBerita); + recyclerView.setLayoutManager(new LinearLayoutManager(this)); + + adapter = new BeritaAdapter(this, beritaList, berita -> { + // Intent ke Detail saat berita diklik + Intent intent = new Intent(BeritaActivity.this, DetailBeritaActivity.class); + intent.putExtra("judul", berita.getJudul()); + intent.putExtra("tanggal", berita.getTanggal()); + intent.putExtra("deskripsi", berita.getDeskripsi()); + intent.putExtra("gambar", berita.getGambar()); + + // Tambahkan log dan toast DI SINI +// Log.d("BERITA_GAMBAR_URL", berita.getGambar()); +// Toast.makeText(this, "Gambar: " + berita.getGambar(), Toast.LENGTH_LONG).show(); + + startActivity(intent); + }); + + recyclerView.setAdapter(adapter); + getBerita(); + } + + private void getBerita() { + String baseUrl = ApiHelper.getBaseUrl(); + String requestUrl = baseUrl + "getBerita"; + + JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, requestUrl, null, + response -> { + try { + if (response.has("data")) { + JSONArray jsonArray = response.getJSONArray("data"); + if (jsonArray.length() == 0) { + Toast.makeText(this, "Data berita tidak ditemukan", Toast.LENGTH_SHORT).show(); + return; + } + + beritaList.clear(); + for (int i = 0; i < jsonArray.length(); i++) { + JSONObject obj = jsonArray.getJSONObject(i); + Berita berita = new Berita( + obj.getString("judul"), + obj.getString("gambar"), + obj.getString("tanggal"), + obj.getString("deskripsi") + ); + beritaList.add(berita); + } + adapter.notifyDataSetChanged(); + } else { + Toast.makeText(this, "Data berita tidak ditemukan", Toast.LENGTH_SHORT).show(); + } + } catch (JSONException e) { + e.printStackTrace(); + Toast.makeText(this, "Gagal parsing data", Toast.LENGTH_SHORT).show(); + } + }, + error -> Toast.makeText(this, "Gagal ambil data: " + error.getMessage(), Toast.LENGTH_SHORT).show() + ); + + Volley.newRequestQueue(this).add(request); + } +} diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/BeritaAdapter.java b/app/src/main/java/com/nurulwafa/nufakuproject/BeritaAdapter.java new file mode 100644 index 0000000..5ff23d3 --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/BeritaAdapter.java @@ -0,0 +1,65 @@ +package com.nurulwafa.nufakuproject; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.List; + +public class BeritaAdapter extends RecyclerView.Adapter { + + private List listBerita; + private Context context; + private OnItemClickListener listener; + + public interface OnItemClickListener { + void onItemClick(Berita berita); + } + + public BeritaAdapter(Context context, List listBerita, OnItemClickListener listener) { + this.context = context; + this.listBerita = listBerita; + this.listener = listener; + } + + @NonNull + @Override + public BeritaViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_berita, parent, false); + return new BeritaViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull BeritaViewHolder holder, int position) { + Berita berita = listBerita.get(position); + holder.tvJudulBerita.setText(berita.getJudul()); + + // Jika kamu ingin klik tombol detail untuk pindah halaman: + holder.btnDetailBerita.setOnClickListener(v -> listener.onItemClick(berita)); + } + + @Override + public int getItemCount() { + return listBerita.size(); + } + + public class BeritaViewHolder extends RecyclerView.ViewHolder { + TextView tvJudulBerita; + ImageView btnDetailBerita; + + public BeritaViewHolder(@NonNull View itemView) { + super(itemView); + tvJudulBerita = itemView.findViewById(R.id.tvJudulBerita); + btnDetailBerita = itemView.findViewById(R.id.btnDetailBerita); + } + } +} + + + diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/ChatActivity.java b/app/src/main/java/com/nurulwafa/nufakuproject/ChatActivity.java new file mode 100644 index 0000000..aa97743 --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/ChatActivity.java @@ -0,0 +1,134 @@ +package com.nurulwafa.nufakuproject; + +import android.os.Bundle; +import android.util.Log; +import android.widget.EditText; +import android.widget.ImageButton; +import android.widget.Toast; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.android.volley.Request; +import com.android.volley.RequestQueue; +import com.android.volley.toolbox.JsonObjectRequest; +import com.android.volley.toolbox.StringRequest; +import com.android.volley.toolbox.Volley; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ChatActivity extends AppCompatActivity { + + private RecyclerView recyclerView; + private EditText inputMessage; + private List chatList; + private ChatAdapter chatAdapter; + private String sender = "wali"; // Ganti jika admin + String idWaliSantri; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_chat); + + recyclerView = findViewById(R.id.recyclerChat); + inputMessage = findViewById(R.id.inputMessage); + ImageButton btnSend = findViewById(R.id.btnSend); + + chatList = new ArrayList<>(); + chatAdapter = new ChatAdapter(chatList, sender); + + recyclerView.setLayoutManager(new LinearLayoutManager(this)); + recyclerView.setAdapter(chatAdapter); + idWaliSantri = getIntent().getStringExtra("id_wali_santri"); + Log.d("CheckID", "idWaliSantri: " + idWaliSantri); + + Log.d("ChatActivity", "ID dari Intent: " + idWaliSantri); + + // ✅ Cek sebelum loadChat + Log.d("Sender", "Before loadChat: " + sender); + + loadChat(); + + // ✅ Cek sesudah loadChat (optional, tapi bagus untuk jaga-jaga) + Log.d("Sender", "After loadChat: " + sender); + + btnSend.setOnClickListener(v -> { + String msg = inputMessage.getText().toString().trim(); + if (!msg.isEmpty()) { + if (idWaliSantri == null || idWaliSantri.isEmpty()) { + Toast.makeText(ChatActivity.this, "ID Wali Santri tidak ditemukan", Toast.LENGTH_SHORT).show(); + return; + } + sendMessage(msg); + inputMessage.setText(""); + } + }); + } + + private void loadChat() { + String baseUrl = ApiHelper.getBaseUrl(); + String requestUrl = baseUrl + "getChatByWali/" + idWaliSantri; + + RequestQueue queue = Volley.newRequestQueue(this); + JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, requestUrl, null, + response -> { + try { + JSONArray chatArray = response.getJSONArray("data"); + chatList.clear(); + for (int i = 0; i < chatArray.length(); i++) { + JSONObject obj = chatArray.getJSONObject(i); + String messageSender = obj.getString("sender"); + String message = obj.getString("message"); + String timestamp = obj.getString("timestamp"); + + Log.d("ChatDebug", "sender = " + messageSender + ", message = " + message + ", timestamp = " + timestamp); + + // ⬇️ ChatModel sudah parse timestamp ke Date di dalam konstruktor + chatList.add(new ChatModel(messageSender, message, timestamp)); + } + + chatList.sort(Comparator.comparing(ChatModel::getParsedTimestamp)); + chatAdapter.notifyDataSetChanged(); + recyclerView.scrollToPosition(chatList.size() - 1); + } catch (Exception e) { + e.printStackTrace(); + } + }, + error -> error.printStackTrace() + ); + queue.add(request); + } + + + private void sendMessage(String message) { + String baseUrl = ApiHelper.getBaseUrl(); + String requestUrl = baseUrl + "sendChat"; + + StringRequest request = new StringRequest(Request.Method.POST, requestUrl, + response -> loadChat(), + error -> error.printStackTrace() + ) { + @Override + protected Map getParams() { + Map params = new HashMap<>(); + params.put("sender", sender); + params.put("id_wali_santri", idWaliSantri); // Ambil ID sesuai login + params.put("message", message); + return params; + } + }; + RequestQueue queue = Volley.newRequestQueue(this); + queue.add(request); + } +} + diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/ChatAdapter.java b/app/src/main/java/com/nurulwafa/nufakuproject/ChatAdapter.java new file mode 100644 index 0000000..56a27d4 --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/ChatAdapter.java @@ -0,0 +1,76 @@ +package com.nurulwafa.nufakuproject; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import androidx.recyclerview.widget.RecyclerView; +import java.util.List; + +public class ChatAdapter extends RecyclerView.Adapter { + + private static final int TYPE_WALI = 0; + private static final int TYPE_ADMIN = 1; + + private List chatList; + private String currentUser; // "wali" or "admin" + + public ChatAdapter(List chatList, String currentUser) { + this.chatList = chatList; + this.currentUser = currentUser; + } + + @Override + public int getItemViewType(int position) { + if (chatList.get(position).getSender().equals(currentUser)) { + return TYPE_WALI; + } else { + return TYPE_ADMIN; + } + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + if (viewType == TYPE_WALI) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_chat_right, parent, false); + return new WaliViewHolder(view); + } else { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_chat_left, parent, false); + return new AdminViewHolder(view); + } + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + ChatModel chat = chatList.get(position); + if (holder instanceof WaliViewHolder) { + ((WaliViewHolder) holder).message.setText(chat.getMessage()); + } else { + ((AdminViewHolder) holder).message.setText(chat.getMessage()); + } + } + + @Override + public int getItemCount() { + return chatList.size(); + } + + static class WaliViewHolder extends RecyclerView.ViewHolder { + TextView message; + + public WaliViewHolder(View itemView) { + super(itemView); + message = itemView.findViewById(R.id.textMessageRight); + } + } + + static class AdminViewHolder extends RecyclerView.ViewHolder { + TextView message; + + public AdminViewHolder(View itemView) { + super(itemView); + message = itemView.findViewById(R.id.textMessageLeft); + } + } +} + diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/ChatModel.java b/app/src/main/java/com/nurulwafa/nufakuproject/ChatModel.java new file mode 100644 index 0000000..547ae11 --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/ChatModel.java @@ -0,0 +1,45 @@ +package com.nurulwafa.nufakuproject; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +public class ChatModel { + private String sender; + private String message; + private String timestamp; + private Date parsedTimestamp; + + public ChatModel(String sender, String message, String timestamp) { + this.sender = sender; + this.message = message; + this.timestamp = timestamp; + + // Parse timestamp ke Date saat objek dibuat + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); + this.parsedTimestamp = sdf.parse(timestamp); + } catch (ParseException e) { + e.printStackTrace(); + this.parsedTimestamp = new Date(); // fallback: waktu saat ini + } + } + + public String getSender() { + return sender; + } + + public String getMessage() { + return message; + } + + public String getTimestamp() { + return timestamp; + } + + public Date getParsedTimestamp() { + return parsedTimestamp; + } +} + diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/DataSantriActivity.java b/app/src/main/java/com/nurulwafa/nufakuproject/DataSantriActivity.java new file mode 100644 index 0000000..00bfbc3 --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/DataSantriActivity.java @@ -0,0 +1,83 @@ +package com.nurulwafa.nufakuproject; +import android.os.Bundle; +import android.widget.TextView; +import android.widget.Toast; +import androidx.appcompat.app.AppCompatActivity; +import com.android.volley.Request; +import com.android.volley.RequestQueue; +import com.android.volley.toolbox.JsonObjectRequest; +import com.android.volley.toolbox.Volley; +import org.json.JSONException; +import org.json.JSONObject; + +public class DataSantriActivity extends AppCompatActivity { + + private TextView tvNIS, tvNamaSantri, tvKelasDiniyah, tvStatusSantri, tvTahunMasuk, tvTahunKeluar, tvKeteranganKeluar, + tvTempatLahir, tvTanggalLahir, tvAlamatSantri; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_data_santri); + + // Inisialisasi TextView + tvNIS = findViewById(R.id.tvNIS); + tvNamaSantri = findViewById(R.id.tvNamaSantri); + tvKelasDiniyah = findViewById(R.id.tvKelasDiniyah); + tvStatusSantri = findViewById(R.id.tvStatusSantri); + tvTahunMasuk = findViewById(R.id.tvTahunMasuk); + tvTahunKeluar = findViewById(R.id.tvTahunKeluar); + tvKeteranganKeluar = findViewById(R.id.tvKeteranganKeluar); + tvTempatLahir = findViewById(R.id.tvTempatLahir); + tvTanggalLahir = findViewById(R.id.tvTanggalLahir); + tvAlamatSantri = findViewById(R.id.tvAlamatSantri); + + String loginKey = getIntent().getStringExtra("login_key"); + String loginValue = getIntent().getStringExtra("login_value"); + + if (loginKey != null && loginValue != null) { + getDataSantri(loginKey, loginValue); + } else { + Toast.makeText(this, "Data login tidak ditemukan", Toast.LENGTH_SHORT).show(); + } + } + + private void getDataSantri(String key, String value) { + String baseUrl = ApiHelper.getBaseUrl(); // Ambil base URL fleksibel + + String requestUrl = baseUrl + "getDataSantri?" + key + "=" + value; + + JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, requestUrl, null, + response -> { + try { + if (response.getBoolean("status")) { + // Ambil objek santri + JSONObject data = response.getJSONObject("data"); + JSONObject santri = data.getJSONObject("santri"); + + tvNIS.setText(santri.getString("NIS")); + tvNamaSantri.setText(santri.getString("nama_santri")); + tvKelasDiniyah.setText(santri.getString("kelas_diniyah")); + tvStatusSantri.setText(santri.getString("status_santri")); + tvTahunMasuk.setText(santri.getString("tahun_masuk")); + tvTahunKeluar.setText(santri.getString("tahun_keluar")); + tvKeteranganKeluar.setText(santri.getString("keterangan_keluar")); + tvTempatLahir.setText(santri.getString("tempat_lahir")); + tvTanggalLahir.setText(santri.getString("tanggal_lahir")); + tvAlamatSantri.setText(santri.getString("alamat_santri")); + } else { + Toast.makeText(this, "Data tidak ditemukan", Toast.LENGTH_SHORT).show(); + } + } catch (JSONException e) { + e.printStackTrace(); + Toast.makeText(this, "Gagal parsing data", Toast.LENGTH_SHORT).show(); + } + }, + error -> Toast.makeText(this, "Gagal ambil data: " + error.getMessage(), Toast.LENGTH_SHORT).show() + ); + + + RequestQueue queue = Volley.newRequestQueue(this); + queue.add(request); + } +} diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/DataWaliSantriActivity.java b/app/src/main/java/com/nurulwafa/nufakuproject/DataWaliSantriActivity.java new file mode 100644 index 0000000..8c68da3 --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/DataWaliSantriActivity.java @@ -0,0 +1,75 @@ +package com.nurulwafa.nufakuproject; + +import android.os.Bundle; +import android.widget.TextView; +import android.widget.Toast; +import androidx.appcompat.app.AppCompatActivity; +import com.android.volley.Request; +import com.android.volley.RequestQueue; +import com.android.volley.toolbox.JsonObjectRequest; +import com.android.volley.toolbox.Volley; +import org.json.JSONException; +import org.json.JSONObject; + +public class DataWaliSantriActivity extends AppCompatActivity { + + private TextView tvEmail, tvPassword, tvNamaWaliSantri, tvAlamat, tvNoTelepon, tvPekerjaan; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_data_wali_santri); + + // Inisialisasi TextView + tvEmail = findViewById(R.id.tvEmail); + tvPassword = findViewById(R.id.tvPassword); + tvNamaWaliSantri = findViewById(R.id.tvNamaWaliSantri); + tvAlamat = findViewById(R.id.tvAlamat); + tvNoTelepon = findViewById(R.id.tvNoTelepon); + tvPekerjaan = findViewById(R.id.tvPekerjaan); + + String loginKey = getIntent().getStringExtra("login_key"); + String loginValue = getIntent().getStringExtra("login_value"); + + if (loginKey != null && loginValue != null) { + getDataSantri(loginKey, loginValue); + } else { + Toast.makeText(this, "Data login tidak ditemukan", Toast.LENGTH_SHORT).show(); + } + } + + private void getDataSantri(String key, String value) { + String baseUrl = ApiHelper.getBaseUrl(); // Ambil base URL fleksibel + + String requestUrl = baseUrl + "getDataSantri?" + key + "=" + value; + + JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, requestUrl, null, + response -> { + try { + if (response.getBoolean("status")) { + // Ambil objek wali_santri + JSONObject data = response.getJSONObject("data"); + JSONObject waliSantri = data.getJSONObject("wali_santri"); + + tvEmail.setText(waliSantri.getString("email")); + tvPassword.setText(waliSantri.getString("password")); // Tidak ada di response, bisa dikosongkan atau ditambah di API jika perlu + tvNamaWaliSantri.setText(waliSantri.getString("nama_wali_santri")); + tvAlamat.setText(waliSantri.getString("alamat")); + tvNoTelepon.setText(waliSantri.getString("no_telepon")); + tvPekerjaan.setText(waliSantri.getString("pekerjaan")); + } else { + Toast.makeText(this, "Data tidak ditemukan", Toast.LENGTH_SHORT).show(); + } + } catch (JSONException e) { + e.printStackTrace(); + Toast.makeText(this, "Gagal parsing data", Toast.LENGTH_SHORT).show(); + } + }, + error -> Toast.makeText(this, "Gagal ambil data: " + error.getMessage(), Toast.LENGTH_SHORT).show() + ); + + + RequestQueue queue = Volley.newRequestQueue(this); + queue.add(request); + } +} diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/DetailBeritaActivity.java b/app/src/main/java/com/nurulwafa/nufakuproject/DetailBeritaActivity.java new file mode 100644 index 0000000..5bb19f1 --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/DetailBeritaActivity.java @@ -0,0 +1,52 @@ +package com.nurulwafa.nufakuproject; + +import android.os.Bundle; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.appcompat.app.AppCompatActivity; + +import com.bumptech.glide.Glide; + +public class DetailBeritaActivity extends AppCompatActivity { + + TextView tvJudul, tvTanggal, tvDeskripsi; + ImageView imgBerita; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_detail_berita); + + tvJudul = findViewById(R.id.tvJudul); + tvTanggal = findViewById(R.id.tvTanggal); + tvDeskripsi = findViewById(R.id.tvDeskripsi); + imgBerita = findViewById(R.id.imgBerita); + + // Ambil data dari intent + String judul = getIntent().getStringExtra("judul"); + String tanggal = getIntent().getStringExtra("tanggal"); + String deskripsi = getIntent().getStringExtra("deskripsi"); + String gambar = getIntent().getStringExtra("gambar"); + + tvJudul.setText(judul); + tvTanggal.setText(tanggal); + tvDeskripsi.setText(deskripsi); + Glide.with(this).load(gambar).into(imgBerita); +// Glide.with(this) +// .load(gambar) +// .listener(new RequestListener() { +// @Override +// public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { +// e.printStackTrace(); // cetak error ke logcat +// return false; +// } +// +// @Override +// public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { +// return false; +// } +// }) +// .into(imgBerita); + } +} diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/DetailKegiatanActivity.java b/app/src/main/java/com/nurulwafa/nufakuproject/DetailKegiatanActivity.java new file mode 100644 index 0000000..8e20c64 --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/DetailKegiatanActivity.java @@ -0,0 +1,80 @@ +package com.nurulwafa.nufakuproject; + +import android.os.Bundle; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.android.volley.Request; +import com.android.volley.toolbox.JsonObjectRequest; +import com.android.volley.toolbox.Volley; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +public class DetailKegiatanActivity extends AppCompatActivity { + + private TextView tvHari; + private RecyclerView rvKegiatanSantri; + private List kegiatanList; + private KegiatanSantriAdapter adapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_detail_kegiatan); + + tvHari = findViewById(R.id.homeTitle); + rvKegiatanSantri = findViewById(R.id.rvKegiatanSantri); + + String hari = getIntent().getStringExtra("hari"); + tvHari.setText("Kegiatan Hari " + hari); + + kegiatanList = new ArrayList<>(); + adapter = new KegiatanSantriAdapter(this, kegiatanList); + rvKegiatanSantri.setLayoutManager(new LinearLayoutManager(this)); + rvKegiatanSantri.setAdapter(adapter); + + getDetailKegiatan(hari); + } + + private void getDetailKegiatan(String hari) { + String url = ApiHelper.getBaseUrl() + "getKegiatan?hari=" + hari; + + JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, + response -> { + try { + if (response.getBoolean("status")) { + JSONArray dataArray = response.getJSONArray("data"); + kegiatanList.clear(); + + for (int i = 0; i < dataArray.length(); i++) { + JSONObject item = dataArray.getJSONObject(i); + String namaKegiatan = item.getString("nama_kegiatan"); + String waktu = item.getString("waktu"); + + kegiatanList.add(new KegiatanSantri(namaKegiatan, waktu)); + } + + adapter.notifyDataSetChanged(); + } else { + Toast.makeText(this, "Data tidak tersedia", Toast.LENGTH_SHORT).show(); + } + } catch (JSONException e) { + Toast.makeText(this, "Gagal parsing data", Toast.LENGTH_SHORT).show(); + e.printStackTrace(); + } + }, + error -> Toast.makeText(this, "Gagal mengambil data: " + error.getMessage(), Toast.LENGTH_SHORT).show() + ); + + Volley.newRequestQueue(this).add(request); + } +} diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/HomeActivity.java b/app/src/main/java/com/nurulwafa/nufakuproject/HomeActivity.java new file mode 100644 index 0000000..b0f31cd --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/HomeActivity.java @@ -0,0 +1,197 @@ +package com.nurulwafa.nufakuproject; + +import android.content.Intent; +import android.os.Bundle; + +import android.content.SharedPreferences; +import androidx.appcompat.app.AlertDialog; + +import androidx.cardview.widget.CardView; + +import android.util.Log; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; +import androidx.appcompat.app.AppCompatActivity; + +public class HomeActivity extends AppCompatActivity { + + String idSantri; + CardView cardKesehatan; + TextView txtKesehatan; + ImageView imgKesehatan; + + @Override + protected void onCreate(Bundle savedInstanceState) { + + // Ambil data dari notifikasi (jika ada) + Intent notifIntent = getIntent(); // jangan pakai nama 'intent' + String idSantriFromNotif = notifIntent.getStringExtra("id_santri"); + String kondisiFromNotif = notifIntent.getStringExtra("kondisi_kesehatan"); + +// Simpan ke SharedPreferences jika berasal dari notifikasi + if (idSantriFromNotif != null && kondisiFromNotif != null) { + Log.d("NOTIF", "ID Santri dari Notif: " + idSantriFromNotif); + SharedPreferences preferences = getSharedPreferences("santri", MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + editor.putString("kondisi_kesehatan", kondisiFromNotif); + editor.apply(); + + } + + SharedPreferences preferences = getSharedPreferences("santri", MODE_PRIVATE); + String idSantri = preferences.getString("id_santri", null); + + if (idSantri == null) { + // Jika datang dari notifikasi + if (getIntent().getBooleanExtra("from_notif", false)) { + String idFromNotif = getIntent().getStringExtra("id_santri"); + if (idFromNotif != null) { + SharedPreferences.Editor editor = preferences.edit(); + editor.putString("id_santri", idFromNotif); + editor.apply(); + idSantri = idFromNotif; + + // Log.d("HOME_ID_SANTRI", "Disimpan dari notifikasi: " + idSantri); + } + } + + if (idSantri == null) { + Toast.makeText(this, "ID Santri tidak ditemukan!", Toast.LENGTH_SHORT).show(); + finish(); + return; + } + } + + // Terima login key dan value dari LoginActivity + String loginKey = getIntent().getStringExtra("login_key"); + String loginValue = getIntent().getStringExtra("login_value"); + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_home); // pastikan xml-nya activity_home.xml + + // Terima id_santri dari intent + idSantri = getIntent().getStringExtra("id_santri"); + + if (idSantri == null) { + Toast.makeText(this, "ID Santri tidak ditemukan!", Toast.LENGTH_SHORT).show(); + finish(); + return; + } + String idWaliSantri = getIntent().getStringExtra("id_wali_santri"); + + // Hubungkan semua CardView + CardView cardPonpes = findViewById(R.id.cardPonpes); + CardView cardSantri = findViewById(R.id.cardSantri); + CardView cardWaliSantri = findViewById(R.id.cardWaliSantri); + CardView cardKegiatan = findViewById(R.id.cardKegiatan); + CardView cardPrestasi = findViewById(R.id.cardPrestasi); + CardView cardPelanggaran = findViewById(R.id.cardPelanggaran); + CardView cardSPP = findViewById(R.id.cardSPP); + CardView cardBerita = findViewById(R.id.cardBerita); + cardKesehatan = findViewById(R.id.cardKesehatan); + txtKesehatan = findViewById(R.id.txtKesehatan); + imgKesehatan = findViewById(R.id.imgKesehatan); + + // Pasang onClick untuk tiap CardView + cardPonpes.setOnClickListener(v -> { + Intent intent = new Intent(HomeActivity.this, PonpesActivity.class); + startActivity(intent); + }); + cardSantri.setOnClickListener(v -> { + Intent intent = new Intent(HomeActivity.this, DataSantriActivity.class); + intent.putExtra("login_key", loginKey); + intent.putExtra("login_value", loginValue); + startActivity(intent); + }); + + + cardWaliSantri.setOnClickListener(v -> { + Intent intent = new Intent(HomeActivity.this, DataWaliSantriActivity.class); + intent.putExtra("login_key", loginKey); + intent.putExtra("login_value", loginValue); + startActivity(intent); + }); + + cardKegiatan.setOnClickListener(v -> { + Intent intent = new Intent(HomeActivity.this, KegiatanSantriActivity.class); + startActivity(intent); + }); + + cardPrestasi.setOnClickListener(v -> { + Intent intent = new Intent(HomeActivity.this, PrestasiSantriActivity.class); + intent.putExtra("login_key", loginKey); + intent.putExtra("login_value", loginValue); + startActivity(intent); + }); + + cardPelanggaran.setOnClickListener(v -> { + Intent intent = new Intent(HomeActivity.this, PelanggaranSantriActivity.class); + intent.putExtra("login_key", loginKey); + intent.putExtra("login_value", loginValue); + startActivity(intent); + }); + + cardSPP.setOnClickListener(v -> { + Intent intent = new Intent(HomeActivity.this, InformasiSPPActivity.class); + intent.putExtra("login_key", loginKey); + intent.putExtra("login_value", loginValue); + startActivity(intent); + }); + + cardBerita.setOnClickListener(v -> { + Intent intent = new Intent(HomeActivity.this, BeritaActivity.class); + startActivity(intent); + }); + + ImageButton btnChat = findViewById(R.id.btnChat); + btnChat.setOnClickListener(v -> { + Intent intent = new Intent(HomeActivity.this, ChatActivity.class); + intent.putExtra("id_wali_santri", String.valueOf(idWaliSantri)); + startActivity(intent); + }); + + ImageButton btnLogout = findViewById(R.id.btnLogout); + + btnLogout.setOnClickListener(v -> { + new AlertDialog.Builder(HomeActivity.this) + .setTitle("Konfirmasi Logout") + .setMessage("Apakah Anda yakin ingin keluar?") + .setPositiveButton("Iya", (dialog, which) -> { + // Hapus sesi login (jika pakai SharedPreferences) + SharedPreferences logoutPrefs = getSharedPreferences("login", MODE_PRIVATE); + logoutPrefs.edit().clear().apply(); + + // Arahkan ke halaman login + Intent intent = new Intent(HomeActivity.this, MainActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + startActivity(intent); + finish(); + }) + .setNegativeButton("Tidak", (dialog, which) -> { + dialog.dismiss(); // Tutup dialog + }) + .show(); + }); + + loadDataSantri(); + } + + private void loadDataSantri() { + SharedPreferences preferences = getSharedPreferences("santri", MODE_PRIVATE); + String kondisiKesehatan = preferences.getString("kondisi_kesehatan", "Tidak Diketahui"); + + // Log.d("Kesehatan", "Kondisi: " + kondisiKesehatan); + txtKesehatan.setText(kondisiKesehatan); + + if (kondisiKesehatan.equalsIgnoreCase("Dalam Kondisi Sehat")) { + imgKesehatan.setImageResource(R.drawable.sehat); + } else if (kondisiKesehatan.equalsIgnoreCase("Dalam Kondisi Sakit")) { + imgKesehatan.setImageResource(R.drawable.sakit); + } else { + txtKesehatan.setText("Kondisi Tidak Diketahui"); + imgKesehatan.setImageResource(R.drawable.ic_unknown); + } + } + +} diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/InformasiSPP.java b/app/src/main/java/com/nurulwafa/nufakuproject/InformasiSPP.java new file mode 100644 index 0000000..56d7e0a --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/InformasiSPP.java @@ -0,0 +1,43 @@ +package com.nurulwafa.nufakuproject; + +public class InformasiSPP { + private String namaSantri; + private String bulan; + private String tahun; + private String jumlahPembayaran; + private String jatuhTempo; + private String keterangan; + + public InformasiSPP(String namaSantri, String bulan, String tahun, String jumlahPembayaran, String jatuhTempo, String keterangan) { + this.namaSantri = namaSantri; + this.bulan = bulan; + this.tahun = tahun; + this.jumlahPembayaran = jumlahPembayaran; + this.jatuhTempo = jatuhTempo; + this.keterangan = keterangan; + } + + public String getNamaSantri() { + return namaSantri; + } + + public String getBulan() { + return bulan; + } + + public String getTahun() { + return tahun; + } + + public String getJumlahPembayaran() { + return jumlahPembayaran; + } + + public String getJatuhTempo() { + return jatuhTempo; + } + + public String getKeterangan() { + return keterangan; + } +} diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/InformasiSPPActivity.java b/app/src/main/java/com/nurulwafa/nufakuproject/InformasiSPPActivity.java new file mode 100644 index 0000000..c7851c6 --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/InformasiSPPActivity.java @@ -0,0 +1,93 @@ +package com.nurulwafa.nufakuproject; + +import android.os.Bundle; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.android.volley.Request; +import com.android.volley.RequestQueue; +import com.android.volley.toolbox.JsonObjectRequest; +import com.android.volley.toolbox.Volley; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; + +public class InformasiSPPActivity extends AppCompatActivity { + private RecyclerView rvInformasiSPP; + private InformasiSPPAdapter adapter; + private ArrayList informasiSPPList; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_informasi_spp_santri); + + rvInformasiSPP = findViewById(R.id.rvInformasiSPP); + rvInformasiSPP.setLayoutManager(new LinearLayoutManager(this)); + + informasiSPPList = new ArrayList<>(); + adapter = new InformasiSPPAdapter(informasiSPPList); + rvInformasiSPP.setAdapter(adapter); + + String loginKey = getIntent().getStringExtra("login_key"); + String loginValue = getIntent().getStringExtra("login_value"); + + if (loginKey != null && loginValue != null) { + getDataSantri(loginKey, loginValue); + } else { + Toast.makeText(this, "Data login tidak ditemukan", Toast.LENGTH_SHORT).show(); + } + } + + private void getDataSantri(String key, String value) { + String baseUrl = ApiHelper.getBaseUrl(); + String requestUrl = baseUrl + "getDataSantri?" + key + "=" + value; + + JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, requestUrl, null, + response -> { + try { + if (response.getBoolean("status")) { + informasiSPPList.clear(); + + // Ambil objek "data" + JSONObject dataObject = response.getJSONObject("data"); + + // Ambil array "pelanggaran_santri" dari dalam "data" + JSONArray informasiSPPArray = dataObject.getJSONArray("informasi_spp_santri"); + + for (int i = 0; i < informasiSPPArray.length(); i++) { + JSONObject informasiSPP = informasiSPPArray.getJSONObject(i); + + String nama = informasiSPP.getString("nama_santri"); + String bulan = informasiSPP.optString("bulan", "-"); + String tahun = informasiSPP.optString("tahun", "-"); + String jumlahPembayaran = informasiSPP.optString("jumlah_pembayaran", "-"); + String jatuhTempo = informasiSPP.optString("jatuh_tempo", "-"); + String keterangan = informasiSPP.optString("keterangan", "-"); + + InformasiSPP p = new InformasiSPP(nama, bulan, tahun, jumlahPembayaran, jatuhTempo, keterangan); + informasiSPPList.add(p); + } + + adapter.notifyDataSetChanged(); + } else { + Toast.makeText(this, "Data tidak ditemukan", Toast.LENGTH_SHORT).show(); + } + } catch (JSONException e) { + e.printStackTrace(); + Toast.makeText(this, "Gagal parsing data", Toast.LENGTH_SHORT).show(); + } + }, + error -> Toast.makeText(this, "Gagal ambil data: " + error.getMessage(), Toast.LENGTH_SHORT).show() + ); + + RequestQueue queue = Volley.newRequestQueue(this); + queue.add(request); + } +} diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/InformasiSPPAdapter.java b/app/src/main/java/com/nurulwafa/nufakuproject/InformasiSPPAdapter.java new file mode 100644 index 0000000..16179d1 --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/InformasiSPPAdapter.java @@ -0,0 +1,56 @@ +package com.nurulwafa.nufakuproject; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.List; + +public class InformasiSPPAdapter extends RecyclerView.Adapter { + private final List informasiSPPList; + + public InformasiSPPAdapter(List informasiSPPList) { + this.informasiSPPList = informasiSPPList; + } + + @NonNull + @Override + public InformasiSPPAdapter.InformasiSPPViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_informasi_spp, parent, false); + return new InformasiSPPAdapter.InformasiSPPViewHolder(v); + } + + @Override + public void onBindViewHolder(@NonNull InformasiSPPAdapter.InformasiSPPViewHolder holder, int position) { + InformasiSPP informasiSPP = informasiSPPList.get(position); + holder.tvNamaSantri.setText(informasiSPP.getNamaSantri()); + holder.tvBulan.setText("Bulan: " + informasiSPP.getBulan()); + holder.tvTahun.setText("Tahun: " + informasiSPP.getTahun()); + holder.tvJumlahPembayaran.setText("Jumlah Pembayaran: " + informasiSPP.getJumlahPembayaran()); + holder.tvJatuhTempo.setText("Jatuh Tempo: " + informasiSPP.getJatuhTempo()); + holder.tvKeterangan.setText("Keterangan: " + informasiSPP.getKeterangan()); + } + + @Override + public int getItemCount() { + return informasiSPPList.size(); + } + + static class InformasiSPPViewHolder extends RecyclerView.ViewHolder { + TextView tvNamaSantri, tvBulan, tvTahun, tvJumlahPembayaran, tvJatuhTempo, tvKeterangan; + + public InformasiSPPViewHolder(@NonNull View itemView) { + super(itemView); + tvNamaSantri = itemView.findViewById(R.id.tvNamaSantri); + tvBulan = itemView.findViewById(R.id.tvBulan); + tvTahun = itemView.findViewById(R.id.tvTahun); + tvJumlahPembayaran = itemView.findViewById(R.id.tvJumlahPembayaran); + tvJatuhTempo = itemView.findViewById(R.id.tvJatuhTempo); + tvKeterangan = itemView.findViewById(R.id.tvKeterangan); + } + } +} diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/KegiatanSantri.java b/app/src/main/java/com/nurulwafa/nufakuproject/KegiatanSantri.java new file mode 100644 index 0000000..fe4bb03 --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/KegiatanSantri.java @@ -0,0 +1,19 @@ +package com.nurulwafa.nufakuproject; + +public class KegiatanSantri { + private String namaKegiatan; + private String waktu; + + public KegiatanSantri(String namaKegiatan, String waktu) { + this.namaKegiatan = namaKegiatan; + this.waktu = waktu; + } + + public String getNamaKegiatan() { + return namaKegiatan; + } + + public String getWaktu() { + return waktu; + } +} diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/KegiatanSantriActivity.java b/app/src/main/java/com/nurulwafa/nufakuproject/KegiatanSantriActivity.java new file mode 100644 index 0000000..a611644 --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/KegiatanSantriActivity.java @@ -0,0 +1,98 @@ +package com.nurulwafa.nufakuproject; + +import android.graphics.Typeface; +import android.os.Bundle; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; + +import com.android.volley.Request; +import com.android.volley.RequestQueue; +import com.android.volley.toolbox.JsonObjectRequest; +import com.android.volley.toolbox.Volley; + +import org.json.JSONException; +import org.json.JSONObject; +import org.json.JSONArray; + +public class KegiatanSantriActivity extends AppCompatActivity { + + private LinearLayout layoutKonten; + RequestQueue requestQueue; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_kegiatan_santri); + + layoutKonten = findViewById(R.id.layoutKonten); + requestQueue = Volley.newRequestQueue(this); + // Panggil method untuk ambil dan tampilkan data + fetchKegiatanSantri(); + } + + private void fetchKegiatanSantri() { + String url = ApiHelper.getBaseUrl() + "getKegiatan"; + + JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, + response -> { + try { + boolean status = response.getBoolean("status"); + if (status) { + JSONArray dataArray = response.getJSONArray("data"); + + for (int i = 0; i < dataArray.length(); i++) { + JSONObject kegiatan = dataArray.getJSONObject(i); + String namaKegiatan = kegiatan.getString("nama_kegiatan"); + String waktu = kegiatan.getString("waktu"); + + // Tambahkan ke layoutKonten + addKegiatanCard(namaKegiatan, waktu); + } + } else { + Toast.makeText(this, "Tidak ada data kegiatan ditemukan.", Toast.LENGTH_SHORT).show(); + } + } catch (JSONException e) { + e.printStackTrace(); + Toast.makeText(this, "Error parsing data", Toast.LENGTH_SHORT).show(); + } + }, + error -> { + error.printStackTrace(); + Toast.makeText(this, "Gagal mengambil data dari server", Toast.LENGTH_SHORT).show(); + } + ); + requestQueue.add(request); + } + + private void addKegiatanCard(String nama, String waktu) { + LinearLayout layoutKonten = findViewById(R.id.layoutKonten); + + LinearLayout card = new LinearLayout(this); + card.setOrientation(LinearLayout.VERTICAL); + card.setPadding(24, 24, 24, 24); + card.setBackgroundResource(R.drawable.custom_editcard); // opsional: drawable card background + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); + params.setMargins(0, 30, 0, 0); + card.setLayoutParams(params); + + TextView tvNama = new TextView(this); + tvNama.setText(nama); + tvNama.setTextSize(16f); + tvNama.setTypeface(null, Typeface.BOLD); + + TextView tvWaktu = new TextView(this); + tvWaktu.setText(waktu); + tvWaktu.setTextSize(14f); + + card.addView(tvNama); + card.addView(tvWaktu); + + layoutKonten.addView(card); + } + +} + diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/KegiatanSantriAdapter.java b/app/src/main/java/com/nurulwafa/nufakuproject/KegiatanSantriAdapter.java new file mode 100644 index 0000000..a8c602a --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/KegiatanSantriAdapter.java @@ -0,0 +1,51 @@ +package com.nurulwafa.nufakuproject; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.List; + +public class KegiatanSantriAdapter extends RecyclerView.Adapter { + private List kegiatanList; + private Context context; + + public KegiatanSantriAdapter(Context context, List kegiatanList) { + this.context = context; + this.kegiatanList = kegiatanList; + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_kegiatan_santri, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + KegiatanSantri kegiatan = kegiatanList.get(position); + holder.tvNamaKegiatan.setText(kegiatan.getNamaKegiatan()); + holder.tvWaktu.setText(kegiatan.getWaktu()); + } + + @Override + public int getItemCount() { + return kegiatanList.size(); + } + + public static class ViewHolder extends RecyclerView.ViewHolder { + TextView tvNamaKegiatan, tvWaktu; + + public ViewHolder(@NonNull View itemView) { + super(itemView); + tvNamaKegiatan = itemView.findViewById(R.id.tvNamaKegiatan); + tvWaktu = itemView.findViewById(R.id.tvWaktu); + } + } +} diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/MainActivity.java b/app/src/main/java/com/nurulwafa/nufakuproject/MainActivity.java new file mode 100644 index 0000000..85d7e5a --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/MainActivity.java @@ -0,0 +1,214 @@ +package com.nurulwafa.nufakuproject; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.text.InputType; +import android.util.Log; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.Toast; + +import com.android.volley.Request; +import com.android.volley.toolbox.JsonObjectRequest; +import com.android.volley.toolbox.Volley; +import com.google.firebase.messaging.FirebaseMessaging; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; + +public class MainActivity extends AppCompatActivity { + + private EditText edtEmailOrNIS; + private EditText edtPassword; + private Button btnLogin; + private boolean isPasswordVisible = false; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + edtEmailOrNIS = findViewById(R.id.email); + edtPassword = findViewById(R.id.password); + btnLogin = findViewById(R.id.loginButton); + ImageView togglePasswordVisibility = findViewById(R.id.togglePasswordVisibility); + + togglePasswordVisibility.setOnClickListener(v -> { + if (isPasswordVisible) { + edtPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); + togglePasswordVisibility.setImageResource(R.drawable.ic_eye_closed); + isPasswordVisible = false; + } else { + edtPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); + togglePasswordVisibility.setImageResource(R.drawable.ic_eye_open); + isPasswordVisible = true; + } + edtPassword.setSelection(edtPassword.getText().length()); + }); + + btnLogin.setOnClickListener(view -> { + String inputEmailOrNIS = edtEmailOrNIS.getText().toString().trim(); + String inputPassword = edtPassword.getText().toString().trim(); + + if (inputEmailOrNIS.isEmpty() || inputPassword.isEmpty()) { + Toast.makeText(MainActivity.this, "Email/NIS dan Password tidak boleh kosong!", Toast.LENGTH_SHORT).show(); + return; + } + + new Thread(() -> { + try { + String urlLogin = ApiHelper.getBaseUrl() + "loginWaliSantri"; + URL url = new URL(urlLogin); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("POST"); + conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); + conn.setDoOutput(true); + conn.setDoInput(true); + + JSONObject jsonParam = new JSONObject(); + jsonParam.put("email_or_NIS", inputEmailOrNIS); + jsonParam.put("password", inputPassword); + + OutputStream os = conn.getOutputStream(); + os.write(jsonParam.toString().getBytes("UTF-8")); + os.close(); + + int responseCode = conn.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK) { + BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); + StringBuilder sb = new StringBuilder(); + String line; + while ((line = in.readLine()) != null) { + sb.append(line); + } + in.close(); + + // Tambahkan debug di sini + String responseData = sb.toString(); + // Log.d("API_RESPONSE", responseData); + JSONObject responseJson = new JSONObject(responseData); + + String status = responseJson.getString("status"); + + runOnUiThread(() -> { + if (status.equals("success") || status.equals("true")) { + try { + JSONObject santri = responseJson.getJSONObject("santri"); + String idSantri = santri.getString("id_santri"); + + JSONObject waliSantri = responseJson.getJSONObject("wali_santri"); + String idWaliSantri = waliSantri.getString("id_wali_santri"); + String kondisiKesehatan = waliSantri.optString("kondisi_kesehatan"); + // Log.d("Kesehatan", "Login - kondisi dari API: " + kondisiKesehatan); + // Log.d("LOGIN_ID_SANTRI", "ID Santri dari API: " + idSantri); + + + // SharedPreferences DI SINI — di thread utama + SharedPreferences preferences = getSharedPreferences("santri", MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + editor.putString("id_santri", idSantri); + editor.putString("kondisi_kesehatan", kondisiKesehatan); + editor.apply(); + // Log.d("Kesehatan", "Menyimpan kondisi: " + kondisiKesehatan); + // Log.d("LOGIN_ID_SANTRI", "ID Santri disimpan ke SharedPreferences: " + idSantri); + + Toast.makeText(MainActivity.this, "Login berhasil!", Toast.LENGTH_SHORT).show(); + + FirebaseMessaging.getInstance().getToken().addOnCompleteListener(task -> { + if (task.isSuccessful()) { + String fcmToken = task.getResult(); + // Log.d("FCM_TOKEN", "Token didapatkan: " + fcmToken); + + saveTokenToServer(idWaliSantri, fcmToken, () -> { + // Callback setelah token tersimpan, lanjut ke HomeActivity + Intent intent = new Intent(MainActivity.this, HomeActivity.class); + intent.putExtra("id_santri", idSantri); + intent.putExtra("id_wali_santri", idWaliSantri); + + String loginKey = inputEmailOrNIS.contains("@") ? "email" : "NIS"; + intent.putExtra("login_key", loginKey); + intent.putExtra("login_value", inputEmailOrNIS); + + startActivity(intent); + finish(); + }); + } else { + // Log.e("FCM_TOKEN_ERR", "Gagal mendapatkan token FCM: " + task.getException()); + } + }); + + Intent intent = new Intent(MainActivity.this, HomeActivity.class); + intent.putExtra("id_santri", idSantri); + intent.putExtra("id_wali_santri", idWaliSantri); + + String loginKey = inputEmailOrNIS.contains("@") ? "email" : "NIS"; + intent.putExtra("login_key", loginKey); + intent.putExtra("login_value", inputEmailOrNIS); + + startActivity(intent); + finish(); + + } catch (JSONException e) { + e.printStackTrace(); + Toast.makeText(MainActivity.this, "Gagal parsing data!", Toast.LENGTH_SHORT).show(); + } + } else { + Toast.makeText(MainActivity.this, "Login gagal! Email/NIS atau password salah.", Toast.LENGTH_SHORT).show(); + } + }); + + } else { + runOnUiThread(() -> + Toast.makeText(MainActivity.this, "Gagal terhubung ke server.", Toast.LENGTH_SHORT).show() + ); + } + conn.disconnect(); + + } catch (Exception e) { + e.printStackTrace(); + runOnUiThread(() -> + Toast.makeText(MainActivity.this, "Terjadi kesalahan: " + e.getMessage(), Toast.LENGTH_SHORT).show() + ); + } + }).start(); + }); + + } + private void saveTokenToServer(String idWaliSantri, String token, Runnable onSuccess) { + String url = ApiHelper.getBaseUrl() + "saveToken"; + + JSONObject jsonBody = new JSONObject(); + try { + jsonBody.put("id_wali_santri", idWaliSantri); + jsonBody.put("token", token); + } catch (JSONException e) { + e.printStackTrace(); + return; + } + + JsonObjectRequest request = new JsonObjectRequest( + Request.Method.POST, url, jsonBody, + response -> { + Log.d("FCM_TOKEN", "Token berhasil dikirim: " + token); + if (onSuccess != null) { + onSuccess.run(); // jalankan callback jika tidak null + } + }, + error -> Log.e("FCM_TOKEN_ERR", "Gagal kirim token: " + error.toString()) + ); + + Volley.newRequestQueue(this).add(request); + } + + +} diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/MyAppGlideModule.java b/app/src/main/java/com/nurulwafa/nufakuproject/MyAppGlideModule.java new file mode 100644 index 0000000..21bcdf6 --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/MyAppGlideModule.java @@ -0,0 +1,6 @@ +package com.nurulwafa.nufakuproject; + +import com.bumptech.glide.module.AppGlideModule; + +public class MyAppGlideModule extends AppGlideModule { +} diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/MyFirebaseMessagingService.java b/app/src/main/java/com/nurulwafa/nufakuproject/MyFirebaseMessagingService.java new file mode 100644 index 0000000..8b07e32 --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/MyFirebaseMessagingService.java @@ -0,0 +1,113 @@ +package com.nurulwafa.nufakuproject; + +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.ContentResolver; +import android.content.Intent; +import android.graphics.Color; +import android.media.AudioAttributes; +import android.net.Uri; +import android.os.Build; +import android.util.Log; + +import androidx.annotation.NonNull; +import androidx.core.app.NotificationCompat; + +import com.google.firebase.messaging.FirebaseMessagingService; +import com.google.firebase.messaging.RemoteMessage; +import com.nurulwafa.nufakuproject.R; + +public class MyFirebaseMessagingService extends FirebaseMessagingService { + + private static final String CHANNEL_ID = "NUFA_CHANNEL_2"; + + @Override + public void onMessageReceived(@NonNull RemoteMessage remoteMessage) { + String title = "Notifikasi Baru"; + String body = "Ada pesan masuk"; + + if (remoteMessage.getNotification() != null) { + title = remoteMessage.getNotification().getTitle(); + body = remoteMessage.getNotification().getBody(); + } else if (remoteMessage.getData().size() > 0) { + title = remoteMessage.getData().get("title"); + body = remoteMessage.getData().get("body"); + } + + String idSantri = remoteMessage.getData().get("id_santri"); + String idWaliSantri = remoteMessage.getData().get("id_wali_santri"); + String kondisi = remoteMessage.getData().get("kondisi_kesehatan"); + String type = remoteMessage.getData().get("type"); + String apiUrl = remoteMessage.getData().get("api_url"); + + Intent intent; + if ("kesehatan".equalsIgnoreCase(type)) { + intent = new Intent(this, HomeActivity.class); + intent.putExtra("id_santri", idSantri); + intent.putExtra("id_wali_santri", idWaliSantri); + intent.putExtra("kondisi_kesehatan", kondisi); + intent.putExtra("from_notif", true); + } else if ("pelanggaran".equalsIgnoreCase(type)) { + intent = new Intent(this, PelanggaranSantriActivity.class); + intent.putExtra("login_key", "id_santri"); + intent.putExtra("login_value", idSantri); + intent.putExtra("from_notif", true); + } else if ("berita".equalsIgnoreCase(type)) { + intent = new Intent(this, DetailBeritaActivity.class); + intent.putExtra("from_notif", true); + intent.putExtra("judul", remoteMessage.getData().get("judul")); + intent.putExtra("gambar", remoteMessage.getData().get("gambar")); + intent.putExtra("tanggal", remoteMessage.getData().get("tanggal")); + intent.putExtra("deskripsi", remoteMessage.getData().get("deskripsi")); + } else { + intent = new Intent(this, HomeActivity.class); + } + + PendingIntent pendingIntent = PendingIntent.getActivity( + this, + 0, + intent, + PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE + ); + + // Deklarasikan di atas agar bisa digunakan dua kali + Uri soundUri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + getPackageName() + "/raw/nufa_alert"); + Log.d("NOTIF_SOUND", "Sound URI: " + soundUri.toString()); + + NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) + .setSmallIcon(R.drawable.logo) + .setContentTitle(title) + .setContentText(body) + .setAutoCancel(true) + .setColor(Color.GREEN) + .setContentIntent(pendingIntent) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setSound(soundUri); // dipakai di sini + + NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + AudioAttributes audioAttributes = new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_NOTIFICATION) + .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) + .build(); + + NotificationChannel channel = new NotificationChannel( + CHANNEL_ID, + "Notifikasi NUFA", + NotificationManager.IMPORTANCE_HIGH + ); + channel.setDescription("Channel untuk notifikasi"); + channel.enableLights(true); + channel.enableVibration(true); + channel.setSound(soundUri, audioAttributes); // dipakai di sini juga + + notificationManager.createNotificationChannel(channel); + } + + // BARIS INI YANG BELUM ADA + notificationManager.notify(1, builder.build()); + } +} + diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/Pelanggaran.java b/app/src/main/java/com/nurulwafa/nufakuproject/Pelanggaran.java new file mode 100644 index 0000000..2d76626 --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/Pelanggaran.java @@ -0,0 +1,37 @@ +package com.nurulwafa.nufakuproject; + +public class Pelanggaran { + private String namaSantri; + private String pelanggaran; + private String tanggal; + private String sanksi; + private String keterangan; + + public Pelanggaran(String namaSantri, String pelanggaran, String tanggal, String sanksi, String keterangan) { + this.namaSantri = namaSantri; + this.pelanggaran = pelanggaran; + this.tanggal = tanggal; + this.sanksi = sanksi; + this.keterangan = keterangan; + } + + public String getNamaSantri() { + return namaSantri; + } + + public String getPelanggaran() { + return pelanggaran; + } + + public String getTanggal() { + return tanggal; + } + + public String getSanksi() { + return sanksi; + } + + public String getKeterangan() { + return keterangan; + } +} diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/PelanggaranAdapter.java b/app/src/main/java/com/nurulwafa/nufakuproject/PelanggaranAdapter.java new file mode 100644 index 0000000..b8f7f8c --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/PelanggaranAdapter.java @@ -0,0 +1,54 @@ +package com.nurulwafa.nufakuproject; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.List; + +public class PelanggaranAdapter extends RecyclerView.Adapter { + private final List pelanggaranList; + + public PelanggaranAdapter(List pelanggaranList) { + this.pelanggaranList = pelanggaranList; + } + + @NonNull + @Override + public PelanggaranAdapter.PelanggaranViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_pelanggaran, parent, false); + return new PelanggaranAdapter.PelanggaranViewHolder(v); + } + + @Override + public void onBindViewHolder(@NonNull PelanggaranAdapter.PelanggaranViewHolder holder, int position) { + Pelanggaran pelanggaran = pelanggaranList.get(position); + holder.tvNamaSantri.setText(pelanggaran.getNamaSantri()); + holder.tvPelanggaran.setText("Pelanggaran: " + pelanggaran.getPelanggaran()); + holder.tvTanggal.setText("Tanggal: " + pelanggaran.getTanggal()); + holder.tvSanksi.setText("Sanksi: " + pelanggaran.getSanksi()); + holder.tvKeterangan.setText("Keterangan: " + pelanggaran.getKeterangan()); + } + + @Override + public int getItemCount() { + return pelanggaranList.size(); + } + + static class PelanggaranViewHolder extends RecyclerView.ViewHolder { + TextView tvNamaSantri, tvPelanggaran, tvTanggal, tvSanksi, tvKeterangan; + + public PelanggaranViewHolder(@NonNull View itemView) { + super(itemView); + tvNamaSantri = itemView.findViewById(R.id.tvNamaSantri); + tvPelanggaran = itemView.findViewById(R.id.tvPelanggaran); + tvTanggal = itemView.findViewById(R.id.tvTanggal); + tvSanksi = itemView.findViewById(R.id.tvSanksi); + tvKeterangan = itemView.findViewById(R.id.tvKeterangan); + } + } +} diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/PelanggaranSantriActivity.java b/app/src/main/java/com/nurulwafa/nufakuproject/PelanggaranSantriActivity.java new file mode 100644 index 0000000..d934908 --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/PelanggaranSantriActivity.java @@ -0,0 +1,95 @@ +package com.nurulwafa.nufakuproject; + +import android.os.Bundle; +import android.util.Log; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.android.volley.Request; +import com.android.volley.RequestQueue; +import com.android.volley.toolbox.JsonObjectRequest; +import com.android.volley.toolbox.Volley; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; + +public class PelanggaranSantriActivity extends AppCompatActivity { + private RecyclerView rvPelanggaran; + private PelanggaranAdapter adapter; + private ArrayList pelanggaranList; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_pelanggaran_santri); + + rvPelanggaran = findViewById(R.id.rvPelanggaran); + rvPelanggaran.setLayoutManager(new LinearLayoutManager(this)); + + pelanggaranList = new ArrayList<>(); + adapter = new PelanggaranAdapter(pelanggaranList); + rvPelanggaran.setAdapter(adapter); + + String loginKey = getIntent().getStringExtra("login_key"); + String loginValue = getIntent().getStringExtra("login_value"); + + if (loginKey != null && loginValue != null) { + getDataSantri(loginKey, loginValue); + } else { + Toast.makeText(this, "Data login tidak ditemukan", Toast.LENGTH_SHORT).show(); + } + } + + private void getDataSantri(String key, String value) { + String baseUrl = ApiHelper.getBaseUrl(); + String requestUrl = baseUrl + "getDataSantri?" + key + "=" + value; + + Log.d("PEL_REQ_URL", "URL: " + requestUrl); + + JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, requestUrl, null, + response -> { + try { + if (response.getBoolean("status")) { + pelanggaranList.clear(); + + // Ambil objek "data" + JSONObject dataObject = response.getJSONObject("data"); + + // Ambil array "pelanggaran_santri" dari dalam "data" + JSONArray pelanggaranArray = dataObject.getJSONArray("pelanggaran_santri"); + + for (int i = 0; i < pelanggaranArray.length(); i++) { + JSONObject pelanggaran = pelanggaranArray.getJSONObject(i); + + String nama = pelanggaran.getString("nama_santri"); + String namaPelanggaran = pelanggaran.optString("pelanggaran", "-"); + String tanggal = pelanggaran.optString("tanggal", "-"); + String sanksi = pelanggaran.optString("sanksi", "-"); + String keterangan = pelanggaran.optString("keterangan", "-"); + + Pelanggaran p = new Pelanggaran(nama, namaPelanggaran, tanggal, sanksi, keterangan); + pelanggaranList.add(p); + } + + adapter.notifyDataSetChanged(); + } else { + Toast.makeText(this, "Data tidak ditemukan", Toast.LENGTH_SHORT).show(); + } + } catch (JSONException e) { + e.printStackTrace(); + Toast.makeText(this, "Gagal parsing data", Toast.LENGTH_SHORT).show(); + } + }, + error -> Toast.makeText(this, "Gagal ambil data: " + error.getMessage(), Toast.LENGTH_SHORT).show() + ); + + RequestQueue queue = Volley.newRequestQueue(this); + queue.add(request); + } +} diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/PonpesActivity.java b/app/src/main/java/com/nurulwafa/nufakuproject/PonpesActivity.java new file mode 100644 index 0000000..af75e24 --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/PonpesActivity.java @@ -0,0 +1,63 @@ +package com.nurulwafa.nufakuproject; + +import android.os.Bundle; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; + +import com.android.volley.Request; +import com.android.volley.RequestQueue; +import com.android.volley.toolbox.JsonObjectRequest; +import com.android.volley.toolbox.Volley; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + + public class PonpesActivity extends AppCompatActivity { + private TextView tvSejarah; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_sejarah); + + tvSejarah = findViewById(R.id.tvSejarah); + + getSejarah(); // langsung ambil data sejarah + } + + private void getSejarah() { + String baseUrl = ApiHelper.getBaseUrl(); + String requestUrl = baseUrl + "getSejarah"; // Sesuaikan dengan controller kamu + + JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, requestUrl, null, + response -> { + try { + if (response.getBoolean("status")) { + JSONArray sejarahArray = response.getJSONArray("data"); + StringBuilder sejarahGabungan = new StringBuilder(); + + for (int i = 0; i < sejarahArray.length(); i++) { + JSONObject sejarahItem = sejarahArray.getJSONObject(i); + String isi = sejarahItem.getString("sejarah"); + sejarahGabungan.append(isi).append("\n\n"); + } + tvSejarah.setText(sejarahGabungan.toString()); + } else { + Toast.makeText(this, "Data sejarah tidak ditemukan", Toast.LENGTH_SHORT).show(); + } + } catch (JSONException e) { + e.printStackTrace(); + Toast.makeText(this, "Gagal parsing data", Toast.LENGTH_SHORT).show(); + } + }, + error -> Toast.makeText(this, "Gagal ambil data: " + error.getMessage(), Toast.LENGTH_SHORT).show() + ); + + RequestQueue queue = Volley.newRequestQueue(this); + queue.add(request); + } + } + diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/Prestasi.java b/app/src/main/java/com/nurulwafa/nufakuproject/Prestasi.java new file mode 100644 index 0000000..0a9d836 --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/Prestasi.java @@ -0,0 +1,43 @@ +package com.nurulwafa.nufakuproject; + +public class Prestasi { + private String namaSantri; + private String prestasi; + private String agenda; + private String perlombaan; + private String tanggal; + private String buktiPrestasi; + + public Prestasi(String namaSantri, String prestasi, String agenda, String perlombaan, String tanggal, String buktiPrestasi) { + this.namaSantri = namaSantri; + this.prestasi = prestasi; + this.agenda = agenda; + this.perlombaan = perlombaan; + this.tanggal = tanggal; + this.buktiPrestasi = buktiPrestasi; + } + + public String getNamaSantri() { + return namaSantri; + } + + public String getPrestasi() { + return prestasi; + } + + public String getAgenda() { + return agenda; + } + + public String getPerlombaan() { + return perlombaan; + } + + public String getTanggal() { + return tanggal; + } + + public String getBuktiPrestasi() { + return buktiPrestasi; + } +} diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/PrestasiAdapter.java b/app/src/main/java/com/nurulwafa/nufakuproject/PrestasiAdapter.java new file mode 100644 index 0000000..cb9f30b --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/PrestasiAdapter.java @@ -0,0 +1,113 @@ +package com.nurulwafa.nufakuproject; + +import android.content.ActivityNotFoundException; +import android.content.Intent; +import android.graphics.Color; +import android.graphics.Paint; +import android.net.Uri; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.List; +public class PrestasiAdapter extends RecyclerView.Adapter { + private final List prestasiList; + + public PrestasiAdapter(List prestasiList) { + this.prestasiList = prestasiList; + } + + @NonNull + @Override + public PrestasiViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_prestasi, parent, false); + return new PrestasiViewHolder(v); + } + + @Override + public void onBindViewHolder(@NonNull PrestasiViewHolder holder, int position) { + Prestasi prestasi = prestasiList.get(position); + holder.tvNamaSantri.setText(prestasi.getNamaSantri()); + holder.tvPrestasi.setText("Prestasi: " + prestasi.getPrestasi()); + holder.tvAgenda.setText("Agenda: " + prestasi.getAgenda()); + holder.tvPerlombaan.setText("Perlombaan: " + prestasi.getPerlombaan()); + holder.tvTanggal.setText("Tanggal: " + prestasi.getTanggal()); + + String buktiUrl = prestasi.getBuktiPrestasi(); + if (buktiUrl != null && !buktiUrl.isEmpty()) { + holder.tvBuktiPrestasi.setText("Lihat Bukti Prestasi"); + holder.tvBuktiPrestasi.setTextColor(Color.BLUE); + holder.tvBuktiPrestasi.setPaintFlags(holder.tvBuktiPrestasi.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); + + holder.tvBuktiPrestasi.setOnClickListener(v -> { + try { + String fileId = ""; + + if (buktiUrl.contains("/d/")) { + String[] parts = buktiUrl.split("/d/"); + if (parts.length > 1) { + fileId = parts[1].split("/")[0]; + } + } else if (buktiUrl.contains("id=")) { + Uri uri = Uri.parse(buktiUrl); + fileId = uri.getQueryParameter("id"); + } + + if (fileId != null && !fileId.isEmpty()) { + // Pakai format view langsung, bukan uc?export + String directLink = "https://drive.google.com/file/d/" + fileId + "/view"; + + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(directLink)); + intent.setPackage("com.android.chrome"); + + try { + v.getContext().startActivity(intent); + } catch (ActivityNotFoundException e) { + intent.setPackage(null); // fallback ke browser default + v.getContext().startActivity(intent); + } + + } else { + Toast.makeText(v.getContext(), "Link file tidak valid", Toast.LENGTH_SHORT).show(); + } + } catch (Exception e) { + Toast.makeText(v.getContext(), "Gagal membuka link", Toast.LENGTH_SHORT).show(); + e.printStackTrace(); + } + }); + + + } else { + holder.tvBuktiPrestasi.setText("Tidak Ada Bukti"); + holder.tvBuktiPrestasi.setTextColor(Color.GRAY); + holder.tvBuktiPrestasi.setPaintFlags(0); + holder.tvBuktiPrestasi.setOnClickListener(null); // tidak ada aksi + } + + } + + + @Override + public int getItemCount() { + return prestasiList.size(); + } + + static class PrestasiViewHolder extends RecyclerView.ViewHolder { + TextView tvNamaSantri, tvPrestasi, tvAgenda, tvPerlombaan, tvTanggal, tvBuktiPrestasi; + + public PrestasiViewHolder(@NonNull View itemView) { + super(itemView); + tvNamaSantri = itemView.findViewById(R.id.tvNamaSantri); + tvPrestasi = itemView.findViewById(R.id.tvPrestasi); + tvAgenda = itemView.findViewById(R.id.tvAgenda); + tvPerlombaan = itemView.findViewById(R.id.tvPerlombaan); + tvTanggal = itemView.findViewById(R.id.tvTanggal); + tvBuktiPrestasi = itemView.findViewById(R.id.tvBuktiPrestasi); + } + } +} diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/PrestasiSantriActivity.java b/app/src/main/java/com/nurulwafa/nufakuproject/PrestasiSantriActivity.java new file mode 100644 index 0000000..7977a5e --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/PrestasiSantriActivity.java @@ -0,0 +1,95 @@ +package com.nurulwafa.nufakuproject; + +import android.os.Bundle; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.android.volley.Request; +import com.android.volley.RequestQueue; +import com.android.volley.toolbox.JsonObjectRequest; +import com.android.volley.toolbox.Volley; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; + +public class PrestasiSantriActivity extends AppCompatActivity { + + private RecyclerView rvPrestasi; + private PrestasiAdapter adapter; + private ArrayList prestasiList; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_prestasi_santri); + + rvPrestasi = findViewById(R.id.rvPrestasi); + rvPrestasi.setLayoutManager(new LinearLayoutManager(this)); + + prestasiList = new ArrayList<>(); + adapter = new PrestasiAdapter(prestasiList); + rvPrestasi.setAdapter(adapter); + + String loginKey = getIntent().getStringExtra("login_key"); + String loginValue = getIntent().getStringExtra("login_value"); + + if (loginKey != null && loginValue != null) { + getDataSantri(loginKey, loginValue); + } else { + Toast.makeText(this, "Data login tidak ditemukan", Toast.LENGTH_SHORT).show(); + } + } + + private void getDataSantri(String key, String value) { + String baseUrl = ApiHelper.getBaseUrl(); + String requestUrl = baseUrl + "getDataSantri?" + key + "=" + value; + + JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, requestUrl, null, + response -> { + try { + if (response.getBoolean("status")) { + prestasiList.clear(); + + // Ambil objek "data" + JSONObject dataObject = response.getJSONObject("data"); + + // Ambil array "prestasi_santri" dari dalam "data" + JSONArray prestasiArray = dataObject.getJSONArray("prestasi_santri"); + + for (int i = 0; i < prestasiArray.length(); i++) { + JSONObject prestasi = prestasiArray.getJSONObject(i); + + String nama = prestasi.getString("nama_santri"); + String namaPrestasi = prestasi.optString("prestasi", "-"); + String agenda = prestasi.optString("agenda", "-"); + String perlombaan = prestasi.optString("perlombaan", "-"); + String tanggal = prestasi.optString("tanggal", "-"); + String buktiPrestasi = prestasi.optString("bukti_prestasi", "-"); + + Prestasi p = new Prestasi(nama, namaPrestasi, agenda, perlombaan, tanggal, buktiPrestasi); + prestasiList.add(p); + } + + adapter.notifyDataSetChanged(); + } else { + Toast.makeText(this, "Data tidak ditemukan", Toast.LENGTH_SHORT).show(); + } + } catch (JSONException e) { + e.printStackTrace(); + Toast.makeText(this, "Gagal parsing data", Toast.LENGTH_SHORT).show(); + } + }, + error -> Toast.makeText(this, "Gagal ambil data: " + error.getMessage(), Toast.LENGTH_SHORT).show() + ); + + RequestQueue queue = Volley.newRequestQueue(this); + queue.add(request); + } + +} diff --git a/app/src/main/java/com/nurulwafa/nufakuproject/RegisterDBHelper.java b/app/src/main/java/com/nurulwafa/nufakuproject/RegisterDBHelper.java new file mode 100644 index 0000000..ffadae2 --- /dev/null +++ b/app/src/main/java/com/nurulwafa/nufakuproject/RegisterDBHelper.java @@ -0,0 +1,55 @@ +package com.nurulwafa.nufakuproject; + +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; + +public class RegisterDBHelper extends SQLiteOpenHelper { + + private static final String DATABASE_NAME = "UserDatabase.db"; + private static final int DATABASE_VERSION = 1; + + public RegisterDBHelper(Context context) { + super(context, DATABASE_NAME, null, DATABASE_VERSION); + } + + @Override + public void onCreate(SQLiteDatabase db) { + // TIDAK perlu membuat tabel di sini, karena kamu pakai tb_santri dari awal (imported / prepopulated) + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + // Kosongkan juga kalau kamu nggak perlu upgrade schema + } + + // ✅ Mengecek login dari tb_santri berdasarkan email/nis dan password + public boolean checkUser(String emailOrNis, String password) { + SQLiteDatabase db = this.getReadableDatabase(); + String query = "SELECT * FROM tb_santri WHERE (email = ? OR nis = ?) AND password = ?"; + Cursor cursor = db.rawQuery(query, new String[]{emailOrNis, emailOrNis, password}); + + boolean result = cursor.moveToFirst(); + cursor.close(); + db.close(); + + return result; + } + + // ✅ Ambil id_santri setelah login berhasil + public String getUserId(String emailOrNis) { + SQLiteDatabase db = this.getReadableDatabase(); + String query = "SELECT id_santri FROM tb_santri WHERE email = ? OR nis = ?"; + Cursor cursor = db.rawQuery(query, new String[]{emailOrNis, emailOrNis}); + + if (cursor.moveToFirst()) { + String id = cursor.getString(0); + cursor.close(); + return id; + } + + cursor.close(); + return null; + } +} diff --git a/app/src/main/res/drawable/berita.png b/app/src/main/res/drawable/berita.png new file mode 100644 index 0000000..9c51260 Binary files /dev/null and b/app/src/main/res/drawable/berita.png differ diff --git a/app/src/main/res/drawable/bg_chat_left.xml b/app/src/main/res/drawable/bg_chat_left.xml new file mode 100644 index 0000000..8789ae2 --- /dev/null +++ b/app/src/main/res/drawable/bg_chat_left.xml @@ -0,0 +1,5 @@ + + + + diff --git a/app/src/main/res/drawable/bg_chat_right.xml b/app/src/main/res/drawable/bg_chat_right.xml new file mode 100644 index 0000000..82e5666 --- /dev/null +++ b/app/src/main/res/drawable/bg_chat_right.xml @@ -0,0 +1,5 @@ + + + + diff --git a/app/src/main/res/drawable/chat.png b/app/src/main/res/drawable/chat.png new file mode 100644 index 0000000..1cf3e33 Binary files /dev/null and b/app/src/main/res/drawable/chat.png differ diff --git a/app/src/main/res/drawable/chat2.png b/app/src/main/res/drawable/chat2.png new file mode 100644 index 0000000..29d8242 Binary files /dev/null and b/app/src/main/res/drawable/chat2.png differ diff --git a/app/src/main/res/drawable/circle_white.xml b/app/src/main/res/drawable/circle_white.xml new file mode 100644 index 0000000..013f93b --- /dev/null +++ b/app/src/main/res/drawable/circle_white.xml @@ -0,0 +1,4 @@ + + + diff --git a/app/src/main/res/drawable/custom_editcard.xml b/app/src/main/res/drawable/custom_editcard.xml new file mode 100644 index 0000000..8a20864 --- /dev/null +++ b/app/src/main/res/drawable/custom_editcard.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/custom_edittext.xml b/app/src/main/res/drawable/custom_edittext.xml new file mode 100644 index 0000000..66496fc --- /dev/null +++ b/app/src/main/res/drawable/custom_edittext.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/green.png b/app/src/main/res/drawable/green.png new file mode 100644 index 0000000..01c9fcd Binary files /dev/null and b/app/src/main/res/drawable/green.png differ diff --git a/app/src/main/res/drawable/ic_arrow_right.xml b/app/src/main/res/drawable/ic_arrow_right.xml new file mode 100644 index 0000000..2b0bbbd --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_right.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_chat.xml b/app/src/main/res/drawable/ic_chat.xml new file mode 100644 index 0000000..82c3ca7 --- /dev/null +++ b/app/src/main/res/drawable/ic_chat.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_eye_closed.png b/app/src/main/res/drawable/ic_eye_closed.png new file mode 100644 index 0000000..63c4033 Binary files /dev/null and b/app/src/main/res/drawable/ic_eye_closed.png differ diff --git a/app/src/main/res/drawable/ic_eye_open.png b/app/src/main/res/drawable/ic_eye_open.png new file mode 100644 index 0000000..09e6e39 Binary files /dev/null and b/app/src/main/res/drawable/ic_eye_open.png differ diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_unknown.png b/app/src/main/res/drawable/ic_unknown.png new file mode 100644 index 0000000..712c9dd Binary files /dev/null and b/app/src/main/res/drawable/ic_unknown.png differ diff --git a/app/src/main/res/drawable/informasispp.png b/app/src/main/res/drawable/informasispp.png new file mode 100644 index 0000000..881031b Binary files /dev/null and b/app/src/main/res/drawable/informasispp.png differ diff --git a/app/src/main/res/drawable/kegiatan.png b/app/src/main/res/drawable/kegiatan.png new file mode 100644 index 0000000..ca305da Binary files /dev/null and b/app/src/main/res/drawable/kegiatan.png differ diff --git a/app/src/main/res/drawable/logo.png b/app/src/main/res/drawable/logo.png new file mode 100644 index 0000000..ffc38bb Binary files /dev/null and b/app/src/main/res/drawable/logo.png differ diff --git a/app/src/main/res/drawable/logout.png b/app/src/main/res/drawable/logout.png new file mode 100644 index 0000000..ed9bc84 Binary files /dev/null and b/app/src/main/res/drawable/logout.png differ diff --git a/app/src/main/res/drawable/pelanggaran.png b/app/src/main/res/drawable/pelanggaran.png new file mode 100644 index 0000000..441aed1 Binary files /dev/null and b/app/src/main/res/drawable/pelanggaran.png differ diff --git a/app/src/main/res/drawable/ponpes.png b/app/src/main/res/drawable/ponpes.png new file mode 100644 index 0000000..98c4bb1 Binary files /dev/null and b/app/src/main/res/drawable/ponpes.png differ diff --git a/app/src/main/res/drawable/prestasi.png b/app/src/main/res/drawable/prestasi.png new file mode 100644 index 0000000..2264000 Binary files /dev/null and b/app/src/main/res/drawable/prestasi.png differ diff --git a/app/src/main/res/drawable/sakit.png b/app/src/main/res/drawable/sakit.png new file mode 100644 index 0000000..28a81cc Binary files /dev/null and b/app/src/main/res/drawable/sakit.png differ diff --git a/app/src/main/res/drawable/santri.png b/app/src/main/res/drawable/santri.png new file mode 100644 index 0000000..e153971 Binary files /dev/null and b/app/src/main/res/drawable/santri.png differ diff --git a/app/src/main/res/drawable/sehat.png b/app/src/main/res/drawable/sehat.png new file mode 100644 index 0000000..69084ba Binary files /dev/null and b/app/src/main/res/drawable/sehat.png differ diff --git a/app/src/main/res/drawable/send.png b/app/src/main/res/drawable/send.png new file mode 100644 index 0000000..d8458b9 Binary files /dev/null and b/app/src/main/res/drawable/send.png differ diff --git a/app/src/main/res/drawable/send2.png b/app/src/main/res/drawable/send2.png new file mode 100644 index 0000000..679752d Binary files /dev/null and b/app/src/main/res/drawable/send2.png differ diff --git a/app/src/main/res/drawable/wali.png b/app/src/main/res/drawable/wali.png new file mode 100644 index 0000000..d41bb89 Binary files /dev/null and b/app/src/main/res/drawable/wali.png differ diff --git a/app/src/main/res/layout/activity_berita.xml b/app/src/main/res/layout/activity_berita.xml new file mode 100644 index 0000000..9203f7a --- /dev/null +++ b/app/src/main/res/layout/activity_berita.xml @@ -0,0 +1,39 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/activity_chat.xml b/app/src/main/res/layout/activity_chat.xml new file mode 100644 index 0000000..0ace1a6 --- /dev/null +++ b/app/src/main/res/layout/activity_chat.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_data_santri.xml b/app/src/main/res/layout/activity_data_santri.xml new file mode 100644 index 0000000..ad22e8e --- /dev/null +++ b/app/src/main/res/layout/activity_data_santri.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_data_wali_santri.xml b/app/src/main/res/layout/activity_data_wali_santri.xml new file mode 100644 index 0000000..0ed7b95 --- /dev/null +++ b/app/src/main/res/layout/activity_data_wali_santri.xml @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_detail_berita.xml b/app/src/main/res/layout/activity_detail_berita.xml new file mode 100644 index 0000000..990ed58 --- /dev/null +++ b/app/src/main/res/layout/activity_detail_berita.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_detail_kegiatan.xml b/app/src/main/res/layout/activity_detail_kegiatan.xml new file mode 100644 index 0000000..6e6b883 --- /dev/null +++ b/app/src/main/res/layout/activity_detail_kegiatan.xml @@ -0,0 +1,36 @@ + + + + + + + + diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml new file mode 100644 index 0000000..f670e22 --- /dev/null +++ b/app/src/main/res/layout/activity_home.xml @@ -0,0 +1,473 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_informasi_spp_santri.xml b/app/src/main/res/layout/activity_informasi_spp_santri.xml new file mode 100644 index 0000000..728f13a --- /dev/null +++ b/app/src/main/res/layout/activity_informasi_spp_santri.xml @@ -0,0 +1,36 @@ + + + + + + + + diff --git a/app/src/main/res/layout/activity_kegiatan_santri.xml b/app/src/main/res/layout/activity_kegiatan_santri.xml new file mode 100644 index 0000000..1a532fd --- /dev/null +++ b/app/src/main/res/layout/activity_kegiatan_santri.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..8e7d770 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + +