package ru.shutoff.cgstarter; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.ActivityInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.os.Environment; import android.preference.PreferenceManager; import android.provider.Settings; import android.telephony.TelephonyManager; import android.util.Log; import android.widget.Toast; import java.io.BufferedWriter; import java.io.DataOutputStream; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Calendar; import java.util.Date; public class State extends BroadcastReceiver { static final String AUTO_PAUSE = "auto_pause"; static final String INACTIVE_PAUSE = "inactive_pause"; static final String INACTIVE_MODE = "inactive_mode"; static final String CAR_MODE = "carmode"; static final String CAR_STATE = "car_state"; static final String POWER_TIME = "powertime"; static final String BT = "bt"; static final String BT_DEVICES = "bt_devices"; static final String VOLUME = "volume"; static final String LEVEL = "level"; static final String RING_LEVEL = "ring_level"; static final String SAVE_RING_LEVEL = "save_ring_level"; static final String PHONE = "phone"; static final String DATA = "data"; static final String SPEAKER = "speaker"; static final String ANSWER_TIME = "answertime"; static final String RINGING_TIME = "ringtime"; static final String SMS = "sms"; static final String ID = "ID"; static final String ORIENTATION = "orientation"; static final String SAVE_ROTATE = "save_rotate"; static final String CALL_VOLUME = "save_call_volume"; static final String SAVE_ORIENTATION = "save_orientation"; static final String CUR_CHANNEL = "cur_channel"; static final String SAVE_CHANNEL = "channel"; static final String SAVE_LEVEL = "save_level"; static final String MUTE_LEVEL = "mute_level"; static final String GPS = "gps"; static final String GPS_SAVE = "gps_save"; static final String SAVE_WIFI = "save_wifi"; static final String SAVE_DATA = "save_data"; static final String START = "start"; static final String PHONE_X = "phone_x"; static final String PHONE_Y = "phone_y"; static final String PHONE_LAND_X = "phone_land_x"; static final String PHONE_LAND_Y = "phone_land_y"; static final String PHONE_SHOW = "phone_show"; static final String RTA_LOGS = "rta_logs"; static final String ROUTE = "route"; static final String KILL_CAR = "kill_car"; static final String KILL_POWER = "kill_power"; static final String KILL_BT = "kill_bt"; static final String PING = "ping"; static final String NOTIFICATION = "notification"; static final String NOTIFICATION_IGNORE = "notification_ignore"; static final String SHOW_SMS = "show_sms"; static final String MAPCAM = "mapcam"; static final String STRELKA = "strelka"; static final String TRAFFIC = "traffic"; static final String UPD_TIME = "upd_time"; static final String NAME = "Name"; static final String ORIGINAL = "Original"; static final String LATITUDE = "Latitude"; static final String LONGITUDE = "Longitude"; static final String INTERVAL = "Interval"; static final String DAYS = "Days"; static final String POINTS = "Points"; static final int WORKDAYS = 1; static final int HOLIDAYS = 2; static final int ALLDAYS = 3; static final String TITLE = "title"; static final String INFO = "info"; static final String TEXT = "text"; static final String APP = "app"; static final String ICON = "icon"; static final String START_POINT = "start_point"; static final String VERTICAL = "vertical"; static final String APPS = "apps"; static final String FULL_TIME = "full_time"; static final String QUICK_ALPHA = "quick_alpha"; static final String QUICK_SIZE = "quick_size"; static final String WIFI = "wifi"; static final String LAST_LAT = "last_lat"; static final String LAST_LNG = "last_lng"; static public boolean can_root; static Point[] points; static int telephony_state = 0; static String cg_package = null; static boolean cg_files = true; static boolean is_cg = false; static boolean is_cn = false; static String cg = "cityguide.probki.net"; static String cn = "net.probki.geonet"; static File cg_folder = null; static Point[] get(Context context, boolean force) { SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); if (force) points = null; if (points == null) { points = new Point[8]; boolean is_init = false; for (int i = 0; i < 8; i++) { Point p = new Point(); if (!force) { p.name = preferences.getString(NAME + i, ""); p.original = preferences.getString(ORIGINAL + i, ""); p.lat = preferences.getString(LATITUDE + i, ""); p.lng = preferences.getString(LONGITUDE + i, ""); p.interval = preferences.getString(INTERVAL + i, ""); p.days = preferences.getInt(DAYS + i, 0); p.points = preferences.getString(POINTS + i, ""); if (p.lat.equals("") || p.lng.equals("")) { p.name = ""; p.original = ""; p.lat = ""; p.lng = ""; p.interval = ""; p.days = 0; p.points = ""; } if (!p.name.equals("")) is_init = true; } points[i] = p; } if (!is_init) { Bookmarks.Point[] from = Bookmarks.get(context); for (int i = 0; i < 8; i++) { if (i >= from.length) break; Point p = points[i]; p.name = from[i].name; p.original = from[i].name; p.lat = from[i].lat + ""; p.lng = from[i].lng + ""; p.points = from[i].points; } save(preferences); } } return points; } static void save(SharedPreferences preferences) { SharedPreferences.Editor ed = preferences.edit(); for (int i = 0; i < 8; i++) { Point p = points[i]; if (p.name.equals("")) { ed.remove(NAME + i); ed.remove(ORIGINAL + i); ed.remove(LATITUDE + i); ed.remove(LONGITUDE + i); ed.remove(INTERVAL + i); ed.remove(DAYS + i); ed.remove(POINTS + i); continue; } ed.putString(NAME + i, p.name); ed.putString(ORIGINAL + i, p.original); ed.putString(LATITUDE + i, p.lat); ed.putString(LONGITUDE + i, p.lng); ed.putString(INTERVAL + i, p.interval); ed.putString(POINTS + i, p.points); ed.putInt(DAYS + i, p.days); } ed.commit(); } static boolean canToggleGPS(Context context) { PackageManager pacman = context.getPackageManager(); PackageInfo pacInfo = null; try { pacInfo = pacman.getPackageInfo("com.android.settings", PackageManager.GET_RECEIVERS); } catch (PackageManager.NameNotFoundException e) { return false; //package not found } if (pacInfo != null) { for (ActivityInfo actInfo : pacInfo.receivers) { //test if recevier is exported. if so, we can toggle GPS. if (actInfo.name.equals("com.android.settings.widget.SettingsAppWidgetProvider") && actInfo.exported) { return true; } } } return false; //default } static void turnGPSOn(Context context) { String provider = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED); if (!provider.contains("gps")) { //if gps is disabled final Intent poke = new Intent(); poke.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider"); poke.addCategory(Intent.CATEGORY_ALTERNATIVE); poke.setData(Uri.parse("3")); context.sendBroadcast(poke); } } static void turnGPSOff(Context context) { String provider = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED); if (provider.contains("gps")) { //if gps is enabled final Intent poke = new Intent(); poke.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider"); poke.addCategory(Intent.CATEGORY_ALTERNATIVE); poke.setData(Uri.parse("3")); context.sendBroadcast(poke); } } static public void appendLog(String text) { Log.v("CG starter", text); File logFile = Environment.getExternalStorageDirectory(); logFile = new File(logFile, "cg.log"); if (text == null) text = " (null)"; try { if (!logFile.exists()) logFile.createNewFile(); //BufferedWriter for performance, true to set append to file flag BufferedWriter buf = new BufferedWriter(new FileWriter(logFile, true)); Date d = new Date(); buf.append(d.toLocaleString()); buf.append(" "); buf.append(text); buf.newLine(); buf.close(); } catch (IOException e) { } } static public void print(Throwable ex) { appendLog("Error: " + ex.toString()); StringWriter sw = new StringWriter(); ex.printStackTrace(new PrintWriter(sw)); String s = sw.toString(); appendLog(s); } static boolean inInterval(String interval) { if (interval.equals("")) return false; Calendar calendar = Calendar.getInstance(); int now = calendar.get(Calendar.HOUR_OF_DAY) * 60 + calendar.get(Calendar.MINUTE); String[] parts = interval.split(";"); for (String part : parts) { if (inInterval(now, part)) return true; } return false; } static boolean inInterval(int now, String interval) { String[] times = interval.split("-"); String[] time = times[0].split(":"); int start = Integer.parseInt(time[0]) * 60 + Integer.parseInt(time[1]); time = times[1].split(":"); int end = Integer.parseInt(time[0]) * 60 + Integer.parseInt(time[1]); if (end > start) { if (now < start) return false; return (now <= end); } if (now <= end) return true; if (now >= start) return true; return false; } static boolean isDebug() { return Build.FINGERPRINT.startsWith("generic"); } static boolean hasTelephony(Context context) { if (isDebug()) return true; if (telephony_state == 0) { PackageManager pm = context.getPackageManager(); if (!pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) { telephony_state = -1; return false; } TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); if (tm.getSimState() == TelephonyManager.SIM_STATE_ABSENT) { telephony_state = -1; return false; } telephony_state = 1; } return telephony_state > 0; } static boolean doRoot(Context context, String command, boolean show_error) { try { Process p = Runtime.getRuntime().exec("su"); DataOutputStream os = new DataOutputStream(p.getOutputStream()); os.writeBytes(command); os.writeBytes("\nexit\n"); os.flush(); p.waitFor(); int ev = p.exitValue(); if (ev == 0) return true; } catch (Exception ex) { if (show_error) { Toast toast = Toast.makeText(context, ex.toString(), Toast.LENGTH_LONG); toast.show(); } // State.appendLog("su error " + command + " - " + ex.toString()); // ignore } return false; } static void init_package(Context context) { cg_files = true; cg_folder = Environment.getExternalStorageDirectory(); PackageManager pm = context.getPackageManager(); try { PackageInfo info = pm.getPackageInfo(cg, 0); is_cg = true; String[] ver = info.versionName.split("\\."); if (Integer.parseInt(ver[0]) > 7) cg_files = false; } catch (Exception ex) { // ignore } try { pm.getPackageInfo(cn, 0); is_cn = true; } catch (Exception ex) { // ignore } if (!is_cn) { cg_package = cg; cg_folder = new File(cg_folder, "CityGuide"); context.sendBroadcast(new Intent(MainActivity.CHANGE_APP)); return; } if (!is_cg) { cg_package = cn; cg_folder = new File(cg_folder, "GeoNet"); cg_files = false; context.sendBroadcast(new Intent(MainActivity.CHANGE_APP)); return; } SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); if (preferences.getString("cg_app", "").equals(cn)) { cg_package = cn; cg_folder = new File(cg_folder, "GeoNet"); cg_files = false; context.sendBroadcast(new Intent(MainActivity.CHANGE_APP)); return; } cg_package = cg; cg_folder = new File(cg_folder, "CityGuide"); context.sendBroadcast(new Intent(MainActivity.CHANGE_APP)); } static File CG_Folder(Context context) { if (cg_package == null) init_package(context); String folder = cg_folder.getAbsolutePath(); return cg_folder; } static String CG_Package(Context context) { if (cg_package == null) init_package(context); return cg_package; } @Override public void onReceive(Context context, Intent intent) { init_package(context); } interface OnBadGPS { abstract void gps_message(Context context); } static class Point { String name; String original; String lat; String lng; String interval; String points; int days; } }