diff --git a/res/layout/addrepo.xml b/res/layout/addrepo.xml
index 95882888e..0638049ee 100644
--- a/res/layout/addrepo.xml
+++ b/res/layout/addrepo.xml
@@ -4,17 +4,6 @@
android:layout_height="wrap_content"
android:orientation="vertical" >
-
-
-
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 58f105812..fcf48814a 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -56,6 +56,9 @@
Add
Cancel
+ Enable
+ Add Key
+ Overwrite
Choose repository to remove
Update repositories
@@ -72,7 +75,9 @@
Repository address
fingerprint (optional)
This repo already exists!
- Overwrite the existing repo?
+ This repo is already setup, this will add new key information.
+ This repo is already setup, confirm that you want to re-enable it.
+ You must first delete this repo before you can add one with a different key!
The list of used repositories has
changed.\nDo you
diff --git a/src/org/fdroid/fdroid/ManageRepo.java b/src/org/fdroid/fdroid/ManageRepo.java
index b9913b293..8555d90d8 100644
--- a/src/org/fdroid/fdroid/ManageRepo.java
+++ b/src/org/fdroid/fdroid/ManageRepo.java
@@ -35,24 +35,21 @@ import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
+import android.support.v4.app.NavUtils;
+import android.support.v4.view.MenuItemCompat;
import android.text.format.DateFormat;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
-import android.view.View.OnClickListener;
import android.widget.Button;
-import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import org.fdroid.fdroid.DB.Repo;
-import android.support.v4.app.NavUtils;
-import android.support.v4.view.MenuItemCompat;
-
import org.fdroid.fdroid.compat.ActionBarCompat;
public class ManageRepo extends ListActivity {
@@ -62,6 +59,11 @@ public class ManageRepo extends ListActivity {
private boolean changed = false;
+ private enum PositiveAction {
+ ADD_NEW, ENABLE, IGNORE
+ }
+ private PositiveAction positiveAction;
+
private List repos;
private static List reposToDisable;
@@ -231,10 +233,10 @@ public class ManageRepo extends ListActivity {
return repos;
}
- protected Repo getRepo(String repoUri, List repos) {
- if (repoUri != null)
+ protected Repo getRepoByAddress(String address, List repos) {
+ if (address != null)
for (Repo repo : repos)
- if (repoUri.equals(repo.address))
+ if (address.equals(repo.address))
return repo;
return null;
}
@@ -249,7 +251,7 @@ public class ManageRepo extends ListActivity {
return super.onOptionsItemSelected(item);
}
- private void showAddRepo(String uriString, String fingerprint) {
+ private void showAddRepo(String newAddress, String newFingerprint) {
LayoutInflater li = LayoutInflater.from(this);
View view = li.inflate(R.layout.addrepo, null);
Builder p = new AlertDialog.Builder(this).setView(view);
@@ -257,6 +259,9 @@ public class ManageRepo extends ListActivity {
final EditText uriEditText = (EditText) view.findViewById(R.id.edit_uri);
final EditText fingerprintEditText = (EditText) view.findViewById(R.id.edit_fingerprint);
+ List repos = getRepos();
+ final Repo repo = getRepoByAddress(newAddress, repos);
+
alrt.setIcon(android.R.drawable.ic_menu_add);
alrt.setTitle(getString(R.string.repo_add_title));
alrt.setButton(DialogInterface.BUTTON_POSITIVE,
@@ -264,10 +269,15 @@ public class ManageRepo extends ListActivity {
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
- addRepo(uriEditText.getText().toString(),
- fingerprintEditText.getText().toString());
- changed = true;
- redraw();
+ String fp = fingerprintEditText.getText().toString();
+ // the DB uses null for no fingerprint but the above
+ // code returns "" rather than null if its blank
+ if (fp.equals(""))
+ fp = null;
+ if (positiveAction == PositiveAction.ADD_NEW)
+ addRepoPositiveAction(uriEditText.getText().toString(), fp, null);
+ else if (positiveAction == PositiveAction.ENABLE)
+ addRepoPositiveAction(null, null, repo);
}
});
@@ -281,30 +291,59 @@ public class ManageRepo extends ListActivity {
});
alrt.show();
- List repos = getRepos();
- Repo repo = getRepo(uriString, repos);
- if (repo != null) {
- TextView tv = (TextView) view.findViewById(R.id.repo_alert);
- tv.setVisibility(0);
- tv.setText(R.string.repo_exists);
+ final TextView overwriteMessage = (TextView) view.findViewById(R.id.overwrite_message);
+ overwriteMessage.setVisibility(View.GONE);
+ if (repo == null) {
+ // no existing repo, add based on what we have
+ positiveAction = PositiveAction.ADD_NEW;
+ } else {
+ // found the address in the DB of existing repos
final Button addButton = alrt.getButton(DialogInterface.BUTTON_POSITIVE);
- addButton.setEnabled(false);
- final CheckBox overwriteCheckBox = (CheckBox) view.findViewById(R.id.overwrite_repo);
- overwriteCheckBox.setVisibility(0);
- overwriteCheckBox.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- addButton.setEnabled(overwriteCheckBox.isChecked());
- }
- });
- // TODO if address and fingerprint match, then enable existing repo
- // TODO if address matches but fingerprint doesn't, handle this with extra widgets
+ alrt.setTitle(R.string.repo_exists);
+ overwriteMessage.setVisibility(View.VISIBLE);
+ if (repo.fingerprint == null && newFingerprint != null) {
+ // we're upgrading from unsigned to signed repo
+ overwriteMessage.setText(R.string.repo_exists_add_fingerprint);
+ addButton.setText(R.string.add_key);
+ positiveAction = PositiveAction.ADD_NEW;
+ } else if (newFingerprint == null || newFingerprint.equals(repo.fingerprint)) {
+ // this entry already exists, offer to enable it
+ overwriteMessage.setText(R.string.repo_exists_enable);
+ addButton.setText(R.string.enable);
+ positiveAction = PositiveAction.ENABLE;
+ } else {
+ // same address with different fingerprint, this could be
+ // malicious, so force the user to manually delete the repo
+ // before adding this one
+ overwriteMessage.setTextColor(getResources().getColor(R.color.red));
+ overwriteMessage.setText(R.string.repo_delete_to_overwrite);
+ addButton.setText(R.string.overwrite);
+ addButton.setEnabled(false);
+ positiveAction = PositiveAction.IGNORE;
+ }
}
- if (uriString != null)
- uriEditText.setText(uriString);
- if (fingerprint != null)
- fingerprintEditText.setText(fingerprint);
+ if (newAddress != null)
+ uriEditText.setText(newAddress);
+ if (newFingerprint != null)
+ fingerprintEditText.setText(newFingerprint);
+ }
+
+ private void addRepoPositiveAction(String address, String fingerprint, Repo repo) {
+ if (address != null) {
+ addRepo(address, fingerprint);
+ } else if (repo != null) {
+ // force-enable an existing repo
+ repo.inuse = true;
+ try {
+ DB db = DB.getDB();
+ db.updateRepoByAddress(repo);
+ } finally {
+ DB.releaseDB();
+ }
+ }
+ changed = true;
+ redraw();
}
@Override