aboutsummaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/src/androidTest/java/org/connectbot/StartupTest.java16
-rw-r--r--app/src/main/java/org/connectbot/ColorsActivity.java40
-rw-r--r--app/src/main/java/org/connectbot/ConsoleActivity.java8
-rw-r--r--app/src/main/java/org/connectbot/GeneratePubkeyActivity.java3
-rw-r--r--app/src/main/java/org/connectbot/HostEditorActivity.java58
-rw-r--r--app/src/main/java/org/connectbot/HostListActivity.java17
-rw-r--r--app/src/main/java/org/connectbot/PortForwardListActivity.java30
-rw-r--r--app/src/main/java/org/connectbot/PubkeyListActivity.java41
-rw-r--r--app/src/main/java/org/connectbot/service/BackupAgent.java25
-rw-r--r--app/src/main/java/org/connectbot/service/TerminalBridge.java11
-rw-r--r--app/src/main/java/org/connectbot/service/TerminalManager.java22
-rw-r--r--app/src/main/java/org/connectbot/transport/SSH.java20
-rw-r--r--app/src/main/java/org/connectbot/util/HostDatabase.java334
-rw-r--r--app/src/main/java/org/connectbot/util/PubkeyDatabase.java130
14 files changed, 303 insertions, 452 deletions
diff --git a/app/src/androidTest/java/org/connectbot/StartupTest.java b/app/src/androidTest/java/org/connectbot/StartupTest.java
index a60d00e..9b725ef 100644
--- a/app/src/androidTest/java/org/connectbot/StartupTest.java
+++ b/app/src/androidTest/java/org/connectbot/StartupTest.java
@@ -1,29 +1,20 @@
package org.connectbot;
-import org.connectbot.bean.HostBean;
import org.connectbot.util.HostDatabase;
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeMatcher;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
-import android.support.annotation.ColorInt;
import android.support.annotation.ColorRes;
-import android.support.annotation.NonNull;
import android.support.annotation.StringRes;
import android.support.test.InstrumentationRegistry;
import android.support.test.espresso.intent.Intents;
-import android.support.test.espresso.matcher.BoundedMatcher;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.TextView;
import static android.support.test.espresso.Espresso.onData;
import static android.support.test.espresso.Espresso.onView;
@@ -34,7 +25,6 @@ import static android.support.test.espresso.action.ViewActions.pressBack;
import static android.support.test.espresso.action.ViewActions.pressImeActionButton;
import static android.support.test.espresso.action.ViewActions.pressMenuKey;
import static android.support.test.espresso.action.ViewActions.typeText;
-import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.intent.Intents.intended;
import static android.support.test.espresso.intent.matcher.IntentMatchers.hasComponent;
@@ -58,8 +48,8 @@ public class StartupTest {
@Before
public void makeDatabasePristine() {
- HostDatabase db = new HostDatabase(InstrumentationRegistry.getTargetContext());
- db.resetDatabase();
+ Context testContext = InstrumentationRegistry.getTargetContext();
+ HostDatabase.resetInMemoryInstance(testContext);
mActivityRule.launchActivity(new Intent());
}
diff --git a/app/src/main/java/org/connectbot/ColorsActivity.java b/app/src/main/java/org/connectbot/ColorsActivity.java
index be5dfb1..8725a51 100644
--- a/app/src/main/java/org/connectbot/ColorsActivity.java
+++ b/app/src/main/java/org/connectbot/ColorsActivity.java
@@ -56,7 +56,6 @@ public class ColorsActivity extends Activity implements OnItemClickListener, OnC
private int mColorScheme;
private List<Integer> mColorList;
- private HostDatabase mHostDb;
private int mCurrentColor = 0;
@@ -74,10 +73,10 @@ public class ColorsActivity extends Activity implements OnItemClickListener, OnC
mColorScheme = HostDatabase.DEFAULT_COLOR_SCHEME;
- mHostDb = new HostDatabase(this);
+ HostDatabase hostDb = HostDatabase.get(this);
- mColorList = Arrays.asList(mHostDb.getColorsForScheme(mColorScheme));
- mDefaultColors = mHostDb.getDefaultColorsForScheme(mColorScheme);
+ mColorList = Arrays.asList(hostDb.getColorsForScheme(mColorScheme));
+ mDefaultColors = hostDb.getDefaultColorsForScheme(mColorScheme);
mColorGrid = (GridView) findViewById(R.id.color_grid);
mColorGrid.setAdapter(new ColorsAdapter(true));
@@ -95,24 +94,6 @@ public class ColorsActivity extends Activity implements OnItemClickListener, OnC
mBgSpinner.setOnItemSelectedListener(this);
}
- @Override
- protected void onDestroy() {
- super.onDestroy();
-
- if (mHostDb != null) {
- mHostDb.close();
- mHostDb = null;
- }
- }
-
- @Override
- protected void onResume() {
- super.onResume();
-
- if (mHostDb == null)
- mHostDb = new HostDatabase(this);
- }
-
private class ColorsAdapter extends BaseAdapter {
private final boolean mSquareViews;
private final int mResourceLabel;
@@ -304,7 +285,8 @@ public class ColorsActivity extends Activity implements OnItemClickListener, OnC
public void onNothingSelected(AdapterView<?> arg0) { }
public void colorChanged(int value) {
- mHostDb.setGlobalColor(mCurrentColor, value);
+ HostDatabase hostDb = HostDatabase.get(this);
+ hostDb.setGlobalColor(mCurrentColor, value);
mColorList.set(mCurrentColor, value);
mColorGrid.invalidateViews();
}
@@ -324,8 +306,10 @@ public class ColorsActivity extends Activity implements OnItemClickListener, OnC
}
}
- if (needUpdate)
- mHostDb.setDefaultColorsForScheme(mColorScheme, mDefaultColors[0], mDefaultColors[1]);
+ if (needUpdate) {
+ HostDatabase hostDb = HostDatabase.get(this);
+ hostDb.setDefaultColorsForScheme(mColorScheme, mDefaultColors[0], mDefaultColors[1]);
+ }
}
@Override
@@ -338,10 +322,12 @@ public class ColorsActivity extends Activity implements OnItemClickListener, OnC
reset.setIcon(android.R.drawable.ic_menu_revert);
reset.setOnMenuItemClickListener(new OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem arg0) {
+ HostDatabase hostDb = HostDatabase.get(ColorsActivity.this);
+
// Reset each individual color to defaults.
for (int i = 0; i < Colors.defaults.length; i++) {
if (!mColorList.get(i).equals(Colors.defaults[i])) {
- mHostDb.setGlobalColor(i, Colors.defaults[i]);
+ hostDb.setGlobalColor(i, Colors.defaults[i]);
mColorList.set(i, Colors.defaults[i]);
}
}
@@ -350,7 +336,7 @@ public class ColorsActivity extends Activity implements OnItemClickListener, OnC
// Reset the default FG/BG colors as well.
mFgSpinner.setSelection(HostDatabase.DEFAULT_FG_COLOR);
mBgSpinner.setSelection(HostDatabase.DEFAULT_BG_COLOR);
- mHostDb.setDefaultColorsForScheme(HostDatabase.DEFAULT_COLOR_SCHEME,
+ hostDb.setDefaultColorsForScheme(HostDatabase.DEFAULT_COLOR_SCHEME,
HostDatabase.DEFAULT_FG_COLOR, HostDatabase.DEFAULT_BG_COLOR);
return true;
diff --git a/app/src/main/java/org/connectbot/ConsoleActivity.java b/app/src/main/java/org/connectbot/ConsoleActivity.java
index 7ed9076..5258bef 100644
--- a/app/src/main/java/org/connectbot/ConsoleActivity.java
+++ b/app/src/main/java/org/connectbot/ConsoleActivity.java
@@ -167,8 +167,6 @@ public class ConsoleActivity extends AppCompatActivity implements BridgeDisconne
bound.setResizeAllowed(true);
final String requestedNickname = (requested != null) ? requested.getFragment() : null;
- int requestedIndex = 0;
-
TerminalBridge requestedBridge = bound.getConnectedBridge(requestedNickname);
// If we didn't find the requested connection, try opening it
@@ -183,9 +181,11 @@ public class ConsoleActivity extends AppCompatActivity implements BridgeDisconne
// create views for all bridges on this service
adapter.notifyDataSetChanged();
- requestedIndex = bound.getBridges().indexOf(requestedBridge);
+ int requestedIndex = bound.getBridges().indexOf(requestedBridge);
- setDisplayedTerminal(requestedIndex == -1 ? 0 : requestedIndex);
+ if (requestedIndex != -1) {
+ setDisplayedTerminal(requestedIndex);
+ }
}
public void onServiceDisconnected(ComponentName className) {
diff --git a/app/src/main/java/org/connectbot/GeneratePubkeyActivity.java b/app/src/main/java/org/connectbot/GeneratePubkeyActivity.java
index 7510394..17db685 100644
--- a/app/src/main/java/org/connectbot/GeneratePubkeyActivity.java
+++ b/app/src/main/java/org/connectbot/GeneratePubkeyActivity.java
@@ -298,9 +298,8 @@ public class GeneratePubkeyActivity extends Activity implements OnEntropyGathere
pubkey.setStartup(unlockAtStartup.isChecked());
pubkey.setConfirmUse(confirmUse.isChecked());
- PubkeyDatabase pubkeydb = new PubkeyDatabase(GeneratePubkeyActivity.this);
+ PubkeyDatabase pubkeydb = PubkeyDatabase.get(GeneratePubkeyActivity.this);
pubkeydb.savePubkey(pubkey);
- pubkeydb.close();
} catch (Exception e) {
Log.e(TAG, "Could not generate key pair");
diff --git a/app/src/main/java/org/connectbot/HostEditorActivity.java b/app/src/main/java/org/connectbot/HostEditorActivity.java
index 3976858..7316775 100644
--- a/app/src/main/java/org/connectbot/HostEditorActivity.java
+++ b/app/src/main/java/org/connectbot/HostEditorActivity.java
@@ -66,9 +66,10 @@ public class HostEditorActivity extends PreferenceActivity implements OnSharedPr
protected final void cacheValues() {
// fill a cursor and cache the values locally
- // this makes sure we dont have any floating cursor to dispose later
+ // this makes sure we don't have any floating cursor to dispose later
- SQLiteDatabase db = hostdb.getReadableDatabase();
+ HostDatabase hostdb = HostDatabase.get(HostEditorActivity.this);
+ SQLiteDatabase db = hostdb.getWritableDatabase();
Cursor cursor = db.query(table, null, "_id = ?",
new String[] { String.valueOf(id) }, null, null, null);
@@ -81,23 +82,6 @@ public class HostEditorActivity extends PreferenceActivity implements OnSharedPr
}
}
cursor.close();
- db.close();
-
-// db = pubkeydb.getReadableDatabase();
-// cursor = db.query(PubkeyDatabase.TABLE_PUBKEYS,
-// new String[] { "_id", PubkeyDatabase.FIELD_PUBKEY_NICKNAME },
-// null, null, null, null, null);
-//
-// if (cursor.moveToFirst()) {
-// do {
-// String pubkeyid = String.valueOf(cursor.getLong(0));
-// String value = cursor.getString(1);
-// pubkeys.put(pubkeyid, value);
-// } while (cursor.moveToNext());
-// }
-//
-// cursor.close();
-// db.close();
}
public boolean contains(String key) {
@@ -115,10 +99,15 @@ public class HostEditorActivity extends PreferenceActivity implements OnSharedPr
}
public boolean commit() {
- //Log.d(this.getClass().toString(), "commit() changes back to database");
+ HostDatabase hostdb = HostDatabase.get(HostEditorActivity.this);
SQLiteDatabase db = hostdb.getWritableDatabase();
- db.update(table, update, "_id = ?", new String[] { String.valueOf(id) });
- db.close();
+ db.beginTransaction();
+ try {
+ db.update(table, update, "_id = ?", new String[] {String.valueOf(id)});
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ }
// make sure we refresh the parent cached values
cacheValues();
@@ -226,9 +215,6 @@ public class HostEditorActivity extends PreferenceActivity implements OnSharedPr
protected static final String TAG = "CB.HostEditorActivity";
- protected HostDatabase hostdb = null;
- private PubkeyDatabase pubkeydb = null;
-
private CursorPreferenceHack pref;
private ServiceConnection connection;
@@ -244,8 +230,7 @@ public class HostEditorActivity extends PreferenceActivity implements OnSharedPr
// TODO: we could pass through a specific ContentProvider uri here
//this.getPreferenceManager().setSharedPreferencesName(uri);
- this.hostdb = new HostDatabase(this);
- this.pubkeydb = new PubkeyDatabase(this);
+ HostDatabase hostdb = HostDatabase.get(this);
host = hostdb.findHostById(hostId);
@@ -271,6 +256,7 @@ public class HostEditorActivity extends PreferenceActivity implements OnSharedPr
// TODO: should consider moving into onStart, but we dont have a good way of resetting the listpref after filling once
ListPreference pubkeyPref = (ListPreference) findPreference(HostDatabase.FIELD_HOST_PUBKEYID);
+ PubkeyDatabase pubkeydb = PubkeyDatabase.get(this);
List<CharSequence> pubkeyNicks = new LinkedList<CharSequence>(Arrays.asList(pubkeyPref.getEntries()));
pubkeyNicks.addAll(pubkeydb.allValues(PubkeyDatabase.FIELD_PUBKEY_NICKNAME));
pubkeyPref.setEntries(pubkeyNicks.toArray(new CharSequence[pubkeyNicks.size()]));
@@ -305,12 +291,6 @@ public class HostEditorActivity extends PreferenceActivity implements OnSharedPr
super.onStart();
bindService(new Intent(this, TerminalManager.class), connection, Context.BIND_AUTO_CREATE);
-
- if (this.hostdb == null)
- this.hostdb = new HostDatabase(this);
-
- if (this.pubkeydb == null)
- this.pubkeydb = new PubkeyDatabase(this);
}
@Override
@@ -318,19 +298,11 @@ public class HostEditorActivity extends PreferenceActivity implements OnSharedPr
super.onStop();
unbindService(connection);
-
- if (this.hostdb != null) {
- this.hostdb.close();
- this.hostdb = null;
- }
-
- if (this.pubkeydb != null) {
- this.pubkeydb.close();
- this.pubkeydb = null;
- }
}
private void updateSummaries() {
+ PubkeyDatabase pubkeydb = PubkeyDatabase.get(this);
+
// for all text preferences, set hint as current database value
for (String key : this.pref.values.keySet()) {
if (key.equals(HostDatabase.FIELD_HOST_POSTLOGIN)) continue;
diff --git a/app/src/main/java/org/connectbot/HostListActivity.java b/app/src/main/java/org/connectbot/HostListActivity.java
index ce8c79b..c95769c 100644
--- a/app/src/main/java/org/connectbot/HostListActivity.java
+++ b/app/src/main/java/org/connectbot/HostListActivity.java
@@ -71,7 +71,6 @@ public class HostListActivity extends ListActivity implements OnHostStatusChange
protected TerminalManager bound = null;
- protected HostDatabase hostdb;
private List<HostBean> hosts;
protected LayoutInflater inflater = null;
@@ -124,9 +123,6 @@ public class HostListActivity extends ListActivity implements OnHostStatusChange
// start the terminal manager service
this.bindService(new Intent(this, TerminalManager.class), connection, Context.BIND_AUTO_CREATE);
-
- if (this.hostdb == null)
- this.hostdb = new HostDatabase(this);
}
@Override
@@ -134,11 +130,6 @@ public class HostListActivity extends ListActivity implements OnHostStatusChange
super.onStop();
this.unbindService(connection);
- if (this.hostdb != null) {
- this.hostdb.close();
- this.hostdb = null;
- }
-
closeOnDisconnectAll = true;
}
@@ -209,7 +200,6 @@ public class HostListActivity extends ListActivity implements OnHostStatusChange
|| Intent.ACTION_PICK.equals(getIntent().getAction());
// connect with hosts database and populate list
- this.hostdb = new HostDatabase(this);
ListView list = this.getListView();
this.sortedByColor = prefs.getBoolean(PreferenceConstants.SORT_BY_COLOR, false);
@@ -402,7 +392,7 @@ public class HostListActivity extends ListActivity implements OnHostStatusChange
if (bridge != null)
bridge.dispatchDisconnect(true);
- hostdb.deleteHost(host);
+ HostDatabase.get(HostListActivity.this).deleteHost(host);
updateList();
}
})
@@ -463,6 +453,7 @@ public class HostListActivity extends ListActivity implements OnHostStatusChange
return false;
}
+ HostDatabase hostdb = HostDatabase.get(this);
HostBean host = TransportFactory.findHost(hostdb, uri);
if (host == null) {
host = TransportFactory.getTransport(uri.getScheme()).createHost(uri);
@@ -488,9 +479,7 @@ public class HostListActivity extends ListActivity implements OnHostStatusChange
edit.commit();
}
- if (hostdb == null)
- hostdb = new HostDatabase(this);
-
+ HostDatabase hostdb = HostDatabase.get(this);
hosts = hostdb.getHosts(sortedByColor);
// Don't lose hosts that are connected via shortcuts but not in the database.
diff --git a/app/src/main/java/org/connectbot/PortForwardListActivity.java b/app/src/main/java/org/connectbot/PortForwardListActivity.java
index c1a6b75..c2be62c 100644
--- a/app/src/main/java/org/connectbot/PortForwardListActivity.java
+++ b/app/src/main/java/org/connectbot/PortForwardListActivity.java
@@ -68,8 +68,6 @@ public class PortForwardListActivity extends ListActivity {
private static final int LISTENER_CYCLE_TIME = 500;
- protected HostDatabase hostdb;
-
private List<PortForwardBean> portForwards;
private ServiceConnection connection = null;
@@ -83,9 +81,6 @@ public class PortForwardListActivity extends ListActivity {
super.onStart();
this.bindService(new Intent(this, TerminalManager.class), connection, Context.BIND_AUTO_CREATE);
-
- if (this.hostdb == null)
- this.hostdb = new HostDatabase(this);
}
@Override
@@ -93,11 +88,6 @@ public class PortForwardListActivity extends ListActivity {
super.onStop();
this.unbindService(connection);
-
- if (this.hostdb != null) {
- this.hostdb.close();
- this.hostdb = null;
- }
}
@Override
@@ -109,7 +99,7 @@ public class PortForwardListActivity extends ListActivity {
setContentView(R.layout.act_portforwardlist);
// connect with hosts database and populate list
- this.hostdb = new HostDatabase(this);
+ HostDatabase hostdb = HostDatabase.get(this);
host = hostdb.findHostById(hostId);
{
@@ -220,9 +210,12 @@ public class PortForwardListActivity extends ListActivity {
hostBridge.enablePortForward(pfb);
}
- if (host != null && !hostdb.savePortForward(pfb))
- throw new SQLException("Could not save port forward");
-
+ if (host != null) {
+ HostDatabase hostdb = HostDatabase.get(PortForwardListActivity.this);
+ if (!hostdb.savePortForward(pfb)) {
+ throw new SQLException("Could not save port forward");
+ }
+ }
updateHandler.sendEmptyMessage(-1);
} catch (Exception e) {
Log.e(TAG, "Could not update port forward", e);
@@ -317,8 +310,10 @@ public class PortForwardListActivity extends ListActivity {
}, LISTENER_CYCLE_TIME);
- if (!hostdb.savePortForward(pfb))
+ HostDatabase hostdb = HostDatabase.get(PortForwardListActivity.this);
+ if (!hostdb.savePortForward(pfb)) {
throw new SQLException("Could not save port forward");
+ }
updateHandler.sendEmptyMessage(-1);
} catch (Exception e) {
@@ -346,6 +341,7 @@ public class PortForwardListActivity extends ListActivity {
if (hostBridge != null)
hostBridge.removePortForward(pfb);
+ HostDatabase hostdb = HostDatabase.get(PortForwardListActivity.this);
hostdb.deletePortForward(pfb);
} catch (Exception e) {
Log.e(TAG, "Could not delete port forward", e);
@@ -372,8 +368,8 @@ public class PortForwardListActivity extends ListActivity {
if (hostBridge != null) {
this.portForwards = hostBridge.getPortForwards();
} else {
- if (this.hostdb == null) return;
- this.portForwards = this.hostdb.getPortForwardsForHost(host);
+ HostDatabase hostdb = HostDatabase.get(this);
+ this.portForwards = hostdb.getPortForwardsForHost(host);
}
PortForwardAdapter adapter = new PortForwardAdapter(this, portForwards);
diff --git a/app/src/main/java/org/connectbot/PubkeyListActivity.java b/app/src/main/java/org/connectbot/PubkeyListActivity.java
index 6004327..8910abf 100644
--- a/app/src/main/java/org/connectbot/PubkeyListActivity.java
+++ b/app/src/main/java/org/connectbot/PubkeyListActivity.java
@@ -88,7 +88,6 @@ public class PubkeyListActivity extends ListActivity implements EventListener {
private static final String ANDEXPLORER_TITLE = "explorer_title";
private static final String MIME_TYPE_ANDEXPLORER_FILE = "vnd.android.cursor.dir/lysesoft.andexplorer.file";
- protected PubkeyDatabase pubkeydb;
private List<PubkeyBean> pubkeys;
protected ClipboardManager clipboard;
@@ -120,8 +119,7 @@ public class PubkeyListActivity extends ListActivity implements EventListener {
bindService(new Intent(this, TerminalManager.class), connection, Context.BIND_AUTO_CREATE);
- if (pubkeydb == null)
- pubkeydb = new PubkeyDatabase(this);
+ updateList();
}
@Override
@@ -129,11 +127,6 @@ public class PubkeyListActivity extends ListActivity implements EventListener {
super.onStop();
unbindService(connection);
-
- if (pubkeydb != null) {
- pubkeydb.close();
- pubkeydb = null;
- }
}
@Override
@@ -145,11 +138,6 @@ public class PubkeyListActivity extends ListActivity implements EventListener {
getResources().getText(R.string.app_name),
getResources().getText(R.string.title_pubkey_list)));
- // connect with hosts database and populate list
- pubkeydb = new PubkeyDatabase(this);
-
- updateList();
-
registerForContextMenu(getListView());
getListView().setOnItemClickListener(new OnItemClickListener() {
@@ -331,7 +319,8 @@ public class PubkeyListActivity extends ListActivity implements EventListener {
public boolean onMenuItemClick(MenuItem item) {
// toggle onstart status
pubkey.setStartup(!pubkey.isStartup());
- pubkeydb.savePubkey(pubkey);
+ PubkeyDatabase pubkeyDb = PubkeyDatabase.get(PubkeyListActivity.this);
+ pubkeyDb.savePubkey(pubkey);
updateList();
return true;
}
@@ -405,7 +394,8 @@ public class PubkeyListActivity extends ListActivity implements EventListener {
.setPositiveButton(android.R.string.ok, null)
.create().show();
else {
- pubkeydb.savePubkey(pubkey);
+ PubkeyDatabase pubkeyDb = PubkeyDatabase.get(PubkeyListActivity.this);
+ pubkeyDb.savePubkey(pubkey);
updateList();
}
} catch (Exception e) {
@@ -430,7 +420,8 @@ public class PubkeyListActivity extends ListActivity implements EventListener {
public boolean onMenuItemClick(MenuItem item) {
// toggle confirm use
pubkey.setConfirmUse(!pubkey.isConfirmUse());
- pubkeydb.savePubkey(pubkey);
+ PubkeyDatabase pubkeyDb = PubkeyDatabase.get(PubkeyListActivity.this);
+ pubkeyDb.savePubkey(pubkey);
updateList();
return true;
}
@@ -446,11 +437,13 @@ public class PubkeyListActivity extends ListActivity implements EventListener {
public void onClick(DialogInterface dialog, int which) {
// dont forget to remove from in-memory
- if (loaded)
+ if (loaded) {
bound.removeKey(pubkey.getNickname());
+ }
// delete from backend database and update gui
- pubkeydb.deletePubkey(pubkey);
+ PubkeyDatabase pubkeyDb = PubkeyDatabase.get(PubkeyListActivity.this);
+ pubkeyDb.deletePubkey(pubkey);
updateList();
}
})
@@ -463,9 +456,8 @@ public class PubkeyListActivity extends ListActivity implements EventListener {
}
protected void updateList() {
- if (pubkeydb == null) return;
-
- pubkeys = pubkeydb.allPubkeys();
+ PubkeyDatabase pubkeyDb = PubkeyDatabase.get(PubkeyListActivity.this);
+ pubkeys = pubkeyDb.allPubkeys();
PubkeyAdapter adapter = new PubkeyAdapter(this, pubkeys);
this.setListAdapter(adapter);
@@ -496,7 +488,7 @@ public class PubkeyListActivity extends ListActivity implements EventListener {
}
/**
- * @param name
+ * @param file
*/
private void readKeyFromFile(File file) {
PubkeyBean pubkey = new PubkeyBean();
@@ -545,9 +537,8 @@ public class PubkeyListActivity extends ListActivity implements EventListener {
}
// write new value into database
- if (pubkeydb == null)
- pubkeydb = new PubkeyDatabase(this);
- pubkeydb.savePubkey(pubkey);
+ PubkeyDatabase pubkeyDb = PubkeyDatabase.get(this);
+ pubkeyDb.savePubkey(pubkey);
updateList();
} catch (Exception e) {
diff --git a/app/src/main/java/org/connectbot/service/BackupAgent.java b/app/src/main/java/org/connectbot/service/BackupAgent.java
index 312ae3b..6e57f27 100644
--- a/app/src/main/java/org/connectbot/service/BackupAgent.java
+++ b/app/src/main/java/org/connectbot/service/BackupAgent.java
@@ -17,19 +17,14 @@
package org.connectbot.service;
-import java.io.IOException;
-
import org.connectbot.util.HostDatabase;
import org.connectbot.util.PreferenceConstants;
import org.connectbot.util.PubkeyDatabase;
import android.annotation.TargetApi;
import android.app.backup.BackupAgentHelper;
-import android.app.backup.BackupDataInput;
-import android.app.backup.BackupDataOutput;
import android.app.backup.FileBackupHelper;
import android.app.backup.SharedPreferencesBackupHelper;
-import android.os.ParcelFileDescriptor;
import android.util.Log;
/**
@@ -53,24 +48,4 @@ public class BackupAgent extends BackupAgentHelper {
addHelper(PubkeyDatabase.DB_NAME, pubkeys);
}
-
- @Override
- public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
- ParcelFileDescriptor newState) throws IOException {
- synchronized (HostDatabase.dbLock) {
- super.onBackup(oldState, data, newState);
- }
- }
-
- @Override
- public void onRestore(BackupDataInput data, int appVersionCode,
- ParcelFileDescriptor newState) throws IOException {
- Log.d("ConnectBot.BackupAgent", "onRestore called");
-
- synchronized (HostDatabase.dbLock) {
- Log.d("ConnectBot.BackupAgent", "onRestore in-lock");
-
- super.onRestore(data, appVersionCode, newState);
- }
- }
}
diff --git a/app/src/main/java/org/connectbot/service/TerminalBridge.java b/app/src/main/java/org/connectbot/service/TerminalBridge.java
index 6d47f96..6f76b02 100644
--- a/app/src/main/java/org/connectbot/service/TerminalBridge.java
+++ b/app/src/main/java/org/connectbot/service/TerminalBridge.java
@@ -273,7 +273,8 @@ public class TerminalBridge implements VDUDisplay {
transport.setEmulation(emulation);
if (transport.canForwardPorts()) {
- for (PortForwardBean portForward : manager.hostdb.getPortForwardsForHost(host))
+ HostDatabase hostDb = HostDatabase.get(manager);
+ for (PortForwardBean portForward : hostDb.getPortForwardsForHost(host))
transport.addPortForward(portForward);
}
@@ -533,7 +534,8 @@ public class TerminalBridge implements VDUDisplay {
}
host.setFontSize((int) sizeDp);
- manager.hostdb.updateFontSize(host);
+ HostDatabase hostDb = HostDatabase.get(manager);
+ hostDb.updateFontSize(host);
forcedSize = false;
}
@@ -950,11 +952,12 @@ public class TerminalBridge implements VDUDisplay {
}
public final void resetColors() {
- int[] defaults = manager.hostdb.getDefaultColorsForScheme(HostDatabase.DEFAULT_COLOR_SCHEME);
+ HostDatabase hostDb = HostDatabase.get(manager);
+ int[] defaults = hostDb.getDefaultColorsForScheme(HostDatabase.DEFAULT_COLOR_SCHEME);
defaultFg = defaults[0];
defaultBg = defaults[1];
- color = manager.hostdb.getColorsForScheme(HostDatabase.DEFAULT_COLOR_SCHEME);
+ color = hostDb.getColorsForScheme(HostDatabase.DEFAULT_COLOR_SCHEME);
}
private static Pattern urlPattern = null;
diff --git a/app/src/main/java/org/connectbot/service/TerminalManager.java b/app/src/main/java/org/connectbot/service/TerminalManager.java
index 5416ddb..3a58c8a 100644
--- a/app/src/main/java/org/connectbot/service/TerminalManager.java
+++ b/app/src/main/java/org/connectbot/service/TerminalManager.java
@@ -87,9 +87,6 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen
public Resources res;
- public HostDatabase hostdb;
- public PubkeyDatabase pubkeydb;
-
protected SharedPreferences prefs;
final private IBinder binder = new TerminalBinder();
@@ -129,11 +126,9 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen
pubkeyTimer = new Timer("pubkeyTimer", true);
- hostdb = new HostDatabase(this);
- pubkeydb = new PubkeyDatabase(this);
-
// load all marked pubkeys into memory
updateSavingKeys();
+ PubkeyDatabase pubkeydb = PubkeyDatabase.get(this);
List<PubkeyBean> pubkeys = pubkeydb.getAllStartPubkeys();
for (PubkeyBean pubkey : pubkeys) {
@@ -173,16 +168,6 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen
disconnectAll(true, false);
- if (hostdb != null) {
- hostdb.close();
- hostdb = null;
- }
-
- if (pubkeydb != null) {
- pubkeydb.close();
- pubkeydb = null;
- }
-
synchronized (this) {
if (idleTimer != null)
idleTimer.cancel();
@@ -277,10 +262,12 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen
* format specified by an individual transport.
*/
public TerminalBridge openConnection(Uri uri) throws Exception {
+ HostDatabase hostdb = HostDatabase.get(this);
HostBean host = TransportFactory.findHost(hostdb, uri);
- if (host == null)
+ if (host == null) {
host = TransportFactory.getTransport(uri.getScheme()).createHost(uri);
+ }
return openConnection(host);
}
@@ -290,6 +277,7 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen
* to {@link HostDatabase}.
*/
private void touchHost(HostBean host) {
+ HostDatabase hostdb = HostDatabase.get(this);
hostdb.touchHost(host);
}
diff --git a/app/src/main/java/org/connectbot/transport/SSH.java b/app/src/main/java/org/connectbot/transport/SSH.java
index 4bad2f1..f3b85a6 100644
--- a/app/src/main/java/org/connectbot/transport/SSH.java
+++ b/app/src/main/java/org/connectbot/transport/SSH.java
@@ -141,7 +141,8 @@ public class SSH extends AbsTransport implements ConnectionMonitor, InteractiveC
String serverHostKeyAlgorithm, byte[] serverHostKey) throws IOException {
// read in all known hosts from hostdb
- KnownHosts hosts = manager.hostdb.getKnownHosts();
+ HostDatabase hostDb = HostDatabase.get(manager);
+ KnownHosts hosts = hostDb.getKnownHosts();
Boolean result;
String matchName = String.format(Locale.US, "%s:%d", hostname, port);
@@ -172,7 +173,7 @@ public class SSH extends AbsTransport implements ConnectionMonitor, InteractiveC
if (result == null) return false;
if (result.booleanValue()) {
// save this key in known database
- manager.hostdb.saveKnownHost(hostname, port, serverHostKeyAlgorithm, serverHostKey);
+ hostDb.saveKnownHost(hostname, port, serverHostKeyAlgorithm, serverHostKey);
}
return result.booleanValue();
@@ -195,7 +196,7 @@ public class SSH extends AbsTransport implements ConnectionMonitor, InteractiveC
result = bridge.promptHelper.requestBooleanPrompt(null, manager.res.getString(R.string.prompt_continue_connecting));
if (result != null && result.booleanValue()) {
// save this key in known database
- manager.hostdb.saveKnownHost(hostname, port, serverHostKeyAlgorithm, serverHostKey);
+ hostDb.saveKnownHost(hostname, port, serverHostKeyAlgorithm, serverHostKey);
return true;
} else {
return false;
@@ -249,13 +250,16 @@ public class SSH extends AbsTransport implements ConnectionMonitor, InteractiveC
} else {
bridge.outputLine(manager.res.getString(R.string.terminal_auth_pubkey_specific));
// use a specific key for this host, as requested
- PubkeyBean pubkey = manager.pubkeydb.findPubkeyById(pubkeyId);
+ PubkeyDatabase pubkeyDb = PubkeyDatabase.get(manager);
+ PubkeyBean pubkey = pubkeyDb.findPubkeyById(pubkeyId);
- if (pubkey == null)
+ if (pubkey == null) {
bridge.outputLine(manager.res.getString(R.string.terminal_auth_pubkey_invalid));
- else
- if (tryPublicKey(pubkey))
+ } else {
+ if (tryPublicKey(pubkey)) {
finishConnection();
+ }
+ }
}
pubkeysExhausted = true;
@@ -293,7 +297,7 @@ public class SSH extends AbsTransport implements ConnectionMonitor, InteractiveC
/**
* Attempt connection with database row pointed to by cursor.
- * @param cursor
+ * @param pubkey
* @return true for successful authentication
* @throws NoSuchAlgorithmException
* @throws InvalidKeySpecException
diff --git a/app/src/main/java/org/connectbot/util/HostDatabase.java b/app/src/main/java/org/connectbot/util/HostDatabase.java
index f721aeb..83fc6be 100644
--- a/app/src/main/java/org/connectbot/util/HostDatabase.java
+++ b/app/src/main/java/org/connectbot/util/HostDatabase.java
@@ -139,17 +139,35 @@ public class HostDatabase extends RobustSQLiteOpenHelper {
addIndexName(TABLE_COLOR_DEFAULTS + FIELD_COLOR_SCHEME + "index");
}
- public static final Object[] dbLock = new Object[0];
-
/** Used during upgrades from DB version 23 to 24. */
private final float displayDensity;
- public HostDatabase(Context context) {
- super(context, DB_NAME, null, DB_VERSION);
+ private static final Object sInstanceLock = new Object();
- this.displayDensity = context.getResources().getDisplayMetrics().density;
+ private static HostDatabase sInstance;
+
+ private final SQLiteDatabase mDb;
+
+ public static HostDatabase get(Context context) {
+ synchronized (sInstanceLock) {
+ if (sInstance != null) {
+ return sInstance;
+ }
+
+ sInstance = new HostDatabase(context.getApplicationContext());
+ return sInstance;
+ }
+ }
+
+ private HostDatabase(Context context) {
+ this(context, DB_NAME);
+ }
+
+ private HostDatabase(Context context, String dbName) {
+ super(context, dbName, null, DB_VERSION);
- getWritableDatabase().close();
+ this.displayDensity = context.getResources().getDisplayMetrics().density;
+ mDb = getWritableDatabase();
}
@Override
@@ -209,14 +227,10 @@ public class HostDatabase extends RobustSQLiteOpenHelper {
}
@VisibleForTesting
- public void resetDatabase() {
- SQLiteDatabase db = getWritableDatabase();
- db.execSQL("DROP TABLE IF EXISTS " + TABLE_HOSTS);
- db.execSQL("DROP TABLE IF EXISTS " + TABLE_PORTFORWARDS);
- db.execSQL("DROP TABLE IF EXISTS " + TABLE_COLORS);
- db.execSQL("DROP TABLE IF EXISTS " + TABLE_COLOR_DEFAULTS);
- createTables(db);
- db.close();
+ public static void resetInMemoryInstance(Context context) {
+ synchronized (sInstanceLock) {
+ sInstance = new HostDatabase(context, null);
+ }
}
@Override
@@ -301,10 +315,12 @@ public class HostDatabase extends RobustSQLiteOpenHelper {
ContentValues values = new ContentValues();
values.put(FIELD_HOST_LASTCONNECT, now);
- synchronized (dbLock) {
- SQLiteDatabase db = this.getWritableDatabase();
-
- db.update(TABLE_HOSTS, values, "_id = ?", new String[] { String.valueOf(host.getId()) });
+ mDb.beginTransaction();
+ try {
+ mDb.update(TABLE_HOSTS, values, "_id = ?", new String[] {String.valueOf(host.getId())});
+ mDb.setTransactionSuccessful();
+ } finally {
+ mDb.endTransaction();
}
}
@@ -314,10 +330,12 @@ public class HostDatabase extends RobustSQLiteOpenHelper {
public HostBean saveHost(HostBean host) {
long id;
- synchronized (dbLock) {
- SQLiteDatabase db = this.getWritableDatabase();
-
- id = db.insert(TABLE_HOSTS, null, host.getValues());
+ mDb.beginTransaction();
+ try {
+ id = mDb.insert(TABLE_HOSTS, null, host.getValues());
+ mDb.setTransactionSuccessful();
+ } finally {
+ mDb.endTransaction();
}
host.setId(id);
@@ -336,12 +354,13 @@ public class HostDatabase extends RobustSQLiteOpenHelper {
ContentValues updates = new ContentValues();
updates.put(FIELD_HOST_FONTSIZE, host.getFontSize());
- synchronized (dbLock) {
- SQLiteDatabase db = getWritableDatabase();
-
- db.update(TABLE_HOSTS, updates, "_id = ?",
- new String[] { String.valueOf(id) });
-
+ mDb.beginTransaction();
+ try {
+ mDb.update(TABLE_HOSTS, updates, "_id = ?",
+ new String[] {String.valueOf(id)});
+ mDb.setTransactionSuccessful();
+ } finally {
+ mDb.endTransaction();
}
return true;
@@ -351,12 +370,16 @@ public class HostDatabase extends RobustSQLiteOpenHelper {
* Delete a specific host by its <code>_id</code> value.
*/
public void deleteHost(HostBean host) {
- if (host.getId() < 0)
+ if (host.getId() < 0) {
return;
+ }
- synchronized (dbLock) {
- SQLiteDatabase db = this.getWritableDatabase();
- db.delete(TABLE_HOSTS, "_id = ?", new String[] { String.valueOf(host.getId()) });
+ mDb.beginTransaction();
+ try {
+ mDb.delete(TABLE_HOSTS, "_id = ?", new String[] {String.valueOf(host.getId())});
+ mDb.setTransactionSuccessful();
+ } finally {
+ mDb.endTransaction();
}
}
@@ -368,15 +391,11 @@ public class HostDatabase extends RobustSQLiteOpenHelper {
String sortField = sortColors ? FIELD_HOST_COLOR : FIELD_HOST_NICKNAME;
List<HostBean> hosts;
- synchronized (dbLock) {
- SQLiteDatabase db = this.getReadableDatabase();
-
- Cursor c = db.query(TABLE_HOSTS, null, null, null, null, null, sortField + " ASC");
+ Cursor c = mDb.query(TABLE_HOSTS, null, null, null, null, null, sortField + " ASC");
- hosts = createHostBeans(c);
+ hosts = createHostBeans(c);
- c.close();
- }
+ c.close();
return hosts;
}
@@ -480,20 +499,13 @@ public class HostDatabase extends RobustSQLiteOpenHelper {
String selectionValues[] = new String[selectionValuesList.size()];
selectionValuesList.toArray(selectionValues);
- selectionValuesList = null;
- HostBean host;
+ Cursor c = mDb.query(TABLE_HOSTS, null,
+ selectionBuilder.toString(),
+ selectionValues,
+ null, null, null);
- synchronized (dbLock) {
- SQLiteDatabase db = getReadableDatabase();
-
- Cursor c = db.query(TABLE_HOSTS, null,
- selectionBuilder.toString(),
- selectionValues,
- null, null, null);
-
- host = getFirstHostBean(c);
- }
+ HostBean host = getFirstHostBean(c);
return host;
}
@@ -503,19 +515,11 @@ public class HostDatabase extends RobustSQLiteOpenHelper {
* @return host matching the hostId or {@code null} if none match
*/
public HostBean findHostById(long hostId) {
- HostBean host;
-
- synchronized (dbLock) {
- SQLiteDatabase db = getReadableDatabase();
+ Cursor c = mDb.query(TABLE_HOSTS, null,
+ "_id = ?", new String[] {String.valueOf(hostId)},
+ null, null, null);
- Cursor c = db.query(TABLE_HOSTS, null,
- "_id = ?", new String[] { String.valueOf(hostId) },
- null, null, null);
-
- host = getFirstHostBean(c);
- }
-
- return host;
+ return getFirstHostBean(c);
}
/**
@@ -530,14 +534,10 @@ public class HostDatabase extends RobustSQLiteOpenHelper {
values.put(FIELD_HOST_HOSTKEYALGO, hostkeyalgo);
values.put(FIELD_HOST_HOSTKEY, hostkey);
- synchronized (dbLock) {
- SQLiteDatabase db = getReadableDatabase();
-
- db.update(TABLE_HOSTS, values,
- FIELD_HOST_HOSTNAME + " = ? AND " + FIELD_HOST_PORT + " = ?",
- new String[] { hostname, String.valueOf(port) });
- Log.d(TAG, String.format("Finished saving hostkey information for '%s'", hostname));
- }
+ mDb.update(TABLE_HOSTS, values,
+ FIELD_HOST_HOSTNAME + " = ? AND " + FIELD_HOST_PORT + " = ?",
+ new String[] {hostname, String.valueOf(port)});
+ Log.d(TAG, String.format("Finished saving hostkey information for '%s'", hostname));
}
/**
@@ -547,36 +547,33 @@ public class HostDatabase extends RobustSQLiteOpenHelper {
public KnownHosts getKnownHosts() {
KnownHosts known = new KnownHosts();
- synchronized (dbLock) {
- SQLiteDatabase db = this.getReadableDatabase();
- Cursor c = db.query(TABLE_HOSTS, new String[] { FIELD_HOST_HOSTNAME,
- FIELD_HOST_PORT, FIELD_HOST_HOSTKEYALGO, FIELD_HOST_HOSTKEY },
- null, null, null, null, null);
+ Cursor c = mDb.query(TABLE_HOSTS, new String[] {FIELD_HOST_HOSTNAME,
+ FIELD_HOST_PORT, FIELD_HOST_HOSTKEYALGO, FIELD_HOST_HOSTKEY},
+ null, null, null, null, null);
- if (c != null) {
- int COL_HOSTNAME = c.getColumnIndexOrThrow(FIELD_HOST_HOSTNAME),
+ if (c != null) {
+ int COL_HOSTNAME = c.getColumnIndexOrThrow(FIELD_HOST_HOSTNAME),
COL_PORT = c.getColumnIndexOrThrow(FIELD_HOST_PORT),
COL_HOSTKEYALGO = c.getColumnIndexOrThrow(FIELD_HOST_HOSTKEYALGO),
COL_HOSTKEY = c.getColumnIndexOrThrow(FIELD_HOST_HOSTKEY);
- while (c.moveToNext()) {
- String hostname = c.getString(COL_HOSTNAME),
+ while (c.moveToNext()) {
+ String hostname = c.getString(COL_HOSTNAME),
hostkeyalgo = c.getString(COL_HOSTKEYALGO);
- int port = c.getInt(COL_PORT);
- byte[] hostkey = c.getBlob(COL_HOSTKEY);
+ int port = c.getInt(COL_PORT);
+ byte[] hostkey = c.getBlob(COL_HOSTKEY);
- if (hostkeyalgo == null || hostkeyalgo.length() == 0) continue;
- if (hostkey == null || hostkey.length == 0) continue;
+ if (hostkeyalgo == null || hostkeyalgo.length() == 0) continue;
+ if (hostkey == null || hostkey.length == 0) continue;
- try {
- known.addHostkey(new String[] { String.format("%s:%d", hostname, port) }, hostkeyalgo, hostkey);
- } catch (Exception e) {
- Log.e(TAG, "Problem while adding a known host from database", e);
- }
+ try {
+ known.addHostkey(new String[] {String.format("%s:%d", hostname, port)}, hostkeyalgo, hostkey);
+ } catch (Exception e) {
+ Log.e(TAG, "Problem while adding a known host from database", e);
}
-
- c.close();
}
+
+ c.close();
}
return known;
@@ -592,10 +589,12 @@ public class HostDatabase extends RobustSQLiteOpenHelper {
ContentValues values = new ContentValues();
values.put(FIELD_HOST_PUBKEYID, PUBKEYID_ANY);
- synchronized (dbLock) {
- SQLiteDatabase db = this.getWritableDatabase();
-
- db.update(TABLE_HOSTS, values, FIELD_HOST_PUBKEYID + " = ?", new String[] { String.valueOf(pubkeyId) });
+ mDb.beginTransaction();
+ try {
+ mDb.update(TABLE_HOSTS, values, FIELD_HOST_PUBKEYID + " = ?", new String[] {String.valueOf(pubkeyId)});
+ mDb.setTransactionSuccessful();
+ } finally {
+ mDb.endTransaction();
}
Log.d(TAG, String.format("Set all hosts using pubkey id %d to -1", pubkeyId));
@@ -616,17 +615,14 @@ public class HostDatabase extends RobustSQLiteOpenHelper {
return portForwards;
}
- synchronized (dbLock) {
- SQLiteDatabase db = this.getReadableDatabase();
-
- Cursor c = db.query(TABLE_PORTFORWARDS, new String[] {
- "_id", FIELD_PORTFORWARD_NICKNAME, FIELD_PORTFORWARD_TYPE, FIELD_PORTFORWARD_SOURCEPORT,
- FIELD_PORTFORWARD_DESTADDR, FIELD_PORTFORWARD_DESTPORT },
- FIELD_PORTFORWARD_HOSTID + " = ?", new String[] { String.valueOf(host.getId()) },
- null, null, null);
+ Cursor c = mDb.query(TABLE_PORTFORWARDS, new String[] {
+ "_id", FIELD_PORTFORWARD_NICKNAME, FIELD_PORTFORWARD_TYPE, FIELD_PORTFORWARD_SOURCEPORT,
+ FIELD_PORTFORWARD_DESTADDR, FIELD_PORTFORWARD_DESTPORT},
+ FIELD_PORTFORWARD_HOSTID + " = ?", new String[] {String.valueOf(host.getId())},
+ null, null, null);
- while (c.moveToNext()) {
- PortForwardBean pfb = new PortForwardBean(
+ while (c.moveToNext()) {
+ PortForwardBean pfb = new PortForwardBean(
c.getInt(0),
host.getId(),
c.getString(1),
@@ -634,12 +630,11 @@ public class HostDatabase extends RobustSQLiteOpenHelper {
c.getInt(3),
c.getString(4),
c.getInt(5));
- portForwards.add(pfb);
- }
-
- c.close();
+ portForwards.add(pfb);
}
+ c.close();
+
return portForwards;
}
@@ -649,22 +644,25 @@ public class HostDatabase extends RobustSQLiteOpenHelper {
* @return true on success
*/
public boolean savePortForward(PortForwardBean pfb) {
- boolean success = false;
-
- synchronized (dbLock) {
- SQLiteDatabase db = getWritableDatabase();
-
+ mDb.beginTransaction();
+ try {
if (pfb.getId() < 0) {
- long id = db.insert(TABLE_PORTFORWARDS, null, pfb.getValues());
- pfb.setId(id);
- success = true;
+ long addedId = mDb.insert(TABLE_PORTFORWARDS, null, pfb.getValues());
+ if (addedId == -1) {
+ return false;
+ }
+ pfb.setId(addedId);
} else {
- if (db.update(TABLE_PORTFORWARDS, pfb.getValues(), "_id = ?", new String[] { String.valueOf(pfb.getId()) }) > 0)
- success = true;
+ if (mDb.update(TABLE_PORTFORWARDS, pfb.getValues(), "_id = ?", new String[] {String.valueOf(pfb.getId())}) <= 0) {
+ return false;
+ }
}
- }
- return success;
+ mDb.setTransactionSuccessful();
+ return true;
+ } finally {
+ mDb.endTransaction();
+ }
}
/**
@@ -672,64 +670,66 @@ public class HostDatabase extends RobustSQLiteOpenHelper {
* @param pfb {@link PortForwardBean} to delete
*/
public void deletePortForward(PortForwardBean pfb) {
- if (pfb.getId() < 0)
+ if (pfb.getId() < 0) {
return;
+ }
- synchronized (dbLock) {
- SQLiteDatabase db = this.getWritableDatabase();
- db.delete(TABLE_PORTFORWARDS, "_id = ?", new String[] { String.valueOf(pfb.getId()) });
+ mDb.beginTransaction();
+ try {
+ mDb.delete(TABLE_PORTFORWARDS, "_id = ?", new String[] {String.valueOf(pfb.getId())});
+ mDb.setTransactionSuccessful();
+ } finally {
+ mDb.endTransaction();
}
}
public Integer[] getColorsForScheme(int scheme) {
Integer[] colors = Colors.defaults.clone();
- synchronized (dbLock) {
- SQLiteDatabase db = getReadableDatabase();
-
- Cursor c = db.query(TABLE_COLORS, new String[] {
- FIELD_COLOR_NUMBER, FIELD_COLOR_VALUE },
- FIELD_COLOR_SCHEME + " = ?",
- new String[] { String.valueOf(scheme) },
- null, null, null);
+ Cursor c = mDb.query(TABLE_COLORS, new String[] {
+ FIELD_COLOR_NUMBER, FIELD_COLOR_VALUE},
+ FIELD_COLOR_SCHEME + " = ?",
+ new String[] {String.valueOf(scheme)},
+ null, null, null);
- while (c.moveToNext()) {
- colors[c.getInt(0)] = Integer.valueOf(c.getInt(1));
- }
-
- c.close();
+ while (c.moveToNext()) {
+ colors[c.getInt(0)] = Integer.valueOf(c.getInt(1));
}
+ c.close();
+
return colors;
}
public void setColorForScheme(int scheme, int number, int value) {
- final SQLiteDatabase db;
-
final String[] whereArgs = new String[] { String.valueOf(scheme), String.valueOf(number) };
if (value == Colors.defaults[number]) {
- synchronized (dbLock) {
- db = getWritableDatabase();
-
- db.delete(TABLE_COLORS,
+ mDb.beginTransaction();
+ try {
+ mDb.delete(TABLE_COLORS,
WHERE_SCHEME_AND_COLOR, whereArgs);
+ mDb.setTransactionSuccessful();
+ } finally {
+ mDb.endTransaction();
}
} else {
final ContentValues values = new ContentValues();
values.put(FIELD_COLOR_VALUE, value);
- synchronized (dbLock) {
- db = getWritableDatabase();
-
- final int rowsAffected = db.update(TABLE_COLORS, values,
+ mDb.beginTransaction();
+ try {
+ final int rowsAffected = mDb.update(TABLE_COLORS, values,
WHERE_SCHEME_AND_COLOR, whereArgs);
if (rowsAffected == 0) {
values.put(FIELD_COLOR_SCHEME, scheme);
values.put(FIELD_COLOR_NUMBER, number);
- db.insert(TABLE_COLORS, null, values);
+ mDb.insert(TABLE_COLORS, null, values);
}
+ mDb.setTransactionSuccessful();
+ } finally {
+ mDb.endTransaction();
}
}
}
@@ -741,23 +741,19 @@ public class HostDatabase extends RobustSQLiteOpenHelper {
public int[] getDefaultColorsForScheme(int scheme) {
int[] colors = new int[] { DEFAULT_FG_COLOR, DEFAULT_BG_COLOR };
- synchronized (dbLock) {
- SQLiteDatabase db = getReadableDatabase();
-
- Cursor c = db.query(TABLE_COLOR_DEFAULTS,
- new String[] { FIELD_COLOR_FG, FIELD_COLOR_BG },
- FIELD_COLOR_SCHEME + " = ?",
- new String[] { String.valueOf(scheme) },
- null, null, null);
-
- if (c.moveToFirst()) {
- colors[0] = c.getInt(0);
- colors[1] = c.getInt(1);
- }
+ Cursor c = mDb.query(TABLE_COLOR_DEFAULTS,
+ new String[] {FIELD_COLOR_FG, FIELD_COLOR_BG},
+ FIELD_COLOR_SCHEME + " = ?",
+ new String[] {String.valueOf(scheme)},
+ null, null, null);
- c.close();
+ if (c.moveToFirst()) {
+ colors[0] = c.getInt(0);
+ colors[1] = c.getInt(1);
}
+ c.close();
+
return colors;
}
@@ -778,16 +774,18 @@ public class HostDatabase extends RobustSQLiteOpenHelper {
values.put(FIELD_COLOR_FG, fg);
values.put(FIELD_COLOR_BG, bg);
- synchronized (dbLock) {
- db = getWritableDatabase();
-
- int rowsAffected = db.update(TABLE_COLOR_DEFAULTS, values,
+ mDb.beginTransaction();
+ try {
+ int rowsAffected = mDb.update(TABLE_COLOR_DEFAULTS, values,
schemeWhere, whereArgs);
if (rowsAffected == 0) {
values.put(FIELD_COLOR_SCHEME, scheme);
- db.insert(TABLE_COLOR_DEFAULTS, null, values);
+ mDb.insert(TABLE_COLOR_DEFAULTS, null, values);
}
+ mDb.setTransactionSuccessful();
+ } finally {
+ mDb.endTransaction();
}
}
}
diff --git a/app/src/main/java/org/connectbot/util/PubkeyDatabase.java b/app/src/main/java/org/connectbot/util/PubkeyDatabase.java
index 02bf5b9..c66c8bf 100644
--- a/app/src/main/java/org/connectbot/util/PubkeyDatabase.java
+++ b/app/src/main/java/org/connectbot/util/PubkeyDatabase.java
@@ -61,7 +61,23 @@ public class PubkeyDatabase extends RobustSQLiteOpenHelper {
addTableName(TABLE_PUBKEYS);
}
- public PubkeyDatabase(Context context) {
+ private static final Object sInstanceLock = new Object();
+
+ private static PubkeyDatabase sInstance;
+
+ public static PubkeyDatabase get(Context context) {
+ synchronized (sInstanceLock) {
+ if (sInstance != null) {
+ return sInstance;
+ }
+
+ Context appContext = context.getApplicationContext();
+ sInstance = new PubkeyDatabase(appContext);
+ return sInstance;
+ }
+ }
+
+ private PubkeyDatabase(Context context) {
super(context, DB_NAME, null, DB_VERSION);
this.context = context;
@@ -98,27 +114,19 @@ public class PubkeyDatabase extends RobustSQLiteOpenHelper {
* Delete a specific host by its <code>_id</code> value.
*/
public void deletePubkey(PubkeyBean pubkey) {
- HostDatabase hostdb = new HostDatabase(context);
+ HostDatabase hostdb = HostDatabase.get(context);
hostdb.stopUsingPubkey(pubkey.getId());
- hostdb.close();
SQLiteDatabase db = getWritableDatabase();
- db.delete(TABLE_PUBKEYS, "_id = ?", new String[] { Long.toString(pubkey.getId()) });
- db.close();
+ db.beginTransaction();
+ try {
+ db.delete(TABLE_PUBKEYS, "_id = ?", new String[] {Long.toString(pubkey.getId())});
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ }
}
- /**
- * Return a cursor that contains information about all known hosts.
- */
- /*
- public Cursor allPubkeys() {
- SQLiteDatabase db = this.getReadableDatabase();
- return db.query(TABLE_PUBKEYS, new String[] { "_id",
- FIELD_PUBKEY_NICKNAME, FIELD_PUBKEY_TYPE, FIELD_PUBKEY_PRIVATE,
- FIELD_PUBKEY_PUBLIC, FIELD_PUBKEY_ENCRYPTED, FIELD_PUBKEY_STARTUP },
- null, null, null, null, null);
- }*/
-
public List<PubkeyBean> allPubkeys() {
return getPubkeys(null, null);
}
@@ -164,14 +172,12 @@ public class PubkeyDatabase extends RobustSQLiteOpenHelper {
c.close();
}
- db.close();
-
return pubkeys;
}
/**
- * @param hostId
- * @return
+ * @param pubkeyId database ID for a desired pubkey
+ * @return object representing the pubkey
*/
public PubkeyBean findPubkeyById(long pubkeyId) {
SQLiteDatabase db = getReadableDatabase();
@@ -189,8 +195,6 @@ public class PubkeyDatabase extends RobustSQLiteOpenHelper {
c.close();
}
- db.close();
-
return pubkey;
}
@@ -230,8 +234,6 @@ public class PubkeyDatabase extends RobustSQLiteOpenHelper {
c.close();
}
- db.close();
-
return list;
}
@@ -250,58 +252,9 @@ public class PubkeyDatabase extends RobustSQLiteOpenHelper {
c.close();
}
- db.close();
-
return nickname;
}
-/*
- public void setOnStart(long id, boolean onStart) {
-
- SQLiteDatabase db = this.getWritableDatabase();
-
- ContentValues values = new ContentValues();
- values.put(FIELD_PUBKEY_STARTUP, onStart ? 1 : 0);
-
- db.update(TABLE_PUBKEYS, values, "_id = ?", new String[] { Long.toString(id) });
-
- }
-
- public boolean changePassword(long id, String oldPassword, String newPassword) throws NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, InvalidKeyException, BadPaddingException {
- SQLiteDatabase db = this.getWritableDatabase();
-
- Cursor c = db.query(TABLE_PUBKEYS, new String[] { FIELD_PUBKEY_TYPE,
- FIELD_PUBKEY_PRIVATE, FIELD_PUBKEY_ENCRYPTED },
- "_id = ?", new String[] { String.valueOf(id) },
- null, null, null);
-
- if (!c.moveToFirst())
- return false;
-
- String keyType = c.getString(0);
- byte[] encPriv = c.getBlob(1);
- c.close();
-
- PrivateKey priv;
- try {
- priv = PubkeyUtils.decodePrivate(encPriv, keyType, oldPassword);
- } catch (InvalidKeyException e) {
- return false;
- } catch (BadPaddingException e) {
- return false;
- } catch (InvalidKeySpecException e) {
- return false;
- }
-
- ContentValues values = new ContentValues();
- values.put(FIELD_PUBKEY_PRIVATE, PubkeyUtils.getEncodedPrivate(priv, newPassword));
- values.put(FIELD_PUBKEY_ENCRYPTED, newPassword.length() > 0 ? 1 : 0);
- db.update(TABLE_PUBKEYS, values, "_id = ?", new String[] { String.valueOf(id) });
-
- return true;
- }
- */
-
/**
* @param pubkey
*/
@@ -311,19 +264,26 @@ public class PubkeyDatabase extends RobustSQLiteOpenHelper {
ContentValues values = pubkey.getValues();
- if (pubkey.getId() > 0) {
- values.remove("_id");
- if (db.update(TABLE_PUBKEYS, values, "_id = ?", new String[] { String.valueOf(pubkey.getId()) }) > 0)
- success = true;
- }
-
- if (!success) {
- long id = db.insert(TABLE_PUBKEYS, null, pubkey.getValues());
- pubkey.setId(id);
- }
+ db.beginTransaction();
+ try {
+ if (pubkey.getId() > 0) {
+ values.remove("_id");
+ if (db.update(TABLE_PUBKEYS, values, "_id = ?", new String[] {String.valueOf(pubkey.getId())}) > 0)
+ success = true;
+ }
- db.close();
+ if (!success) {
+ long id = db.insert(TABLE_PUBKEYS, null, pubkey.getValues());
+ if (id != -1) {
+ // TODO add some error handling here?
+ pubkey.setId(id);
+ }
+ }
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ }
return pubkey;
}
}