x1ongzhu 1 year ago
parent
commit
3e4bf51d25

+ 74 - 7
app/src/main/java/com/example/modifier/ModifierService.java

@@ -1,20 +1,28 @@
 package com.example.modifier;
 package com.example.modifier;
 
 
+import android.accessibilityservice.AccessibilityServiceInfo;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager;
+import android.graphics.PixelFormat;
 import android.graphics.Rect;
 import android.graphics.Rect;
 import android.os.Build;
 import android.os.Build;
 import android.util.Log;
 import android.util.Log;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.WindowManager;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.AccessibilityNodeInfo;
 import android.view.accessibility.AccessibilityNodeInfo;
-import android.widget.Toast;
+import android.widget.FrameLayout;
+import android.widget.ImageButton;
 
 
+import androidx.appcompat.view.ContextThemeWrapper;
+
+import com.example.modifier.databinding.FloatingWindowBinding;
+import com.google.gson.Gson;
+
+import org.json.JSONException;
 import org.json.JSONObject;
 import org.json.JSONObject;
 
 
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URISyntaxException;
-import java.net.URLEncoder;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashMap;
 import java.util.List;
 import java.util.List;
@@ -36,12 +44,15 @@ public class ModifierService extends android.accessibilityservice.AccessibilityS
 
 
     private Socket mSocket;
     private Socket mSocket;
 
 
+    private boolean canSend = false;
+    private FloatingWindowBinding binding;
+
     public ModifierService() {
     public ModifierService() {
         Log.i(TAG, "Creating ModifierService");
         Log.i(TAG, "Creating ModifierService");
         try {
         try {
             IO.Options opts = new IO.Options();
             IO.Options opts = new IO.Options();
-            opts.query = "device=" + Build.MANUFACTURER + " " + Build.MODEL;
-            mSocket = IO.socket("http://192.168.50.202:3000", opts);
+            opts.query = "model=" + Build.MANUFACTURER + " " + Build.MODEL + "&name=" + Build.DEVICE + "&id=" + Utils.getUniqueID();
+            mSocket = IO.socket("http://192.168.6.215:3000", opts);
             mSocket.on("message", this);
             mSocket.on("message", this);
             mSocket.on(Socket.EVENT_CONNECT, args -> {
             mSocket.on(Socket.EVENT_CONNECT, args -> {
                 Log.i(TAG, "Connected to server");
                 Log.i(TAG, "Connected to server");
@@ -65,6 +76,7 @@ public class ModifierService extends android.accessibilityservice.AccessibilityS
     public void onCreate() {
     public void onCreate() {
         super.onCreate();
         super.onCreate();
         Log.i(TAG, "Starting ModifierService");
         Log.i(TAG, "Starting ModifierService");
+        canSend = getSharedPreferences(BuildConfig.APPLICATION_ID, MODE_PRIVATE).getBoolean("canSend", false);
         mSocket.connect();
         mSocket.connect();
     }
     }
 
 
@@ -150,4 +162,59 @@ public class ModifierService extends android.accessibilityservice.AccessibilityS
         }
         }
         return map;
         return map;
     }
     }
+
+    @Override
+    protected void onServiceConnected() {
+        super.onServiceConnected();
+
+        AccessibilityServiceInfo info = new AccessibilityServiceInfo();
+        info.eventTypes = AccessibilityEvent.TYPE_VIEW_CLICKED |
+                AccessibilityEvent.TYPE_VIEW_FOCUSED |
+                AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;
+        info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
+        info.notificationTimeout = 100;
+        this.setServiceInfo(info);
+
+        WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
+        FrameLayout mLayout = new FrameLayout(this);
+        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
+        layoutParams.type = WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY;
+        layoutParams.format = PixelFormat.TRANSLUCENT;
+        layoutParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
+        layoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
+        layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
+        layoutParams.x = 0;
+        layoutParams.y = 400;
+        layoutParams.gravity = Gravity.START | Gravity.TOP;
+        ContextThemeWrapper newContext = new ContextThemeWrapper(getApplicationContext(), R.style.Theme_Modifier);
+        LayoutInflater inflater = LayoutInflater.from(newContext);
+        binding = FloatingWindowBinding.inflate(inflater, mLayout, true);
+        windowManager.addView(mLayout, layoutParams);
+
+        binding.swConnect.setChecked(true);
+        binding.swConnect.setOnCheckedChangeListener((buttonView, isChecked) -> {
+            if (isChecked) {
+                mSocket.connect();
+            } else {
+                mSocket.disconnect();
+            }
+        });
+
+        binding.swSend.setChecked(canSend);
+        binding.swSend.setOnCheckedChangeListener((buttonView, isChecked) -> {
+            getSharedPreferences(BuildConfig.APPLICATION_ID, MODE_PRIVATE).edit().putBoolean("canSend", isChecked).apply();
+            canSend = isChecked;
+
+            JSONObject json = new JSONObject();
+            try {
+                json.put("action", "updateDevice");
+                JSONObject data = new JSONObject();
+                data.put("canSend", isChecked);
+                json.put("data", data);
+                mSocket.emit("message", json);
+            } catch (JSONException e) {
+                e.printStackTrace();
+            }
+        });
+    }
 }
 }

+ 22 - 0
app/src/main/java/com/example/modifier/Utils.java

@@ -2,6 +2,7 @@ package com.example.modifier;
 
 
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.content.Context;
 import android.content.Context;
+import android.content.SharedPreferences;
 import android.content.pm.ServiceInfo;
 import android.content.pm.ServiceInfo;
 import android.provider.Settings;
 import android.provider.Settings;
 import android.text.TextUtils;
 import android.text.TextUtils;
@@ -11,6 +12,7 @@ import android.view.accessibility.AccessibilityManager;
 import androidx.appcompat.app.AlertDialog;
 import androidx.appcompat.app.AlertDialog;
 
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
 
 
 import java.io.DataOutputStream;
 import java.io.DataOutputStream;
 import java.io.File;
 import java.io.File;
@@ -18,6 +20,7 @@ import java.io.IOException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
+import java.util.Objects;
 
 
 public class Utils {
 public class Utils {
     private static final String TAG = "Modifier";
     private static final String TAG = "Modifier";
@@ -111,4 +114,23 @@ public class Utils {
         }
         }
         return false;
         return false;
     }
     }
+
+    public static String getUniqueID() {
+        Context context = getContext();
+        Objects.requireNonNull(context);
+        SharedPreferences sharedPrefs = context.getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE);
+        String uniqueID = sharedPrefs.getString("unique_id", null);
+        if (StringUtils.isBlank(uniqueID)) {
+            try {
+                uniqueID = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        if (StringUtils.isBlank(uniqueID)) {
+            uniqueID = java.util.UUID.randomUUID().toString();
+        }
+        sharedPrefs.edit().putString("unique_id", uniqueID).apply();
+        return uniqueID;
+    }
 }
 }

+ 1 - 1
app/src/main/res/layout/activity_main.xml

@@ -243,7 +243,7 @@
             <com.google.android.material.button.MaterialButton
             <com.google.android.material.button.MaterialButton
                 android:id="@+id/btn_send"
                 android:id="@+id/btn_send"
                 android:layout_width="match_parent"
                 android:layout_width="match_parent"
-                android:layout_height="wrap_content"
+                android:layout_height="56dp"
                 android:layout_marginTop="16dp"
                 android:layout_marginTop="16dp"
                 android:text="Send" />
                 android:text="Send" />
         </LinearLayout>
         </LinearLayout>

+ 26 - 0
app/src/main/res/layout/floating_window.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:background="#66000000"
+    android:orientation="vertical"
+    android:padding="8dp"
+    android:theme="@style/Theme.MaterialComponents.DayNight.NoActionBar">
+
+    <com.google.android.material.switchmaterial.SwitchMaterial
+        android:id="@+id/sw_connect"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:checked="true"
+        android:text="Connect"
+        android:textColor="@color/white" />
+
+    <com.google.android.material.switchmaterial.SwitchMaterial
+        android:id="@+id/sw_send"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:checked="true"
+        android:text="Send"
+        android:textColor="@color/white" />
+</LinearLayout>

+ 1 - 1
app/src/main/res/values-night/themes.xml

@@ -1,6 +1,6 @@
 <resources xmlns:tools="http://schemas.android.com/tools">
 <resources xmlns:tools="http://schemas.android.com/tools">
     <!-- Base application theme. -->
     <!-- Base application theme. -->
-    <style name="Base.Theme.Modifier" parent="Theme.Material3.DayNight.NoActionBar">
+    <style name="Base.Theme.Modifier" parent="Theme.MaterialComponents.DayNight.NoActionBar">
         <!-- Customize your dark theme here. -->
         <!-- Customize your dark theme here. -->
         <!-- <item name="colorPrimary">@color/my_dark_primary</item> -->
         <!-- <item name="colorPrimary">@color/my_dark_primary</item> -->
     </style>
     </style>

+ 1 - 1
app/src/main/res/values/themes.xml

@@ -1,6 +1,6 @@
 <resources xmlns:tools="http://schemas.android.com/tools">
 <resources xmlns:tools="http://schemas.android.com/tools">
     <!-- Base application theme. -->
     <!-- Base application theme. -->
-    <style name="Base.Theme.Modifier" parent="Theme.Material3.DayNight.NoActionBar">
+    <style name="Base.Theme.Modifier" parent="Theme.MaterialComponents.Light.NoActionBar">
         <!-- Customize your light theme here. -->
         <!-- Customize your light theme here. -->
         <!-- <item name="colorPrimary">@color/my_light_primary</item> -->
         <!-- <item name="colorPrimary">@color/my_light_primary</item> -->
     </style>
     </style>