diff --git a/F-Droid/src/org/fdroid/fdroid/views/swap/ConfirmReceiveSwapFragment.java b/F-Droid/src/org/fdroid/fdroid/views/swap/ConfirmReceiveSwapFragment.java deleted file mode 100644 index 0f1b6204b..000000000 --- a/F-Droid/src/org/fdroid/fdroid/views/swap/ConfirmReceiveSwapFragment.java +++ /dev/null @@ -1,204 +0,0 @@ -package org.fdroid.fdroid.views.swap; - -import android.app.Activity; -import android.content.ContentValues; -import android.net.Uri; -import android.net.http.AndroidHttpClient; -import android.os.AsyncTask; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; -import android.widget.Toast; - -import org.apache.http.HttpHost; -import org.apache.http.NameValuePair; -import org.apache.http.client.entity.UrlEncodedFormEntity; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.message.BasicNameValuePair; -import org.fdroid.fdroid.FDroidApp; -import org.fdroid.fdroid.ProgressListener; -import org.fdroid.fdroid.R; -import org.fdroid.fdroid.UpdateService; -import org.fdroid.fdroid.Utils; -import org.fdroid.fdroid.data.NewRepoConfig; -import org.fdroid.fdroid.data.Repo; -import org.fdroid.fdroid.data.RepoProvider; - -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.List; - -public class ConfirmReceiveSwapFragment extends Fragment implements ProgressListener { - - private static final String TAG = "fdroid.ConfirmReceiveSwapFragment"; - - private NewRepoConfig newRepoConfig; - - @Nullable - private Repo repo; - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.swap_confirm_receive, container, false); - view.findViewById(R.id.no_button).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - finish(); - } - }); - view.findViewById(R.id.yes_button).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - confirm(); - } - }); - return view; - } - - private void finish() { - getActivity().setResult(Activity.RESULT_OK); - getActivity().finish(); - } - - public void onResume() { - super.onResume(); - newRepoConfig = new NewRepoConfig(getActivity(), getActivity().getIntent()); - if (newRepoConfig.isValidRepo()) { - TextView tv = (TextView) getView().findViewById(R.id.text_description); - if (tv != null) { - tv.setText(getString(R.string.swap_confirm_connect, newRepoConfig.getHost())); - } - } else { - // TODO: Show error message on screen (not in popup). - // TODO: I don't think we want to continue with this at all if the repo config is invalid, - // how should we boot the user from this screen in this case? - } - } - - private void confirm() { - repo = ensureRepoExists(); - if (repo != null) { - UpdateService.updateRepoNow(repo.address, getActivity()).setListener(this); - } - } - - private Repo ensureRepoExists() { - if (!newRepoConfig.isValidRepo()) { - return null; - } - - // TODO: newRepoConfig.getParsedUri() will include a fingerprint, which may not match with - // the repos address in the database. Not sure on best behaviour in this situation. - Repo repo = RepoProvider.Helper.findByAddress(getActivity(), newRepoConfig.getRepoUriString()); - if (repo == null) { - ContentValues values = new ContentValues(6); - - // TODO: i18n and think about most appropriate name. Although it wont be visible in - // the "Manage repos" UI after being marked as a swap repo here... - values.put(RepoProvider.DataColumns.NAME, getString(R.string.swap_repo_name)); - values.put(RepoProvider.DataColumns.ADDRESS, newRepoConfig.getRepoUriString()); - values.put(RepoProvider.DataColumns.DESCRIPTION, ""); // TODO; - values.put(RepoProvider.DataColumns.FINGERPRINT, newRepoConfig.getFingerprint()); - values.put(RepoProvider.DataColumns.IN_USE, true); - values.put(RepoProvider.DataColumns.IS_SWAP, true); - Uri uri = RepoProvider.Helper.insert(getActivity(), values); - repo = RepoProvider.Helper.findByUri(getActivity(), uri); - } else if (!repo.isSwap) { - Log.d(TAG, "Old local repo being marked as \"Swap\" repo, so that it wont appear in the list of repositories in the future."); - ContentValues values = new ContentValues(1); - values.put(RepoProvider.DataColumns.IS_SWAP, true); - RepoProvider.Helper.update(getActivity(), repo, values); - } - - if (!newRepoConfig.preventFurtherSwaps()) { - askServerToSwapWithUs(); - } - - return repo; - } - - private void askServerToSwapWithUs() { - if (!newRepoConfig.isValidRepo()) { - return; - } - - new AsyncTask<Void, Void, Void>() { - @Override - protected Void doInBackground(Void... args) { - Uri repoUri = newRepoConfig.getRepoUri(); - String swapBackUri = Utils.getLocalRepoUri(FDroidApp.repo).toString(); - - AndroidHttpClient client = AndroidHttpClient.newInstance("F-Droid", getActivity()); - HttpPost request = new HttpPost("/request-swap"); - HttpHost host = new HttpHost(repoUri.getHost(), repoUri.getPort(), repoUri.getScheme()); - - try { - Log.d(TAG, "Asking server at " + newRepoConfig.getRepoUriString() + " to swap with us in return (by POSTing to \"/request-swap\" with repo \"" + swapBackUri + "\")..."); - populatePostParams(swapBackUri, request); - client.execute(host, request); - } catch (IOException e) { - notifyOfErrorOnUiThread(); - Log.e(TAG, "Error while asking server to swap with us: " + e.getMessage()); - } finally { - client.close(); - } - return null; - } - - private void populatePostParams(String swapBackUri, HttpPost request) throws UnsupportedEncodingException { - List<NameValuePair> params = new ArrayList<>(); - params.add(new BasicNameValuePair("repo", swapBackUri)); - UrlEncodedFormEntity encodedParams = new UrlEncodedFormEntity(params); - request.setEntity(encodedParams); - } - - private void notifyOfErrorOnUiThread() { - getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - Toast.makeText( - getActivity(), - getString(R.string.swap_reciprocate_failed), - Toast.LENGTH_LONG - ).show(); - } - }); - } - }.execute(); - } - - @Override - public void onProgress(Event event) { - // TODO: Show progress, but we can worry about that later. - // Might be nice to have it nicely embedded in the UI, rather than as - // an additional dialog. E.g. White text on blue, letting the user - // know what we are up to. - - switch (event.type) { - case UpdateService.EVENT_COMPLETE_AND_SAME: - case UpdateService.EVENT_COMPLETE_WITH_CHANGES: - ((ConnectSwapActivity)getActivity()).onRepoUpdated(repo); - /*Intent intent = new Intent(); - intent.putExtra("category", newRepoConfig.getHost()); // TODO: Load repo from database to get proper name. This is what the category we want to select will be called. - getActivity().setResult(Activity.RESULT_OK, intent); - finish();*/ - break; - case UpdateService.EVENT_ERROR: - // TODO: Show message on this screen (with a big "okay" button that goes back to F-Droid activity) - // rather than finishing directly. - finish(); - break; - } - } - - public void setRepoConfig(NewRepoConfig repoConfig) { - this.newRepoConfig = repoConfig; - } -} diff --git a/F-Droid/src/org/fdroid/fdroid/views/swap/ConnectSwapActivity.java b/F-Droid/src/org/fdroid/fdroid/views/swap/ConnectSwapActivity.java index fdcb59c2b..67176c50e 100644 --- a/F-Droid/src/org/fdroid/fdroid/views/swap/ConnectSwapActivity.java +++ b/F-Droid/src/org/fdroid/fdroid/views/swap/ConnectSwapActivity.java @@ -1,14 +1,41 @@ package org.fdroid.fdroid.views.swap; +import android.annotation.TargetApi; +import android.app.Activity; +import android.content.ContentValues; import android.content.Intent; +import android.net.Uri; +import android.net.http.AndroidHttpClient; +import android.os.AsyncTask; import android.os.Bundle; -import android.support.v4.app.FragmentActivity; -import android.support.v4.app.FragmentManager; +import android.support.annotation.Nullable; +import android.support.v7.app.ActionBarActivity; +import android.util.Log; +import android.view.View; +import android.widget.TextView; +import android.widget.Toast; +import org.apache.http.HttpHost; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.message.BasicNameValuePair; +import org.fdroid.fdroid.FDroidApp; +import org.fdroid.fdroid.ProgressListener; +import org.fdroid.fdroid.R; +import org.fdroid.fdroid.UpdateService; +import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.data.NewRepoConfig; import org.fdroid.fdroid.data.Repo; +import org.fdroid.fdroid.data.RepoProvider; -public class ConnectSwapActivity extends FragmentActivity { +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.List; + +public class ConnectSwapActivity extends ActionBarActivity implements ProgressListener { + private static final String TAG = "ConnectSwapActivity"; private static final String STATE_CONFIRM = "startSwap"; @@ -21,53 +48,169 @@ public class ConnectSwapActivity extends FragmentActivity { */ public static final String EXTRA_PREVENT_FURTHER_SWAP_REQUESTS = "preventFurtherSwap"; - private ConfirmReceiveSwapFragment fragment; + @Nullable + private Repo repo; + + private NewRepoConfig newRepoConfig; + private TextView descriptionTextView; @Override public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - if (savedInstanceState == null) { + setContentView(R.layout.swap_confirm_receive); - fragment = new ConfirmReceiveSwapFragment(); - - getSupportFragmentManager() - .beginTransaction() - .replace(android.R.id.content, fragment, STATE_CONFIRM) - .addToBackStack(STATE_CONFIRM) - .commit(); - - } + descriptionTextView = (TextView) findViewById(R.id.text_description); + findViewById(R.id.no_button).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + setResult(Activity.RESULT_OK); + finish(); + } + }); + findViewById(R.id.yes_button).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + confirm(); + } + }); } @Override protected void onResume() { super.onResume(); // Only confirm the action, and then return a result... - NewRepoConfig config = new NewRepoConfig(this, getIntent()); - fragment.setRepoConfig(config); - } - - @Override - public void onBackPressed() { - if (currentState().equals(STATE_CONFIRM)) { - finish(); + newRepoConfig = new NewRepoConfig(this, getIntent()); + if (newRepoConfig.isValidRepo()) { + descriptionTextView.setText(getString(R.string.swap_confirm_connect, newRepoConfig.getHost())); } else { - super.onBackPressed(); + // TODO: Show error message on screen (not in popup). + // TODO: I don't think we want to continue with this at all if the repo config is invalid, + // how should we boot the user from this screen in this case? } } - private String currentState() { - int index = getSupportFragmentManager().getBackStackEntryCount() - 1; - FragmentManager.BackStackEntry lastFragment = getSupportFragmentManager().getBackStackEntryAt(index); - return lastFragment.getName(); + @Override + public void onProgress(Event event) { + // TODO: Show progress, but we can worry about that later. + // Might be nice to have it nicely embedded in the UI, rather than as + // an additional dialog. E.g. White text on blue, letting the user + // know what we are up to. + + switch (event.type) { + case UpdateService.EVENT_COMPLETE_AND_SAME: + Log.i(TAG, "EVENT_COMPLETE_AND_SAME"); + case UpdateService.EVENT_COMPLETE_WITH_CHANGES: + Log.i(TAG, "EVENT_COMPLETE_WITH_CHANGES"); + Intent intent = new Intent(this, SwapAppListActivity.class); + intent.putExtra(SwapAppListActivity.EXTRA_REPO_ID, repo.getId()); + startActivity(intent); + finish(); + /* + // TODO: Load repo from database to get proper name. This is what the category we want to select will be called. + intent.putExtra("category", newRepoConfig.getHost()); + getActivity().setResult(Activity.RESULT_OK, intent); + */ + break; + case UpdateService.EVENT_ERROR: + // TODO: Show message on this screen (with a big "okay" button that goes back to F-Droid activity) + // rather than finishing directly. + finish(); + break; + } } - public void onRepoUpdated(Repo repo) { - Intent intent = new Intent(this, SwapAppListActivity.class); - intent.putExtra(SwapAppListActivity.EXTRA_REPO_ID, repo.getId()); - startActivity(intent); + private void confirm() { + repo = ensureRepoExists(); + if (repo != null) { + UpdateService.updateRepoNow(repo.address, this).setListener(this); + } + } + + private Repo ensureRepoExists() { + if (!newRepoConfig.isValidRepo()) { + return null; + } + + // TODO: newRepoConfig.getParsedUri() will include a fingerprint, which may not match with + // the repos address in the database. Not sure on best behaviour in this situation. + Repo repo = RepoProvider.Helper.findByAddress(this, newRepoConfig.getRepoUriString()); + if (repo == null) { + ContentValues values = new ContentValues(6); + + // TODO: i18n and think about most appropriate name. Although it wont be visible in + // the "Manage repos" UI after being marked as a swap repo here... + values.put(RepoProvider.DataColumns.NAME, getString(R.string.swap_repo_name)); + values.put(RepoProvider.DataColumns.ADDRESS, newRepoConfig.getRepoUriString()); + values.put(RepoProvider.DataColumns.DESCRIPTION, ""); // TODO; + values.put(RepoProvider.DataColumns.FINGERPRINT, newRepoConfig.getFingerprint()); + values.put(RepoProvider.DataColumns.IN_USE, true); + values.put(RepoProvider.DataColumns.IS_SWAP, true); + Uri uri = RepoProvider.Helper.insert(this, values); + repo = RepoProvider.Helper.findByUri(this, uri); + } else if (!repo.isSwap) { + Log.d(TAG, "Old local repo being marked as \"Swap\" repo, so that it wont appear in the list of repositories in the future."); + ContentValues values = new ContentValues(1); + values.put(RepoProvider.DataColumns.IS_SWAP, true); + RepoProvider.Helper.update(this, repo, values); + } + + if (!newRepoConfig.preventFurtherSwaps()) { + askServerToSwapWithUs(); + } + + return repo; + } + + private void askServerToSwapWithUs() { + if (!newRepoConfig.isValidRepo()) { + return; + } + + new AsyncTask<Void, Void, Void>() { + @TargetApi(8) + @Override + protected Void doInBackground(Void... args) { + Uri repoUri = newRepoConfig.getRepoUri(); + String swapBackUri = Utils.getLocalRepoUri(FDroidApp.repo).toString(); + + AndroidHttpClient client = AndroidHttpClient.newInstance("F-Droid", ConnectSwapActivity.this); + HttpPost request = new HttpPost("/request-swap"); + HttpHost host = new HttpHost(repoUri.getHost(), repoUri.getPort(), repoUri.getScheme()); + + try { + Log.d(TAG, "Asking server at " + newRepoConfig.getRepoUriString() + " to swap with us in return (by POSTing to \"/request-swap\" with repo \"" + swapBackUri + "\")..."); + populatePostParams(swapBackUri, request); + client.execute(host, request); + } catch (IOException e) { + notifyOfErrorOnUiThread(); + Log.e(TAG, "Error while asking server to swap with us: " + e.getMessage()); + } finally { + client.close(); + } + return null; + } + + private void populatePostParams(String swapBackUri, HttpPost request) throws UnsupportedEncodingException { + List<NameValuePair> params = new ArrayList<>(); + params.add(new BasicNameValuePair("repo", swapBackUri)); + UrlEncodedFormEntity encodedParams = new UrlEncodedFormEntity(params); + request.setEntity(encodedParams); + } + + private void notifyOfErrorOnUiThread() { + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText( + ConnectSwapActivity.this, + R.string.swap_reciprocate_failed, + Toast.LENGTH_LONG + ).show(); + } + }); + } + }.execute(); } }