package ru.shutoff.cgstarter; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.res.AssetManager; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.net.Uri; import android.os.Bundle; import android.util.AttributeSet; import android.util.Xml; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.Spinner; import android.widget.TextView; import org.xmlpull.v1.XmlPullParser; import java.io.File; import java.io.InputStream; import java.io.OutputStream; public class StartFragment extends PreferencesFragment { SensorManager sensorManager; Sensor sensorAccelerometer; Sensor sensorMagnetic; SensorEventListener sensorEventListener; float[] gravity; float[] magnetic; float[] orientation; TextView tvVert; int vert_id; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); View v = inflater.inflate(R.layout.start, container, false); setSeekBar(v, R.id.auto_pause, R.id.auto_pause_text, R.string.auto_pause, State.AUTO_PAUSE, 5, 2); setSeekBar(v, R.id.inactive_pause, R.id.inactive_pause_text, R.string.inactive_pause, State.INACTIVE_PAUSE, 60, 5); setSpinner(v, R.id.inactive_mode, R.array.inactive_entries, R.array.inactive_values, State.INACTIVE_MODE, "0"); setCheckBox(v, R.id.carmode, State.CAR_MODE); setCheckBoxSU(v, R.id.kill_car, State.KILL_CAR); setCheckBoxSU(v, R.id.kill_power, State.KILL_POWER); setCheckBox(v, R.id.vertical, State.VERTICAL, true); setCheckBox(v, R.id.mapcam, State.MAPCAM); setCheckBox(v, R.id.strelka, State.STRELKA); setCheckBox(v, R.id.remove_rta, State.RTA_LOGS); State.CG_Package(getActivity()); if (!State.is_cg || !State.is_cn) { v.findViewById(R.id.cg_run).setVisibility(View.GONE); v.findViewById(R.id.cg_app).setVisibility(View.GONE); } else { Spinner spinner = (Spinner) v.findViewById(R.id.cg_app); final String[] names = new String[2]; try { PackageManager pm = getActivity().getPackageManager(); PackageInfo pi = pm.getPackageInfo(State.cg, 0); names[0] = pi.packageName; ApplicationInfo appInfo = pm.getApplicationInfo(pi.packageName, 0); names[0] = pm.getApplicationLabel(appInfo).toString(); pi = pm.getPackageInfo(State.cn, 0); names[1] = pi.packageName; appInfo = pm.getApplicationInfo(pi.packageName, 0); names[1] = pm.getApplicationLabel(appInfo).toString(); } catch (Exception ex) { // ignore } spinner.setAdapter(new BaseAdapter() { @Override public int getCount() { return 2; } @Override public Object getItem(int position) { return names[position]; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Activity.LAYOUT_INFLATER_SERVICE); v = inflater.inflate(R.layout.item, null); } TextView tv = (TextView) v.findViewById(R.id.name); tv.setText(names[position]); return v; } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Activity.LAYOUT_INFLATER_SERVICE); v = inflater.inflate(R.layout.dropdown_item, null); } TextView tv = (TextView) v.findViewById(R.id.name); tv.setText(names[position]); return v; } }); spinner.setSelection(preferences.getString("cg_app", "").equals(State.cn) ? 1 : 0); spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { SharedPreferences.Editor ed = preferences.edit(); ed.putString("cg_app", (position == 1) ? State.cn : State.cg); ed.commit(); State.cg_package = null; getActivity().sendBroadcast(new Intent(MainActivity.CHANGE_APP)); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); } File rta_ini = State.CG_Folder(getActivity()); rta_ini = new File(rta_ini, "rtlog.ini"); if (!rta_ini.exists()) v.findViewById(R.id.rta).setVisibility(View.GONE); PackageManager pm = getActivity().getPackageManager(); PackageInfo info = null; try { info = pm.getPackageInfo("info.mapcam.droid", 0); } catch (Exception ex) { // ignore } if (info == null) v.findViewById(R.id.mapcam).setVisibility(View.GONE); info = null; try { info = pm.getPackageInfo("com.ivolk.StrelkaGPS", 0); } catch (Exception ex) { // ignore } if (info == null) v.findViewById(R.id.strelka).setVisibility(View.GONE); info = null; boolean nolock = false; boolean nav = false; try { info = pm.getPackageInfo("de.robv.android.xposed.installer", 0); } catch (Exception ex) { // ignore } if (info != null) { info = null; try { info = pm.getPackageInfo("com.smartmadsoft.xposed.nolockhome", 0); } catch (Exception ex) { // ignore } if (info == null) nolock = true; info = null; try { info = pm.getPackageInfo("ru.shutoff.routeselect", 0); } catch (Exception ex) { // ignore } if (info == null) nav = true; } if (nolock) { v.findViewById(R.id.xposed_lock).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { install("nolockhome"); } }); } else { v.findViewById(R.id.xposed_lock).setVisibility(View.GONE); } if (nav) { v.findViewById(R.id.xposed_route).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { install("routeselect"); } }); } else { v.findViewById(R.id.xposed_route).setVisibility(View.GONE); } if (!State.can_root) { v.findViewById(R.id.kill_car_block).setVisibility(View.GONE); v.findViewById(R.id.kill_power_block).setVisibility(View.GONE); } final TextView power_time = (TextView) v.findViewById(R.id.powertime); XmlPullParser parser = getResources().getXml(R.xml.power_time); AttributeSet attributes = Xml.asAttributeSet(parser); final TimePreference power_pref = new TimePreference(getActivity(), attributes) { @Override public void setSummary(CharSequence summary) { power_time.setText(summary); } @Override protected boolean persistString(String value) { SharedPreferences.Editor ed = preferences.edit(); ed.putString(State.POWER_TIME, value); ed.commit(); return true; } }; power_pref.onSetInitialValue(false, preferences.getString(State.POWER_TIME, "")); v.findViewById(R.id.power_block).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { power_pref.showDialog(); } }); tvVert = (TextView) v.findViewById(R.id.sensor_vertical); final Bookmarks.Point[] points = Bookmarks.get(getActivity()); Spinner start_point = (Spinner) v.findViewById(R.id.start_point); start_point.setAdapter(new BaseAdapter() { @Override public int getCount() { return points.length + 1; } @Override public Object getItem(int position) { if (position > 0) return points[position]; return null; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Activity.LAYOUT_INFLATER_SERVICE); v = inflater.inflate(R.layout.item, null); } TextView tv = (TextView) v.findViewById(R.id.name); if (position > 0) { tv.setText(points[position - 1].name); } else { tv.setText(R.string.last_position); } return v; } }); String point = preferences.getString(State.START_POINT, ""); for (int i = 0; i < points.length; i++) { Bookmarks.Point p = points[i]; if (point.equals(p.lat + "|" + p.lng)) { start_point.setSelection(i); break; } } start_point.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { SharedPreferences.Editor ed = preferences.edit(); if (position > 0) { Bookmarks.Point p = points[position - 1]; ed.putString(State.START_POINT, p.lat + "|" + p.lng); } else { ed.putString(State.START_POINT, "-"); } ed.commit(); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); return v; } @Override public void onStart() { super.onStart(); sensorManager = (SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE); sensorAccelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); sensorMagnetic = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); sensorEventListener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) magnetic = event.values; if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) gravity = event.values; if ((gravity == null) || (magnetic == null)) return; float[] fR = new float[9]; float[] fI = new float[9]; if (!SensorManager.getRotationMatrix(fR, fI, gravity, magnetic)) return; if (orientation == null) orientation = new float[3]; SensorManager.getOrientation(fR, orientation); int new_id = R.string.sensor_vertical; if ((Math.abs(orientation[1]) + Math.abs(orientation[2])) < 1) new_id = R.string.sensor_horizontal; if (new_id != vert_id) { vert_id = new_id; if (tvVert != null) tvVert.setText(vert_id); } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } }; sensorManager.registerListener(sensorEventListener, sensorAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); sensorManager.registerListener(sensorEventListener, sensorMagnetic, SensorManager.SENSOR_DELAY_NORMAL); } @Override public void onStop() { super.onStop(); sensorManager.unregisterListener(sensorEventListener); } public void install(String name) { InputStream in = null; OutputStream out = null; AssetManager assetManager = getActivity().getAssets(); try { String apk = name + ".apk"; in = assetManager.open(apk); out = getActivity().openFileOutput(apk, Context.MODE_WORLD_READABLE); byte[] buffer = new byte[1024]; int read; while ((read = in.read(buffer)) != -1) { out.write(buffer, 0, read); } in.close(); out.flush(); out.close(); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(getActivity().getFileStreamPath(apk)), "application/vnd.android.package-archive"); startActivity(intent); } catch (Exception e) { e.printStackTrace(); } } }