Pārlūkot izejas kodu

Phone state/ calls

David 9 gadi atpakaļ
vecāks
revīzija
5752a74626

+ 4 - 0
README.md

@@ -21,6 +21,10 @@ Supported events (and their conditions):
 	- BodyRegex (String, Regex)
 	- NameRegex (String, Regex)
 	- Sender (String, matching Phone number exactly)
+- PhoneCall:
+	- Name (String)
+	- Number (String)
+	- State (String) { RINGING, IDLE }
 
 There's an special event called 'State'. State takes a Key (String) and Value (Object). This gets triggered automatically when an Action with type 'State' **changes** its value.
 

+ 2 - 0
app/src/main/AndroidManifest.xml

@@ -10,6 +10,8 @@
     <uses-permission android:name="android.permission.READ_SMS" />
     <uses-permission android:name="android.permission.SEND_SMS" />
     <uses-permission android:name="android.permission.READ_CONTACTS"/>
+    <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
+
 
     <application
         android:allowBackup="true"

+ 10 - 0
app/src/main/java/com/example/david/libretasker/EventReceiver.java

@@ -1,5 +1,6 @@
 package com.example.david.libretasker;
 
+import android.telephony.TelephonyManager;
 import android.annotation.TargetApi;
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -14,6 +15,7 @@ import android.util.Log;
 import com.example.david.libretasker.Actions.Actions;
 import com.example.david.libretasker.Events.Event;
 import com.example.david.libretasker.Events.NetworkEvent;
+import com.example.david.libretasker.Events.PhoneEvent;
 import com.example.david.libretasker.Events.SMSEvent;
 import com.example.david.libretasker.Events.ScreenEvent;
 import com.example.david.libretasker.Events.StateEvent;
@@ -60,6 +62,11 @@ public class EventReceiver extends BroadcastReceiver {
             case Event.STATE_CHANGED:
                 e = new StateEvent();
                 String s = intent.getDataString();
+
+                break;
+            case TelephonyManager.ACTION_PHONE_STATE_CHANGED:
+                e = new PhoneEvent();
+                data = UserData.getData("PhoneCall");
                 break;
             default:
                 Log.d(TAG, intent.getAction());
@@ -69,6 +76,9 @@ public class EventReceiver extends BroadcastReceiver {
         if ( e == null )
             return;
 
+        if ( data == null )
+            throw new AssertionError("Data is null! WTF!");
+
         actions = (ArrayList<HashMap<String, Object>>)data.get("Actions");
         eventData = (HashMap<String, Object>)data.get("Event");
         eventData.put("Intent", intent);

+ 65 - 0
app/src/main/java/com/example/david/libretasker/Events/PhoneEvent.java

@@ -0,0 +1,65 @@
+package com.example.david.libretasker.Events;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.telephony.TelephonyManager;
+
+import com.example.david.libretasker.Helpers;
+
+import java.util.HashMap;
+
+/**
+ * Created by david on 03/01/17.
+ */
+
+public class PhoneEvent implements Event {
+    private String failureReason = "";
+    @Override
+    public boolean trigger(Context ctx, HashMap<String, Object> hm) {
+        failureReason = "";
+
+        Intent intent = (Intent) hm.get("Intent");
+        Bundle bundle = intent.getExtras();
+        if (bundle == null) {
+            failureReason = "Bundle is null";
+            return false;
+        }
+
+        String state = bundle.getString(TelephonyManager.EXTRA_STATE);
+        if (hm.get("State") != null && !state.equals(hm.get("State"))) {
+            failureReason = "States don't match";
+            return false;
+        }
+
+        String number = bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
+        if (number == null) {
+            failureReason = "Number is null";
+            return false;
+        }
+
+        String requestedNumber = (String)hm.get("Number");
+
+        if (requestedNumber != null && !requestedNumber.equals(number)) {
+            failureReason = "Numbers don't match";
+            return false;
+        }
+
+        String requestedName = (String)hm.get("Name");
+        String name = Helpers.getContactName(ctx, number);
+
+        if (requestedName == null)
+            return true;
+
+        if (!requestedName.equals(name)){
+            failureReason = "Names don't match";
+            return false;
+        }
+
+        return true;
+    }
+    @Override
+    public String getFailureReason() {
+        return failureReason;
+    }
+}

+ 2 - 18
app/src/main/java/com/example/david/libretasker/Events/SMSEvent.java

@@ -15,6 +15,8 @@ import java.util.HashMap;
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
 
+import static com.example.david.libretasker.Helpers.getContactName;
+
 /**
  * Created by david on 03/01/17.
  */
@@ -69,24 +71,6 @@ public class SMSEvent implements Event {
         failureReason = "Couldn't match Sender nor body";
         return false;
     }
-    private String getContactName(Context context, String phoneNumber) {
-        ContentResolver cr = context.getContentResolver();
-        Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
-        Cursor cursor = cr.query(uri, new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null);
-        if (cursor == null) {
-            return null;
-        }
-        String contactName = null;
-        if(cursor.moveToFirst()) {
-            contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME));
-        }
-
-        if(cursor != null && !cursor.isClosed()) {
-            cursor.close();
-        }
-
-        return contactName;
-    }
 
     @Override
     public String getFailureReason() {

+ 33 - 0
app/src/main/java/com/example/david/libretasker/Helpers.java

@@ -0,0 +1,33 @@
+package com.example.david.libretasker;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+import android.provider.ContactsContract;
+
+/**
+ * Created by david on 03/01/17.
+ */
+
+public class Helpers {
+    public static String getContactName(Context context, String phoneNumber) {
+        ContentResolver cr = context.getContentResolver();
+        Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
+        Cursor cursor = cr.query(uri, new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null);
+        if (cursor == null) {
+            return null;
+        }
+        String contactName = null;
+        if(cursor.moveToFirst()) {
+            contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME));
+        }
+
+        if(cursor != null && !cursor.isClosed()) {
+            cursor.close();
+        }
+
+        return contactName;
+    }
+
+}

+ 2 - 2
app/src/main/java/com/example/david/libretasker/MainService.java

@@ -1,14 +1,13 @@
 package com.example.david.libretasker;
 
 import android.app.Service;
-import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.net.ConnectivityManager;
 import android.os.IBinder;
 import android.support.annotation.Nullable;
-import android.support.v4.content.LocalBroadcastManager;
+import android.telephony.TelephonyManager;
 import android.util.Log;
 
 import com.example.david.libretasker.Events.Event;
@@ -42,6 +41,7 @@ public class MainService extends Service {
         filter.addAction(Intent.ACTION_SCREEN_ON);
         filter.addAction(Intent.ACTION_SCREEN_OFF);
         filter.addAction(Event.STATE_CHANGED);
+        filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
 
         //startForeground(); //TODO: ??
 

+ 6 - 1
app/src/main/java/com/example/david/libretasker/UserData/UserData.java

@@ -79,7 +79,12 @@ public class UserData {
                 //action2.put("Type", "Toast");
                 //action2.put("Value", "Screen ON!");
                 break;
-
+            case "PhoneCall":
+                event.put("Name", "Androidtest");
+                action.put("Type", "Toast");
+                action.put("Value", "Called!");
+                actions.add(action);
+                break;
         }
         assoc.put("Event", event);
         assoc.put("Actions", actions);