Browse Source

added sync and export

Alexander Brakowski 10 years ago
parent
commit
aebf16c345

+ 5 - 0
res/menu/records_overview_actions.xml

@@ -1,6 +1,11 @@
 <?xml version="1.0" encoding="utf-8"?>
 
 <menu xmlns:android="http://schemas.android.com/apk/res/android">
+	<item android:id="@+id/records_action_export"
+	      android:icon="@drawable/ic_action_save"
+	      android:title="Export to storage"
+	      android:showAsAction="always" />
+
 	<item android:id="@+id/records_action_synchronize"
 	      android:icon="@drawable/ic_action_refresh"
 	      android:title="Synchronize"

+ 1 - 0
res/values/strings.xml

@@ -21,6 +21,7 @@
 
     <string name="information">Information</string>
 	<string name="wifi_not_connected_msg">You are not connected to a WiFi network. \n\nPlease connect to one, before trying to activate HosTaGe.</string>
+	<string name="network_not_connected_msg">You are not connected to any network. \n\nPlease connect to one, before trying to activate HosTaGe.</string>
 	<string name="no_network_connection_threatmap_msg">Currently you are not connected to the Internet.\n\nPlease establish a connection to use the Threatmap.</string>
 	<string name="profile_no_services_msg">The current active profile does not seem to monitor any services.\n\nPlease activate some services to monitor in the profile.</string>
 

+ 0 - 7
res/xml/settings_preferences.xml

@@ -23,19 +23,12 @@
 				android:defaultValue="/HosTaGe/LogFiles/"
 				android:title="@string/pref_external_location_title"
 				/>
-
-		<Preference
-				android:key="pref_external_export"
-				android:title="@string/export_to_location"
-				/>
-
 	</PreferenceCategory>
 	<PreferenceCategory android:title="@string/pref_upload" >
 		<EditTextPreference
 				android:key="pref_upload_server"
 				android:defaultValue="https://ssi.cased.de"
 				android:title="@string/pref_upload_server" />
-
 	</PreferenceCategory>
 
 	<PreferenceCategory android:title="@string/advanced_settings">

+ 14 - 3
src/de/tudarmstadt/informatik/hostage/ui2/fragment/HomeFragment.java

@@ -80,6 +80,9 @@ public class HomeFragment extends Fragment {
 
 	private boolean mRestoredFromSaved = false;
 
+	private boolean isActive = false;
+	private boolean isConnected = false;
+
 	private void assignViews() {
 		mHomeSwitchConnection = (Switch) mRootView.findViewById(R.id.home_switch_connection);
 		mHomeTextName = (TextView) mRootView.findViewById(R.id.home_text_name);
@@ -120,6 +123,7 @@ public class HomeFragment extends Fragment {
 		}
 
 		mHomeSwitchConnection.setChecked(false);
+		isActive = false;
 	}
 
 	public void setStateNotActive() {
@@ -143,6 +147,7 @@ public class HomeFragment extends Fragment {
 		}
 
 		mHomeSwitchConnection.setChecked(true);
+		isActive = true;
 	}
 
 	public void setStateNotConnected() {
@@ -154,6 +159,7 @@ public class HomeFragment extends Fragment {
 		mHomeConnectionInfoButton.setVisibility(View.INVISIBLE);
 
 		mHomeTextName.setText(R.string.not_connected);
+		isConnected = false;
 	}
 
 	public void setStateConnected() {
@@ -161,6 +167,7 @@ public class HomeFragment extends Fragment {
 		mHomeTextProfileHeader.setVisibility(View.VISIBLE);
 		mHomeProfileImage.setVisibility(View.VISIBLE);
 		mHomeConnectionInfoButton.setVisibility(View.VISIBLE);
+		isConnected = true;
 	}
 
 	public void updateUI() {
@@ -170,9 +177,13 @@ public class HomeFragment extends Fragment {
 			mHomeProfileImage.setImageBitmap(profile.getIconBitmap());
 		}
 
-		if (HelperUtils.isWifiConnected(getActivity())) {
+		if (HelperUtils.isNetworkAvailable(getActivity())) {
 			setStateConnected();
 			mHomeTextName.setText(mConnectionInfo.getString(getString(R.string.connection_info_ssid), ""));
+		} else {
+			setStateNotConnected();
+			if(isActive) ThreatIndicatorGLRenderer.setThreatLevel(ThreatIndicatorGLRenderer.ThreatLevel.NO_THREAT);
+			return;
 		}
 
 		boolean hasActiveListeners = false;
@@ -225,7 +236,7 @@ public class HomeFragment extends Fragment {
 		} else {
 			setStateNotActive();
 
-			if (!HelperUtils.isWifiConnected(getActivity())) {
+			if (!HelperUtils.isNetworkAvailable(getActivity())) {
 				setStateNotConnected();
 			}
 		}
@@ -285,7 +296,7 @@ public class HomeFragment extends Fragment {
 			mSwitchChangeListener = new CompoundButton.OnCheckedChangeListener() {
 				public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
 					if (!HelperUtils.isNetworkAvailable(getActivity())) {
-						new AlertDialog.Builder(getActivity()).setTitle(R.string.information).setMessage(R.string.wifi_not_connected_msg)
+						new AlertDialog.Builder(getActivity()).setTitle(R.string.information).setMessage(R.string.network_not_connected_msg)
 								.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
 									public void onClick(DialogInterface dialog, int which) {
 

+ 94 - 3
src/de/tudarmstadt/informatik/hostage/ui2/fragment/RecordOverviewFragment.java

@@ -2,10 +2,15 @@ package de.tudarmstadt.informatik.hostage.ui2.fragment;
 
 import android.annotation.SuppressLint;
 import android.app.Activity;
+import android.app.AlertDialog;
 import android.app.FragmentManager;
 import android.content.Context;
+import android.content.DialogInterface;
 import android.content.Intent;
+import android.content.SharedPreferences;
 import android.os.Bundle;
+import android.os.Environment;
+import android.preference.PreferenceManager;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.Menu;
@@ -16,9 +21,12 @@ import android.view.ViewGroup;
 import android.widget.ExpandableListView;
 import android.widget.ImageButton;
 import android.widget.ProgressBar;
+import android.widget.Toast;
 
 import com.google.android.gms.maps.model.LatLng;
 
+import java.io.File;
+import java.io.FileOutputStream;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
@@ -30,9 +38,12 @@ import java.util.HashMap;
 import java.util.Random;
 
 import de.tudarmstadt.informatik.hostage.R;
+import de.tudarmstadt.informatik.hostage.commons.HelperUtils;
 import de.tudarmstadt.informatik.hostage.deprecated.UglyDbHelper;
 import de.tudarmstadt.informatik.hostage.logging.Record;
+import de.tudarmstadt.informatik.hostage.logging.formatter.TraCINgFormatter;
 import de.tudarmstadt.informatik.hostage.sync.BluetoothSync;
+import de.tudarmstadt.informatik.hostage.sync.NFCSync;
 import de.tudarmstadt.informatik.hostage.ui.LogFilter;
 import de.tudarmstadt.informatik.hostage.ui.LogFilter.SortType;
 import de.tudarmstadt.informatik.hostage.ui2.activity.MainActivity;
@@ -80,7 +91,9 @@ public class RecordOverviewFragment extends UpNavigatibleFragment implements Che
     private String sectionToOpen = "";
     private ArrayList<Integer> openSections;
 
-    public void setFilter(LogFilter filter){
+	private SharedPreferences pref;
+
+	public void setFilter(LogFilter filter){
         this.filter = filter;
     }
 
@@ -107,7 +120,7 @@ public class RecordOverviewFragment extends UpNavigatibleFragment implements Che
 		getActivity().setTitle(getResources().getString(R.string.drawer_records));
 
 		dbh = new UglyDbHelper(this.getActivity().getBaseContext());
-
+	    pref = PreferenceManager.getDefaultSharedPreferences(getActivity());
         //this.addRecordToDB(5, 2);
 
 	    // Get the message from the intent
@@ -316,13 +329,91 @@ public class RecordOverviewFragment extends UpNavigatibleFragment implements Che
 	public boolean onOptionsItemSelected(MenuItem item) {
 		switch (item.getItemId()) {
 			case R.id.records_action_synchronize:
-				getActivity().startActivity(new Intent(this.getActivity(), BluetoothSync.class));
+
+				AlertDialog.Builder builder = new AlertDialog.Builder(this.getActivity());
+				builder.setTitle("Synchronize records");
+				builder.setItems(new String[]{
+						"Via Bluetooth",
+						"Via NFC",
+						"Via CASED database"
+				}, new DialogInterface.OnClickListener() {
+					@Override
+					public void onClick(DialogInterface dialog, int position) {
+						switch(position){
+							case 0:
+								getActivity().startActivity(new Intent(getActivity(), BluetoothSync.class));
+								break;
+							case 1:
+								getActivity().startActivity(new Intent(getActivity(), NFCSync.class));
+								break;
+
+							case 2:
+								break;
+						}
+					}
+				});
+				builder.create();
+				builder.show();
+
+
+				return true;
+			case R.id.records_action_export:
+				AlertDialog.Builder builderExport = new AlertDialog.Builder(getActivity());
+				builderExport.setTitle("Choose export format");
+				builderExport.setItems(R.array.format, new DialogInterface.OnClickListener() {
+					@Override
+					public void onClick(DialogInterface dialog, int position) {
+						RecordOverviewFragment.this.exportDatabase(position);
+					}
+				});
+				builderExport.create();
+				builderExport.show();
+
 				return true;
 		}
 
 		return false;
 	}
 
+	private void exportDatabase(int format) {
+		try {
+			FileOutputStream log;
+			String filename = "hostage_" + format + "_" + System.currentTimeMillis() + ".log";
+
+			String externalLocation = pref.getString("pref_external_location",
+					"");
+
+			String root = Environment.getExternalStorageDirectory()
+					.toString();
+			if (root != null && HelperUtils.isExternalStorageWritable()) {
+				File dir = new File(root + externalLocation);
+				dir.mkdirs();
+				File file = new File(dir, filename);
+				log = new FileOutputStream(file);
+			} else {
+				Toast.makeText(getActivity(), "Could not write to SD Card",
+						Toast.LENGTH_SHORT).show();
+				return;
+			}
+
+
+			ArrayList<Record> records = dbh.getAllRecords();
+			for (Record record : records) {
+				log.write((record.toString((format == 1) ? TraCINgFormatter
+						.getInstance() : null)).getBytes());
+			}
+			log.flush();
+			log.close();
+			Toast.makeText(
+					getActivity(),
+					"Exported records to " + externalLocation + filename, Toast.LENGTH_LONG)
+					.show();
+		} catch (Exception e) {
+			Toast.makeText(getActivity(), "Could not write to SD Card",
+					Toast.LENGTH_SHORT).show();
+			e.printStackTrace();
+		}
+	}
 
 	/*****************************
 	 *