package org.bitseal.activities;
import info.guardianproject.cacheword.CacheWordHandler;
import info.guardianproject.cacheword.ICacheWordSubscriber;
import java.util.Timer;
import java.util.TimerTask;
import org.bitseal.R;
import org.bitseal.services.AppLockHandler;
import org.bitseal.util.TimeUtils;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.TextView;
/**
* The Activity class for the app's Settings screen.
*
* @author Jonathan Coe
*/
public class SettingsActivity extends Activity implements ICacheWordSubscriber
{
private Button mSecuritySettingsButton;
private Button mNetworkSettingsButton;
private Button mImportOrExportButton;
private Button mSystemToolsButton;
private TextView mTimeBehindNetworkTextView;
private CheckBox mShowSettingsCheckbox;
private static final String KEY_SHOW_SETTINGS = "showSettings";
private static final long UPDATE_FREQUENCY_MILLISECONDS = 1000;
/** The key for a boolean variable that records whether or not a user-defined database encryption passphrase has been saved */
private static final String KEY_DATABASE_PASSPHRASE_SAVED = "databasePassphraseSaved";
private CacheWordHandler mCacheWordHandler;
private static final String TAG = "SETTINGS_ACTIVITY";
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
// Check whether the user has set a database encryption passphrase
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
if (prefs.getBoolean(KEY_DATABASE_PASSPHRASE_SAVED, false))
{
// Connect to the CacheWordService
mCacheWordHandler = new CacheWordHandler(this);
mCacheWordHandler.connectToService();
}
mTimeBehindNetworkTextView = (TextView) findViewById(R.id.settings_time_behind_network_textview);
mTimeBehindNetworkTextView.setText(TimeUtils.getTimeBehindNetworkMessage());
// Update the 'time behind network' text view regularly
new Timer().schedule(new TimerTask()
{
@Override
public void run()
{
runOnUiThread(new Runnable()
{
public void run()
{
mTimeBehindNetworkTextView.setText(TimeUtils.getTimeBehindNetworkMessage());
}
});
}
}, 0, UPDATE_FREQUENCY_MILLISECONDS);
mSecuritySettingsButton = (Button) findViewById(R.id.settings_security_settings_button);
mSecuritySettingsButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Log.i(TAG, "Security settings button clicked");
Intent i = new Intent(getBaseContext(), SecurityActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivityForResult(i, 0);
}
});
mNetworkSettingsButton = (Button) findViewById(R.id.settings_network_settings_button);
mNetworkSettingsButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Log.i(TAG, "Network settings button clicked");
Intent i = new Intent(getBaseContext(), NetworkSettingsActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivityForResult(i, 0);
}
});
mImportOrExportButton = (Button) findViewById(R.id.settings_import_or_export_button);
mImportOrExportButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Log.i(TAG, "Import or export button clicked");
Intent i = new Intent(getBaseContext(), ImportOrExportActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivityForResult(i, 0);
}
});
mSystemToolsButton = (Button) findViewById(R.id.settings_system_tools_button);
mSystemToolsButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Log.i(TAG, "Settings system tools button clicked");
Intent i = new Intent(getBaseContext(), SystemToolsActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivityForResult(i, 0);
}
});
mShowSettingsCheckbox = (CheckBox) findViewById(R.id.settings_show_settings_checkbox);
mShowSettingsCheckbox.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
if (mShowSettingsCheckbox.isChecked())
{
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean(KEY_SHOW_SETTINGS, true);
editor.commit();
showSettings();
}
else
{
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean(KEY_SHOW_SETTINGS, false);
editor.commit();
hideSettings();
}
}
});
// Read the Shared Preferences to determine whether or not the settings should be visible
boolean showSettings = prefs.getBoolean(KEY_SHOW_SETTINGS, false);
Log.i(TAG, "Show settings is set to " + showSettings);
if (showSettings)
{
showSettings();
mShowSettingsCheckbox.setChecked(true);
}
else
{
hideSettings();
mShowSettingsCheckbox.setChecked(false);
}
}
private void showSettings()
{
mSecuritySettingsButton.setVisibility(View.VISIBLE);
mNetworkSettingsButton.setVisibility(View.VISIBLE);
mImportOrExportButton.setVisibility(View.VISIBLE);
mSystemToolsButton.setVisibility(View.VISIBLE);
mTimeBehindNetworkTextView.setVisibility(View.VISIBLE);
}
private void hideSettings()
{
mSecuritySettingsButton.setVisibility(View.GONE);
mNetworkSettingsButton.setVisibility(View.GONE);
mImportOrExportButton.setVisibility(View.GONE);
mSystemToolsButton.setVisibility(View.GONE);
mTimeBehindNetworkTextView.setVisibility(View.GONE);
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.options_menu, menu);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu)
{
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
if (prefs.getBoolean(KEY_DATABASE_PASSPHRASE_SAVED, false) == false)
{
menu.removeItem(R.id.menu_item_lock);
}
return super.onPrepareOptionsMenu(menu);
}
@SuppressLint("InlinedApi")
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch(item.getItemId())
{
case R.id.menu_item_inbox:
Intent intent1 = new Intent(this, InboxActivity.class);
intent1.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent1);
break;
case R.id.menu_item_sent:
Intent intent2 = new Intent(this, SentActivity.class);
intent2.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent2);
break;
case R.id.menu_item_compose:
Intent intent3 = new Intent(this, ComposeActivity.class);
intent3.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent3);
break;
case R.id.menu_item_identities:
Intent intent4 = new Intent(this, IdentitiesActivity.class);
intent4.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent4);
break;
case R.id.menu_item_addressBook:
Intent intent5 = new Intent(this, AddressBookActivity.class);
intent5.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent5);
break;
case R.id.menu_item_settings:
// We are already here, so there's nothing to do
break;
case R.id.menu_item_lock:
AppLockHandler.runLockRoutine(mCacheWordHandler);
break;
default:
return super.onOptionsItemSelected(item);
}
return true;
}
@Override
protected void onStop()
{
super.onStop();
if (mCacheWordHandler != null)
{
mCacheWordHandler.disconnectFromService();
}
}
@SuppressLint("InlinedApi")
@Override
public void onCacheWordLocked()
{
// Redirect to the lock screen activity
Intent intent = new Intent(getBaseContext(), LockScreenActivity.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) // FLAG_ACTIVITY_CLEAR_TASK only exists in API 11 and later
{
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);// Clear the stack of activities
}
else
{
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
startActivity(intent);
}
@Override
public void onCacheWordOpened()
{
// Nothing to do here currently
}
@Override
public void onCacheWordUninitialized()
{
// Database encryption is currently not enabled by default, so there is nothing to do here
}
}