// Path: app/src/main/java/com/red/alert/config/Logging.java
// public class Logging {
//     // Tag for all logcat logs
//     public static String TAG = "RedAlert";
// }
// 
// Path: app/src/main/java/com/red/alert/config/Sound.java
// public class Sound {
//     public static final String SCHEME_URI_IDENTIFIER = "://";
//     public static final String APP_SOUND_PREFIX = "com.red.alert://";
//     // The AudioManager stream that sirens will be played on
//     public static int STREAM_TYPE = AudioManager.STREAM_ALARM;
// }
// 
// Path: app/src/main/java/com/red/alert/logic/alerts/AlertTypes.java
// public class AlertTypes {
//     public static final String SYSTEM = "system";
//     public static final String PRIMARY = "alert";
//     public static final String SECONDARY = "secondary_alert";
// 
//     public static final String TEST = "test";
//     public static final String TEST_SOUND = "test_sound";
//     public static final String TEST_SECONDARY_SOUND = "test_secondary_sound";
// }
// 
// Path: app/src/main/java/com/red/alert/utils/caching/Singleton.java
// public class Singleton {
//     static ObjectMapper mMapper;
//     static SharedPreferences mSettings;
// 
//     public static SharedPreferences getSharedPreferences(Context context) {
//         // First time?
//         if (mSettings == null) {
//             // Open shared preferences
//             mSettings = PreferenceManager.getDefaultSharedPreferences(context);
//         }
// 
//         // Return cached object
//         return mSettings;
//     }
// 
//     public static ObjectMapper getJackson() {
//         // First time?
//         if (mMapper == null) {
//             // Get Jackson instance
//             mMapper = new ObjectMapper();
// 
//             // Ignore unknown properties
//             mMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//         }
// 
//         // Return cached object
//         return mMapper;
//     }
// }
// 
// Path: app/src/main/java/com/red/alert/utils/feedback/Vibration.java
// public class Vibration {
//     public static void stopVibration(Context context) {
//         // Get vibration service
//         Vibrator vibratorService = (Vibrator) context.getSystemService(context.VIBRATOR_SERVICE);
// 
//         // Cancel any current vibrations
//         vibratorService.cancel();
//     }
// 
//     public static void issueVibration(String alertType, Context context) {
//         // Enable vibration?
//         if (!VibrationLogic.isVibrationEnabled(alertType, context)) {
//             return;
//         }
// 
//         // Should we vibrate?
//         if (!VibrationLogic.shouldVibrate(alertType, context)) {
//             return;
//         }
// 
//         // Get vibration service
//         Vibrator vibratorService = (Vibrator) context.getSystemService(context.VIBRATOR_SERVICE);
// 
//         // Play only once
//         vibratorService.vibrate(com.red.alert.config.Vibration.VIBRATION_PATTERN, -1);
//     }
// 
// }
// 
// Path: app/src/main/java/com/red/alert/utils/formatting/StringUtils.java
// public class StringUtils {
//     public static boolean stringIsNullOrEmpty(String inputString) {
//         // String is null? return true
//         if (inputString == null) {
//             return true;
//         }
// 
//         // String is empty? true
//         if (inputString.trim().equals("")) {
//             return true;
//         }
// 
//         // String is not empty
//         return false;
//     }
// 
//     public static String implode(String separator, List<String> data) {
//         // No data?
//         if (data.size() == 0) {
//             return "";
//         }
// 
//         // Create temp StringBuilder
//         StringBuilder builder = new StringBuilder();
// 
//         // Loop over list except last item
//         for (int i = 0; i < data.size() - 1; i++) {
//             // Append current item
//             builder.append(data.get(i));
// 
//             // Append separator
//             builder.append(separator);
//         }
// 
//         // Add last item without separator
//         builder.append(data.get(data.size() - 1));
// 
//         // Return string
//         return builder.toString();
//     }
// 
//     public static String regexMatch(String source, String compilePattern) {
//         // Compile regex
//         Pattern compiledPattern = Pattern.compile(compilePattern);
// 
//         // Match against source input
//         Matcher matcher = compiledPattern.matcher(source);
// 
//         // Prepare match object
//         String match = "";
// 
//         // Did we find anything?
//         if (matcher.find()) {
//             // Get first group
//             match = matcher.group(1);
//         }
// 
//         // Return match
//         return match;
//     }
// }


import android.content.Context;
import android.content.SharedPreferences;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.PowerManager;
import android.util.Log;
import android.widget.Toast;
import com.red.alert.R;
import com.red.alert.config.Logging;
import com.red.alert.config.Sound;
import com.red.alert.logic.alerts.AlertTypes;
import com.red.alert.utils.caching.Singleton;
import com.red.alert.utils.feedback.Vibration;
import com.red.alert.utils.formatting.StringUtils;
    public static Uri getAlertSound(String alertType, String overrideSound, Context context) {
        // Override sound selection?
        if (overrideSound != null) {
            // Convert to URI and return it
            return getSoundURI(overrideSound, context);
        }

        // Get selected sound
        String soundPreference = getSoundPreference(alertType, context);

        // Get sound file path
        String selectedSound = Singleton.getSharedPreferences(context).getString(soundPreference, getDefaultSound(alertType, context));

        // No sound selected?
        if (StringUtils.stringIsNullOrEmpty(selectedSound)) {
            // Nothing to play
            return null;
        }

        // Get path to sound resource
        return getSoundURI(selectedSound, context);
    }

    static Uri getSoundURI(String uri, Context context) {
        // No URI? Nothing to do here
        if (StringUtils.stringIsNullOrEmpty(uri)) {
            return null;
        }

        // Support for old alarms (without the scheme identifier)
// Path: app/src/main/java/com/red/alert/config/Logging.java
// public class Logging {
//     // Tag for all logcat logs
//     public static String TAG = "RedAlert";
// }
// 
// Path: app/src/main/java/com/red/alert/config/Sound.java
// public class Sound {
//     public static final String SCHEME_URI_IDENTIFIER = "://";
//     public static final String APP_SOUND_PREFIX = "com.red.alert://";
//     // The AudioManager stream that sirens will be played on
//     public static int STREAM_TYPE = AudioManager.STREAM_ALARM;
// }
// 
// Path: app/src/main/java/com/red/alert/logic/alerts/AlertTypes.java
// public class AlertTypes {
//     public static final String SYSTEM = "system";
//     public static final String PRIMARY = "alert";
//     public static final String SECONDARY = "secondary_alert";
// 
//     public static final String TEST = "test";
//     public static final String TEST_SOUND = "test_sound";
//     public static final String TEST_SECONDARY_SOUND = "test_secondary_sound";
// }
// 
// Path: app/src/main/java/com/red/alert/utils/caching/Singleton.java
// public class Singleton {
//     static ObjectMapper mMapper;
//     static SharedPreferences mSettings;
// 
//     public static SharedPreferences getSharedPreferences(Context context) {
//         // First time?
//         if (mSettings == null) {
//             // Open shared preferences
//             mSettings = PreferenceManager.getDefaultSharedPreferences(context);
//         }
// 
//         // Return cached object
//         return mSettings;
//     }
// 
//     public static ObjectMapper getJackson() {
//         // First time?
//         if (mMapper == null) {
//             // Get Jackson instance
//             mMapper = new ObjectMapper();
// 
//             // Ignore unknown properties
//             mMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//         }
// 
//         // Return cached object
//         return mMapper;
//     }
// }
// 
// Path: app/src/main/java/com/red/alert/utils/feedback/Vibration.java
// public class Vibration {
//     public static void stopVibration(Context context) {
//         // Get vibration service
//         Vibrator vibratorService = (Vibrator) context.getSystemService(context.VIBRATOR_SERVICE);
// 
//         // Cancel any current vibrations
//         vibratorService.cancel();
//     }
// 
//     public static void issueVibration(String alertType, Context context) {
//         // Enable vibration?
//         if (!VibrationLogic.isVibrationEnabled(alertType, context)) {
//             return;
//         }
// 
//         // Should we vibrate?
//         if (!VibrationLogic.shouldVibrate(alertType, context)) {
//             return;
//         }
// 
//         // Get vibration service
//         Vibrator vibratorService = (Vibrator) context.getSystemService(context.VIBRATOR_SERVICE);
// 
//         // Play only once
//         vibratorService.vibrate(com.red.alert.config.Vibration.VIBRATION_PATTERN, -1);
//     }
// 
// }
// 
// Path: app/src/main/java/com/red/alert/utils/formatting/StringUtils.java
// public class StringUtils {
//     public static boolean stringIsNullOrEmpty(String inputString) {
//         // String is null? return true
//         if (inputString == null) {
//             return true;
//         }
// 
//         // String is empty? true
//         if (inputString.trim().equals("")) {
//             return true;
//         }
// 
//         // String is not empty
//         return false;
//     }
// 
//     public static String implode(String separator, List<String> data) {
//         // No data?
//         if (data.size() == 0) {
//             return "";
//         }
// 
//         // Create temp StringBuilder
//         StringBuilder builder = new StringBuilder();
// 
//         // Loop over list except last item
//         for (int i = 0; i < data.size() - 1; i++) {
//             // Append current item
//             builder.append(data.get(i));
// 
//             // Append separator
//             builder.append(separator);
//         }
// 
//         // Add last item without separator
//         builder.append(data.get(data.size() - 1));
// 
//         // Return string
//         return builder.toString();
//     }
// 
//     public static String regexMatch(String source, String compilePattern) {
//         // Compile regex
//         Pattern compiledPattern = Pattern.compile(compilePattern);
// 
//         // Match against source input
//         Matcher matcher = compiledPattern.matcher(source);
// 
//         // Prepare match object
//         String match = "";
// 
//         // Did we find anything?
//         if (matcher.find()) {
//             // Get first group
//             match = matcher.group(1);
//         }
// 
//         // Return match
//         return match;
//     }
// }


// Path: app/src/main/java/com/red/alert/logic/feedback/sound/SoundLogic.java
import android.content.Context;
import android.content.SharedPreferences;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.PowerManager;
import android.util.Log;
import android.widget.Toast;
import com.red.alert.R;
import com.red.alert.config.Logging;
import com.red.alert.config.Sound;
import com.red.alert.logic.alerts.AlertTypes;
import com.red.alert.utils.caching.Singleton;
import com.red.alert.utils.feedback.Vibration;
import com.red.alert.utils.formatting.StringUtils;

    public static Uri getAlertSound(String alertType, String overrideSound, Context context) {
        // Override sound selection?
        if (overrideSound != null) {
            // Convert to URI and return it
            return getSoundURI(overrideSound, context);
        }

        // Get selected sound
        String soundPreference = getSoundPreference(alertType, context);

        // Get sound file path
        String selectedSound = Singleton.getSharedPreferences(context).getString(soundPreference, getDefaultSound(alertType, context));

        // No sound selected?
        if (StringUtils.stringIsNullOrEmpty(selectedSound)) {
            // Nothing to play
            return null;
        }

        // Get path to sound resource
        return getSoundURI(selectedSound, context);
    }

    static Uri getSoundURI(String uri, Context context) {
        // No URI? Nothing to do here
        if (StringUtils.stringIsNullOrEmpty(uri)) {
            return null;
        }

        // Support for old alarms (without the scheme identifier)
        if (!uri.contains(Sound.SCHEME_URI_IDENTIFIER)) {