diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index eda9ba073..df38566c7 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -281,6 +281,15 @@
android:name="android.support.PARENT_ACTIVITY"
android:value=".FDroid" />
+
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/drawable/swap_button_normal.xml b/res/drawable/swap_button_normal.xml
new file mode 100644
index 000000000..c31b230a8
--- /dev/null
+++ b/res/drawable/swap_button_normal.xml
@@ -0,0 +1,20 @@
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/drawable/swap_button_pressed.xml b/res/drawable/swap_button_pressed.xml
new file mode 100644
index 000000000..06e7b3b70
--- /dev/null
+++ b/res/drawable/swap_button_pressed.xml
@@ -0,0 +1,20 @@
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/drawable/swap_button_skin.xml b/res/drawable/swap_button_skin.xml
new file mode 100644
index 000000000..c9351791d
--- /dev/null
+++ b/res/drawable/swap_button_skin.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/res/drawable/swap_nfc_icon.png b/res/drawable/swap_nfc_icon.png
new file mode 100644
index 000000000..800413486
Binary files /dev/null and b/res/drawable/swap_nfc_icon.png differ
diff --git a/res/drawable/swap_qr_example.png b/res/drawable/swap_qr_example.png
new file mode 100644
index 000000000..2719ccb0c
Binary files /dev/null and b/res/drawable/swap_qr_example.png differ
diff --git a/res/drawable/swap_start_button_skin.xml b/res/drawable/swap_start_button_skin.xml
new file mode 100644
index 000000000..b2a71fa84
--- /dev/null
+++ b/res/drawable/swap_start_button_skin.xml
@@ -0,0 +1,8 @@
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/res/drawable/swap_wifi_likely_to_work.xml b/res/drawable/swap_wifi_likely_to_work.xml
new file mode 100644
index 000000000..8da6a1a11
--- /dev/null
+++ b/res/drawable/swap_wifi_likely_to_work.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/res/drawable/swap_wifi_may_work.xml b/res/drawable/swap_wifi_may_work.xml
new file mode 100644
index 000000000..af2e1a0a4
--- /dev/null
+++ b/res/drawable/swap_wifi_may_work.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/res/drawable/swap_window_background.xml b/res/drawable/swap_window_background.xml
new file mode 100644
index 000000000..76f7eb53e
--- /dev/null
+++ b/res/drawable/swap_window_background.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/res/drawable/wifi.png b/res/drawable/wifi.png
new file mode 100644
index 000000000..b7d1da660
Binary files /dev/null and b/res/drawable/wifi.png differ
diff --git a/res/drawable/wifi_ap_personal.png b/res/drawable/wifi_ap_personal.png
new file mode 100644
index 000000000..ee8fae4da
Binary files /dev/null and b/res/drawable/wifi_ap_personal.png differ
diff --git a/res/drawable/wifi_ap_private.png b/res/drawable/wifi_ap_private.png
new file mode 100644
index 000000000..c39be8d3c
Binary files /dev/null and b/res/drawable/wifi_ap_private.png differ
diff --git a/res/drawable/wifi_ap_public.png b/res/drawable/wifi_ap_public.png
new file mode 100644
index 000000000..56f4c5548
Binary files /dev/null and b/res/drawable/wifi_ap_public.png differ
diff --git a/res/layout/applistitem.xml b/res/layout/applistitem.xml
index 8297c1d82..60d635e01 100644
--- a/res/layout/applistitem.xml
+++ b/res/layout/applistitem.xml
@@ -4,7 +4,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
- android:baselineAligned="false" >
+ android:baselineAligned="false"
+ xmlns:tools="http://schemas.android.com/tools" >
@@ -14,7 +15,8 @@
android:layout_width="48dip"
android:layout_height="48dip"
android:layout_gravity="center_vertical"
- android:scaleType="fitCenter" />
+ android:scaleType="fitCenter"
+ tools:src="@drawable/ic_launcher" />
+ android:textAlignment="viewStart"
+ tools:text="F-Droid" />
@@ -79,6 +83,7 @@
android:layout_gravity="center_vertical"
android:gravity="start"
android:textAlignment="viewStart"
+ tools:text="Application manager"
/>
diff --git a/res/layout/swap_blank.xml b/res/layout/swap_blank.xml
new file mode 100644
index 000000000..83b3d8034
--- /dev/null
+++ b/res/layout/swap_blank.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/swap_create.xml b/res/layout/swap_create.xml
new file mode 100644
index 000000000..d7445db93
--- /dev/null
+++ b/res/layout/swap_create.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/swap_create_header.xml b/res/layout/swap_create_header.xml
new file mode 100644
index 000000000..80a20ea2c
--- /dev/null
+++ b/res/layout/swap_create_header.xml
@@ -0,0 +1,8 @@
+
+
diff --git a/res/layout/swap_join_wifi.xml b/res/layout/swap_join_wifi.xml
new file mode 100644
index 000000000..1bf1110d8
--- /dev/null
+++ b/res/layout/swap_join_wifi.xml
@@ -0,0 +1,169 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/swap_nfc.xml b/res/layout/swap_nfc.xml
new file mode 100644
index 000000000..649942af6
--- /dev/null
+++ b/res/layout/swap_nfc.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/swap_wifi_qr.xml b/res/layout/swap_wifi_qr.xml
new file mode 100644
index 000000000..bbd95fd4f
--- /dev/null
+++ b/res/layout/swap_wifi_qr.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/menu/main.xml b/res/menu/main.xml
index 38e72966e..e768a8152 100644
--- a/res/menu/main.xml
+++ b/res/menu/main.xml
@@ -13,8 +13,8 @@
android:title="@string/menu_update_repo"
app:showAsAction="ifRoom"/>
-
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/values/colors.xml b/res/values/colors.xml
index d2777848b..cd2091ecf 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -3,4 +3,12 @@
#ffcccccc
#ffCC0000
#ff999999
+
+ #27aae1
+ #ff98cce1
+ #1c6bbc
+ #ff6ca8d5
+ #fbb040
+ #00a14b
+
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 25c1d3af4..3288c93b6 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -295,4 +295,12 @@
This option is only available when F-Droid is installed as a system-app.
F-Droid is an installable catalogue of FOSS (Free and Open Source Software) applications for the Android platform. The client makes it easy to browse, install, and keep track of updates on your device.
+ If your friend has F-Droid and NFC turned on touch your phones together.
+ Join the same Wifi as your friend
+ Use Bluetooth instead
+ Learn more about Wifi
+ Swap apps
+ Swap apps
+ No network yet
+ (Tap to open available networks)
diff --git a/res/values/styles.xml b/res/values/styles.xml
index dfd911baa..9f319b9ba 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -33,4 +33,93 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/org/fdroid/fdroid/FDroid.java b/src/org/fdroid/fdroid/FDroid.java
index 18d610e52..0cc798535 100644
--- a/src/org/fdroid/fdroid/FDroid.java
+++ b/src/org/fdroid/fdroid/FDroid.java
@@ -47,6 +47,7 @@ import org.fdroid.fdroid.data.AppProvider;
import org.fdroid.fdroid.views.AppListFragmentPagerAdapter;
import org.fdroid.fdroid.views.LocalRepoActivity;
import org.fdroid.fdroid.views.ManageReposActivity;
+import org.fdroid.fdroid.views.swap.SwapActivity;
public class FDroid extends ActionBarActivity {
@@ -145,8 +146,12 @@ public class FDroid extends ActionBarActivity {
startActivityForResult(prefs, REQUEST_PREFS);
return true;
- case R.id.action_local_repo:
- startActivity(new Intent(this, LocalRepoActivity.class));
+ case R.id.action_swap:
+ startActivity(new Intent(this, SwapActivity.class));
+ return true;
+
+ case R.id.action_swap:
+ startActivity(new Intent(this, SwapActivity.class));
return true;
case R.id.action_search:
diff --git a/src/org/fdroid/fdroid/views/swap/JoinWifiFragment.java b/src/org/fdroid/fdroid/views/swap/JoinWifiFragment.java
new file mode 100644
index 000000000..6104de83b
--- /dev/null
+++ b/src/org/fdroid/fdroid/views/swap/JoinWifiFragment.java
@@ -0,0 +1,64 @@
+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.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.content.LocalBroadcastManager;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+import android.widget.Toast;
+import org.fdroid.fdroid.FDroidApp;
+import org.fdroid.fdroid.R;
+import org.fdroid.fdroid.net.WifiStateChangeService;
+
+public class JoinWifiFragment extends Fragment {
+
+ private BroadcastReceiver onWifiChange = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ refreshWifiState();
+ }
+ };
+
+ @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) {
+ Toast.makeText(getActivity(), "Touched view", Toast.LENGTH_LONG);
+ }
+ });
+ 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() {
+ if (getView() != null) {
+ TextView ssidView = (TextView) getView().findViewById(R.id.wifi_ssid);
+ String text = TextUtils.isEmpty(FDroidApp.ssid) ? getString(R.string.swap_no_wifi_network) : FDroidApp.ssid;
+ ssidView.setText(text);
+ }
+ }
+}
diff --git a/src/org/fdroid/fdroid/views/swap/NfcSwapFragment.java b/src/org/fdroid/fdroid/views/swap/NfcSwapFragment.java
new file mode 100644
index 000000000..9ee92f6f2
--- /dev/null
+++ b/src/org/fdroid/fdroid/views/swap/NfcSwapFragment.java
@@ -0,0 +1,17 @@
+package org.fdroid.fdroid.views.swap;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import org.fdroid.fdroid.R;
+
+public class NfcSwapFragment extends Fragment {
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.swap_nfc, container, false);
+ }
+
+}
diff --git a/src/org/fdroid/fdroid/views/swap/SwapActivity.java b/src/org/fdroid/fdroid/views/swap/SwapActivity.java
new file mode 100644
index 000000000..bdaa92970
--- /dev/null
+++ b/src/org/fdroid/fdroid/views/swap/SwapActivity.java
@@ -0,0 +1,96 @@
+package org.fdroid.fdroid.views.swap;
+
+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 org.fdroid.fdroid.R;
+
+public class SwapActivity extends ActionBarActivity implements SwapProcessManager {
+
+ private static final String STATE_JOIN_WIFI = "joinWifi";
+ private static final String STATE_NFC = "nfc";
+ private static final String STATE_WIFI_QR = "wifiQr";
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ getMenuInflater().inflate(R.menu.swap, menu);
+ MenuItem next = menu.getItem(0);
+ MenuItemCompat.setShowAsAction(next, MenuItemCompat.SHOW_AS_ACTION_ALWAYS | MenuItemCompat.SHOW_AS_ACTION_WITH_TEXT);
+ return true;
+ }
+
+ @Override
+ public boolean onPrepareOptionsMenu(Menu menu) {
+ return super.onPrepareOptionsMenu(menu);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (item.getItemId() == R.id.action_next) {
+ moveToNext();
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ private void moveToNext() {
+ getSupportFragmentManager().popBackStack();
+ FragmentManager.BackStackEntry lastFragment = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1);
+ String name = lastFragment.getName();
+ switch (name) {
+ case STATE_JOIN_WIFI:
+ onAttemptNfc();
+ break;
+ case STATE_NFC:
+ onWifiQr();
+ break;
+ case STATE_WIFI_QR:
+
+ break;
+ }
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+
+ super.onCreate(savedInstanceState);
+
+ if (savedInstanceState == null) {
+
+ getSupportFragmentManager()
+ .beginTransaction()
+ .add(android.R.id.content, new JoinWifiFragment(), STATE_JOIN_WIFI)
+ .addToBackStack(STATE_JOIN_WIFI)
+ .commit();
+
+ }
+
+ }
+
+ @Override
+ public void onAttemptNfc() {
+ getSupportFragmentManager()
+ .beginTransaction()
+ .addToBackStack(STATE_NFC)
+ .replace(android.R.id.content, new NfcSwapFragment(), STATE_NFC)
+ .commit();
+ }
+
+ @Override
+ public void onBluetooth() {
+
+ }
+
+ @Override
+ public void onWifiQr() {
+ getSupportFragmentManager()
+ .beginTransaction()
+ .addToBackStack(STATE_WIFI_QR)
+ .replace(android.R.id.content, new WifiQrFragment(), STATE_WIFI_QR)
+ .commit();
+ }
+
+}
diff --git a/src/org/fdroid/fdroid/views/swap/SwapProcessManager.java b/src/org/fdroid/fdroid/views/swap/SwapProcessManager.java
new file mode 100644
index 000000000..33161ca47
--- /dev/null
+++ b/src/org/fdroid/fdroid/views/swap/SwapProcessManager.java
@@ -0,0 +1,7 @@
+package org.fdroid.fdroid.views.swap;
+
+public interface SwapProcessManager {
+ public void onAttemptNfc();
+ public void onBluetooth();
+ public void onWifiQr();
+}
diff --git a/src/org/fdroid/fdroid/views/swap/WifiQrFragment.java b/src/org/fdroid/fdroid/views/swap/WifiQrFragment.java
new file mode 100644
index 000000000..2d8d29212
--- /dev/null
+++ b/src/org/fdroid/fdroid/views/swap/WifiQrFragment.java
@@ -0,0 +1,17 @@
+package org.fdroid.fdroid.views.swap;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import org.fdroid.fdroid.R;
+
+public class WifiQrFragment extends Fragment {
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.swap_nfc, container, false);
+ }
+
+}