diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/activities/ShowAccountActivity.java b/app/src/main/java/fr/gouv/etalab/mastodon/activities/ShowAccountActivity.java index 456832da0..14781d2df 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/activities/ShowAccountActivity.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/activities/ShowAccountActivity.java @@ -24,6 +24,7 @@ import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.os.Handler; +import android.support.design.widget.FloatingActionButton; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; @@ -32,9 +33,13 @@ import android.support.v4.content.ContextCompat; import android.support.v4.content.LocalBroadcastManager; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; +import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.text.Html; +import android.text.SpannableString; +import android.text.method.LinkMovementMethod; import android.util.Log; +import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.widget.Button; @@ -46,6 +51,7 @@ import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; +import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer; import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer; @@ -87,14 +93,14 @@ public class ShowAccountActivity extends AppCompatActivity implements OnPostActi private DisplayImageOptions options; private List statuses; private StatusListAdapter statusListAdapter; - private Button account_follow; + private FloatingActionButton account_follow; private static final int NUM_PAGES = 3; private ViewPager mPager; private String accountId; private TabLayout tabLayout; private BroadcastReceiver hide_header; - private TextView account_note; + private TextView account_note, account_follow_request; private String userId; private boolean isHiddingShowing = false; private static int instanceValue = 0; @@ -118,10 +124,12 @@ public class ShowAccountActivity extends AppCompatActivity implements OnPostActi }else { setTheme(R.style.AppThemeDark); } + setTitle(""); setContentView(R.layout.activity_show_account); instanceValue += 1; Bundle b = getIntent().getExtras(); - account_follow = (Button) findViewById(R.id.account_follow); + account_follow = (FloatingActionButton) findViewById(R.id.account_follow); + account_follow_request = (TextView) findViewById(R.id.account_follow_request); account_follow.setEnabled(false); if(b != null){ accountId = b.getString("accountId"); @@ -148,7 +156,7 @@ public class ShowAccountActivity extends AppCompatActivity implements OnPostActi boolean isOnWifi = Helper.isOnWIFI(getApplicationContext()); int behaviorWithAttachments = sharedpreferences.getInt(Helper.SET_ATTACHMENT_ACTION, Helper.ATTACHMENT_ALWAYS); statusListAdapter = new StatusListAdapter(getApplicationContext(), RetrieveFeedsAsyncTask.Type.USER, accountId, isOnWifi, behaviorWithAttachments, this.statuses); - options = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) + options = new DisplayImageOptions.Builder().displayer(new RoundedBitmapDisplayer(80)).cacheInMemory(false) .cacheOnDisk(true).resetViewBeforeLoading(true).build(); @@ -210,13 +218,11 @@ public class ShowAccountActivity extends AppCompatActivity implements OnPostActi if( !isHiddingShowing ){ isHiddingShowing = true; ImageView account_pp = (ImageView) findViewById(R.id.account_pp); - TextView account_ac = (TextView) findViewById(R.id.account_ac); boolean hide = intent.getBooleanExtra("hide", false); if( hide){ account_follow.setVisibility(View.GONE); account_note.setVisibility(View.GONE); tabLayout.setVisibility(View.GONE); - account_ac.setVisibility(View.GONE); account_pp.getLayoutParams().width = (int) Helper.convertDpToPixel(50, context); account_pp.getLayoutParams().height = (int) Helper.convertDpToPixel(50, context); }else { @@ -224,7 +230,6 @@ public class ShowAccountActivity extends AppCompatActivity implements OnPostActi if( accountId != null && accountId.equals(userId)){ account_follow.setVisibility(View.GONE); } - account_ac.setVisibility(View.VISIBLE); account_pp.getLayoutParams().width = (int) Helper.convertDpToPixel(80, context); account_pp.getLayoutParams().height = (int) Helper.convertDpToPixel(80, context); tabLayout.setVisibility(View.VISIBLE); @@ -301,17 +306,26 @@ public class ShowAccountActivity extends AppCompatActivity implements OnPostActi ImageView account_pp = (ImageView) findViewById(R.id.account_pp); TextView account_dn = (TextView) findViewById(R.id.account_dn); TextView account_un = (TextView) findViewById(R.id.account_un); - TextView account_ac = (TextView) findViewById(R.id.account_ac); + ActionBar actionBar = getSupportActionBar(); + LayoutInflater mInflater = LayoutInflater.from(ShowAccountActivity.this); + if( actionBar != null){ + View show_account_actionbar = mInflater.inflate(R.layout.showaccount_actionbar, null); + TextView actionbar_title = (TextView) show_account_actionbar.findViewById(R.id.show_account_title); + if( account != null && account.getAcct() != null) + actionbar_title.setText(account.getAcct()); + actionBar.setCustomView(show_account_actionbar); + actionBar.setDisplayShowCustomEnabled(true); + }else { + if( account != null && account.getAcct() != null) + setTitle(account.getAcct()); + } if( account != null){ - setTitle(account.getAcct()); account_dn.setText(Helper.shortnameToUnicode(account.getDisplay_name(), true)); account_un.setText(String.format("@%s", account.getUsername())); - if( account.getAcct() != null && account.getAcct().equals(account.getUsername())) - account_ac.setVisibility(View.GONE); - else - account_ac.setText(account.getAcct()); - account_note = Helper.clickableElementsDescription(ShowAccountActivity.this, account_note,account.getNote()); + SpannableString spannableString = Helper.clickableElementsDescription(ShowAccountActivity.this, account.getNote()); + account_note.setText(spannableString, TextView.BufferType.SPANNABLE); + account_note.setMovementMethod(LinkMovementMethod.getInstance()); tabLayout.getTabAt(0).setText(getString(R.string.status_cnt, account.getStatuses_count())); tabLayout.getTabAt(1).setText(getString(R.string.following_cnt, account.getFollowing_count())); tabLayout.getTabAt(2).setText(getString(R.string.followers_cnt, account.getFollowers_count())); @@ -347,21 +361,20 @@ public class ShowAccountActivity extends AppCompatActivity implements OnPostActi } account_follow.setEnabled(true); if( relationship.isBlocking()){ - account_follow.setText(R.string.action_unblock); + account_follow.setImageResource(R.drawable.ic_unlock_alt); doAction = action.UNBLOCK; }else if( relationship.isRequested()){ - account_follow.setText(R.string.request_sent); - account_follow.getBackground().setColorFilter(ContextCompat.getColor(this, R.color.colorPrimary), PorterDuff.Mode.MULTIPLY); + account_follow_request.setVisibility(View.VISIBLE); + account_follow.setVisibility(View.GONE); doAction = action.NOTHING; }else if( relationship.isFollowing()){ - account_follow.setText(R.string.action_unfollow); + account_follow.setImageResource(R.drawable.ic_user_times); doAction = action.UNFOLLOW; }else if( !relationship.isFollowing()){ - account_follow.setText(R.string.action_follow); + account_follow.setImageResource(R.drawable.ic_user_plus); doAction = action.FOLLOW; }else{ - account_follow.setText(R.string.action_no_action); - account_follow.getBackground().setColorFilter(ContextCompat.getColor(this, R.color.red_1), PorterDuff.Mode.MULTIPLY); + account_follow.setVisibility(View.GONE); doAction = action.NOTHING; } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountsListAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountsListAdapter.java index c04fbc226..048932a36 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountsListAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountsListAdapter.java @@ -109,7 +109,8 @@ public class AccountsListAdapter extends BaseAdapter implements OnPostActionInte .denyCacheImageMultipleSizesInMemory() .diskCache(new UnlimitedDiskCache(cacheDir)) .build(); - imageLoader.init(configImg); + if( !imageLoader.isInited()) + imageLoader.init(configImg); DisplayImageOptions options = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) .cacheOnDisk(true).resetViewBeforeLoading(true).build(); final Account account = accounts.get(position); diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/NotificationsListAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/NotificationsListAdapter.java index 08b0f86b6..f73cf9c19 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/NotificationsListAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/NotificationsListAdapter.java @@ -119,7 +119,6 @@ public class NotificationsListAdapter extends BaseAdapter implements OnPostActio holder.notification_status_content = (TextView) convertView.findViewById(R.id.notification_status_content); holder.notification_account_username = (TextView) convertView.findViewById(R.id.notification_account_username); holder.notification_type = (TextView) convertView.findViewById(R.id.notification_type); - holder.notification_account_displayname = (TextView) convertView.findViewById(R.id.notification_account_displayname); holder.notification_account_profile = (ImageView) convertView.findViewById(R.id.notification_account_profile); holder.status_favorite_count = (TextView) convertView.findViewById(R.id.status_favorite_count); holder.status_reblog_count = (TextView) convertView.findViewById(R.id.status_reblog_count); @@ -136,16 +135,28 @@ public class NotificationsListAdapter extends BaseAdapter implements OnPostActio String typeString = ""; switch (type){ case "mention": - typeString = String.format("@%s %s", notification.getAccount().getAcct(),context.getString(R.string.notif_mention)); + if( notification.getAccount().getDisplay_name() != null && notification.getAccount().getDisplay_name().length() > 0) + typeString = String.format("%s %s", Helper.shortnameToUnicode(notification.getAccount().getDisplay_name(), true),context.getString(R.string.notif_mention)); + else + typeString = String.format("@%s %s", notification.getAccount().getAcct(),context.getString(R.string.notif_mention)); break; case "reblog": - typeString = String.format("@%s %s", notification.getAccount().getAcct(),context.getString(R.string.notif_reblog)); + if( notification.getAccount().getDisplay_name() != null && notification.getAccount().getDisplay_name().length() > 0) + typeString = String.format("%s %s", Helper.shortnameToUnicode(notification.getAccount().getDisplay_name(), true),context.getString(R.string.notif_reblog)); + else + typeString = String.format("@%s %s", notification.getAccount().getAcct(),context.getString(R.string.notif_reblog)); break; case "favourite": - typeString = String.format("@%s %s", notification.getAccount().getAcct(),context.getString(R.string.notif_favourite)); + if( notification.getAccount().getDisplay_name() != null && notification.getAccount().getDisplay_name().length() > 0) + typeString = String.format("%s %s", Helper.shortnameToUnicode(notification.getAccount().getDisplay_name(), true),context.getString(R.string.notif_favourite)); + else + typeString = String.format("@%s %s", notification.getAccount().getAcct(),context.getString(R.string.notif_favourite)); break; case "follow": - typeString = String.format("@%s %s", notification.getAccount().getAcct(),context.getString(R.string.notif_follow)); + if( notification.getAccount().getDisplay_name() != null && notification.getAccount().getDisplay_name().length() > 0) + typeString = String.format("%s %s", Helper.shortnameToUnicode(notification.getAccount().getDisplay_name(), true),context.getString(R.string.notif_follow)); + else + typeString = String.format("@%s %s", notification.getAccount().getAcct(),context.getString(R.string.notif_follow)); break; } holder.notification_type.setText(typeString); @@ -191,13 +202,13 @@ public class NotificationsListAdapter extends BaseAdapter implements OnPostActio if( (status.getIn_reply_to_account_id() != null && !status.getIn_reply_to_account_id().equals("null")) || (status.getIn_reply_to_id() != null && !status.getIn_reply_to_id().equals("null")) ){ Drawable img = ContextCompat.getDrawable(context, R.drawable.ic_reply); img.setBounds(0,0,(int) (20 * scale + 0.5f),(int) (15 * scale + 0.5f)); - holder.notification_account_displayname.setCompoundDrawables( img, null, null, null); + holder.notification_account_username.setCompoundDrawables( img, null, null, null); }else if( status.isReblogged()){ Drawable img = ContextCompat.getDrawable(context, R.drawable.ic_retweet); img.setBounds(0,0,(int) (20 * scale + 0.5f),(int) (15 * scale + 0.5f)); - holder.notification_account_displayname.setCompoundDrawables( img, null, null, null); + holder.notification_account_username.setCompoundDrawables( img, null, null, null); }else{ - holder.notification_account_displayname.setCompoundDrawables( null, null, null, null); + holder.notification_account_username.setCompoundDrawables( null, null, null, null); } SpannableString spannableString = Helper.clickableElements(context, status.getContent(), @@ -329,7 +340,6 @@ public class NotificationsListAdapter extends BaseAdapter implements OnPostActio displayConfirmationNotificationDialog(notification); } }); - holder.notification_account_displayname.setText(Helper.shortnameToUnicode(notification.getAccount().getDisplay_name(), true)); holder.notification_account_username.setText( String.format("@%s",notification.getAccount().getUsername())); //Profile picture imageLoader.displayImage(notification.getAccount().getAvatar(), holder.notification_account_profile, options); @@ -487,7 +497,6 @@ public class NotificationsListAdapter extends BaseAdapter implements OnPostActio TextView notification_status_content; TextView notification_type; TextView notification_account_username; - TextView notification_account_displayname; ImageView notification_account_profile; ImageView notification_delete; TextView status_favorite_count; diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/SearchListAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/SearchListAdapter.java index 23b339ddd..5d0b7b78a 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/SearchListAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/SearchListAdapter.java @@ -123,7 +123,8 @@ public class SearchListAdapter extends BaseAdapter { .denyCacheImageMultipleSizesInMemory() .diskCache(new UnlimitedDiskCache(cacheDir)) .build(); - imageLoader.init(configImg); + if( !imageLoader.isInited()) + imageLoader.init(configImg); DisplayImageOptions options = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) .cacheOnDisk(true).resetViewBeforeLoading(true).build(); int type = getItemViewType(position); diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java index c0d013ea4..1b5c65ec3 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java @@ -142,7 +142,8 @@ public class StatusListAdapter extends BaseAdapter implements OnPostActionInterf .denyCacheImageMultipleSizesInMemory() .diskCache(new UnlimitedDiskCache(cacheDir)) .build(); - imageLoader.init(configImg); + if( !imageLoader.isInited()) + imageLoader.init(configImg); options = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) .cacheOnDisk(true).resetViewBeforeLoading(true).build(); diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayAccountsFragment.java b/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayAccountsFragment.java index 650b7bd0b..d8e93fb69 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayAccountsFragment.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayAccountsFragment.java @@ -118,7 +118,11 @@ public class DisplayAccountsFragment extends Fragment implements OnRetrieveAccou @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - if (view.getId() == lv_accounts.getId() && totalItemCount > visibleItemCount) { + if(firstVisibleItem == 0 && Helper.listIsAtTop(lv_accounts)){ + Intent intent = new Intent(Helper.HEADER_ACCOUNT+instanceValue); + intent.putExtra("hide", false); + LocalBroadcastManager.getInstance(context).sendBroadcast(intent); + }else if (view.getId() == lv_accounts.getId() && totalItemCount > visibleItemCount) { final int currentFirstVisibleItem = lv_accounts.getFirstVisiblePosition(); if (currentFirstVisibleItem > lastFirstVisibleItem) { diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayStatusFragment.java b/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayStatusFragment.java index 0497acda3..e1b574641 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayStatusFragment.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayStatusFragment.java @@ -128,9 +128,13 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - if (view.getId() == lv_status.getId() && totalItemCount > visibleItemCount) { - final int currentFirstVisibleItem = lv_status.getFirstVisiblePosition(); + if(firstVisibleItem == 0 && Helper.listIsAtTop(lv_status)){ + Intent intent = new Intent(Helper.HEADER_ACCOUNT+instanceValue); + intent.putExtra("hide", false); + LocalBroadcastManager.getInstance(context).sendBroadcast(intent); + }else if (view.getId() == lv_status.getId() && totalItemCount > visibleItemCount) { + final int currentFirstVisibleItem = lv_status.getFirstVisiblePosition(); if (currentFirstVisibleItem > lastFirstVisibleItem) { Intent intent = new Intent(Helper.HEADER_ACCOUNT+instanceValue); intent.putExtra("hide", true); @@ -231,7 +235,6 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn } - @Override public void onCreate(Bundle saveInstance) { diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/helper/Helper.java b/app/src/main/java/fr/gouv/etalab/mastodon/helper/Helper.java index ec60b3b99..3260ebceb 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/helper/Helper.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/helper/Helper.java @@ -56,6 +56,7 @@ import android.text.method.ArrowKeyMovementMethod; import android.text.method.LinkMovementMethod; import android.text.style.ClickableSpan; import android.util.DisplayMetrics; +import android.util.Patterns; import android.view.Menu; import android.view.MenuItem; import android.view.SubMenu; @@ -67,6 +68,7 @@ import android.webkit.URLUtil; import android.webkit.WebSettings; import android.webkit.WebView; import android.widget.ImageView; +import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; @@ -226,7 +228,7 @@ public class Helper { private static final Pattern SHORTNAME_PATTERN = Pattern.compile(":([-+\\w]+):"); private static final Pattern urlPattern = Pattern.compile( - "(?i)\\b((?:[a-z][\\w-]+:(?:/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’]))", + "(?i)\\b((?:[a-z][\\w-]+:(?:/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,10}/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’]))", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); private static final Pattern hashtagPattern = Pattern.compile("(#[\\w_À-ú-]{1,})"); @@ -1023,7 +1025,7 @@ public class Helper { SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); boolean embedded_browser = sharedpreferences.getBoolean(Helper.SET_EMBEDDED_BROWSER, true); if( embedded_browser){ - Matcher matcher = urlPattern.matcher(spannableString); + Matcher matcher = Patterns.WEB_URL.matcher(spannableString); while (matcher.find()){ int matchStart = matcher.start(1); int matchEnd = matcher.end(); @@ -1033,7 +1035,10 @@ public class Helper { public void onClick(View textView) { Intent intent = new Intent(context, WebviewActivity.class); Bundle b = new Bundle(); - b.putString("url", url); + String finalUrl = url; + if( !url.startsWith("http://") && ! url.startsWith("https://")) + finalUrl = "http://" + url; + b.putString("url", finalUrl); intent.putExtras(b); context.startActivity(intent); } @@ -1098,14 +1103,6 @@ public class Helper { }, matchStart, matchEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); } return spannableString; - /* - statusTV.setText(spannableString, TextView.BufferType.SPANNABLE); - statusTV.setMovementMethod(null); - statusTV.setMovementMethod(LinkMovementMethod.getInstance()); - statusTV.setMovementMethod(ArrowKeyMovementMethod.getInstance()); - statusTV.setFocusable(true); - statusTV.setFocusableInTouchMode(true); - return statusTV;*/ } @@ -1115,11 +1112,10 @@ public class Helper { * Click on url => webview or external app * Click on tag => HashTagActivity * @param context Context - * @param statusTV Textview * @param fullContent String, should be the st * @return TextView */ - public static TextView clickableElementsDescription(final Context context, TextView statusTV, String fullContent) { + public static SpannableString clickableElementsDescription(final Context context, String fullContent) { SpannableString spannableString; fullContent = Helper.shortnameToUnicode(fullContent, true); @@ -1131,7 +1127,7 @@ public class Helper { SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); boolean embedded_browser = sharedpreferences.getBoolean(Helper.SET_EMBEDDED_BROWSER, true); if( embedded_browser){ - Matcher matcher = urlPattern.matcher(spannableString); + Matcher matcher = Patterns.WEB_URL.matcher(spannableString); while (matcher.find()){ int matchStart = matcher.start(1); int matchEnd = matcher.end(); @@ -1172,11 +1168,7 @@ public class Helper { } }, matchStart, matchEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); } - - statusTV.setText(spannableString, TextView.BufferType.SPANNABLE); - statusTV.setMovementMethod(null); - statusTV.setMovementMethod(LinkMovementMethod.getInstance()); - return statusTV; + return spannableString; } @@ -1398,4 +1390,13 @@ public class Helper { } } } + + /** + * Returns true if a ListView is at its top position + * @param listView ListView + * @return boolean + */ + public static boolean listIsAtTop(ListView listView) { + return listView.getChildCount() == 0 || listView.getChildAt(0).getTop() == 0; + } } diff --git a/app/src/main/res/drawable-hdpi/ic_unlock_alt.png b/app/src/main/res/drawable-hdpi/ic_unlock_alt.png new file mode 100644 index 000000000..d2c8b39c4 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_unlock_alt.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_user_plus.png b/app/src/main/res/drawable-hdpi/ic_user_plus.png new file mode 100644 index 000000000..46cfb9fe8 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_user_plus.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_user_times.png b/app/src/main/res/drawable-hdpi/ic_user_times.png new file mode 100644 index 000000000..bd7fd96d1 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_user_times.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_volume_up.png b/app/src/main/res/drawable-hdpi/ic_volume_up.png new file mode 100644 index 000000000..40d6ab336 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_volume_up.png differ diff --git a/app/src/main/res/drawable-ldpi/ic_unlock_alt.png b/app/src/main/res/drawable-ldpi/ic_unlock_alt.png new file mode 100644 index 000000000..dec603821 Binary files /dev/null and b/app/src/main/res/drawable-ldpi/ic_unlock_alt.png differ diff --git a/app/src/main/res/drawable-ldpi/ic_user_plus.png b/app/src/main/res/drawable-ldpi/ic_user_plus.png new file mode 100644 index 000000000..805a8d518 Binary files /dev/null and b/app/src/main/res/drawable-ldpi/ic_user_plus.png differ diff --git a/app/src/main/res/drawable-ldpi/ic_user_times.png b/app/src/main/res/drawable-ldpi/ic_user_times.png new file mode 100644 index 000000000..bc2407a11 Binary files /dev/null and b/app/src/main/res/drawable-ldpi/ic_user_times.png differ diff --git a/app/src/main/res/drawable-ldpi/ic_volume_up.png b/app/src/main/res/drawable-ldpi/ic_volume_up.png new file mode 100644 index 000000000..fb40f5156 Binary files /dev/null and b/app/src/main/res/drawable-ldpi/ic_volume_up.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_unlock_alt.png b/app/src/main/res/drawable-mdpi/ic_unlock_alt.png new file mode 100644 index 000000000..ea52dd15b Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_unlock_alt.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_user_plus.png b/app/src/main/res/drawable-mdpi/ic_user_plus.png new file mode 100644 index 000000000..3f6c75c56 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_user_plus.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_user_times.png b/app/src/main/res/drawable-mdpi/ic_user_times.png new file mode 100644 index 000000000..bf5ce0a0d Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_user_times.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_volume_up.png b/app/src/main/res/drawable-mdpi/ic_volume_up.png new file mode 100644 index 000000000..2994a3601 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_volume_up.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_unlock_alt.png b/app/src/main/res/drawable-xhdpi/ic_unlock_alt.png new file mode 100644 index 000000000..c730ebe04 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_unlock_alt.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_user_plus.png b/app/src/main/res/drawable-xhdpi/ic_user_plus.png new file mode 100644 index 000000000..77c482e5b Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_user_plus.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_user_times.png b/app/src/main/res/drawable-xhdpi/ic_user_times.png new file mode 100644 index 000000000..5706fab20 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_user_times.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_volume_up.png b/app/src/main/res/drawable-xhdpi/ic_volume_up.png new file mode 100644 index 000000000..6a25403e6 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_volume_up.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_unlock_alt.png b/app/src/main/res/drawable-xxhdpi/ic_unlock_alt.png new file mode 100644 index 000000000..4f3616892 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_unlock_alt.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_user_plus.png b/app/src/main/res/drawable-xxhdpi/ic_user_plus.png new file mode 100644 index 000000000..e1f60cc22 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_user_plus.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_user_times.png b/app/src/main/res/drawable-xxhdpi/ic_user_times.png new file mode 100644 index 000000000..37aa2dea1 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_user_times.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_volume_up.png b/app/src/main/res/drawable-xxhdpi/ic_volume_up.png new file mode 100644 index 000000000..3ea051411 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_volume_up.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_unlock_alt.png b/app/src/main/res/drawable-xxxhdpi/ic_unlock_alt.png new file mode 100644 index 000000000..98052c59e Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_unlock_alt.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_user_plus.png b/app/src/main/res/drawable-xxxhdpi/ic_user_plus.png new file mode 100644 index 000000000..ffa613901 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_user_plus.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_user_times.png b/app/src/main/res/drawable-xxxhdpi/ic_user_times.png new file mode 100644 index 000000000..f46ae8a7e Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_user_times.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_volume_up.png b/app/src/main/res/drawable-xxxhdpi/ic_volume_up.png new file mode 100644 index 000000000..0d55e0f24 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_volume_up.png differ diff --git a/app/src/main/res/layout/activity_show_account.xml b/app/src/main/res/layout/activity_show_account.xml index f72fe067f..199f81efb 100644 --- a/app/src/main/res/layout/activity_show_account.xml +++ b/app/src/main/res/layout/activity_show_account.xml @@ -17,96 +17,108 @@ --> + android:orientation="vertical"> - + android:orientation="vertical"> + android:id="@+id/header_container" + android:layout_marginTop="5dp" + android:layout_width="match_parent" + android:gravity="center" + android:orientation="horizontal" + android:layout_height="wrap_content" + > + - + + android:gravity="center" + android:layout_marginTop="5dp" + android:orientation="horizontal"> + + + + + + /> - - -