package com.mechinn.android.ouralliance; import android.bluetooth.BluetoothAdapter; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.os.Environment; import android.util.Log; import android.widget.Toast; import com.activeandroid.ActiveAndroid; import com.activeandroid.app.Application; import com.activeandroid.query.Delete; import io.fabric.sdk.android.Fabric; import com.crashlytics.android.Crashlytics; import com.mechinn.android.ouralliance.data.Event; import com.mechinn.android.ouralliance.data.EventTeam; import com.mechinn.android.ouralliance.data.JsonWrapper; import com.mechinn.android.ouralliance.data.Match; import com.mechinn.android.ouralliance.data.Team; import com.mechinn.android.ouralliance.data.frc2014.MatchScouting2014; import com.mechinn.android.ouralliance.data.frc2014.TeamScouting2014; import com.mechinn.android.ouralliance.data.frc2014.Wheel2014; import com.mechinn.android.ouralliance.data.frc2015.MatchScouting2015; import com.mechinn.android.ouralliance.data.frc2015.MatchScouting2015Wrapper; import com.mechinn.android.ouralliance.data.frc2015.TeamScouting2015; import com.mechinn.android.ouralliance.data.frc2015.TeamScouting2015Wrapper; import com.mechinn.android.ouralliance.data.frc2015.Wheel2015; import com.mechinn.android.ouralliance.event.BluetoothEvent; import com.mechinn.android.ouralliance.event.EventException; import com.mechinn.android.ouralliance.event.ResetEvent; import com.mechinn.android.ouralliance.event.ToastEvent; import com.mechinn.android.ouralliance.gson.BluetoothImportJson; import com.mechinn.android.ouralliance.gson.OurAllianceGson; import com.mechinn.android.ouralliance.gson.frc2015.ImportJsonEventTeamScouting2015; import com.mechinn.android.ouralliance.gson.frc2015.TeamScouting2015WrapperAdapter; import java.io.File; import java.util.List; import app.akexorcist.bluetotohspp.library.BluetoothSPP; import app.akexorcist.bluetotohspp.library.BluetoothState; import de.greenrobot.event.EventBus; import de.greenrobot.event.util.AsyncExecutor; import de.greenrobot.event.util.ThrowableFailureEvent; import timber.log.Timber; /** * Created by mechinn on 2/18/14. */ public class OurAlliance extends Application implements SharedPreferences.OnSharedPreferenceChangeListener { public static final String TAG = "OurAlliance"; private Prefs prefs; private String packageName; public static final int VERSION = 18; private BluetoothSPP bt; private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) { int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR); EventBus.getDefault().postSticky(new BluetoothEvent(state)); // EventBus.getDefault().postSticky(new BluetoothEvent(BluetoothAdapter.ERROR)); } } }; @Override public void onCreate() { super.onCreate(); if (BuildConfig.DEBUG) { Timber.plant(new Timber.DebugTree()); } Fabric.with(this, new Crashlytics()); EventBus.getDefault().register(this); prefs = new Prefs(this); prefs.setChangeListener(this); packageName = this.getPackageName(); Timber.d("current version: " + prefs.getVersion()); Timber.d("new version: "+VERSION); if(prefs.getVersion() < VERSION) { setup(); } bt = new BluetoothSPP(this); IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); this.registerReceiver(broadcastReceiver, filter); BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if(null==bluetoothAdapter) { EventBus.getDefault().postSticky(new BluetoothEvent(BluetoothAdapter.STATE_OFF)); } else { EventBus.getDefault().postSticky(new BluetoothEvent(bluetoothAdapter.getState())); } bt.setOnDataReceivedListener(new BluetoothSPP.OnDataReceivedListener() { public void onDataReceived(byte[] data, String message) { ToastEvent.toast("Recieved data"); Timber.d("Recieved data"); Timber.d(message); AsyncExecutor.create().execute(new BluetoothImportJson(OurAlliance.this,message)); } }); EventBus.getDefault().postSticky(bt); // new AlarmTheBlueAlliance(this.getApplicationContext()).setAlarm(); } public void onEventMainThread(BluetoothEvent event) { switch (event.getState()) { case OFF: case TURNING_OFF: bt.stopService(); break; case ON: bt.setupService(); bt.startService(BluetoothState.DEVICE_ANDROID); break; } } @Override public void onTerminate() { bt.stopService(); prefs.unsetChangeListener(this); EventBus.getDefault().unregister(this); super.onTerminate(); } public void setup() { AsyncExecutor.create().execute(new AsyncExecutor.RunnableEx() { @Override public void run() throws Exception { Timber.d( "version: " + prefs.getVersion()); switch (prefs.getVersion() + 1) { //reset case 0: prefs.clear(); prefs.setVersion(0); Timber.i("Resetting database"); ActiveAndroid.beginTransaction(); try { new Delete().from(MatchScouting2015.class).execute(); new Delete().from(Wheel2015.class).execute(); new Delete().from(TeamScouting2015.class).execute(); new Delete().from(MatchScouting2014.class).execute(); new Delete().from(Wheel2014.class).execute(); new Delete().from(TeamScouting2014.class).execute(); new Delete().from(Match.class).execute(); new Delete().from(EventTeam.class).execute(); new Delete().from(Event.class).execute(); new Delete().from(Team.class).execute(); ActiveAndroid.setTransactionSuccessful(); } finally { ActiveAndroid.endTransaction(); } case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: prefs.setVersion(17); case 18: if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { Timber.i( "Deleting old file directory"); File externalPath = Environment.getExternalStorageDirectory(); File fileDir = new File(externalPath.getAbsolutePath() + "/Android/data/" + packageName + "/files"); Utility.deleteRecursive(fileDir); } Timber.i( "Resetting database"); if (deleteDatabase(getDatabasePath("sprinkles.db").getAbsolutePath())) { Timber.d( "deleted db"); } else { Timber.d( "did not delete db"); } prefs.increaseVersion(); } Timber.i( "Finished setup"); } }); } public void onEventMainThread(ToastEvent event) { if(event.isLong()) { Toast.makeText(this,event.getMessage(),Toast.LENGTH_LONG).show(); } else { Toast.makeText(this,event.getMessage(),Toast.LENGTH_SHORT).show(); } } public void onEventMainThread(ThrowableFailureEvent event) { Toast.makeText(this,event.getThrowable().getMessage(),Toast.LENGTH_LONG); Timber.e(event.getThrowable(),event.getThrowable().getMessage()); } public void onEventMainThread(ResetEvent event) { String pack = this.getPackageName(); Timber.d( pack); Intent i = this.getPackageManager().getLaunchIntentForPackage(pack); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); this.startActivity(i); prefs.clear(); prefs.setVersion(-1); setup(); } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { Prefs.changed(this,key); } }