ui: QRCode/Share button in a dedicated screen

- removes QRCode/Share button from MenuHeader
- adds a "Share my account" entry in the main menu
- displays these elements in a dedicated screen

Change-Id: Ib8b8e827adb0623ee2f53ddd0621d1cdd5b64577
Tuleap: #1123
diff --git a/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java b/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java
index 597ddb0..38bf211 100644
--- a/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java
@@ -20,7 +20,6 @@
 package cx.ring.client;
 
 import android.Manifest;
-import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.FragmentManager;
 import android.app.FragmentTransaction;
@@ -43,7 +42,6 @@
 import android.preference.PreferenceManager;
 import android.provider.MediaStore;
 import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
 import android.support.design.widget.FloatingActionButton;
 import android.support.design.widget.NavigationView;
 import android.support.v4.app.ActivityCompat;
@@ -52,22 +50,13 @@
 import android.support.v7.app.ActionBarDrawerToggle;
 import android.support.v7.app.AppCompatActivity;
 import android.support.v7.widget.Toolbar;
-import android.transition.Explode;
-import android.transition.Fade;
 import android.util.Log;
-import android.view.LayoutInflater;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
-import com.google.zxing.BarcodeFormat;
-import com.google.zxing.WriterException;
-import com.google.zxing.common.BitMatrix;
-import com.google.zxing.qrcode.QRCodeWriter;
-
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -77,12 +66,12 @@
 
 import butterknife.BindView;
 import butterknife.ButterKnife;
-import butterknife.OnClick;
 import cx.ring.R;
 import cx.ring.fragments.AboutFragment;
 import cx.ring.fragments.AccountsManagementFragment;
 import cx.ring.fragments.ContactListFragment;
 import cx.ring.fragments.SettingsFragment;
+import cx.ring.fragments.ShareFragment;
 import cx.ring.fragments.SmartListFragment;
 import cx.ring.model.CallContact;
 import cx.ring.model.account.Account;
@@ -99,7 +88,7 @@
     static final String TAG = HomeActivity.class.getSimpleName();
 
     public static final int REQUEST_CODE_PREFERENCES = 1;
-    public static final int REQUEST_CODE_CREATE_ACCOUNT= 7;
+    public static final int REQUEST_CODE_CREATE_ACCOUNT = 7;
     public static final int REQUEST_CODE_CALL = 3;
     public static final int REQUEST_CODE_CONVERSATION = 4;
 
@@ -111,6 +100,8 @@
     private static final String HOME_TAG = "Home";
     private static final String ACCOUNTS_TAG = "Accounts";
     private static final String ABOUT_TAG = "About";
+    private static final String SETTINGS_TAG = "Prefs";
+    private static final String SHARE_TAG = "Share";
 
 
     private LocalService service;
@@ -217,27 +208,6 @@
         }
     }
 
-    /**
-     * Listener given to the MenuHeaderView to be notified when the QRCode is clicked
-     */
-    private View.OnClickListener mQRCodeClickListener = new View.OnClickListener() {
-        @Override
-        public void onClick(View v) {
-            QRCodeFragment zoom = QRCodeFragment.newInstance(fMenuHead.getSelectedAccount().getShareURI());
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-                zoom.setEnterTransition(new Explode());
-                zoom.setReturnTransition(new Fade());
-            }
-
-            mNavigationDrawer.closeDrawers();
-            getSupportFragmentManager()
-                    .beginTransaction()
-                    .replace(R.id.drawer_layout, zoom)
-                    .addToBackStack(null)
-                    .commit();
-        }
-    };
-
     final BroadcastReceiver receiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
@@ -539,7 +509,6 @@
                 fMenuHead = new MenuHeaderView(HomeActivity.this);
                 fMenuHead.setCallbacks(service);
                 fMenu.addHeaderView(fMenuHead);
-                fMenuHead.setQRCodeListener(mQRCodeClickListener);
             }
 
             FragmentManager fragmentManager = getFragmentManager();
@@ -589,12 +558,12 @@
                 }
                 break;
             case REQUEST_CODE_PHOTO:
-                if(resultCode == RESULT_OK && data != null){
+                if (resultCode == RESULT_OK && data != null) {
                     fMenuHead.updatePhoto((Bitmap) data.getExtras().get("data"));
                 }
                 break;
             case REQUEST_CODE_GALLERY:
-                if(resultCode == RESULT_OK && data != null) {
+                if (resultCode == RESULT_OK && data != null) {
                     fMenuHead.updatePhoto(data.getData());
                 }
                 break;
@@ -642,12 +611,31 @@
             case R.id.menuitem_prefs:
                 this.goToSettings();
                 break;
+            case R.id.menuitem_share:
+                goToShare();
+                break;
             default:
                 return false;
         }
         return true;
     }
 
+    private void goToShare() {
+        if (fContent instanceof ShareFragment) {
+            return;
+        }
+        fContent = new ShareFragment();
+
+        if (fMenuHead != null) {
+            fMenuHead.registerAccountSelectionListener((MenuHeaderView.MenuHeaderAccountSelectionListener) fContent);
+        }
+
+        Bundle args = new Bundle();
+        args.putString(ShareFragment.ARG_URI, fMenuHead.getSelectedAccount().getShareURI());
+        fContent.setArguments(args);
+        getFragmentManager().beginTransaction().setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE).replace(R.id.main_frame, fContent, SHARE_TAG).addToBackStack(SHARE_TAG).commit();
+    }
+
     public void goToSettings() {
         if (fMenu != null) {
             MenuItem settingsItem = fMenu.getMenu().findItem(R.id.menuitem_prefs);
@@ -665,8 +653,8 @@
         getFragmentManager()
                 .beginTransaction()
                 .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
-                .replace(R.id.main_frame, fContent, "Prefs")
-                .addToBackStack("Prefs")
+                .replace(R.id.main_frame, fContent, SETTINGS_TAG)
+                .addToBackStack(SETTINGS_TAG)
                 .commit();
     }
 
@@ -750,90 +738,4 @@
             }
         }
     }
-
-    /**
-     * Inner fragment used to show a fullscreen QRCode
-     * Only used here, may need its own file if used somewhere else
-     */
-    public static class QRCodeFragment extends android.support.v4.app.Fragment {
-
-        private static String ARG_URI = "QRCodeFragment.URI";
-
-        @BindView(R.id.qr_image)
-        ImageView mQrImage;
-
-        /**
-         * Create a new QRCodeFragment
-         *
-         * @param uri the string representing the uri to be displayed
-         * @return a new QRCodeFragment instance
-         */
-        public static QRCodeFragment newInstance(String uri) {
-            Bundle args = new Bundle();
-            args.putString(ARG_URI, uri);
-            QRCodeFragment fragment = new QRCodeFragment();
-            fragment.setArguments(args);
-            return fragment;
-        }
-
-        @Nullable
-        @Override
-        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
-            View rootView = inflater.inflate(R.layout.frag_qrcode, container, false);
-            ButterKnife.bind(this,rootView);
-
-            final String uriToShow = getArguments().getString(ARG_URI);
-
-            mQrImage.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
-                @Override
-                public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
-                    if (uriToShow != null) {
-                        Bitmap qrBitmap = encodeStringAsQrBitmap(uriToShow, mQrImage.getMeasuredWidth());
-                        mQrImage.setImageBitmap(qrBitmap);
-                    }
-                }
-            });
-            return rootView;
-        }
-
-        @OnClick(R.id.exit)
-        @SuppressWarnings("unused")
-        void onExitClickListener(View view) {
-            getFragmentManager().popBackStack();
-        }
-
-        /**
-         * @param input          uri to be displayed
-         * @param qrWindowPixels the ImageView size that will contain the QRcode
-         * @return the resulting image
-         */
-        public static Bitmap encodeStringAsQrBitmap(String input, int qrWindowPixels) {
-            QRCodeWriter qrWriter = new QRCodeWriter();
-            BitMatrix qrImageMatrix;
-            try {
-                qrImageMatrix = qrWriter.encode(input, BarcodeFormat.QR_CODE, qrWindowPixels, qrWindowPixels);
-            } catch (WriterException e) {
-                Log.e(TAG, "Error while encoding QR", e);
-                return null;
-            }
-
-            int qrImageWidth = qrImageMatrix.getWidth();
-            int qrImageHeight = qrImageMatrix.getHeight();
-            int[] pixels = new int[qrImageWidth * qrImageHeight];
-
-            final int BLACK = 0x00FFFFFF;
-            final int WHITE = 0xFFFFFFFF;
-
-            for (int row = 0; row < qrImageHeight; row++) {
-                int offset = row * qrImageWidth;
-                for (int column = 0; column < qrImageWidth; column++) {
-                    pixels[offset + column] = qrImageMatrix.get(column, row) ? BLACK : WHITE;
-                }
-            }
-
-            Bitmap bitmap = Bitmap.createBitmap(qrImageWidth, qrImageHeight, Bitmap.Config.ARGB_8888);
-            bitmap.setPixels(pixels, 0, qrImageWidth, 0, 0, qrImageWidth, qrImageHeight);
-            return bitmap;
-        }
-    }
 }
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/ShareFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/ShareFragment.java
new file mode 100644
index 0000000..248ab4b
--- /dev/null
+++ b/ring-android/app/src/main/java/cx/ring/fragments/ShareFragment.java
@@ -0,0 +1,109 @@
+/*
+ *  Copyright (C) 2015-2016 Savoir-faire Linux Inc.
+ *
+ *  Authors: Adrien Béraud <adrien.beraud@savoirfairelinux.com>
+ *           Alexandre Lision <alexandre.lision@savoirfairelinux.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package cx.ring.fragments;
+
+import android.app.Fragment;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.ImageView;
+
+import butterknife.BindString;
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import butterknife.OnClick;
+import cx.ring.R;
+import cx.ring.client.HomeActivity;
+import cx.ring.model.account.Account;
+import cx.ring.utils.QRCodeUtils;
+import cx.ring.views.MenuHeaderView;
+
+public class ShareFragment extends Fragment implements MenuHeaderView.MenuHeaderAccountSelectionListener {
+
+    public static final String ARG_URI = "ShareFragment.URI";
+
+    @BindView(R.id.qr_image)
+    ImageView mQrImage;
+
+    @BindView(R.id.share_button)
+    Button mShareButton;
+
+    @BindString(R.string.account_contact_me)
+    String mAccountCountactMe;
+
+    @BindString(R.string.share_via)
+    String mShareVia;
+
+    String mUriToShow;
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        ((HomeActivity) getActivity()).setToolbarState(false, R.string.menu_item_share);
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
+        final View inflatedView = inflater.inflate(R.layout.frag_share, parent, false);
+        ButterKnife.bind(this, inflatedView);
+
+        mUriToShow = getArguments().getString(ARG_URI);
+
+        mQrImage.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
+            @Override
+            public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
+                updateView();
+            }
+        });
+
+        return inflatedView;
+    }
+
+    private void updateView() {
+        if (!TextUtils.isEmpty(mUriToShow)) {
+            Bitmap qrBitmap = QRCodeUtils.encodeStringAsQrBitmap(mUriToShow, mQrImage.getMeasuredWidth());
+            mQrImage.setImageBitmap(qrBitmap);
+        }
+    }
+
+    @OnClick(R.id.share_button)
+    public void shareRingAccount() {
+        if (!TextUtils.isEmpty(mUriToShow)) {
+            Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
+            sharingIntent.setType("text/plain");
+            String shareBody = getString(R.string.account_share_body, mUriToShow);
+            sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, mAccountCountactMe);
+            sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody);
+            startActivity(Intent.createChooser(sharingIntent, mShareVia));
+        }
+    }
+
+    @Override
+    public void accountSelected(Account account) {
+        mUriToShow = account.getShareURI();
+        updateView();
+    }
+}
diff --git a/ring-android/app/src/main/java/cx/ring/utils/QRCodeUtils.java b/ring-android/app/src/main/java/cx/ring/utils/QRCodeUtils.java
new file mode 100644
index 0000000..ce6008a
--- /dev/null
+++ b/ring-android/app/src/main/java/cx/ring/utils/QRCodeUtils.java
@@ -0,0 +1,69 @@
+/*
+ *  Copyright (C) 2004-2016 Savoir-faire Linux Inc.
+ *
+ *  Author: Thibault Wittemberg <thibault.wittemberg@savoirfairelinux.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package cx.ring.utils;
+
+import android.graphics.Bitmap;
+import android.util.Log;
+
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.WriterException;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.qrcode.QRCodeWriter;
+
+public class QRCodeUtils {
+
+    private final static String TAG = QRCodeUtils.class.getName();
+
+    /**
+     * @param input          uri to be displayed
+     * @param qrWindowPixels the ImageView size that will contain the QRcode
+     * @return the resulting image
+     */
+    public static Bitmap encodeStringAsQrBitmap(String input, int qrWindowPixels) {
+        QRCodeWriter qrWriter = new QRCodeWriter();
+        BitMatrix qrImageMatrix;
+        try {
+            qrImageMatrix = qrWriter.encode(input, BarcodeFormat.QR_CODE, qrWindowPixels, qrWindowPixels);
+        } catch (WriterException e) {
+            Log.e(TAG, "Error while encoding QR", e);
+            return null;
+        }
+
+        int qrImageWidth = qrImageMatrix.getWidth();
+        int qrImageHeight = qrImageMatrix.getHeight();
+        int[] pixels = new int[qrImageWidth * qrImageHeight];
+
+        final int BLACK = 0x00FFFFFF;
+        final int WHITE = 0xFFFFFFFF;
+
+        for (int row = 0; row < qrImageHeight; row++) {
+            int offset = row * qrImageWidth;
+            for (int column = 0; column < qrImageWidth; column++) {
+                pixels[offset + column] = qrImageMatrix.get(column, row) ? BLACK : WHITE;
+            }
+        }
+
+        Bitmap bitmap = Bitmap.createBitmap(qrImageWidth, qrImageHeight, Bitmap.Config.ARGB_8888);
+        bitmap.setPixels(pixels, 0, qrImageWidth, 0, 0, qrImageWidth, qrImageHeight);
+        return bitmap;
+    }
+
+}
diff --git a/ring-android/app/src/main/java/cx/ring/views/MenuHeaderView.java b/ring-android/app/src/main/java/cx/ring/views/MenuHeaderView.java
index 7de246b..7a2fcfe 100644
--- a/ring-android/app/src/main/java/cx/ring/views/MenuHeaderView.java
+++ b/ring-android/app/src/main/java/cx/ring/views/MenuHeaderView.java
@@ -48,6 +48,7 @@
 import android.widget.TextView;
 
 import java.io.ByteArrayOutputStream;
+import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -76,15 +77,9 @@
     @BindView(R.id.account_selection)
     Spinner mSpinnerAccounts;
 
-    @BindView(R.id.share_btn)
-    ImageButton mShareBtn;
-
     @BindView(R.id.addaccount_btn)
     Button mNewAccountBtn;
 
-    @BindView(R.id.qr_image)
-    ImageButton mQrImage;
-
     @BindView(R.id.user_photo)
     ImageView mUserImage;
 
@@ -94,6 +89,8 @@
     private ImageView mProfilePhoto;
     private VCard mVCardProfile;
 
+    private List<WeakReference<MenuHeaderAccountSelectionListener>> mListeners;
+
     public MenuHeaderView(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
         initViews();
@@ -118,12 +115,12 @@
                         mAccountAdapter.setSelectedAccount(pos);
                         service.setAccountOrder(mAccountAdapter.getAccountOrder());
                     }
-                    String shareUri = getSelectedAccount().getShareURI();
-                    if (!shareUri.isEmpty()) {
-                        Bitmap qrBitmap = HomeActivity.QRCodeFragment.encodeStringAsQrBitmap(shareUri, mQrImage.getWidth());
-                        mQrImage.setImageBitmap(qrBitmap);
-                    } else {
-                        mQrImage.setImageBitmap(null);
+
+                    for (WeakReference<MenuHeaderAccountSelectionListener> weakListener : mListeners) {
+                        MenuHeaderAccountSelectionListener listener = weakListener.get();
+                        if (listener != null) {
+                            listener.accountSelected(getSelectedAccount());
+                        }
                     }
                 }
 
@@ -136,6 +133,10 @@
         }
     }
 
+    public void registerAccountSelectionListener(MenuHeaderAccountSelectionListener listener) {
+        mListeners.add(new WeakReference<>(listener));
+    }
+
     public void updateUserView() {
         LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         Log.d(TAG, "updateUserView");
@@ -182,6 +183,8 @@
         mVCardProfile = VCardUtils.loadLocalProfileFromDisk(getContext());
 
         updateUserView();
+
+        mListeners = new ArrayList<>();
     }
 
     @OnClick(R.id.profile_container)
@@ -273,37 +276,16 @@
     public void updateAccounts(List<Account> accounts) {
         if (accounts.isEmpty()) {
             mNewAccountBtn.setVisibility(View.VISIBLE);
-            mShareBtn.setVisibility(View.GONE);
             mSpinnerAccounts.setVisibility(View.GONE);
-            mQrImage.setVisibility(View.GONE);
         } else {
             mNewAccountBtn.setVisibility(View.GONE);
-            mShareBtn.setVisibility(View.VISIBLE);
             mSpinnerAccounts.setVisibility(View.VISIBLE);
-            mQrImage.setVisibility(View.VISIBLE);
             mAccountAdapter.replaceAll(accounts);
             mSpinnerAccounts.setSelection(0);
         }
     }
 
-    public void setQRCodeListener(OnClickListener l) {
-        mQrImage.setOnClickListener(l);
+    public interface MenuHeaderAccountSelectionListener {
+        void accountSelected(Account account);
     }
-
-    /**
-     * Click listeners
-     */
-
-    @OnClick(R.id.share_btn)
-    public void shareButtonClicked() {
-        Account account = mAccountAdapter.getSelectedAccount();
-        String shareUri = account.getShareURI();
-        Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
-        sharingIntent.setType("text/plain");
-        String shareBody = getContext().getString(R.string.account_share_body, shareUri);
-        sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, getContext().getString(R.string.account_contact_me));
-        sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody);
-        getContext().startActivity(Intent.createChooser(sharingIntent, getContext().getText(R.string.share_via)));
-    }
-
 }
diff --git a/ring-android/app/src/main/res/drawable-hdpi/ic_share_black_24dp.png b/ring-android/app/src/main/res/drawable-hdpi/ic_share_black_24dp.png
new file mode 100644
index 0000000..20ba480
--- /dev/null
+++ b/ring-android/app/src/main/res/drawable-hdpi/ic_share_black_24dp.png
Binary files differ
diff --git a/ring-android/app/src/main/res/drawable-mdpi/ic_share_black_24dp.png b/ring-android/app/src/main/res/drawable-mdpi/ic_share_black_24dp.png
new file mode 100644
index 0000000..f02d360
--- /dev/null
+++ b/ring-android/app/src/main/res/drawable-mdpi/ic_share_black_24dp.png
Binary files differ
diff --git a/ring-android/app/src/main/res/drawable-xhdpi/ic_share_black_24dp.png b/ring-android/app/src/main/res/drawable-xhdpi/ic_share_black_24dp.png
new file mode 100644
index 0000000..81c80b7
--- /dev/null
+++ b/ring-android/app/src/main/res/drawable-xhdpi/ic_share_black_24dp.png
Binary files differ
diff --git a/ring-android/app/src/main/res/drawable-xxhdpi/ic_share_black_24dp.png b/ring-android/app/src/main/res/drawable-xxhdpi/ic_share_black_24dp.png
new file mode 100644
index 0000000..784933a
--- /dev/null
+++ b/ring-android/app/src/main/res/drawable-xxhdpi/ic_share_black_24dp.png
Binary files differ
diff --git a/ring-android/app/src/main/res/drawable-xxxhdpi/ic_share_black_24dp.png b/ring-android/app/src/main/res/drawable-xxxhdpi/ic_share_black_24dp.png
new file mode 100644
index 0000000..5a8544c
--- /dev/null
+++ b/ring-android/app/src/main/res/drawable-xxxhdpi/ic_share_black_24dp.png
Binary files differ
diff --git a/ring-android/app/src/main/res/layout/frag_menu_header.xml b/ring-android/app/src/main/res/layout/frag_menu_header.xml
index e52effc..6f0a299 100644
--- a/ring-android/app/src/main/res/layout/frag_menu_header.xml
+++ b/ring-android/app/src/main/res/layout/frag_menu_header.xml
@@ -35,6 +35,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_alignTop="@+id/anchor"
+            android:layout_toEndOf="@+id/anchor"
             android:layout_toRightOf="@+id/anchor"
             android:src="@drawable/ic_action_edit"
             app:backgroundTint="@color/transparent_light"
@@ -56,14 +57,6 @@
 
     </RelativeLayout>
 
-    <ImageButton
-        android:id="@+id/qr_image"
-        android:layout_width="85dp"
-        android:layout_height="85dp"
-        android:layout_below="@+id/profile_container"
-        android:layout_centerHorizontal="true"
-        android:background="@null" />
-
     <Spinner
         android:id="@+id/account_selection"
         android:layout_width="wrap_content"
@@ -72,24 +65,12 @@
         android:layout_alignParentLeft="true"
         android:layout_alignParentRight="true"
         android:layout_alignParentStart="true"
-        android:layout_below="@+id/qr_image"
-        android:layout_toStartOf="@+id/share_btn"
+        android:layout_below="@+id/profile_container"
+        android:layout_toEndOf="@+id/profile_container"
+        android:layout_toRightOf="@+id/profile_container"
         android:visibility="visible"
         tools:listitem="@layout/item_account_selected" />
 
-    <ImageButton
-        android:id="@+id/share_btn"
-        style="?android:attr/borderlessButtonStyle"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignBottom="@+id/qr_image"
-        android:layout_alignTop="@+id/qr_image"
-        android:layout_toEndOf="@+id/qr_image"
-        android:layout_toRightOf="@+id/qr_image"
-        android:src="@drawable/ic_share_white_24dp"
-        android:text="@string/share_number"
-        android:visibility="visible" />
-
     <Button
         android:id="@+id/addaccount_btn"
         style="@style/Widget.AppCompat.Button.Borderless"
diff --git a/ring-android/app/src/main/res/layout/frag_qrcode.xml b/ring-android/app/src/main/res/layout/frag_qrcode.xml
deleted file mode 100644
index 4f5ef4f..0000000
--- a/ring-android/app/src/main/res/layout/frag_qrcode.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:clickable="true"
-    android:background="@color/black">
-
-    <ImageButton
-        android:id="@+id/exit"
-        android:layout_width="48dp"
-        android:layout_height="48dp"
-        android:layout_alignParentRight="true"
-        android:layout_alignParentTop="true"
-        android:layout_marginTop="20dp"
-        android:layout_marginRight="20dp"
-        android:background="@null"
-        android:src="@drawable/ic_action_remove" />
-
-    <ImageView
-        android:id="@+id/qr_image"
-        android:layout_width="300dp"
-        android:layout_height="300dp"
-        android:layout_centerHorizontal="true"
-        android:layout_centerInParent="true"
-        android:background="@null" />
-
-</RelativeLayout>
\ No newline at end of file
diff --git a/ring-android/app/src/main/res/layout/frag_share.xml b/ring-android/app/src/main/res/layout/frag_share.xml
new file mode 100644
index 0000000..28c03f9
--- /dev/null
+++ b/ring-android/app/src/main/res/layout/frag_share.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <TextView
+        android:id="@+id/textView"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_above="@+id/qr_image_panel"
+        android:layout_alignEnd="@+id/qr_image_panel"
+        android:layout_alignLeft="@+id/qr_image_panel"
+        android:layout_alignRight="@+id/qr_image_panel"
+        android:layout_alignStart="@+id/qr_image_panel"
+        android:paddingBottom="24sp"
+        android:paddingTop="16sp"
+        android:text="@string/share_message"
+        android:textColor="@color/text_color_primary"
+        android:textSize="16sp" />
+
+    <LinearLayout
+        android:id="@+id/qr_image_panel"
+        android:layout_width="300dp"
+        android:layout_height="300dp"
+        android:layout_centerHorizontal="true"
+        android:layout_centerInParent="true"
+        android:background="@color/black"
+        android:padding="10dp">
+
+        <ImageView
+            android:id="@+id/qr_image"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:background="@null" />
+
+    </LinearLayout>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_alignParentBottom="true"
+        android:background="@color/color_primary_dark">
+
+        <android.support.v7.widget.AppCompatButton
+            android:id="@+id/share_button"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="5dp"
+            android:paddingTop="5dp"
+            android:text="@string/share_your_account_information"
+            android:textColor="@color/white" />
+
+    </LinearLayout>
+
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/ring-android/app/src/main/res/menu/drawer.xml b/ring-android/app/src/main/res/menu/drawer.xml
index 2c2cc83..f9493d5 100644
--- a/ring-android/app/src/main/res/menu/drawer.xml
+++ b/ring-android/app/src/main/res/menu/drawer.xml
@@ -15,6 +15,10 @@
             android:icon="@drawable/ic_settings_black_24dp"
             android:title="@string/menu_item_settings"/>
         <item
+            android:id="@+id/menuitem_share"
+            android:icon="@drawable/ic_share_black_24dp"
+            android:title="@string/menu_item_share"/>
+        <item
             android:id="@+id/menuitem_about"
             android:icon="@drawable/ic_info_black_48dp"
             android:title="@string/menu_item_about"/>
diff --git a/ring-android/app/src/main/res/values/strings.xml b/ring-android/app/src/main/res/values/strings.xml
index 4b6d9c6..86cbb38 100644
--- a/ring-android/app/src/main/res/values/strings.xml
+++ b/ring-android/app/src/main/res/values/strings.xml
@@ -57,6 +57,7 @@
     <string name="menu_item_home">Home</string>
     <string name="menu_item_accounts">Manage accounts</string>
     <string name="menu_item_settings">Settings</string>
+    <string name="menu_item_share">Share my contact</string>
     <string name="menu_item_about">About Ring</string>
 
     <!-- Dialing Fragment -->
@@ -177,4 +178,9 @@
     <string name="unknowm_if_empty">Unknown if empty</string>
     <string name="unknown">Unknown</string>
 
+    <!-- Share fragment -->
+    <string name="share_label">Click on the Ring id to share</string>
+    <string name="share_message">Scan this QRCode with the embedded scanner of the Ring application that wants to communicate with you.</string>
+    <string name="share_your_account_information">Share your contact information</string>
+
 </resources>