From 11d232146774f63cb9373561c31eae2316ffa2f5 Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Tue, 24 Apr 2018 16:43:48 -0300 Subject: [PATCH] New default avatar photo. Support relative url for profile picture. Refactor download profile picture as async task --- .../highfidelity/hifiinterface/HifiUtils.java | 25 +++++++ .../hifiinterface/MainActivity.java | 37 ++-------- .../task/DownloadProfileImageTask.java | 71 +++++++++++++++++++ .../res/drawable/default_profile_avatar.xml | 17 +++++ .../src/main/res/layout/navigation_header.xml | 1 + 5 files changed, 120 insertions(+), 31 deletions(-) create mode 100644 android/app/src/main/java/io/highfidelity/hifiinterface/task/DownloadProfileImageTask.java create mode 100644 android/app/src/main/res/drawable/default_profile_avatar.xml diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/HifiUtils.java b/android/app/src/main/java/io/highfidelity/hifiinterface/HifiUtils.java index 15d716548f..408929c20f 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/HifiUtils.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/HifiUtils.java @@ -1,11 +1,16 @@ package io.highfidelity.hifiinterface; +import java.net.URI; +import java.net.URISyntaxException; + /** * Created by Gabriel Calero & Cristian Duarte on 4/13/18. */ public class HifiUtils { + public static final String METAVERSE_BASE_URL = "https://metaverse.highfidelity.com"; + private static HifiUtils instance; private HifiUtils() { @@ -18,6 +23,26 @@ public class HifiUtils { return instance; } + public String absoluteHifiAssetUrl(String urlString) { + return absoluteHifiAssetUrl(urlString, METAVERSE_BASE_URL); + } + + public String absoluteHifiAssetUrl(String urlString, String baseUrl) { + urlString = urlString.trim(); + if (!urlString.isEmpty()) { + URI uri; + try { + uri = new URI(urlString); + } catch (URISyntaxException e) { + return urlString; + } + if (uri.getScheme() == null || uri.getScheme().isEmpty()) { + urlString = baseUrl + urlString; + } + } + return urlString; + } + public native String getCurrentAddress(); } diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java b/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java index 0c15730643..274ad95347 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java @@ -35,13 +35,14 @@ import io.highfidelity.hifiinterface.fragment.GotoFragment; import io.highfidelity.hifiinterface.fragment.HomeFragment; import io.highfidelity.hifiinterface.fragment.LoginFragment; import io.highfidelity.hifiinterface.fragment.PolicyFragment; +import io.highfidelity.hifiinterface.task.DownloadProfileImageTask; public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, LoginFragment.OnLoginInteractionListener, HomeFragment.OnHomeInteractionListener, GotoFragment.OnGotoInteractionListener { - private static final int PROFILE_PICTURE_PLACEHOLDER = R.drawable.ic_person; + private static final int PROFILE_PICTURE_PLACEHOLDER = R.drawable.default_profile_avatar; private String TAG = "HighFidelity"; public native boolean nativeIsLoggedIn(); @@ -234,36 +235,10 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On * TODO: this should be get from an API (at the moment there is no one for this) */ private void updateProfilePicture(String username) { - Picasso.get().load(PROFILE_PICTURE_PLACEHOLDER).into(mProfilePicture); - - new Thread(() -> { - try { - URL userPage = new URL("https://highfidelity.com/users/" + username); - BufferedReader in = new BufferedReader( - new InputStreamReader( - userPage.openStream())); - - StringBuffer strBuff = new StringBuffer(); - String inputLine; - while ((inputLine = in.readLine()) != null) { - strBuff.append(inputLine); - } - in.close(); - String substr = "img class=\"users-img\" src=\""; - int indexBegin = strBuff.indexOf(substr) + substr.length(); - if (indexBegin >= substr.length()) { - int indexEnd = strBuff.indexOf("\"", indexBegin); - runOnUiThread(() -> { - if (indexEnd > 0) { - Picasso.get().load(strBuff.substring(indexBegin, indexEnd)).into(mProfilePicture, new RoundProfilePictureCallback()); - } - }); - } - } catch (IOException e) { - Log.e(TAG, "Error getting profile picture for username " + username); - } - }).start(); - + mProfilePicture.setImageResource(PROFILE_PICTURE_PLACEHOLDER); + new DownloadProfileImageTask(url -> { if (url!=null && !url.isEmpty()) { + Picasso.get().load(url).into(mProfilePicture, new RoundProfilePictureCallback()); + } } ).execute(username); } public void onPrivacyPolicyClicked(View view) { diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/task/DownloadProfileImageTask.java b/android/app/src/main/java/io/highfidelity/hifiinterface/task/DownloadProfileImageTask.java new file mode 100644 index 0000000000..f32227a31e --- /dev/null +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/task/DownloadProfileImageTask.java @@ -0,0 +1,71 @@ +package io.highfidelity.hifiinterface.task; + +import android.os.AsyncTask; +import android.util.Log; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.URL; + +import io.highfidelity.hifiinterface.HifiUtils; + +/** + * This is a temporary solution until the profile picture URL is + * available in an API + */ +public class DownloadProfileImageTask extends AsyncTask { + + private static final String BASE_PROFILE_URL = "https://highfidelity.com"; + private static final String TAG = "Interface"; + + private final DownloadProfileImageResultProcessor mResultProcessor; + + public interface DownloadProfileImageResultProcessor { + void onResultAvailable(String url); + } + + public DownloadProfileImageTask(DownloadProfileImageResultProcessor resultProcessor) { + mResultProcessor = resultProcessor; + } + + @Override + protected String doInBackground(String... usernames) { + URL userPage = null; + for (String username: usernames) { + try { + userPage = new URL(BASE_PROFILE_URL + "/users/" + username); + BufferedReader in = new BufferedReader( + new InputStreamReader( + userPage.openStream())); + + StringBuffer strBuff = new StringBuffer(); + String inputLine; + while ((inputLine = in.readLine()) != null) { + strBuff.append(inputLine); + } + in.close(); + String substr = "img class=\"users-img\" src=\""; + int indexBegin = strBuff.indexOf(substr) + substr.length(); + if (indexBegin >= substr.length()) { + int indexEnd = strBuff.indexOf("\"", indexBegin); + if (indexEnd > 0) { + String url = strBuff.substring(indexBegin, indexEnd); + return HifiUtils.getInstance().absoluteHifiAssetUrl(url, BASE_PROFILE_URL); + } + } + } catch (IOException e) { + Log.e(TAG, "Error getting profile picture for username " + username); + } + } + return null; + } + + @Override + protected void onPostExecute(String url) { + super.onPostExecute(url); + if (mResultProcessor != null) { + mResultProcessor.onResultAvailable(url); + } + } +} diff --git a/android/app/src/main/res/drawable/default_profile_avatar.xml b/android/app/src/main/res/drawable/default_profile_avatar.xml new file mode 100644 index 0000000000..5db00acdd6 --- /dev/null +++ b/android/app/src/main/res/drawable/default_profile_avatar.xml @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/layout/navigation_header.xml b/android/app/src/main/res/layout/navigation_header.xml index 3ded5a515d..b61e701f48 100644 --- a/android/app/src/main/res/layout/navigation_header.xml +++ b/android/app/src/main/res/layout/navigation_header.xml @@ -9,6 +9,7 @@ android:id="@+id/profilePicture" android:layout_width="64dp" android:layout_height="64dp" + android:src="@drawable/default_profile_avatar" app:layout_constraintTop_toTopOf="parent" app:layout_constraintLeft_toLeftOf="parent" android:layout_marginLeft="@dimen/activity_horizontal_margin"