소스 검색

state + volume

David 9 년 전
부모
커밋
c473442797

+ 44 - 5
app/src/main/java/com/example/david/libretasker/Actions/Actions.java

@@ -2,15 +2,20 @@ package com.example.david.libretasker.Actions;
 
 import android.app.NotificationManager;
 import android.content.Context;
+import android.content.Intent;
+import android.media.AudioManager;
 import android.media.Ringtone;
 import android.media.RingtoneManager;
 import android.net.Uri;
 import android.support.v4.app.NotificationCompat;
 import android.widget.Toast;
 
+import com.example.david.libretasker.Events.Event;
 import com.example.david.libretasker.R;
+import com.example.david.libretasker.State.State;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 
 import static android.content.Context.NOTIFICATION_SERVICE;
@@ -25,6 +30,7 @@ public class Actions {
         ret.add("Toast");
         ret.add("Notification");
         ret.add("Beep");
+        ret.add("State");
         /*
          * Display: Lock, Auto brightness
          * Media: Music Play | skip | stop, Record audio, Record audio stop, Take Photo
@@ -39,15 +45,17 @@ public class Actions {
                 Toast.makeText(context, (String)payload, Toast.LENGTH_SHORT).show();
                 return;
             case "Notification":
-                HashMap<String, Object> tval = (HashMap<String, Object>)payload;
-                assert(tval.get("Title") != null);
-                assert(tval.get("Value") != null);
+                HashMap<String, String> tval = (HashMap<String, String>)payload;
+                if (tval.get("Title") == null)
+                    throw new AssertionError("Title");
+                if (tval.get("Value") == null)
+                    throw new AssertionError("Value");
 
                 NotificationCompat.Builder mBuilder =
                         new NotificationCompat.Builder(context)
                                 .setSmallIcon(R.drawable.ic_stat_name)
-                                .setContentTitle((String)tval.get("Title"))
-                                .setContentText((String)tval.get("Value"));
+                                .setContentTitle(tval.get("Title"))
+                                .setContentText(tval.get("Value"));
                 NotificationManager mNotifyMgr =
                         (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
                 // Builds the notification and issues it.
@@ -59,6 +67,37 @@ public class Actions {
                 Ringtone r = RingtoneManager.getRingtone(context.getApplicationContext(), notification);
                 r.play();
                 return;
+            case "State":
+                HashMap<String, Object> s = (HashMap<String, Object>)payload;
+                if (State.set((String) s.get("Key"), s.get("Value"))) { //Did the state change? Trigger events
+                    Intent i = new Intent(Event.STATE_CHANGED);
+                    i.setData(Uri.parse("State"));
+                    context.sendBroadcast(i);
+                }
+                return;
+            case "Volume":
+                HashMap<String, Integer> v = (HashMap<String, Integer>)payload;
+                AudioManager audio = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
+
+                if (v.get("Stream") == null) throw new AssertionError("Stream");
+                if (v.get("Volume") == null) throw new AssertionError("Volume");
+
+                int streamType = v.get("Stream");
+
+                if (!Arrays.asList(
+                        AudioManager.STREAM_RING,
+                        AudioManager.STREAM_ALARM,
+                        AudioManager.STREAM_MUSIC,
+                        AudioManager.STREAM_NOTIFICATION,
+                        AudioManager.STREAM_SYSTEM).contains(streamType))
+                    throw new AssertionError("Invalid streamType");
+
+                int desiredPct = v.get("Volume"); // in %
+                int maxVol = audio.getStreamMaxVolume(streamType);
+                int finalVolume = (int)(((float)desiredPct/100)*maxVol);
+                audio.setStreamVolume(streamType, finalVolume, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
+                //audio.setStreamVolume(streamType, finalVolume, AudioManager.FLAG_SHOW_UI);
+                return;
             default:
                 Toast.makeText(context, name + " " + (String)payload, Toast.LENGTH_SHORT).show();
                 return;

+ 14 - 13
app/src/main/java/com/example/david/libretasker/EventReceiver.java

@@ -10,6 +10,7 @@ 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.ScreenEvent;
+import com.example.david.libretasker.Events.StateEvent;
 import com.example.david.libretasker.Events.TimeEvent;
 import com.example.david.libretasker.UserData.UserData;
 
@@ -24,20 +25,12 @@ public class EventReceiver extends BroadcastReceiver {
     String TAG = " EventReceiver";
     @Override
     public void onReceive(Context context, Intent intent) {
-        Event e = new Event() {
-            @Override
-            public boolean trigger(Context ctx, HashMap<String, Object> hm) {
-                return false;
-            }
-        };
-
+        Event e = null;
         HashMap<String, Object> data = new HashMap<>();
-
-        HashMap<String, Object> event;
+        HashMap<String, Object> eventData;
         ArrayList<HashMap<String, Object>> actions;
 
         switch (intent.getAction()) {
-
             case ConnectivityManager.CONNECTIVITY_ACTION:
                 e = new NetworkEvent();
                 data = UserData.getData("Network");
@@ -54,13 +47,21 @@ public class EventReceiver extends BroadcastReceiver {
                 e = new ScreenEvent();
                 data = UserData.getData("Screen");
                 break;
+            case Event.STATE_CHANGED:
+                e = new StateEvent();
+                String s = intent.getDataString();
+                break;
             default:
                 Log.d(TAG, intent.getAction());
-                break;
+                return;
         }
+
+        if ( e == null )
+            return;
+
         actions = (ArrayList<HashMap<String, Object>>)data.get("Actions");
-        event = (HashMap<String, Object>)data.get("Event");
-        if (e.trigger(context, event)) {
+        eventData = (HashMap<String, Object>)data.get("Event");
+        if (e.trigger(context, eventData)) {
             for (HashMap<String, Object> a : actions) {
                 Actions.Launch(context, (String) a.get("Type"), a.get("Value"));
             }

+ 4 - 2
app/src/main/java/com/example/david/libretasker/Events/Event.java

@@ -9,5 +9,7 @@ import java.util.HashMap;
  */
 
 public interface Event {
-    public boolean trigger(Context ctx, HashMap<String, Object> hm);
-}
+    String STATE_CHANGED = "com.example.david.libretasker.STATE_CHANGED";
+    boolean trigger(Context ctx, HashMap<String, Object> hm);
+    String getFailureReason();
+}

+ 14 - 4
app/src/main/java/com/example/david/libretasker/Events/NetworkEvent.java

@@ -14,11 +14,16 @@ import java.util.List;
  * Created by david on 01/01/17.
  */
 public class NetworkEvent implements Event {
+    private String failureReason = "";
+    @Override
+    public String getFailureReason() {
+        return failureReason;
+    }
     @Override
     public boolean trigger(Context context, HashMap<String, Object> data) {
 
         assert (data.get("type") != null);
-
+        failureReason = "";
         Connection c = new Connection();
         c.state = (NetworkInfo.State)data.get("state");
         c.type = (int) data.get("type");
@@ -29,24 +34,29 @@ public class NetworkEvent implements Event {
         NetworkInfo mActive = conn.getActiveNetworkInfo();
 
         if (mActive == null) {
-            Toast.makeText(context, "No active connection" , Toast.LENGTH_SHORT).show();
+            failureReason = "No active connection";
             return false;
         }
 
         if (c.state != null && c.state != mActive.getState()) {
+            failureReason = "Active conn state != requested state";
             return false;
         }
 
-        if (mActive.getType() != c.type)
+        if (mActive.getType() != c.type) {
+            failureReason = "Active conn type != requested";
             return false;
+        }
 
         if (c.ValidSSIDs != null && c.ValidSSIDs.size() > 0 && c.type == ConnectivityManager.TYPE_WIFI){
             WifiManager wifiManager = (WifiManager) context.getSystemService (Context.WIFI_SERVICE);
             WifiInfo info = wifiManager.getConnectionInfo ();
             String ssid  = info.getSSID(); //Returns "ssid"
             ssid = ssid.substring(1, ssid.length()-1);
-            if (!c.ValidSSIDs.contains(ssid))
+            if (!c.ValidSSIDs.contains(ssid)) {
+                failureReason = "Active ssid != requested";
                 return false;
+            }
         }
 
         return true;

+ 5 - 0
app/src/main/java/com/example/david/libretasker/Events/ScreenEvent.java

@@ -13,6 +13,11 @@ import java.util.HashMap;
  */
 
 public class ScreenEvent implements Event {
+    private String failureReason = "";
+    @Override
+    public String getFailureReason() {
+        return failureReason;
+    }
     @Override
     public boolean trigger(Context ctx, HashMap<String, Object> hm) {
 

+ 22 - 0
app/src/main/java/com/example/david/libretasker/Events/StateEvent.java

@@ -0,0 +1,22 @@
+package com.example.david.libretasker.Events;
+
+import android.content.Context;
+
+import java.util.HashMap;
+
+/**
+ * Created by david on 03/01/17.
+ */
+
+public class StateEvent implements Event {
+    @Override
+    public boolean trigger(Context ctx, HashMap<String, Object> hm) {
+
+        return true;
+    }
+
+    @Override
+    public String getFailureReason() {
+        return null;
+    }
+}

+ 22 - 6
app/src/main/java/com/example/david/libretasker/Events/TimeEvent.java

@@ -11,6 +11,11 @@ import java.util.List;
  */
 
 public class TimeEvent implements Event {
+    private String failureReason = "";
+    @Override
+    public String getFailureReason() {
+        return failureReason;
+    }
     @Override
     public boolean trigger(Context ctx, HashMap<String, Object> hm) {
         Calendar c = Calendar.getInstance();
@@ -23,22 +28,33 @@ public class TimeEvent implements Event {
         boolean invertHour = (boolean) ( hm.get("InvertHour") == null ? false: hm.get("InvertHour") );
         boolean invertMinute = (boolean) ( hm.get("InvertMinute") == null ? false: hm.get("InvertMinute") );
 
-        if (months != null && !months.contains(c.get(Calendar.MONTH)))
+        if (months != null && !months.contains(c.get(Calendar.MONTH))) {
+            failureReason = "Month != requested";
             return false;
+        }
 
-        if (DOW != null && !DOW.contains(c.get(Calendar.DAY_OF_WEEK)))
+        if (DOW != null && !DOW.contains(c.get(Calendar.DAY_OF_WEEK))) {
+            failureReason = "DOW != requested";
             return false;
+        }
 
-        if (DOM != null && !DOM.contains(c.get(Calendar.DAY_OF_MONTH)))
+        if (DOM != null && !DOM.contains(c.get(Calendar.DAY_OF_MONTH))) {
+            failureReason = "DOM!= requested";
             return false;
+        }
 
-        if (hours != null && !hours.contains(c.get(c.HOUR_OF_DAY))) //HOUR == 12, HOUR_OF_DAY == 24
-            if ( !invertHour )
+        if (hours != null && !hours.contains(c.get(c.HOUR_OF_DAY))) { //HOUR == 12, HOUR_OF_DAY == 24
+            if (!invertHour) {
+                failureReason = "Hour != requested, invertHour==false";
                 return false;
+            }
+        }
 
         if (minutes != null && !minutes.contains(c.get(Calendar.MINUTE)))
-            if ( !invertMinute )
+            if ( !invertMinute ) {
+                failureReason = "Minute != requested, invertMinute == false ";
                 return false;
+            }
 
         return true;
     }

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

@@ -1,14 +1,18 @@
 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.util.Log;
 
+import com.example.david.libretasker.Events.Event;
+
 /**
  * Created by david on 01/01/17.
  */
@@ -37,9 +41,12 @@ public class MainService extends Service {
 
         filter.addAction(Intent.ACTION_SCREEN_ON);
         filter.addAction(Intent.ACTION_SCREEN_OFF);
+        filter.addAction(Event.STATE_CHANGED);
+
         //startForeground(); //TODO: ??
 
         this.registerReceiver(receiver, filter);
+
     }
 
     @Override
@@ -55,5 +62,4 @@ public class MainService extends Service {
         return null;
     }
 
-
 }

+ 31 - 0
app/src/main/java/com/example/david/libretasker/State/State.java

@@ -0,0 +1,31 @@
+package com.example.david.libretasker.State;
+
+import android.support.v4.util.Pair;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Set;
+
+/**
+ * Created by david on 03/01/17.
+ */
+
+public class State {
+    private static HashMap<String, Object> state = new HashMap<>();
+    public static Object get(String key){
+        return state.get(key);
+    }
+
+    public static boolean set(String key, Object val) {
+        if( state.get(key) == val ) //FIXME: Equals?
+            return false;
+
+        state.put(key, val);
+        return true;
+
+    }
+
+    public static HashMap<String, Object> getState() {
+        return state;
+    }
+}

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

@@ -1,5 +1,6 @@
 package com.example.david.libretasker.UserData;
 
+import android.media.AudioManager;
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
 
@@ -29,9 +30,15 @@ public class UserData {
                 event.put("state", NetworkInfo.State.CONNECTED);
                 event.put("Name", "Cuevita-Wifi");
 
-                action.put("Type", "Toast");
+                /*action.put("Type", "Toast");
                 action.put("Value", "Connected to cuevita");
-                action.put("Name", "Toast-connected");
+                action.put("Name", "Toast-connected");*/
+                HashMap<String, Integer> volume = new HashMap<>();
+                volume.put("Stream", AudioManager.STREAM_MUSIC);
+                volume.put("Volume", 0);
+
+                action.put("Type", "Volume");
+                action.put("Value", volume);
                 actions.add(action);
 
                 HashMap<String, String> notif = new HashMap<>();