Support "back" button navigation during swap process. Start service at end of swap.

The back button will take you back through each step of the swap
process now, and remove the swap Activity completely if you press
back from the first screen. Also, when the WiFi QR code is shown,
the local repo manager actually starts the relevant service.
This commit is contained in:
Peter Serwylo 2014-06-29 08:11:53 +09:30
parent 87b82a6751
commit e84e9c15e2
4 changed files with 150 additions and 26 deletions

View File

@ -5,6 +5,7 @@
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
xmlns:tools="http://schemas.android.com/tools" tools:context=".views.swap.SwapActivity">
<ListView

View File

@ -153,7 +153,7 @@ public class SelectAppsFragment extends ListFragment
} else {
for (String selected : FDroidApp.selectedApps) {
if (TextUtils.equals(packageName, selected)) {
listView.setItemChecked(i, true);
listView.setItemChecked(i + 1, true);
}
}
}

View File

@ -8,7 +8,6 @@ import android.view.Menu;
import android.view.MenuItem;
import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.views.fragments.SelectLocalAppsFragment;
public class SwapActivity extends ActionBarActivity implements SwapProcessManager {
@ -21,26 +20,31 @@ public class SwapActivity extends ActionBarActivity implements SwapProcessManage
private MenuItem nextMenuItem;
private String nextMenuItemLabel;
public void nextStep() {
getSupportFragmentManager().popBackStack();
FragmentManager.BackStackEntry lastFragment = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1);
String name = lastFragment.getName();
switch (name) {
case STATE_START_SWAP:
onSelectApps();
break;
case STATE_SELECT_APPS:
onJoinWifi();
break;
case STATE_JOIN_WIFI:
onAttemptNfc();
break;
case STATE_NFC:
onWifiQr();
break;
case STATE_WIFI_QR:
@Override
public void onBackPressed() {
if (currentState().equals(STATE_START_SWAP)) {
finish();
} else {
super.onBackPressed();
}
}
break;
private String currentState() {
FragmentManager.BackStackEntry lastFragment = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1);
return lastFragment.getName();
}
public void nextStep() {
String current = currentState();
if (current.equals(STATE_START_SWAP)) {
onSelectApps();
} else if (current.equals(STATE_SELECT_APPS)) {
onJoinWifi();
} else if (current.equals(STATE_JOIN_WIFI)) {
onAttemptNfc();
} else if (current.equals(STATE_NFC)) {
onWifiQr();
} else if (current.equals(STATE_WIFI_QR)) {
}
supportInvalidateOptionsMenu();
}
@ -94,7 +98,7 @@ public class SwapActivity extends ActionBarActivity implements SwapProcessManage
getSupportFragmentManager()
.beginTransaction()
.add(android.R.id.content, new StartSwapFragment(), STATE_START_SWAP)
.replace(android.R.id.content, new StartSwapFragment(), STATE_START_SWAP)
.addToBackStack(STATE_START_SWAP)
.commit();
hideNextButton();
@ -107,7 +111,7 @@ public class SwapActivity extends ActionBarActivity implements SwapProcessManage
getSupportFragmentManager()
.beginTransaction()
.add(android.R.id.content, new SelectAppsFragment(), STATE_SELECT_APPS)
.replace(android.R.id.content, new SelectAppsFragment(), STATE_SELECT_APPS)
.addToBackStack(STATE_SELECT_APPS)
.commit();
showNextButton();
@ -118,7 +122,7 @@ public class SwapActivity extends ActionBarActivity implements SwapProcessManage
getSupportFragmentManager()
.beginTransaction()
.add(android.R.id.content, new JoinWifiFragment(), STATE_JOIN_WIFI)
.replace(android.R.id.content, new JoinWifiFragment(), STATE_JOIN_WIFI)
.addToBackStack(STATE_JOIN_WIFI)
.commit();
showNextButton();
@ -129,8 +133,8 @@ public class SwapActivity extends ActionBarActivity implements SwapProcessManage
if (Preferences.get().showNfcDuringSwap() && NfcSwapFragment.isNfcSupported(this)) {
getSupportFragmentManager()
.beginTransaction()
.addToBackStack(STATE_NFC)
.replace(android.R.id.content, new NfcSwapFragment(), STATE_NFC)
.addToBackStack(STATE_NFC)
.commit();
showNextButton();
} else {
@ -145,8 +149,8 @@ public class SwapActivity extends ActionBarActivity implements SwapProcessManage
public void onWifiQr() {
getSupportFragmentManager()
.beginTransaction()
.addToBackStack(STATE_WIFI_QR)
.replace(android.R.id.content, new WifiQrFragment(), STATE_WIFI_QR)
.addToBackStack(STATE_WIFI_QR)
.commit();
showNextButton();
}

View File

@ -1,10 +1,18 @@
package org.fdroid.fdroid.views.swap;
import android.annotation.TargetApi;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.LightingColorFilter;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.content.LocalBroadcastManager;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
@ -12,15 +20,37 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.QrGenAsyncTask;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.localrepo.LocalRepoManager;
import org.fdroid.fdroid.localrepo.LocalRepoService;
import org.fdroid.fdroid.net.WifiStateChangeService;
import java.util.Locale;
import java.util.Timer;
import java.util.TimerTask;
public class WifiQrFragment extends Fragment {
private BroadcastReceiver onWifiChange = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent i) {
setUIFromWifi();
}
};
private BroadcastReceiver onLocalRepoChange = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent i) {
setUIFromWifi();
}
};
private Timer stopTimer;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.swap_wifi_qr, container, false);
@ -35,6 +65,32 @@ public class WifiQrFragment extends Fragment {
public void onResume() {
super.onResume();
setUIFromWifi();
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(onWifiChange,
new IntentFilter(WifiStateChangeService.BROADCAST));
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(onLocalRepoChange,
new IntentFilter(LocalRepoService.STATE));
// if no local repo exists, create one with only FDroid in it
if (!LocalRepoManager.get(getActivity()).xmlIndex.exists())
new UpdateAsyncTask(getActivity(), new String[] {
getActivity().getPackageName(),
}).execute();
// start repo by default
FDroidApp.startLocalRepoService(getActivity());
// reset the timer if viewing this Activity again
if (stopTimer != null)
stopTimer.cancel();
// automatically turn off after 15 minutes
stopTimer = new Timer();
stopTimer.schedule(new TimerTask() {
@Override
public void run() {
FDroidApp.stopLocalRepoService(getActivity());
}
}, 900000); // 15 minutes
}
@TargetApi(14)
@ -70,4 +126,67 @@ public class WifiQrFragment extends Fragment {
}
class UpdateAsyncTask extends AsyncTask<Void, String, Void> {
private static final String TAG = "UpdateAsyncTask";
private ProgressDialog progressDialog;
private String[] selectedApps;
private Uri sharingUri;
public UpdateAsyncTask(Context c, String[] apps) {
selectedApps = apps;
progressDialog = new ProgressDialog(c);
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setTitle(R.string.updating);
sharingUri = Utils.getSharingUri(c, FDroidApp.repo);
}
@Override
protected void onPreExecute() {
progressDialog.show();
}
@Override
protected Void doInBackground(Void... params) {
try {
final LocalRepoManager lrm = LocalRepoManager.get(getActivity());
publishProgress(getString(R.string.deleting_repo));
lrm.deleteRepo();
for (String app : selectedApps) {
publishProgress(String.format(getString(R.string.adding_apks_format), app));
lrm.addApp(getActivity(), app);
}
lrm.writeIndexPage(sharingUri.toString());
publishProgress(getString(R.string.writing_index_jar));
lrm.writeIndexJar();
publishProgress(getString(R.string.linking_apks));
lrm.copyApksToRepo();
publishProgress(getString(R.string.copying_icons));
// run the icon copy without progress, its not a blocker
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
lrm.copyIconsToRepo();
return null;
}
}.execute();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate(String... progress) {
super.onProgressUpdate(progress);
progressDialog.setMessage(progress[0]);
}
@Override
protected void onPostExecute(Void result) {
progressDialog.dismiss();
Toast.makeText(getActivity(), R.string.updated_local_repo, Toast.LENGTH_SHORT).show();
}
}
}