diff --git a/F-Droid/AndroidManifest.xml b/F-Droid/AndroidManifest.xml index be3883ec7..9bcc88614 100644 --- a/F-Droid/AndroidManifest.xml +++ b/F-Droid/AndroidManifest.xml @@ -385,17 +385,6 @@ android:name="android.support.PARENT_ACTIVITY" android:value=".FDroid" /> - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/F-Droid/res/layout/swap_join_wifi.xml b/F-Droid/res/layout/swap_join_wifi.xml index bf24e6ff4..a07230bb1 100644 --- a/F-Droid/res/layout/swap_join_wifi.xml +++ b/F-Droid/res/layout/swap_join_wifi.xml @@ -1,6 +1,6 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/F-Droid/res/layout/swap_nfc.xml b/F-Droid/res/layout/swap_nfc.xml index 33deea105..572edfac0 100644 --- a/F-Droid/res/layout/swap_nfc.xml +++ b/F-Droid/res/layout/swap_nfc.xml @@ -1,6 +1,6 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/F-Droid/res/layout/swap_select_apps.xml b/F-Droid/res/layout/swap_select_apps.xml index d87aeb313..52489d994 100644 --- a/F-Droid/res/layout/swap_select_apps.xml +++ b/F-Droid/res/layout/swap_select_apps.xml @@ -1,9 +1,9 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/F-Droid/res/layout/swap_wifi_qr.xml b/F-Droid/res/layout/swap_wifi_qr.xml index ae6a11d76..da0ba3a3b 100644 --- a/F-Droid/res/layout/swap_wifi_qr.xml +++ b/F-Droid/res/layout/swap_wifi_qr.xml @@ -1,6 +1,6 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/F-Droid/src/org/fdroid/fdroid/FDroid.java b/F-Droid/src/org/fdroid/fdroid/FDroid.java index a04e3d4ba..8cbddc22e 100644 --- a/F-Droid/src/org/fdroid/fdroid/FDroid.java +++ b/F-Droid/src/org/fdroid/fdroid/FDroid.java @@ -50,7 +50,6 @@ import org.fdroid.fdroid.data.NewRepoConfig; import org.fdroid.fdroid.views.AppListFragmentPagerAdapter; import org.fdroid.fdroid.views.ManageReposActivity; import org.fdroid.fdroid.views.swap.ConnectSwapActivity; -import org.fdroid.fdroid.views.swap.SwapActivity; import org.fdroid.fdroid.views.swap.SwapWorkflowActivity; public class FDroid extends ActionBarActivity { diff --git a/F-Droid/src/org/fdroid/fdroid/FDroidApp.java b/F-Droid/src/org/fdroid/fdroid/FDroidApp.java index 7c0036545..6cb5a63ec 100644 --- a/F-Droid/src/org/fdroid/fdroid/FDroidApp.java +++ b/F-Droid/src/org/fdroid/fdroid/FDroidApp.java @@ -69,7 +69,6 @@ public class FDroidApp extends Application { public static String ssid; public static String bssid; public static final Repo repo = new Repo(); - public static Set selectedApps = null; // init in SelectLocalAppsFragment // Leaving the fully qualified class name here to help clarify the difference between spongy/bouncy castle. private static final org.spongycastle.jce.provider.BouncyCastleProvider spongyCastleProvider; diff --git a/F-Droid/src/org/fdroid/fdroid/localrepo/LocalRepoService.java b/F-Droid/src/org/fdroid/fdroid/localrepo/LocalRepoService.java index 8e835e2b6..223acf42a 100644 --- a/F-Droid/src/org/fdroid/fdroid/localrepo/LocalRepoService.java +++ b/F-Droid/src/org/fdroid/fdroid/localrepo/LocalRepoService.java @@ -26,7 +26,7 @@ import org.fdroid.fdroid.R; import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.net.LocalHTTPD; import org.fdroid.fdroid.net.WifiStateChangeService; -import org.fdroid.fdroid.views.swap.SwapActivity; +import org.fdroid.fdroid.views.swap.SwapWorkflowActivity; import java.io.IOException; import java.net.BindException; @@ -136,7 +136,7 @@ public class LocalRepoService extends Service { private void showNotification() { notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); // launch LocalRepoActivity if the user selects this notification - Intent intent = new Intent(this, SwapActivity.class); + Intent intent = new Intent(this, SwapWorkflowActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); notification = new NotificationCompat.Builder(this) diff --git a/F-Droid/src/org/fdroid/fdroid/views/swap/JoinWifiFragment.java b/F-Droid/src/org/fdroid/fdroid/views/swap/JoinWifiFragment.java deleted file mode 100644 index 9723945b9..000000000 --- a/F-Droid/src/org/fdroid/fdroid/views/swap/JoinWifiFragment.java +++ /dev/null @@ -1,109 +0,0 @@ -package org.fdroid.fdroid.views.swap; - -import android.app.Activity; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -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.ImageView; -import android.widget.TextView; - -import org.fdroid.fdroid.FDroidApp; -import org.fdroid.fdroid.R; -import org.fdroid.fdroid.net.WifiStateChangeService; - -public class JoinWifiFragment extends Fragment { - - private final BroadcastReceiver onWifiChange = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - refreshWifiState(); - } - }; - - @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); - joinWifiView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - openAvailableNetworks(); - } - }); - return joinWifiView; - } - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - // TODO: Listen for "Connecting..." state and reflect that in the view too. - LocalBroadcastManager.getInstance(activity).registerReceiver( - onWifiChange, - new IntentFilter(WifiStateChangeService.BROADCAST)); - } - - @Override - public void onResume() { - super.onResume(); - refreshWifiState(); - } - - private void refreshWifiState() { - View view = getView(); - if (view != null) { - TextView descriptionView = (TextView) view.findViewById(R.id.text_description); - ImageView wifiIcon = (ImageView) view.findViewById(R.id.wifi_icon); - TextView ssidView = (TextView) view.findViewById(R.id.wifi_ssid); - TextView tapView = (TextView) view.findViewById(R.id.wifi_available_networks_prompt); - if (TextUtils.isEmpty(FDroidApp.bssid) && !TextUtils.isEmpty(FDroidApp.ipAddressString)) { - // empty bssid with an ipAddress means hotspot mode - descriptionView.setText(R.string.swap_join_this_hotspot); - wifiIcon.setImageDrawable(getResources().getDrawable(R.drawable.hotspot)); - ssidView.setText(R.string.swap_active_hotspot); - tapView.setText(R.string.swap_switch_to_wifi); - } else if (TextUtils.isEmpty(FDroidApp.ssid)) { - // not connected to or setup with any wifi network - descriptionView.setText(R.string.swap_join_same_wifi); - wifiIcon.setImageDrawable(getResources().getDrawable(R.drawable.wifi)); - ssidView.setText(R.string.swap_no_wifi_network); - tapView.setText(R.string.swap_view_available_networks); - } else { - // connected to a regular wifi network - descriptionView.setText(R.string.swap_join_same_wifi); - wifiIcon.setImageDrawable(getResources().getDrawable(R.drawable.wifi)); - ssidView.setText(FDroidApp.ssid); - tapView.setText(R.string.swap_view_available_networks); - } - } - } - - private void openAvailableNetworks() { - startActivity(new Intent(WifiManager.ACTION_PICK_WIFI_NETWORK)); - } -} diff --git a/F-Droid/src/org/fdroid/fdroid/views/swap/views/JoinWifiView.java b/F-Droid/src/org/fdroid/fdroid/views/swap/JoinWifiView.java similarity index 99% rename from F-Droid/src/org/fdroid/fdroid/views/swap/views/JoinWifiView.java rename to F-Droid/src/org/fdroid/fdroid/views/swap/JoinWifiView.java index 44a16c4e4..99baf6706 100644 --- a/F-Droid/src/org/fdroid/fdroid/views/swap/views/JoinWifiView.java +++ b/F-Droid/src/org/fdroid/fdroid/views/swap/JoinWifiView.java @@ -1,4 +1,4 @@ -package org.fdroid.fdroid.views.swap.views; +package org.fdroid.fdroid.views.swap; import android.annotation.TargetApi; import android.content.BroadcastReceiver; diff --git a/F-Droid/src/org/fdroid/fdroid/views/swap/NfcSwapFragment.java b/F-Droid/src/org/fdroid/fdroid/views/swap/NfcSwapFragment.java deleted file mode 100644 index 6cf5b23e6..000000000 --- a/F-Droid/src/org/fdroid/fdroid/views/swap/NfcSwapFragment.java +++ /dev/null @@ -1,47 +0,0 @@ -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; -import android.widget.CompoundButton; - -import org.fdroid.fdroid.Preferences; -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); - CheckBox dontShowAgain = (CheckBox)view.findViewById(R.id.checkbox_dont_show); - dontShowAgain.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - Preferences.get().setShowNfcDuringSwap(!isChecked); - } - }); - return view; - } - -} diff --git a/F-Droid/src/org/fdroid/fdroid/views/swap/views/NfcView.java b/F-Droid/src/org/fdroid/fdroid/views/swap/NfcView.java similarity index 98% rename from F-Droid/src/org/fdroid/fdroid/views/swap/views/NfcView.java rename to F-Droid/src/org/fdroid/fdroid/views/swap/NfcView.java index 482e23f8d..142218aca 100644 --- a/F-Droid/src/org/fdroid/fdroid/views/swap/views/NfcView.java +++ b/F-Droid/src/org/fdroid/fdroid/views/swap/NfcView.java @@ -1,4 +1,4 @@ -package org.fdroid.fdroid.views.swap.views; +package org.fdroid.fdroid.views.swap; import android.annotation.TargetApi; import android.content.Context; diff --git a/F-Droid/src/org/fdroid/fdroid/views/swap/SelectAppsFragment.java b/F-Droid/src/org/fdroid/fdroid/views/swap/SelectAppsFragment.java deleted file mode 100644 index 0fa746256..000000000 --- a/F-Droid/src/org/fdroid/fdroid/views/swap/SelectAppsFragment.java +++ /dev/null @@ -1,319 +0,0 @@ -package org.fdroid.fdroid.views.swap; - -import android.content.Context; -import android.content.pm.PackageManager; -import android.database.Cursor; -import android.graphics.drawable.Drawable; -import android.net.Uri; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -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.CursorAdapter; -import android.support.v7.widget.SearchView; -import android.text.TextUtils; -import android.view.ContextThemeWrapper; -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; -import android.widget.CompoundButton; -import android.widget.ImageView; -import android.widget.ListView; -import android.widget.TextView; - -import org.fdroid.fdroid.FDroidApp; -import org.fdroid.fdroid.R; -import org.fdroid.fdroid.data.InstalledAppProvider; -import org.fdroid.fdroid.localrepo.LocalRepoManager; -import org.fdroid.fdroid.views.fragments.ThemeableListFragment; - -import java.util.HashSet; -import java.util.Set; - -public class SelectAppsFragment extends ThemeableListFragment - implements LoaderManager.LoaderCallbacks, SearchView.OnQueryTextListener { - - @SuppressWarnings("UnusedDeclaration") - private static final String TAG = "SwapAppsList"; - - private String mCurrentFilterString; - - @NonNull - private final Set previouslySelectedApps = new HashSet<>(); - - public Set getSelectedApps() { - 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_search, 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); - - SearchView searchView = new SearchView(getActivity()); - - MenuItem searchMenuItem = menu.findItem(R.id.action_search); - MenuItemCompat.setActionView(searchMenuItem, searchView); - MenuItemCompat.setShowAsAction(searchMenuItem, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); - - searchView.setOnQueryTextListener(this); - } - - @Override - public void onResume() { - super.onResume(); - previouslySelectedApps.clear(); - if (FDroidApp.selectedApps != null) { - previouslySelectedApps.addAll(FDroidApp.selectedApps); - } - } - - public boolean hasSelectionChanged() { - - Set 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 void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - - setEmptyText(getString(R.string.no_applications_found)); - - ListView listView = getListView(); - listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); - - setListAdapter(new AppListAdapter(listView, getActivity(), null)); - setListShown(false); // start out with a progress indicator - - // either reconnect with an existing loader or start a new one - getLoaderManager().initLoader(0, null, this); - - // build list of existing apps from what is on the file system - if (FDroidApp.selectedApps == null) { - FDroidApp.selectedApps = new HashSet<>(); - for (String filename : LocalRepoManager.get(getActivity()).repoDir.list()) { - if (filename.matches(".*\\.apk")) { - String packageName = filename.substring(0, filename.indexOf("_")); - FDroidApp.selectedApps.add(packageName); - } - } - } - } - - @Override - public void onListItemClick(ListView l, View v, int position, long id) { - // Ignore the headerView at position 0. - if (position > 0) { - toggleAppSelected(position); - } - } - - private void toggleAppSelected(int position) { - Cursor c = (Cursor) getListAdapter().getItem(position - 1); - String packageName = c.getString(c.getColumnIndex(InstalledAppProvider.DataColumns.APP_ID)); - if (FDroidApp.selectedApps.contains(packageName)) { - FDroidApp.selectedApps.remove(packageName); - } else { - FDroidApp.selectedApps.add(packageName); - } - } - - @Override - public CursorLoader onCreateLoader(int id, Bundle args) { - Uri baseUri; - if (TextUtils.isEmpty(mCurrentFilterString)) { - baseUri = InstalledAppProvider.getContentUri(); - } else { - baseUri = InstalledAppProvider.getSearchUri(mCurrentFilterString); - } - return new CursorLoader( - this.getActivity(), - baseUri, - InstalledAppProvider.DataColumns.ALL, - null, - null, - InstalledAppProvider.DataColumns.APPLICATION_LABEL); - } - - @Override - public void onLoadFinished(Loader loader, Cursor cursor) { - ((AppListAdapter)getListAdapter()).swapCursor(cursor); - - ListView listView = getListView(); - String fdroid = loader.getContext().getPackageName(); - for (int i = 0; i < listView.getCount() - 1; i++) { - Cursor c = ((Cursor) listView.getItemAtPosition(i + 1)); - String packageName = c.getString(c.getColumnIndex(InstalledAppProvider.DataColumns.APP_ID)); - if (TextUtils.equals(packageName, fdroid)) { - listView.setItemChecked(i + 1, true); // always include FDroid - } else { - for (String selected : FDroidApp.selectedApps) { - if (TextUtils.equals(packageName, selected)) { - listView.setItemChecked(i + 1, true); - } - } - } - } - - if (isResumed()) { - setListShown(true); - } else { - setListShownNoAnimation(true); - } - } - - @Override - public void onLoaderReset(Loader loader) { - ((AppListAdapter)getListAdapter()).swapCursor(null); - } - - @Override - public boolean onQueryTextChange(String newText) { - String newFilter = !TextUtils.isEmpty(newText) ? newText : null; - if (mCurrentFilterString == null && newFilter == null) { - return true; - } - if (mCurrentFilterString != null && mCurrentFilterString.equals(newFilter)) { - return true; - } - mCurrentFilterString = newFilter; - getLoaderManager().restartLoader(0, null, this); - return true; - } - - @Override - public boolean onQueryTextSubmit(String query) { - // this is not needed since we respond to every change in text - return true; - } - - @Override - protected int getThemeStyle() { - return R.style.SwapTheme_StartSwap; - } - - @Override - protected int getHeaderLayout() { - return R.layout.swap_create_header; - } - - private class AppListAdapter extends CursorAdapter { - - @SuppressWarnings("UnusedDeclaration") - private static final String TAG = "AppListAdapter"; - - @Nullable - private LayoutInflater inflater; - - @Nullable - private Drawable defaultAppIcon; - - @NonNull - private final ListView listView; - - public AppListAdapter(@NonNull ListView listView, @NonNull Context context, @Nullable Cursor c) { - super(context, c, FLAG_REGISTER_CONTENT_OBSERVER); - this.listView = listView; - } - - @NonNull - private LayoutInflater getInflater(Context context) { - if (inflater == null) { - Context themedContext = new ContextThemeWrapper(context, R.style.SwapTheme_AppList_ListItem); - inflater = (LayoutInflater)themedContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - } - return inflater; - } - - @NonNull - private Drawable getDefaultAppIcon(Context context) { - if (defaultAppIcon == null) { - defaultAppIcon = context.getResources().getDrawable(android.R.drawable.sym_def_app_icon); - } - return defaultAppIcon; - } - - @Override - public View newView(Context context, Cursor cursor, ViewGroup parent) { - View view = getInflater(context).inflate(R.layout.select_local_apps_list_item, parent, false); - bindView(view, context, cursor); - return view; - } - - @Override - public void bindView(final View view, final Context context, final Cursor cursor) { - - TextView packageView = (TextView)view.findViewById(R.id.package_name); - TextView labelView = (TextView)view.findViewById(R.id.application_label); - ImageView iconView = (ImageView)view.findViewById(android.R.id.icon); - - String packageName = cursor.getString(cursor.getColumnIndex(InstalledAppProvider.DataColumns.APP_ID)); - String appLabel = cursor.getString(cursor.getColumnIndex(InstalledAppProvider.DataColumns.APPLICATION_LABEL)); - - Drawable icon; - try { - icon = context.getPackageManager().getApplicationIcon(packageName); - } catch (PackageManager.NameNotFoundException e) { - icon = getDefaultAppIcon(context); - } - - packageView.setText(packageName); - labelView.setText(appLabel); - iconView.setImageDrawable(icon); - - // Since v11, the Android SDK provided the ability to show selected list items - // by highlighting their background. Prior to this, we need to handle this ourselves - // by adding a checkbox which can toggle selected items. - View checkBoxView = view.findViewById(R.id.checkbox); - if (checkBoxView != null) { - CheckBox checkBox = (CheckBox)checkBoxView; - checkBox.setOnCheckedChangeListener(null); - - final int listPosition = cursor.getPosition() + 1; // To account for the header view. - - checkBox.setChecked(listView.isItemChecked(listPosition)); - checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - listView.setItemChecked(listPosition, isChecked); - toggleAppSelected(listPosition); - } - }); - } - } - } - -} diff --git a/F-Droid/src/org/fdroid/fdroid/views/swap/views/SelectAppsView.java b/F-Droid/src/org/fdroid/fdroid/views/swap/SelectAppsView.java similarity index 99% rename from F-Droid/src/org/fdroid/fdroid/views/swap/views/SelectAppsView.java rename to F-Droid/src/org/fdroid/fdroid/views/swap/SelectAppsView.java index b07347fc7..fa8864d20 100644 --- a/F-Droid/src/org/fdroid/fdroid/views/swap/views/SelectAppsView.java +++ b/F-Droid/src/org/fdroid/fdroid/views/swap/SelectAppsView.java @@ -1,4 +1,4 @@ -package org.fdroid.fdroid.views.swap.views; +package org.fdroid.fdroid.views.swap; import android.annotation.TargetApi; import android.content.Context; @@ -35,7 +35,6 @@ import android.widget.TextView; import org.fdroid.fdroid.R; import org.fdroid.fdroid.data.InstalledAppProvider; import org.fdroid.fdroid.localrepo.SwapState; -import org.fdroid.fdroid.views.swap.SwapWorkflowActivity; public class SelectAppsView extends ListView implements SwapWorkflowActivity.InnerView, diff --git a/F-Droid/src/org/fdroid/fdroid/views/swap/StartSwapFragment.java b/F-Droid/src/org/fdroid/fdroid/views/swap/StartSwapFragment.java deleted file mode 100644 index 00d090442..000000000 --- a/F-Droid/src/org/fdroid/fdroid/views/swap/StartSwapFragment.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.fdroid.fdroid.views.swap; - -import android.app.Activity; -import android.content.Context; -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.view.ContextThemeWrapper; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import org.fdroid.fdroid.R; - -public class StartSwapFragment extends Fragment { - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - LayoutInflater themedInflater = (LayoutInflater)new ContextThemeWrapper(inflater.getContext(), R.style.SwapTheme_StartSwap).getSystemService(Context.LAYOUT_INFLATER_SERVICE); - return themedInflater.inflate(R.layout.swap_blank, container, false); - } - -} diff --git a/F-Droid/src/org/fdroid/fdroid/views/swap/views/StartSwapView.java b/F-Droid/src/org/fdroid/fdroid/views/swap/StartSwapView.java similarity index 98% rename from F-Droid/src/org/fdroid/fdroid/views/swap/views/StartSwapView.java rename to F-Droid/src/org/fdroid/fdroid/views/swap/StartSwapView.java index c251dd0bf..3f71317bf 100644 --- a/F-Droid/src/org/fdroid/fdroid/views/swap/views/StartSwapView.java +++ b/F-Droid/src/org/fdroid/fdroid/views/swap/StartSwapView.java @@ -1,4 +1,4 @@ -package org.fdroid.fdroid.views.swap.views; +package org.fdroid.fdroid.views.swap; import android.annotation.TargetApi; import android.content.Context; diff --git a/F-Droid/src/org/fdroid/fdroid/views/swap/SwapActivity.java b/F-Droid/src/org/fdroid/fdroid/views/swap/SwapActivity.java deleted file mode 100644 index d1fe5d77c..000000000 --- a/F-Droid/src/org/fdroid/fdroid/views/swap/SwapActivity.java +++ /dev/null @@ -1,295 +0,0 @@ -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.os.Handler; -import android.support.annotation.NonNull; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v7.app.ActionBarActivity; -import android.view.MenuItem; -import android.widget.Toast; - -import org.fdroid.fdroid.FDroidApp; -import org.fdroid.fdroid.NfcHelper; -import org.fdroid.fdroid.Preferences; -import org.fdroid.fdroid.R; -import org.fdroid.fdroid.Utils; -import org.fdroid.fdroid.localrepo.LocalRepoManager; -import org.fdroid.fdroid.localrepo.SwapState; - -import java.util.Set; -import java.util.Timer; -import java.util.TimerTask; - -public class SwapActivity extends ActionBarActivity implements SwapProcessManager { - - private static final String STATE_START_SWAP = "startSwap"; - private static final String STATE_SELECT_APPS = "selectApps"; - private static final String STATE_JOIN_WIFI = "joinWifi"; - private static final String STATE_NFC = "nfc"; - private static final String STATE_WIFI_QR = "wifiQr"; - - private Timer shutdownLocalRepoTimer; - private UpdateAsyncTask updateSwappableAppsTask = null; - private boolean hasPreparedLocalRepo = false; - - @Override - public void onBackPressed() { - switch (currentState()) { - case STATE_START_SWAP: - finish(); - break; - default: - super.onBackPressed(); - break; - } - } - - private String currentState() { - FragmentManager.BackStackEntry lastFragment = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1); - return lastFragment.getName(); - } - - public void nextStep() { - switch (currentState()) { - case STATE_START_SWAP: - showSelectApps(); - break; - case STATE_SELECT_APPS: - prepareLocalRepo(); - break; - case STATE_JOIN_WIFI: - ensureLocalRepoRunning(); - if (!attemptToShowNfc()) { - showWifiQr(); - } - break; - case STATE_NFC: - showWifiQr(); - break; - case STATE_WIFI_QR: - break; - } - supportInvalidateOptionsMenu(); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() == R.id.action_next) { - nextStep(); - } - return super.onOptionsItemSelected(item); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - - super.onCreate(savedInstanceState); - - if (savedInstanceState == null) { - - setContentView(R.layout.swap_activity); - - // Necessary to run on an Android 2.3.[something] device. - new Handler().post(new Runnable() { - @Override - public void run() { - - showFragment(new StartSwapFragment(), STATE_START_SWAP); - - if (getState().isLocalRepoServiceRunning()) { - showSelectApps(); - showJoinWifi(); - attemptToShowNfc(); - showWifiQr(); - } - - } - }); - } - - } - - public void showSelectApps() { - - showFragment(new SelectAppsFragment(), STATE_SELECT_APPS); - - } - - private void showJoinWifi() { - - showFragment(new JoinWifiFragment(), STATE_JOIN_WIFI); - - } - - private boolean attemptToShowNfc() { - // TODO: What if NFC is disabled? Hook up with NfcNotEnabledActivity? Or maybe only if they - // click a relevant button? - - // Even if they opted to skip the message which says "Touch devices to swap", - // we still want to actually enable the feature, so that they could touch - // during the wifi qr code being shown too. - boolean nfcMessageReady = NfcHelper.setPushMessage(this, Utils.getSharingUri(FDroidApp.repo)); - - if (Preferences.get().showNfcDuringSwap() && nfcMessageReady) { - showFragment(new NfcSwapFragment(), STATE_NFC); - return true; - } - return false; - } - - private void showBluetooth() { - - } - - private void showWifiQr() { - showFragment(new WifiQrFragment(), STATE_WIFI_QR); - } - - private void showFragment(Fragment fragment, String name) { - getSupportFragmentManager() - .beginTransaction() - .replace(R.id.fragment_container, fragment, name) - .addToBackStack(name) - .commit(); - } - - 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 { - showJoinWifi(); - } - } - - /** - * 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; - showJoinWifi(); - - } - - private void ensureLocalRepoRunning() { - if (!getState().isLocalRepoServiceRunning()) { - getState().startLocalRepoService(); - initLocalRepoTimer(900000); // 15 mins - } - } - - private SwapState getState() { - return SwapState.load(this); - } - - private void initLocalRepoTimer(long timeoutMilliseconds) { - - // 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() { - getState().stopLocalRepoService(); - } - }, timeoutMilliseconds); - - } - - @Override - public void stopSwapping() { - if (getState().isLocalRepoServiceRunning()) { - if (shutdownLocalRepoTimer != null) { - shutdownLocalRepoTimer.cancel(); - } - getState().stopLocalRepoService(); - } - finish(); - } - - class UpdateAsyncTask extends AsyncTask { - - @SuppressWarnings("UnusedDeclaration") - private static final String TAG = "SwapActivity.UpdateAsyncTask"; - - @NonNull - private final ProgressDialog progressDialog; - - @NonNull - private final Set selectedApps; - - @NonNull - private final Uri sharingUri; - - public UpdateAsyncTask(Context c, @NonNull Set apps) { - selectedApps = apps; - progressDialog = new ProgressDialog(c); - progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); - progressDialog.setTitle(R.string.updating); - sharingUri = Utils.getSharingUri(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() { - - @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(); - } - } - -} diff --git a/F-Droid/src/org/fdroid/fdroid/views/swap/SwapProcessManager.java b/F-Droid/src/org/fdroid/fdroid/views/swap/SwapProcessManager.java deleted file mode 100644 index cb9567bf9..000000000 --- a/F-Droid/src/org/fdroid/fdroid/views/swap/SwapProcessManager.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.fdroid.fdroid.views.swap; - -/** - * Defines the contract between the {@link org.fdroid.fdroid.views.swap.SwapActivity} - * and the fragments which live in it. The fragments each have the responsibility of - * moving to the next stage of the process, and are entitled to stop swapping too - * (e.g. when a "Cancel" button is pressed). - */ -public interface SwapProcessManager { - void nextStep(); - void stopSwapping(); -} diff --git a/F-Droid/src/org/fdroid/fdroid/views/swap/WifiQrFragment.java b/F-Droid/src/org/fdroid/fdroid/views/swap/WifiQrFragment.java deleted file mode 100644 index ecb7d70ca..000000000 --- a/F-Droid/src/org/fdroid/fdroid/views/swap/WifiQrFragment.java +++ /dev/null @@ -1,164 +0,0 @@ -package org.fdroid.fdroid.views.swap; - -import android.app.Activity; -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.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; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.ImageView; -import android.widget.TextView; -import android.widget.Toast; - -import com.google.zxing.integration.android.IntentIntegrator; -import com.google.zxing.integration.android.IntentResult; - -import org.apache.http.NameValuePair; -import org.apache.http.client.utils.URLEncodedUtils; -import org.fdroid.fdroid.FDroid; -import org.fdroid.fdroid.FDroidApp; -import org.fdroid.fdroid.Preferences; -import org.fdroid.fdroid.QrGenAsyncTask; -import org.fdroid.fdroid.R; -import org.fdroid.fdroid.Utils; -import org.fdroid.fdroid.data.NewRepoConfig; -import org.fdroid.fdroid.net.WifiStateChangeService; - -import java.net.URI; -import java.util.List; -import java.util.Locale; - -public class WifiQrFragment extends Fragment { - - private static final int CONNECT_TO_SWAP = 1; - - private static final String TAG = "WifiQrFragment"; - - private final BroadcastReceiver onWifiChange = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent i) { - setUIFromWifi(); - } - }; - - private SwapProcessManager swapManager; - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.swap_wifi_qr, container, false); - ImageView qrImage = (ImageView)view.findViewById(R.id.wifi_qr_code); - - // Replace all blacks with the background blue. - qrImage.setColorFilter(new LightingColorFilter(0xffffffff, getResources().getColor(R.color.swap_blue))); - - Button openQr = (Button)view.findViewById(R.id.btn_qr_scanner); - openQr.setOnClickListener(new Button.OnClickListener() { - @Override - public void onClick(View v) { - IntentIntegrator integrator = new IntentIntegrator(WifiQrFragment.this); - integrator.initiateScan(); - } - }); - - Button cancel = (Button)view.findViewById(R.id.btn_cancel_swap); - cancel.setOnClickListener(new Button.OnClickListener() { - @Override - public void onClick(View v) { - swapManager.stopSwapping(); - } - }); - return view; - } - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - swapManager = (SwapProcessManager)activity; - } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent intent) { - IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent); - if (scanResult != null) { - if (scanResult.getContents() != null) { - NewRepoConfig repoConfig = new NewRepoConfig(getActivity(), scanResult.getContents()); - if (repoConfig.isValidRepo()) { - startActivityForResult(new Intent(FDroid.ACTION_ADD_REPO, Uri.parse(scanResult.getContents()), getActivity(), ConnectSwapActivity.class), CONNECT_TO_SWAP); - } else { - Toast.makeText(getActivity(), "The QR code you scanned doesn't look like a swap code.", Toast.LENGTH_SHORT).show(); - } - } - } else if (requestCode == CONNECT_TO_SWAP && resultCode == Activity.RESULT_OK) { - getActivity().finish(); - } - } - - public void onResume() { - super.onResume(); - setUIFromWifi(); - - LocalBroadcastManager.getInstance(getActivity()).registerReceiver(onWifiChange, - new IntentFilter(WifiStateChangeService.BROADCAST)); - } - - private void setUIFromWifi() { - - if (TextUtils.isEmpty(FDroidApp.repo.address) || getView() == null) - return; - - String scheme = Preferences.get().isLocalRepoHttpsEnabled() ? "https://" : "http://"; - - // the fingerprint is not useful on the button label - String buttonLabel = scheme + FDroidApp.ipAddressString + ":" + FDroidApp.port; - TextView ipAddressView = (TextView) getView().findViewById(R.id.device_ip_address); - ipAddressView.setText(buttonLabel); - - /* - * Set URL to UPPER for compact QR Code, FDroid will translate it back. - * Remove the SSID from the query string since SSIDs are case-sensitive. - * Instead the receiver will have to rely on the BSSID to find the right - * wifi AP to join. Lots of QR Scanners are buggy and do not respect - * custom URI schemes, so we have to use http:// or https:// :-( - */ - Uri sharingUri = Utils.getSharingUri(FDroidApp.repo); - String qrUriString = (scheme + sharingUri.getHost()).toUpperCase(Locale.ENGLISH); - if (sharingUri.getPort() != 80) { - qrUriString += ":" + sharingUri.getPort(); - } - qrUriString += sharingUri.getPath().toUpperCase(Locale.ENGLISH); - boolean first = true; - - // Andorid provides an API for getting the query parameters and iterating over them: - // Uri.getQueryParameterNames() - // But it is only available on later Android versions. As such we use URLEncodedUtils instead. - List parameters = URLEncodedUtils.parse(URI.create(sharingUri.toString()), "UTF-8"); - for (NameValuePair parameter : parameters) { - if (!parameter.getName().equals("ssid")) { - if (first) { - qrUriString += "?"; - first = false; - } else { - qrUriString += "&"; - } - qrUriString += parameter.getName().toUpperCase(Locale.ENGLISH) + "=" + - parameter.getValue().toUpperCase(Locale.ENGLISH); - } - } - - Log.i(TAG, "Encoded swap URI in QR Code: " + qrUriString); - - new QrGenAsyncTask(getActivity(), R.id.wifi_qr_code).execute(qrUriString); - - } - -} diff --git a/F-Droid/src/org/fdroid/fdroid/views/swap/views/WifiQrView.java b/F-Droid/src/org/fdroid/fdroid/views/swap/WifiQrView.java similarity index 99% rename from F-Droid/src/org/fdroid/fdroid/views/swap/views/WifiQrView.java rename to F-Droid/src/org/fdroid/fdroid/views/swap/WifiQrView.java index fc451de9b..8b215d505 100644 --- a/F-Droid/src/org/fdroid/fdroid/views/swap/views/WifiQrView.java +++ b/F-Droid/src/org/fdroid/fdroid/views/swap/WifiQrView.java @@ -1,4 +1,4 @@ -package org.fdroid.fdroid.views.swap.views; +package org.fdroid.fdroid.views.swap; import android.annotation.TargetApi; import android.content.BroadcastReceiver;