Show "preparing local repo" stuff in activity, not dialog.
Use the same view as when downloading a swap index. This means no more progress dialogs, and no more Toasts when finished, which is good.
This commit is contained in:
parent
1ea35f6977
commit
e53a56f7b2
@ -62,7 +62,7 @@ import java.util.TimerTask;
|
|||||||
* the future.
|
* the future.
|
||||||
*
|
*
|
||||||
* TODO: Show "Waiting for other device to finish setting up swap" when only F-Droid shown in swap
|
* TODO: Show "Waiting for other device to finish setting up swap" when only F-Droid shown in swap
|
||||||
* TODO: Handle not connected to wifi more gracefully. For example, Bonjour discovery falls over.
|
* TODO: Handle "not connected to wifi" more gracefully. For example, Bonjour discovery falls over.
|
||||||
* TODO: Remove peers from list of peers when no longer "visible".
|
* TODO: Remove peers from list of peers when no longer "visible".
|
||||||
* TODO: Feedback for "Setting up (wifi|bluetooth)" in start swap view is not as immediate as I had hoped.
|
* TODO: Feedback for "Setting up (wifi|bluetooth)" in start swap view is not as immediate as I had hoped.
|
||||||
* TODO: Turn off bluetooth after cancelling/timing out if we turned it on.
|
* TODO: Turn off bluetooth after cancelling/timing out if we turned it on.
|
||||||
@ -162,6 +162,13 @@ public class SwapService extends Service {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void connectToPeer() {
|
||||||
|
if (getPeer() == null) {
|
||||||
|
throw new IllegalStateException("Cannot connect to peer, no peer has been selected.");
|
||||||
|
}
|
||||||
|
connectTo(getPeer(), getPeer().shouldPromptForSwapBack());
|
||||||
|
}
|
||||||
|
|
||||||
public void connectTo(@NonNull Peer peer, boolean requestSwapBack) {
|
public void connectTo(@NonNull Peer peer, boolean requestSwapBack) {
|
||||||
if (peer != this.peer) {
|
if (peer != this.peer) {
|
||||||
Log.e(TAG, "Oops, got a different peer to swap with than initially planned.");
|
Log.e(TAG, "Oops, got a different peer to swap with than initially planned.");
|
||||||
|
@ -49,26 +49,11 @@ public class SwapConnecting extends LinearLayout implements SwapWorkflowActivity
|
|||||||
return (SwapWorkflowActivity)getContext();
|
return (SwapWorkflowActivity)getContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
private SwapService getManager() {
|
|
||||||
return getActivity().getState();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onFinishInflate() {
|
protected void onFinishInflate() {
|
||||||
super.onFinishInflate();
|
super.onFinishInflate();
|
||||||
|
|
||||||
Peer peer = getManager().getPeer();
|
((TextView) findViewById(R.id.heading)).setText(R.string.swap_connecting);
|
||||||
if (peer == null) {
|
|
||||||
Log.e(TAG, "Cannot find the peer to connect to.");
|
|
||||||
|
|
||||||
// TODO: Don't go to the selected apps, rather show a Toast message and then go to the intro screen.
|
|
||||||
getActivity().showSelectApps();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
String heading = getContext().getString(R.string.status_connecting_to_repo, peer.getName());
|
|
||||||
((TextView) findViewById(R.id.heading)).setText(heading);
|
|
||||||
|
|
||||||
findViewById(R.id.back).setOnClickListener(new OnClickListener() {
|
findViewById(R.id.back).setOnClickListener(new OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
@ -77,56 +62,119 @@ public class SwapConnecting extends LinearLayout implements SwapWorkflowActivity
|
|||||||
});
|
});
|
||||||
|
|
||||||
// TODO: Unregister correctly, not just when being notified of completion or errors.
|
// TODO: Unregister correctly, not just when being notified of completion or errors.
|
||||||
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(repoUpdateReceiver, new IntentFilter(UpdateService.LOCAL_ACTION_STATUS));
|
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
|
||||||
getManager().connectTo(peer, peer.shouldPromptForSwapBack());
|
repoUpdateReceiver, new IntentFilter(UpdateService.LOCAL_ACTION_STATUS));
|
||||||
|
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
|
||||||
|
prepareSwapReceiver, new IntentFilter(SwapWorkflowActivity.PrepareSwapRepo.ACTION));
|
||||||
|
}
|
||||||
|
|
||||||
|
private BroadcastReceiver repoUpdateReceiver = new ConnectSwapReceiver();
|
||||||
|
private BroadcastReceiver prepareSwapReceiver = new PrepareSwapReceiver();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Listens for feedback about a local repository being prepared:
|
||||||
|
* * Apk files copied to the LocalHTTPD webroot
|
||||||
|
* * index.html file prepared
|
||||||
|
* * Icons will be copied to the webroot in the background and so are not part of this process.
|
||||||
|
*/
|
||||||
|
class PrepareSwapReceiver extends Receiver {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getMessageExtra() {
|
||||||
|
return SwapWorkflowActivity.PrepareSwapRepo.EXTRA_MESSAGE;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int getType(Intent intent) {
|
||||||
|
return intent.getIntExtra(SwapWorkflowActivity.PrepareSwapRepo.EXTRA_TYPE, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean isComplete(Intent intent) {
|
||||||
|
return getType(intent) == SwapWorkflowActivity.PrepareSwapRepo.TYPE_COMPLETE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean isError(Intent intent) {
|
||||||
|
return getType(intent) == SwapWorkflowActivity.PrepareSwapRepo.TYPE_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onComplete() {
|
||||||
|
getActivity().onLocalRepoPrepared();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Listens for feedback about a repo update process taking place.
|
||||||
|
* * Tracks an index.jar download and show the progress messages
|
||||||
|
*/
|
||||||
|
class ConnectSwapReceiver extends Receiver {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getMessageExtra() {
|
||||||
|
return UpdateService.EXTRA_MESSAGE;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int getStatusCode(Intent intent) {
|
||||||
|
return intent.getIntExtra(UpdateService.EXTRA_STATUS_CODE, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean isComplete(Intent intent) {
|
||||||
|
int status = getStatusCode(intent);
|
||||||
|
return status == UpdateService.STATUS_COMPLETE_AND_SAME ||
|
||||||
|
status == UpdateService.STATUS_COMPLETE_WITH_CHANGES;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
protected boolean isError(Intent intent) {
|
||||||
|
int status = getStatusCode(intent);
|
||||||
|
return status == UpdateService.STATUS_ERROR_GLOBAL ||
|
||||||
|
status == UpdateService.STATUS_ERROR_LOCAL ||
|
||||||
|
status == UpdateService.STATUS_ERROR_LOCAL_SMALL;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onComplete() {
|
||||||
|
getActivity().showSwapConnected();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private BroadcastReceiver repoUpdateReceiver = new BroadcastReceiver() {
|
abstract class Receiver extends BroadcastReceiver {
|
||||||
|
|
||||||
|
protected abstract String getMessageExtra();
|
||||||
|
protected abstract boolean isComplete(Intent intent);
|
||||||
|
protected abstract boolean isError(Intent intent);
|
||||||
|
protected abstract void onComplete();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onReceive(Context context, Intent intent) {
|
public void onReceive(Context context, Intent intent) {
|
||||||
|
|
||||||
int statusCode = intent.getIntExtra(UpdateService.EXTRA_STATUS_CODE, -1);
|
|
||||||
|
|
||||||
TextView progressText = ((TextView) findViewById(R.id.heading));
|
TextView progressText = ((TextView) findViewById(R.id.heading));
|
||||||
TextView errorText = ((TextView) findViewById(R.id.error));
|
TextView errorText = ((TextView) findViewById(R.id.error));
|
||||||
Button backButton = ((Button) findViewById(R.id.back));
|
Button backButton = ((Button) findViewById(R.id.back));
|
||||||
|
|
||||||
if (intent.hasExtra(UpdateService.EXTRA_MESSAGE)) {
|
String message = null;
|
||||||
progressText.setText(intent.getStringExtra(UpdateService.EXTRA_MESSAGE));
|
if (intent.hasExtra(getMessageExtra())) {
|
||||||
|
message = intent.getStringExtra(getMessageExtra());
|
||||||
|
if (message != null) {
|
||||||
|
progressText.setText(message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean finished = false;
|
|
||||||
boolean error = false;
|
|
||||||
|
|
||||||
progressText.setVisibility(View.VISIBLE);
|
progressText.setVisibility(View.VISIBLE);
|
||||||
errorText.setVisibility(View.GONE);
|
errorText.setVisibility(View.GONE);
|
||||||
backButton.setVisibility(View.GONE);
|
backButton.setVisibility(View.GONE);
|
||||||
|
|
||||||
switch (statusCode) {
|
if (isError(intent)) {
|
||||||
case UpdateService.STATUS_ERROR_GLOBAL:
|
|
||||||
finished = true;
|
|
||||||
error = true;
|
|
||||||
break;
|
|
||||||
case UpdateService.STATUS_COMPLETE_WITH_CHANGES:
|
|
||||||
finished = true;
|
|
||||||
break;
|
|
||||||
case UpdateService.STATUS_COMPLETE_AND_SAME:
|
|
||||||
finished = true;
|
|
||||||
break;
|
|
||||||
case UpdateService.STATUS_INFO:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (finished) {
|
|
||||||
LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(repoUpdateReceiver);
|
|
||||||
if (error) {
|
|
||||||
progressText.setVisibility(View.GONE);
|
progressText.setVisibility(View.GONE);
|
||||||
errorText.setVisibility(View.VISIBLE);
|
errorText.setVisibility(View.VISIBLE);
|
||||||
backButton.setVisibility(View.VISIBLE);
|
backButton.setVisibility(View.VISIBLE);
|
||||||
} else {
|
return;
|
||||||
getActivity().showSwapConnected();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isComplete(intent)) {
|
||||||
|
onComplete();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -16,6 +16,7 @@ import android.support.annotation.LayoutRes;
|
|||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.support.v4.app.NavUtils;
|
import android.support.v4.app.NavUtils;
|
||||||
|
import android.support.v4.content.LocalBroadcastManager;
|
||||||
import android.support.v7.app.AppCompatActivity;
|
import android.support.v7.app.AppCompatActivity;
|
||||||
import android.support.v7.widget.Toolbar;
|
import android.support.v7.widget.Toolbar;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@ -261,7 +262,7 @@ public class SwapWorkflowActivity extends AppCompatActivity {
|
|||||||
showSwapConnected();
|
showSwapConnected();
|
||||||
break;
|
break;
|
||||||
case SwapService.STEP_CONNECTING:
|
case SwapService.STEP_CONNECTING:
|
||||||
// TODO: Properly decide what to do here...
|
// TODO: Properly decide what to do here (i.e. returning to the activity after it was connecting)...
|
||||||
inflateInnerView(R.layout.swap_blank);
|
inflateInnerView(R.layout.swap_blank);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -345,8 +346,10 @@ public class SwapWorkflowActivity extends AppCompatActivity {
|
|||||||
// Otherwise, probably will need to scan the file system.
|
// Otherwise, probably will need to scan the file system.
|
||||||
public void onAppsSelected() {
|
public void onAppsSelected() {
|
||||||
if (updateSwappableAppsTask == null && !hasPreparedLocalRepo) {
|
if (updateSwappableAppsTask == null && !hasPreparedLocalRepo) {
|
||||||
updateSwappableAppsTask = new PrepareFullSwapRepo(getService().getAppsToSwap());
|
updateSwappableAppsTask = new PrepareSwapRepo(getService().getAppsToSwap());
|
||||||
updateSwappableAppsTask.execute();
|
updateSwappableAppsTask.execute();
|
||||||
|
getService().setStep(SwapService.STEP_CONNECTING);
|
||||||
|
inflateInnerView(R.layout.swap_connecting);
|
||||||
} else {
|
} else {
|
||||||
onLocalRepoPrepared();
|
onLocalRepoPrepared();
|
||||||
}
|
}
|
||||||
@ -370,7 +373,7 @@ public class SwapWorkflowActivity extends AppCompatActivity {
|
|||||||
* * Alternatively, if we didn't have a person to connect to, and instead clicked "Scan QR Code",
|
* * Alternatively, if we didn't have a person to connect to, and instead clicked "Scan QR Code",
|
||||||
* then we want to show a QR code or NFC dialog.
|
* then we want to show a QR code or NFC dialog.
|
||||||
*/
|
*/
|
||||||
private void onLocalRepoPrepared() {
|
public void onLocalRepoPrepared() {
|
||||||
updateSwappableAppsTask = null;
|
updateSwappableAppsTask = null;
|
||||||
hasPreparedLocalRepo = true;
|
hasPreparedLocalRepo = true;
|
||||||
if (getService().isConnectingWithPeer()) {
|
if (getService().isConnectingWithPeer()) {
|
||||||
@ -381,6 +384,7 @@ public class SwapWorkflowActivity extends AppCompatActivity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void startSwappingWithPeer() {
|
private void startSwappingWithPeer() {
|
||||||
|
getService().connectToPeer();
|
||||||
inflateInnerView(R.layout.swap_connecting);
|
inflateInnerView(R.layout.swap_connecting);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -542,39 +546,14 @@ public class SwapWorkflowActivity extends AppCompatActivity {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class PrepareFullSwapRepo extends PrepareSwapRepo {
|
class PrepareSwapRepo extends AsyncTask<Void, Void, Void> {
|
||||||
|
|
||||||
@NonNull
|
public static final String ACTION = "PrepareSwapRepo.Action";
|
||||||
private final ProgressDialog progressDialog;
|
public static final String EXTRA_MESSAGE = "PrepareSwapRepo.Status.Message";
|
||||||
|
public static final String EXTRA_TYPE = "PrepareSwapRepo.Action.Type";
|
||||||
public PrepareFullSwapRepo(@NonNull Set<String> apps) {
|
public static final int TYPE_STATUS = 0;
|
||||||
super(apps);
|
public static final int TYPE_COMPLETE = 1;
|
||||||
progressDialog = new ProgressDialog(context);
|
public static final int TYPE_ERROR = 2;
|
||||||
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
|
|
||||||
progressDialog.setTitle(R.string.updating);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onPreExecute() {
|
|
||||||
progressDialog.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onProgressUpdate(String... progress) {
|
|
||||||
super.onProgressUpdate(progress);
|
|
||||||
progressDialog.setMessage(progress[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onPostExecute(Void result) {
|
|
||||||
progressDialog.dismiss();
|
|
||||||
Toast.makeText(context, R.string.updated_local_repo, Toast.LENGTH_SHORT).show();
|
|
||||||
onLocalRepoPrepared();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
abstract class PrepareSwapRepo extends AsyncTask<Void, String, Void> {
|
|
||||||
|
|
||||||
@SuppressWarnings("UnusedDeclaration")
|
@SuppressWarnings("UnusedDeclaration")
|
||||||
private static final String TAG = "UpdateAsyncTask";
|
private static final String TAG = "UpdateAsyncTask";
|
||||||
@ -594,22 +573,36 @@ public class SwapWorkflowActivity extends AppCompatActivity {
|
|||||||
sharingUri = Utils.getSharingUri(FDroidApp.repo);
|
sharingUri = Utils.getSharingUri(FDroidApp.repo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void broadcast(int type) {
|
||||||
|
broadcast(type, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void broadcast(int type, String message) {
|
||||||
|
Intent intent = new Intent(ACTION);
|
||||||
|
intent.putExtra(EXTRA_TYPE, type);
|
||||||
|
if (message != null) {
|
||||||
|
Log.d(TAG, "Preparing swap: " + message);
|
||||||
|
intent.putExtra(EXTRA_MESSAGE, message);
|
||||||
|
}
|
||||||
|
LocalBroadcastManager.getInstance(SwapWorkflowActivity.this).sendBroadcast(intent);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Void doInBackground(Void... params) {
|
protected Void doInBackground(Void... params) {
|
||||||
try {
|
try {
|
||||||
final LocalRepoManager lrm = LocalRepoManager.get(context);
|
final LocalRepoManager lrm = LocalRepoManager.get(context);
|
||||||
publishProgress(getString(R.string.deleting_repo));
|
broadcast(TYPE_STATUS, getString(R.string.deleting_repo));
|
||||||
lrm.deleteRepo();
|
lrm.deleteRepo();
|
||||||
for (String app : selectedApps) {
|
for (String app : selectedApps) {
|
||||||
publishProgress(String.format(getString(R.string.adding_apks_format), app));
|
broadcast(TYPE_STATUS, String.format(getString(R.string.adding_apks_format), app));
|
||||||
lrm.addApp(context, app);
|
lrm.addApp(context, app);
|
||||||
}
|
}
|
||||||
lrm.writeIndexPage(sharingUri.toString());
|
lrm.writeIndexPage(sharingUri.toString());
|
||||||
publishProgress(getString(R.string.writing_index_jar));
|
broadcast(TYPE_STATUS, getString(R.string.writing_index_jar));
|
||||||
lrm.writeIndexJar();
|
lrm.writeIndexJar();
|
||||||
publishProgress(getString(R.string.linking_apks));
|
broadcast(TYPE_STATUS, getString(R.string.linking_apks));
|
||||||
lrm.copyApksToRepo();
|
lrm.copyApksToRepo();
|
||||||
publishProgress(getString(R.string.copying_icons));
|
broadcast(TYPE_STATUS, getString(R.string.copying_icons));
|
||||||
// run the icon copy without progress, its not a blocker
|
// run the icon copy without progress, its not a blocker
|
||||||
// TODO: Fix lint error about this being run from a worker thread, says it should be
|
// TODO: Fix lint error about this being run from a worker thread, says it should be
|
||||||
// run on a main thread.
|
// run on a main thread.
|
||||||
@ -621,17 +614,14 @@ public class SwapWorkflowActivity extends AppCompatActivity {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}.execute();
|
}.execute();
|
||||||
|
|
||||||
|
broadcast(TYPE_COMPLETE);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
broadcast(TYPE_ERROR);
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onProgressUpdate(String... progress) {
|
|
||||||
super.onProgressUpdate(progress);
|
|
||||||
Log.d(TAG, progress[0]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user