Move "Start local repo" to the SwapActivity, rather than WifiQrFragment.
By starting the repo in the activity, both the NFC and wifi fragments have access to it. In the future, it will make it easier to move some of the static stuff from FDroidApp (to do with "selected apps") into the SwapActivity, as it will not really be needed anywhere else.
This commit is contained in:
parent
e84e9c15e2
commit
2a22a8b6cb
@ -10,6 +10,7 @@ import android.support.v4.app.ListFragment;
|
||||
import android.support.v4.app.LoaderManager;
|
||||
import android.support.v4.content.CursorLoader;
|
||||
import android.support.v4.content.Loader;
|
||||
import android.support.v4.widget.SimpleCursorAdapter;
|
||||
import android.text.TextUtils;
|
||||
import android.view.ActionMode;
|
||||
import android.view.ContextThemeWrapper;
|
||||
@ -20,7 +21,6 @@ import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.ListView;
|
||||
import android.widget.SearchView;
|
||||
import android.widget.SimpleCursorAdapter;
|
||||
import android.widget.TextView;
|
||||
import org.fdroid.fdroid.FDroidApp;
|
||||
import org.fdroid.fdroid.R;
|
||||
@ -28,6 +28,7 @@ import org.fdroid.fdroid.data.InstalledAppProvider;
|
||||
import org.fdroid.fdroid.localrepo.LocalRepoManager;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
public class SelectAppsFragment extends ListFragment
|
||||
implements LoaderManager.LoaderCallbacks<Cursor>, SearchView.OnQueryTextListener {
|
||||
@ -36,6 +37,43 @@ public class SelectAppsFragment extends ListFragment
|
||||
private Drawable defaultAppIcon;
|
||||
private ActionMode mActionMode = null;
|
||||
private String mCurrentFilterString;
|
||||
private Set<String> previouslySelectedApps = new HashSet<String>();
|
||||
|
||||
public Set<String> getSelectedApps() {
|
||||
return FDroidApp.selectedApps;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
previouslySelectedApps.clear();
|
||||
if (FDroidApp.selectedApps != null) {
|
||||
previouslySelectedApps.addAll(FDroidApp.selectedApps);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean hasSelectionChanged() {
|
||||
|
||||
Set<String> currentlySelected = getSelectedApps();
|
||||
if (currentlySelected.size() != previouslySelectedApps.size()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
for (String current : currentlySelected) {
|
||||
boolean found = false;
|
||||
for (String previous : previouslySelectedApps) {
|
||||
if (current.equals(previous)) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
|
@ -1,13 +1,25 @@
|
||||
package org.fdroid.fdroid.views.swap;
|
||||
|
||||
import android.app.ProgressDialog;
|
||||
import android.content.Context;
|
||||
import android.net.Uri;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Bundle;
|
||||
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;
|
||||
import org.fdroid.fdroid.Preferences;
|
||||
import org.fdroid.fdroid.R;
|
||||
import org.fdroid.fdroid.Utils;
|
||||
import org.fdroid.fdroid.localrepo.LocalRepoManager;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
public class SwapActivity extends ActionBarActivity implements SwapProcessManager {
|
||||
|
||||
@ -19,6 +31,9 @@ public class SwapActivity extends ActionBarActivity implements SwapProcessManage
|
||||
|
||||
private MenuItem nextMenuItem;
|
||||
private String nextMenuItemLabel;
|
||||
private Timer shutdownLocalRepoTimer;
|
||||
private UpdateAsyncTask updateSwappableAppsTask = null;
|
||||
private boolean hasPreparedLocalRepo = false;
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
@ -39,8 +54,9 @@ public class SwapActivity extends ActionBarActivity implements SwapProcessManage
|
||||
if (current.equals(STATE_START_SWAP)) {
|
||||
onSelectApps();
|
||||
} else if (current.equals(STATE_SELECT_APPS)) {
|
||||
onJoinWifi();
|
||||
prepareLocalRepo();
|
||||
} else if (current.equals(STATE_JOIN_WIFI)) {
|
||||
startLocalRepo();
|
||||
onAttemptNfc();
|
||||
} else if (current.equals(STATE_NFC)) {
|
||||
onWifiQr();
|
||||
@ -155,4 +171,110 @@ public class SwapActivity extends ActionBarActivity implements SwapProcessManage
|
||||
showNextButton();
|
||||
}
|
||||
|
||||
private void prepareLocalRepo() {
|
||||
SelectAppsFragment fragment = (SelectAppsFragment)getSupportFragmentManager().findFragmentByTag(STATE_SELECT_APPS);
|
||||
boolean needsUpdating = !hasPreparedLocalRepo || fragment.hasSelectionChanged();
|
||||
if (updateSwappableAppsTask == null && needsUpdating) {
|
||||
updateSwappableAppsTask = new UpdateAsyncTask(this, fragment.getSelectedApps());
|
||||
updateSwappableAppsTask.execute();
|
||||
} else {
|
||||
onJoinWifi();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Once the UpdateAsyncTask has finished preparing our repository index, we can
|
||||
* show the next screen to the user.
|
||||
*/
|
||||
private void onLocalRepoPrepared() {
|
||||
|
||||
updateSwappableAppsTask = null;
|
||||
hasPreparedLocalRepo = true;
|
||||
onJoinWifi();
|
||||
|
||||
}
|
||||
|
||||
private void startLocalRepo() {
|
||||
if (!FDroidApp.isLocalRepoServiceRunnig()) {
|
||||
FDroidApp.startLocalRepoService(this);
|
||||
}
|
||||
|
||||
// reset the timer if viewing this Activity again
|
||||
if (shutdownLocalRepoTimer != null)
|
||||
shutdownLocalRepoTimer.cancel();
|
||||
|
||||
// automatically turn off after 15 minutes
|
||||
shutdownLocalRepoTimer = new Timer();
|
||||
shutdownLocalRepoTimer.schedule(new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
FDroidApp.stopLocalRepoService(SwapActivity.this);
|
||||
}
|
||||
}, 900000); // 15 minutes
|
||||
}
|
||||
|
||||
class UpdateAsyncTask extends AsyncTask<Void, String, Void> {
|
||||
private static final String TAG = "UpdateAsyncTask";
|
||||
private ProgressDialog progressDialog;
|
||||
private Set<String> selectedApps;
|
||||
private Uri sharingUri;
|
||||
|
||||
public UpdateAsyncTask(Context c, Set<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(SwapActivity.this);
|
||||
publishProgress(getString(R.string.deleting_repo));
|
||||
lrm.deleteRepo();
|
||||
for (String app : selectedApps) {
|
||||
publishProgress(String.format(getString(R.string.adding_apks_format), app));
|
||||
lrm.addApp(SwapActivity.this, 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(SwapActivity.this, R.string.updated_local_repo, Toast.LENGTH_SHORT).show();
|
||||
onLocalRepoPrepared();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,14 +1,11 @@
|
||||
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;
|
||||
@ -20,18 +17,13 @@ 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 {
|
||||
|
||||
@ -42,15 +34,6 @@ public class WifiQrFragment extends Fragment {
|
||||
}
|
||||
};
|
||||
|
||||
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);
|
||||
@ -68,29 +51,6 @@ public class WifiQrFragment extends Fragment {
|
||||
|
||||
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)
|
||||
@ -126,67 +86,4 @@ 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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user