Correct handling of back button presses during swap workflow.

When electing to "Swap Apps" from the main menu, and a LocalRepoService
is already running, then it jumps straight to the wifi QR fragment.
However, it didn't play nice when pressing the "back" button. This is
now fixed, by manually recreating the backstack in this situation.

It also fires up the NFC push message if NFC exists.
This commit is contained in:
Peter Serwylo 2014-09-22 22:06:49 +09:30
parent 92f71ca13a
commit 58db8a1f00
5 changed files with 87 additions and 89 deletions

@ -1,7 +1,7 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/action_skip"
android:id="@+id/action_next"
android:title="Skip"
android:titleCondensed="Skip"/>

@ -9,8 +9,12 @@ import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v4.view.MenuItemCompat;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
@ -27,6 +31,20 @@ public class JoinWifiFragment extends Fragment {
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) {
menuInflater.inflate(R.menu.swap_next, menu);
MenuItem nextMenuItem = menu.findItem(R.id.action_next);
int flags = MenuItemCompat.SHOW_AS_ACTION_ALWAYS | MenuItemCompat.SHOW_AS_ACTION_WITH_TEXT;
MenuItemCompat.setShowAsAction(nextMenuItem, flags);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View joinWifiView = inflater.inflate(R.layout.swap_join_wifi, container, false);

@ -2,7 +2,11 @@ package org.fdroid.fdroid.views.swap;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.MenuItemCompat;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
@ -12,6 +16,20 @@ import org.fdroid.fdroid.R;
public class NfcSwapFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) {
menuInflater.inflate(R.menu.swap_skip, menu);
MenuItem nextMenuItem = menu.findItem(R.id.action_next);
int flags = MenuItemCompat.SHOW_AS_ACTION_ALWAYS | MenuItemCompat.SHOW_AS_ACTION_WITH_TEXT;
MenuItemCompat.setShowAsAction(nextMenuItem, flags);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.swap_nfc, container, false);

@ -8,10 +8,14 @@ import android.os.Bundle;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.widget.SimpleCursorAdapter;
import android.text.TextUtils;
import android.view.ActionMode;
import android.view.ContextThemeWrapper;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
@ -40,6 +44,20 @@ public class SelectAppsFragment extends ThemeableListFragment
return FDroidApp.selectedApps;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) {
menuInflater.inflate(R.menu.swap_next, menu);
MenuItem nextMenuItem = menu.findItem(R.id.action_next);
int flags = MenuItemCompat.SHOW_AS_ACTION_ALWAYS | MenuItemCompat.SHOW_AS_ACTION_WITH_TEXT;
MenuItemCompat.setShowAsAction(nextMenuItem, flags);
}
@Override
public void onResume() {
super.onResume();

@ -5,10 +5,9 @@ import android.content.Context;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import org.fdroid.fdroid.FDroidApp;
@ -30,7 +29,6 @@ public class SwapActivity extends ActionBarActivity implements SwapProcessManage
private static final String STATE_NFC = "nfc";
private static final String STATE_WIFI_QR = "wifiQr";
private String nextMenuItemLabel;
private Timer shutdownLocalRepoTimer;
private UpdateAsyncTask updateSwappableAppsTask = null;
private boolean hasPreparedLocalRepo = false;
@ -52,60 +50,21 @@ public class SwapActivity extends ActionBarActivity implements SwapProcessManage
public void nextStep() {
String current = currentState();
if (current.equals(STATE_START_SWAP)) {
onSelectApps();
showSelectApps();
} else if (current.equals(STATE_SELECT_APPS)) {
prepareLocalRepo();
} else if (current.equals(STATE_JOIN_WIFI)) {
startLocalRepo();
onAttemptNfc();
ensureLocalRepoRunning();
if (!attemptToShowNfc()) {
showWifiQr();
}
} else if (current.equals(STATE_NFC)) {
onWifiQr();
showWifiQr();
} else if (current.equals(STATE_WIFI_QR)) {
}
supportInvalidateOptionsMenu();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.swap_next, menu);
MenuItem nextMenuItem = menu.findItem(R.id.action_next);
nextMenuItem.setVisible(false);
MenuItemCompat.setShowAsAction(nextMenuItem, MenuItemCompat.SHOW_AS_ACTION_ALWAYS | MenuItemCompat.SHOW_AS_ACTION_WITH_TEXT);
return true;
}
private void hideNextButton() {
nextMenuItemLabel = null;
supportInvalidateOptionsMenu();
}
private void showNextButton() {
nextMenuItemLabel = getString(R.string.next);
supportInvalidateOptionsMenu();
}
private void showSkipButton() {
nextMenuItemLabel = getString(R.string.skip);
supportInvalidateOptionsMenu();
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem nextMenuItem = menu.findItem(R.id.action_next);
if (nextMenuItemLabel == null) {
nextMenuItem.setTitle("");
nextMenuItem.setTitleCondensed("");
nextMenuItem.setVisible(false);
return true;
} else {
nextMenuItem.setVisible(true);
nextMenuItem.setTitle(nextMenuItemLabel);
nextMenuItem.setTitleCondensed(nextMenuItemLabel);
return true;
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_next) {
@ -121,46 +80,32 @@ public class SwapActivity extends ActionBarActivity implements SwapProcessManage
if (savedInstanceState == null) {
showFragment(new StartSwapFragment(), STATE_START_SWAP);
if (FDroidApp.isLocalRepoServiceRunning()) {
onWifiQr();
} else {
getSupportFragmentManager()
.beginTransaction()
.replace(android.R.id.content, new StartSwapFragment(), STATE_START_SWAP)
.addToBackStack(STATE_START_SWAP)
.commit();
hideNextButton();
showSelectApps();
showJoinWifi();
attemptToShowNfc();
showWifiQr();
}
}
}
private void onSelectApps() {
private void showSelectApps() {
getSupportFragmentManager()
.beginTransaction()
.replace(android.R.id.content, new SelectAppsFragment(), STATE_SELECT_APPS)
.addToBackStack(STATE_SELECT_APPS)
.commit();
showNextButton();
showFragment(new SelectAppsFragment(), STATE_SELECT_APPS);
}
private void onJoinWifi() {
private void showJoinWifi() {
getSupportFragmentManager()
.beginTransaction()
.replace(android.R.id.content, new JoinWifiFragment(), STATE_JOIN_WIFI)
.addToBackStack(STATE_JOIN_WIFI)
.commit();
showNextButton();
showFragment(new JoinWifiFragment(), STATE_JOIN_WIFI);
}
public void onAttemptNfc() {
private boolean attemptToShowNfc() {
// TODO: What if NFC is disabled? Hook up with NfcNotEnabledActivity? Or maybe only if they
// click a relevant button?
@ -170,28 +115,27 @@ public class SwapActivity extends ActionBarActivity implements SwapProcessManage
boolean nfcMessageReady = NfcHelper.setPushMessage(this, Utils.getSharingUri(this, FDroidApp.repo));
if (Preferences.get().showNfcDuringSwap() && nfcMessageReady) {
getSupportFragmentManager()
.beginTransaction()
.replace(android.R.id.content, new NfcSwapFragment(), STATE_NFC)
.addToBackStack(STATE_NFC)
.commit();
showSkipButton();
showFragment(new NfcSwapFragment(), STATE_NFC);
return true;
} else {
onWifiQr();
return false;
}
}
public void onBluetooth() {
private void showBluetooth() {
}
public void onWifiQr() {
private void showWifiQr() {
showFragment(new WifiQrFragment(), STATE_WIFI_QR);
}
private void showFragment(Fragment fragment, String name) {
getSupportFragmentManager()
.beginTransaction()
.replace(android.R.id.content, new WifiQrFragment(), STATE_WIFI_QR)
.addToBackStack(STATE_WIFI_QR)
.replace(android.R.id.content, fragment, name)
.addToBackStack(name)
.commit();
hideNextButton();
}
private void prepareLocalRepo() {
@ -201,7 +145,7 @@ public class SwapActivity extends ActionBarActivity implements SwapProcessManage
updateSwappableAppsTask = new UpdateAsyncTask(this, fragment.getSelectedApps());
updateSwappableAppsTask.execute();
} else {
onJoinWifi();
showJoinWifi();
}
}
@ -213,11 +157,11 @@ public class SwapActivity extends ActionBarActivity implements SwapProcessManage
updateSwappableAppsTask = null;
hasPreparedLocalRepo = true;
onJoinWifi();
showJoinWifi();
}
private void startLocalRepo() {
private void ensureLocalRepoRunning() {
if (!FDroidApp.isLocalRepoServiceRunning()) {
FDroidApp.startLocalRepoService(this);
initLocalRepoTimer(900000); // 15 mins