package net.bradmont.openmpd.fragments; import net.bradmont.supergreen.models.*; import net.bradmont.openmpd.*; import net.bradmont.openmpd.models.*; import net.bradmont.openmpd.controllers.TntImportService; import net.bradmont.openmpd.controllers.TntImporter; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.database.sqlite.*; import android.database.Cursor; import android.os.Bundle; import android.support.v4.app.ListFragment; import net.bradmont.openmpd.helpers.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import android.support.v4.widget.CursorAdapter; import android.support.v4.widget.SimpleCursorAdapter; import java.lang.Runnable; import android.support.v4.app.Fragment; import android.view.MenuItem; import android.view.Menu; import android.view.MenuInflater; import java.io.InputStream; import java.io.InputStreamReader; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.io.BufferedReader; import java.util.ArrayList; public class DebugFragment extends Fragment implements OnClickListener{ public static final String [] columns = {"timestamp", "msg1", "msg2", "msg3"}; public static final int [] fields = {R.id.timestamp, R.id.msg1, R.id.msg2, R.id.msg3}; private Cursor cursor = null; @Override public void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.debug_page, null); setHasOptionsMenu(true); cursor = MPDDBHelper.get() .getReadableDatabase() .rawQuery("select * from log order by _id desc;", null); SimpleCursorAdapter adapter = new MyAdapter(getActivity(), R.layout.error_list_item, cursor, columns, fields); ListView lv = (ListView) view.findViewById(R.id.list); lv.setAdapter(adapter); return view; } private class MyAdapter extends SimpleCursorAdapter { public MyAdapter(Context context, int layout, Cursor c, String[] from, int[] to){ super(context, layout, c, from, to); } public MyAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags){ super(context, layout, c, from, to, flags); } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewGroup result = (ViewGroup) super.getView(position, convertView, parent); Button b = (Button) result.findViewById(R.id.report_error_button); b.setTag(position); return result; } } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } @Override public void onCreateOptionsMenu (Menu menu, MenuInflater inflater){ inflater.inflate(R.menu.debug, menu); } @Override public boolean onOptionsItemSelected (MenuItem item){ switch (item.getItemId() ){ case R.id.menu_refresh: Log.i("net.bradmont.openmpd", "menu_refresh"); ModelList accounts = MPDDBHelper .get() .getReferenceModel("service_account") .getAll(); int [] account_ids = new int [accounts.size()]; for (int i = 0; i < accounts.size(); i++){ account_ids[i] = accounts.get(i).getID(); } getActivity().startService( new Intent(getActivity(), TntImportService.class) .putExtra("net.bradmont.openmpd.account_ids", account_ids) .putExtra("net.bradmont.openmpd.force_update", true) ); return true; } return false; } @Override public void onClick(View view){ switch (view.getId()){ case R.id.clear_data_button: String [] tables = { "address", "contact_status", "email_address", "gift", "notification", "phone_number", "contact" }; for (String table : tables){ MPDDBHelper.get().getWritableDatabase() .execSQL(String.format("delete from %s;", table)); } MPDDBHelper.get().getWritableDatabase() .execSQL(String.format("update service_account set last_import = null;")); break; case R.id.randomise_data_button: Log.i("net.bradmont.openmpd", "Randomising contact personal info"); // Replace all contact info with fake data, for public // screenshots and such. // read sample data InputStream inputStream = getActivity().getResources().openRawResource(R.raw.example_names); InputStreamReader inputreader = new InputStreamReader(inputStream); BufferedReader buffreader = new BufferedReader(inputreader); String line; ArrayList<String> fake_data = new ArrayList<String>(500); try { line = buffreader.readLine(); // drop first row while (( line = buffreader.readLine()) != null) { fake_data.add(line); } } catch (IOException e){ return; } // get all contacts ModelList contacts = MPDDBHelper.getReferenceModel("contact").getAll(); for (int i = 0; i < contacts.size(); i++){ int index = i % fake_data.size(); String [] info = TntImporter.csvLineSplit(fake_data.get(index)); Contact c = (Contact) contacts.get(index); c.setValue("fname", info[0]); c.setValue("lname", info[1]); c.dirtySave(); try { EmailAddress email = (EmailAddress) MPDDBHelper .getModelByField("email_address", "contact_id", c.getInt("id")); email.setValue("address", info[9]); email.dirtySave(); } catch (Exception e){} try { PhoneNumber phone = (PhoneNumber) MPDDBHelper .getModelByField("phone_number", "contact_id", c.getInt("id")); phone.setValue("number", info[7]); phone.dirtySave(); } catch (Exception e){} try { Address address = (Address) MPDDBHelper .getModelByField("address", "contact_id", c.getInt("id")); address.setValue("addr1", info[3]); address.setValue("addr2", ""); address.setValue("addr3", ""); address.setValue("city", info[4]); address.setValue("region", info[5]); address.setValue("post_code", info[6]); address.dirtySave(); } catch (Exception e){} } Log.i("net.bradmont.openmpd", "Randomising giving info"); // randomize gift amounts /*MPDDBHelper.get().getWritableDatabase() .execSQL("update gift set amount = round(amount * ( .75 + (abs(random()) % 50)/100.));"); MPDDBHelper.get().getWritableDatabase() .execSQL("update contact_status set giving_amount = round(giving_amount * ( .75 + (abs(random()) % 50)/100.));");*/ AnalyticsFragment.clearCache(); break; case R.id.report_error_button: int position = (Integer) view.getTag(); cursor.moveToPosition(position); Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_EMAIL, new String [] {"brad.stewart@p2c.com"}); intent.putExtra(Intent.EXTRA_SUBJECT, "OpenMPD Debug Report"); String body = cursor.getString(1) + "\n" + cursor.getString(2) + "\n" + cursor.getString(3) + "\n"; intent.putExtra(Intent.EXTRA_TEXT, body); getActivity() .startActivity( Intent.createChooser(intent, "Send Email")); break; case R.id.activate_message_templates: OpenMPD.get() .getSharedPreferences("openmpd", Context.MODE_PRIVATE) .edit().putBoolean("messageTemplatesEnabled", true) .apply(); ((BaseActivity) getActivity()).userMessage("Enabled message templates."); break; } } }