diff options
Diffstat (limited to 'app')
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; } } |