package org.ale.openwatch; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.List; import android.app.ActivityGroup; import android.app.AlertDialog; import android.app.Dialog; import android.app.NotificationManager; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.ServiceConnection; import android.content.SharedPreferences; import android.media.AudioManager; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.IBinder; import android.preference.PreferenceManager; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.view.ViewGroup.LayoutParams; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import android.widget.AdapterView.OnItemClickListener; public class MainActivityGroup extends ActivityGroup { /** Called when the activity is first created. */ public boolean recording = false; final Handler mHandler = new Handler(); private boolean r_servicedBind = false; private boolean u_servicedBind = false; private VideoRecorder vr; private String code = "BBB"; private String codeLeft = "BBB"; RecorderActivity raActivity; MainActivity maActivity; private int vol; recordService r_service; uploadService u_service; boolean stoppedPrematurely = false; private ServiceConnection r_connection = new ServiceConnection(){ public void onServiceConnected(ComponentName name, IBinder service) { r_service = recordService.Stub.asInterface(service); } public void onServiceDisconnected(ComponentName name) { r_service = null; } }; private ServiceConnection u_connection = new ServiceConnection(){ public void onServiceConnected(ComponentName name, IBinder service) { u_service = uploadService.Stub.asInterface(service); } public void onServiceDisconnected(ComponentName name) { u_service = null; } }; @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(raActivity.hidden) { if (keyCode == KeyEvent.KEYCODE_BACK) { if("B".equals(codeLeft.substring(0, 1))) { codeLeft = codeLeft.substring(1, codeLeft.length()); } else { codeLeft = code; } } if (keyCode == KeyEvent.KEYCODE_MENU) { if("M".equals(codeLeft.substring(0, 1))) { codeLeft = codeLeft.substring(1, codeLeft.length()); } else { codeLeft = code; } } if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) { if("U".equals(codeLeft.substring(0, 1))) { codeLeft = codeLeft.substring(1, codeLeft.length()); } else { codeLeft = code; } } if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { if("D".equals(codeLeft.substring(0, 1))) { codeLeft = codeLeft.substring(1, codeLeft.length()); } else { codeLeft = code; } } if(codeLeft.length() == 0) { raActivity.stop(); maActivity.activateButton(); codeLeft = code; // UPLOAD STUFF buildDoneDialog(); } return true; } if (keyCode == KeyEvent.KEYCODE_BACK) { finish(); } return false; } private void buildDoneDialog() { AlertDialog.Builder alert2 = new AlertDialog.Builder(this); alert2.setTitle(getString(R.string.recording_saved)); alert2.setMessage(getString(R.string.upload_recording_now)); final Context c = this; alert2.setPositiveButton(getString(R.string.yes_upload), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { mHandler.post(new Runnable() { public void run() { Intent mainIntent = new Intent(c, DescribeActivity.class); startActivity(mainIntent); // u_service.start(); }}); finish(); }}); alert2.setNegativeButton(getString(R.string.no_quit), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { finish(); } }); alert2.show(); } private void bindRecordService(){ r_servicedBind = bindService(new Intent(this, rService.class), r_connection, Context.BIND_AUTO_CREATE); } private void bindUploadService(){ u_servicedBind = bindService(new Intent(this, uService.class), u_connection, Context.BIND_AUTO_CREATE); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuItem mi = menu.add(0,0,0,R.string.menu_open); mi.setIcon(android.R.drawable.ic_menu_add); MenuItem mi3 = menu.add(0,2,0,R.string.tutorial); mi3.setIcon(android.R.drawable.ic_menu_help); MenuItem mi2 = menu.add(0,1,0,R.string.about); mi2.setIcon(android.R.drawable.ic_menu_view); MenuItem mi4 = menu.add(0,3,0,"Share"); mi4.setIcon(android.R.drawable.ic_menu_share); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case 0: AlertDialog ad; final Dialog dialoog = new Dialog(this, R.style.CustomDialogTheme); dialoog.setContentView(R.layout.dialog); final LayoutInflater factory = getLayoutInflater(); final View cView = factory.inflate(R.layout.dialog, null); final ListView list = (ListView) cView.findViewById(R.id.list); list.setVerticalScrollBarEnabled(true); list.setStackFromBottom(true); ArrayList<String> listItems = getRecordingList(); if (listItems == null){ return false; } ListItemsAdapter adapter = new ListItemsAdapter(listItems); list.setAdapter(adapter); list.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { TextView tv = (TextView)(arg1.findViewById(R.id.text)); final String br = tv.getText().toString(); final CharSequence[] items = {getString(R.string.upload), getString(R.string.play)}; AlertDialog.Builder builder = new AlertDialog.Builder(MainActivityGroup.this); builder.setTitle(getString(R.string.upload_or_play)); DialogInterface.OnClickListener DIO = new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { switch(item) { case 0: try { File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/rpath.txt"); f.delete(); f.createNewFile(); FileOutputStream fOut = new FileOutputStream(f); OutputStreamWriter osw = new OutputStreamWriter(fOut); osw.write(Environment.getExternalStorageDirectory().getAbsolutePath() + "/recordings/" + br); osw.flush(); osw.close(); } catch (IOException e1) { e1.printStackTrace(); } Intent mainIntent = new Intent(getBaseContext(), DescribeActivity.class); startActivity(mainIntent); finish(); return; case 1: Intent it; Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getAbsolutePath() + "/recordings/" + br); it = new Intent(Intent.ACTION_VIEW, uri); it.setDataAndType(uri,"video/3gpp"); startActivity(it); return; } } }; builder.setItems(items, DIO); AlertDialog alert = builder.create(); alert.show(); dialoog.cancel(); } }); dialoog.setContentView(cView); dialoog.show(); list.setTranscriptMode(ListView.TRANSCRIPT_MODE_DISABLED); list.scrollTo(0, 0); list.setSelection(0); return true; case 1: // About new AlertDialog.Builder(this) .setTitle("About OpenWatch") .setMessage(getString(R.string.about_text)) .setPositiveButton("Okay!", null) .show(); return(true); case 2: // Tutorial new AlertDialog.Builder(this) .setTitle(getString(R.string.tutorial)) .setMessage(getString(R.string.tutorial_text)) .setPositiveButton("Okay!", null) .show(); return(true); case 3: share_it(); return(true); default: return super.onOptionsItemSelected(item); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.group); Intent i = new Intent(this, RecorderActivity.class); // Ensure that only one ListenActivity can be launched. Otherwise, we may // get overlapping media players. i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); Window w = getLocalActivityManager().startActivity(RecorderActivity.class.getName(), i); View v = w.getDecorView(); ((ViewGroup) findViewById(R.id.Recorder)).addView(v, new ViewGroup.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); // A little hacky, but otherwise we get an annoying black line where the // seam of the drawer's edge is. ((FrameLayout)((ViewGroup) v).getChildAt(0)).setForeground(null); Intent j = new Intent(this, MainActivity.class); // Ensure that only one ListenActivity can be launched. Otherwise, we may // get overlapping media players. Window w2 = getLocalActivityManager().startActivity(MainActivity.class.getName(), j); View v2 = w2.getDecorView(); ((ViewGroup) findViewById(R.id.Main)).addView(v2, new ViewGroup.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); raActivity = (RecorderActivity) getLocalActivityManager().getActivity(RecorderActivity.class.getName()); maActivity = (MainActivity) getLocalActivityManager().getActivity(MainActivity.class.getName()); maActivity.setRecorderActivity(raActivity); raActivity.setMainActivity(maActivity); raActivity.setParentGroup(this); maActivity.setParentGroup(this); raActivity.setFL(maActivity.getFL()); AudioManager mgr = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE); vol = mgr.getStreamVolume(AudioManager.STREAM_SYSTEM); mgr.setStreamVolume(AudioManager.STREAM_SYSTEM, 0, 0); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); final SharedPreferences.Editor editor2; String first = prefs.getString("first_time", "fuck"); if(first.contains("fuck")){ new AlertDialog.Builder(this) .setMessage("Welcome to OpenWatch! \n\n This application allows opportunistic citizen journalists to invisibly record public and private officials and post the recordings to a central website, openwatch.net. A guide to using the application is availble in the Tutorial in the menu. More information about the OpenWatch can be found in the About section.") .setPositiveButton("Okay!", null) .show(); editor2 = prefs.edit(); editor2.putString("first_time", "shitballs"); editor2.commit(); } code = prefs.getString("code", "BBB"); codeLeft = code; Intent intent = new Intent(rService.ACTION_FOREGROUND); intent.setClass(MainActivityGroup.this, rService.class); startService(intent); bindRecordService(); } public void onResume() { super.onResume(); if(stoppedPrematurely) { stoppedPrematurely = false; buildDoneDialog(); } } @Override public void onPause() { super.onPause(); AudioManager mgr = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE); mgr.setStreamVolume(AudioManager.STREAM_SYSTEM, vol, 0); if(raActivity != null && raActivity.isVideoRecording()) { raActivity.stop(); maActivity.activateButton(); stoppedPrematurely = true; } } public void stopMain() { MainActivity maActivity = (MainActivity) getLocalActivityManager().getActivity(MainActivity.class.getName()); maActivity.finish(); } public void share_it(){ final String title = "OpenWatch - A Participatory Countersurveillence Project"; final String body = "I just became part of OpenWatch.net, a participatory countersurveillence project! #openwatch http://bit.ly/hhkWWc"; final Intent i = new Intent(Intent.ACTION_SEND); i.putExtra(Intent.EXTRA_SUBJECT, title); i.putExtra(Intent.EXTRA_TEXT, body); i.setType("text/plain"); startActivity(Intent.createChooser(i, "Share how?")); } public ArrayList<String> getRecordingList() { File folder = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/recordings"); File[] listOfFiles = folder.listFiles(); ArrayList<String> al = new ArrayList<String>(); if(listOfFiles == null) { return null; } for (int i = 0; i < listOfFiles.length; i++) { if (listOfFiles[i].isFile()) { al.add(listOfFiles[i].getName()); } } return al; } class ListItemsAdapter extends ArrayAdapter<String> { List<String> listItems; public ListItemsAdapter(List<String> items) { super(MainActivityGroup.this, android.R.layout.simple_list_item_1, items); listItems = items; } public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; LayoutInflater inflater = getLayoutInflater(); convertView = inflater.inflate(R.layout.dialog_items, null); holder = new ViewHolder(); holder.text = (TextView) convertView.findViewById(R.id.text); convertView.setTag(holder); // Bind the data efficiently with the holder. holder.text.setText( listItems.get(position) ); return convertView; } private class ViewHolder { TextView text; } } }