diff --git a/app/src/common/shared/com/igalia/wolvic/ui/widgets/NavigationBarWidget.java b/app/src/common/shared/com/igalia/wolvic/ui/widgets/NavigationBarWidget.java index 06151a90f8..9c97234493 100644 --- a/app/src/common/shared/com/igalia/wolvic/ui/widgets/NavigationBarWidget.java +++ b/app/src/common/shared/com/igalia/wolvic/ui/widgets/NavigationBarWidget.java @@ -1291,7 +1291,16 @@ public void onPrivateBrowsingClicked() { } @Override - public void onLibraryClicked() { + public void onBookmarksClicked() { + onLibraryClicked(); + } + + @Override + public void onDownloadsClicked() { + onLibraryClicked(); + } + + private void onLibraryClicked() { if (mAttachedWindow.isResizing()) { exitResizeMode(ResizeAction.RESTORE_SIZE); diff --git a/app/src/common/shared/com/igalia/wolvic/ui/widgets/TrayListener.java b/app/src/common/shared/com/igalia/wolvic/ui/widgets/TrayListener.java index ea7d96861a..82d51d684d 100644 --- a/app/src/common/shared/com/igalia/wolvic/ui/widgets/TrayListener.java +++ b/app/src/common/shared/com/igalia/wolvic/ui/widgets/TrayListener.java @@ -4,5 +4,6 @@ public interface TrayListener { default void onPrivateBrowsingClicked() {} default void onAddWindowClicked() {} default void onTabsClicked() {} - default void onLibraryClicked() {} + default void onBookmarksClicked() {} + default void onDownloadsClicked() {} } diff --git a/app/src/common/shared/com/igalia/wolvic/ui/widgets/TrayWidget.java b/app/src/common/shared/com/igalia/wolvic/ui/widgets/TrayWidget.java index 8b83af51ab..8c60006175 100644 --- a/app/src/common/shared/com/igalia/wolvic/ui/widgets/TrayWidget.java +++ b/app/src/common/shared/com/igalia/wolvic/ui/widgets/TrayWidget.java @@ -5,8 +5,6 @@ package com.igalia.wolvic.ui.widgets; -import android.animation.Animator; -import android.animation.ValueAnimator; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -27,7 +25,6 @@ import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; -import android.view.animation.AccelerateDecelerateInterpolator; import androidx.annotation.NonNull; import androidx.databinding.DataBindingUtil; @@ -217,13 +214,23 @@ public void updateUI() { notifyAddWindowClicked(); }); - mBinding.libraryButton.setOnHoverListener(mButtonScaleHoverListener); - mBinding.libraryButton.setOnClickListener(view -> { + mBinding.bookmarksButton.setOnHoverListener(mButtonScaleHoverListener); + mBinding.bookmarksButton.setOnClickListener(view -> { if (mAudio != null) { mAudio.playSound(AudioEngine.Sound.CLICK); } - notifyLibraryClicked(); + notifyBookmarksClicked(); + view.requestFocusFromTouch(); + }); + + mBinding.downloadsButton.setOnHoverListener(mButtonScaleHoverListener); + mBinding.downloadsButton.setOnClickListener(view -> { + if (mAudio != null) { + mAudio.playSound(AudioEngine.Sound.CLICK); + } + + notifyDownloadsClicked(); view.requestFocusFromTouch(); }); @@ -399,7 +406,7 @@ public void onConfigurationChanged(Configuration newConfig) { } private OnHoverListener mButtonScaleHoverListener = (view, motionEvent) -> { - UIButton button = (UIButton)view; + UIButton button = (UIButton) view; if (button.isActive() || button.isPrivate()) { return false; } @@ -407,14 +414,14 @@ public void onConfigurationChanged(Configuration newConfig) { int ev = motionEvent.getActionMasked(); switch (ev) { case MotionEvent.ACTION_HOVER_ENTER: - if (!view.isPressed() && ViewUtils.isInsideView(view, (int)motionEvent.getRawX(), (int)motionEvent.getRawY())) { - animateViewPadding(view, mMaxPadding, mMinPadding, ICON_ANIMATION_DURATION); + if (!button.isPressed() && ViewUtils.isInsideView(button, (int) motionEvent.getRawX(), (int) motionEvent.getRawY())) { + animateButtonPadding(button, mMinPadding, ICON_ANIMATION_DURATION); } return false; case MotionEvent.ACTION_HOVER_EXIT: - if (!ViewUtils.isInsideView(view, (int)motionEvent.getRawX(), (int)motionEvent.getRawY())) { - animateViewPadding(view, mMinPadding, mMaxPadding, ICON_ANIMATION_DURATION); + if (!ViewUtils.isInsideView(button, (int) motionEvent.getRawX(), (int) motionEvent.getRawY())) { + animateButtonPadding(button, mMaxPadding, ICON_ANIMATION_DURATION); } return false; } @@ -422,49 +429,31 @@ public void onConfigurationChanged(Configuration newConfig) { return false; }; - private void animateViewPadding(View view, int paddingStart, int paddingEnd, int duration) { - if (view.isPressed() || !mIsWindowAttached) { - view.setPadding(paddingEnd, paddingEnd, paddingEnd, paddingEnd); + // This animation assumes that the padding is always symmetrical. + private void animateButtonPadding(UIButton button, int paddingEnd, int duration) { + if (button.getPaddingLeft() == paddingEnd) { return; } - ValueAnimator animation = ValueAnimator.ofInt(paddingStart, paddingEnd); - animation.setDuration(duration); - animation.setInterpolator(new AccelerateDecelerateInterpolator()); - animation.addUpdateListener(valueAnimator -> { - try { - int newPadding = Integer.parseInt(valueAnimator.getAnimatedValue().toString()); - view.setPadding(newPadding, newPadding, newPadding, newPadding); - } - catch (NumberFormatException ex) { - Log.e(LOGTAG, "Error parsing tray animation value: " + valueAnimator.getAnimatedValue().toString()); - } - }); - animation.addListener(new Animator.AnimatorListener() { - - @Override - public void onAnimationStart(Animator animator) { - } - - @Override - public void onAnimationEnd(Animator animator) { - UIButton button = (UIButton)view; - if(button.isActive() || button.isPrivate()) { - view.setPadding(mMinPadding, mMinPadding, mMinPadding, mMinPadding); - } - } - - @Override - public void onAnimationCancel(Animator animator) { - - } - - @Override - public void onAnimationRepeat(Animator animator) { + if (button.isPressed() || !mIsWindowAttached) { + button.setPadding(paddingEnd, paddingEnd, paddingEnd, paddingEnd); + return; + } - } - }); - animation.start(); + int paddingStart = button.getPaddingLeft(); + button.animate() + .setDuration(duration) + .setUpdateListener(animation -> { + float progress = animation.getAnimatedFraction(); + int interpolatedPadding = (int) (paddingStart + progress * (paddingEnd - paddingStart)); + button.setPadding(interpolatedPadding, interpolatedPadding, interpolatedPadding, interpolatedPadding); + }) + .withEndAction(() -> { + if (button.isActive() || button.isPrivate()) { + button.setPadding(mMinPadding, mMinPadding, mMinPadding, mMinPadding); + } + }) + .start(); } public void addListeners(TrayListener... listeners) { @@ -490,9 +479,14 @@ private void notifyAddWindowClicked() { mTrayListeners.forEach(TrayListener::onAddWindowClicked); } - private void notifyLibraryClicked() { + private void notifyBookmarksClicked() { + hideNotifications(); + mTrayListeners.forEach(TrayListener::onBookmarksClicked); + } + + private void notifyDownloadsClicked() { hideNotifications(); - mTrayListeners.forEach(TrayListener::onLibraryClicked); + mTrayListeners.forEach(TrayListener::onDownloadsClicked); } @Override @@ -577,7 +571,7 @@ public void detachFromWindow() { mWidgetPlacement.parentHandle = -1; if (mViewModel != null) { - mViewModel.getIsNativeContentVisible().removeObserver(mIsNativeContentVisible); + mViewModel.getCurrentContentType().removeObserver(mCurrentContentTypeObserver); mViewModel.getIsPrivateSession().removeObserver(mIsPrivateSession); mViewModel = null; } @@ -600,7 +594,7 @@ public void attachToWindow(@NonNull WindowWidget aWindow) { (VRBrowserActivity)getContext(), ViewModelProvider.AndroidViewModelFactory.getInstance(((VRBrowserActivity) getContext()).getApplication())) .get(String.valueOf(mAttachedWindow.hashCode()), WindowViewModel.class); - mViewModel.getIsNativeContentVisible().observe((VRBrowserActivity)getContext(), mIsNativeContentVisible); + mViewModel.getCurrentContentType().observe((VRBrowserActivity) getContext(), mCurrentContentTypeObserver); mViewModel.getIsPrivateSession().observe((VRBrowserActivity)getContext(), mIsPrivateSession); mBinding.setViewmodel(mViewModel); @@ -610,14 +604,16 @@ public void attachToWindow(@NonNull WindowWidget aWindow) { mIsWindowAttached = true; } - private Observer mIsNativeContentVisible = aBoolean -> { - if (mBinding.libraryButton.isHovered()) { - return; - } - if (aBoolean.get()) { - animateViewPadding(mBinding.libraryButton, mMaxPadding, mMinPadding, ICON_ANIMATION_DURATION); + private Observer mCurrentContentTypeObserver = contentType -> { + if (contentType == Windows.ContentType.WEB_CONTENT) { + animateButtonPadding(mBinding.bookmarksButton, mMaxPadding, ICON_ANIMATION_DURATION); + animateButtonPadding(mBinding.downloadsButton, mMaxPadding, ICON_ANIMATION_DURATION); + } else if (contentType == Windows.ContentType.DOWNLOADS) { + animateButtonPadding(mBinding.bookmarksButton, mMaxPadding, ICON_ANIMATION_DURATION); + animateButtonPadding(mBinding.downloadsButton, mMinPadding, ICON_ANIMATION_DURATION); } else { - animateViewPadding(mBinding.libraryButton, mMinPadding, mMaxPadding, ICON_ANIMATION_DURATION); + animateButtonPadding(mBinding.bookmarksButton, mMinPadding, ICON_ANIMATION_DURATION); + animateButtonPadding(mBinding.downloadsButton, mMaxPadding, ICON_ANIMATION_DURATION); } }; @@ -626,9 +622,9 @@ public void attachToWindow(@NonNull WindowWidget aWindow) { return; } if (aBoolean.get()) { - animateViewPadding(mBinding.privateButton, mMaxPadding, mMinPadding, ICON_ANIMATION_DURATION); + animateButtonPadding(mBinding.privateButton, mMinPadding, ICON_ANIMATION_DURATION); } else { - animateViewPadding(mBinding.privateButton, mMinPadding, mMaxPadding, ICON_ANIMATION_DURATION); + animateButtonPadding(mBinding.privateButton, mMaxPadding, ICON_ANIMATION_DURATION); } }; @@ -683,16 +679,16 @@ public void showTabSentNotification() { } public void showBookmarkAddedNotification() { - showNotification(BOOKMARK_ADDED_NOTIFICATION_ID, mBinding.libraryButton, R.string.bookmarks_saved_notification); + showNotification(BOOKMARK_ADDED_NOTIFICATION_ID, mBinding.bookmarksButton, R.string.bookmarks_saved_notification); } public void showWebAppAddedNotification() { - showNotification(WEB_APP_ADDED_NOTIFICATION_ID, mBinding.libraryButton, R.string.web_apps_saved_notification); + showNotification(WEB_APP_ADDED_NOTIFICATION_ID, mBinding.bookmarksButton, R.string.web_apps_saved_notification); } public void showDownloadCompletedNotification(String filename) { showNotification(DOWNLOAD_COMPLETED_NOTIFICATION_ID, - mBinding.libraryButton, + mBinding.downloadsButton, getContext().getString(R.string.download_completed_notification, filename)); } @@ -747,7 +743,7 @@ public void onDownloadsUpdate(@NonNull List downloads) { long inProgressNum = downloads.stream().filter(item -> item.inProgress()).count(); mTrayViewModel.setDownloadsNumber((int)inProgressNum); if (inProgressNum == 0) { - mBinding.libraryButton.setLevel(0); + mBinding.downloadsButton.setLevel(0); } else { long size = downloads.stream() @@ -759,7 +755,7 @@ public void onDownloadsUpdate(@NonNull List downloads) { .sum(); if (size > 0) { long percent = downloaded*100/size; - mBinding.libraryButton.setLevel((int)percent*100); + mBinding.downloadsButton.setLevel((int) percent * 100); } } } diff --git a/app/src/common/shared/com/igalia/wolvic/ui/widgets/WindowWidget.java b/app/src/common/shared/com/igalia/wolvic/ui/widgets/WindowWidget.java index d1a6958361..821e68f731 100644 --- a/app/src/common/shared/com/igalia/wolvic/ui/widgets/WindowWidget.java +++ b/app/src/common/shared/com/igalia/wolvic/ui/widgets/WindowWidget.java @@ -489,6 +489,10 @@ public boolean isNativeContentVisible() { return mViewModel.getIsNativeContentVisible().getValue().get(); } + public Windows.ContentType getCurrentContentType() { + return mViewModel.getCurrentContentType().getValue(); + } + public int getWindowWidth() { return mWidgetPlacement.width; } diff --git a/app/src/common/shared/com/igalia/wolvic/ui/widgets/Windows.java b/app/src/common/shared/com/igalia/wolvic/ui/widgets/Windows.java index e806192b8b..7c65403cc5 100644 --- a/app/src/common/shared/com/igalia/wolvic/ui/widgets/Windows.java +++ b/app/src/common/shared/com/igalia/wolvic/ui/widgets/Windows.java @@ -1201,18 +1201,23 @@ public void onAddWindowClicked() { } @Override - public void onLibraryClicked() { - if (mFocusedWindow.isNativeContentVisible()) { + public void onBookmarksClicked() { + if (mFocusedWindow.getCurrentContentType() == ContentType.BOOKMARKS) { mFocusedWindow.hidePanel(); - - } else if (mDownloadsManager.isDownloading()) { - mFocusedWindow.showPanel(ContentType.DOWNLOADS); - } else { mFocusedWindow.showPanel(ContentType.BOOKMARKS); } } + @Override + public void onDownloadsClicked() { + if (mFocusedWindow.getCurrentContentType() == ContentType.DOWNLOADS) { + mFocusedWindow.hidePanel(); + } else { + mFocusedWindow.showPanel(ContentType.DOWNLOADS); + } + } + @Override public void onTabsClicked() { if (mTabsWidget == null) { diff --git a/app/src/main/res/layout/tray.xml b/app/src/main/res/layout/tray.xml index a72cc25096..f40dc00014 100644 --- a/app/src/main/res/layout/tray.xml +++ b/app/src/main/res/layout/tray.xml @@ -3,6 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tool="http://schemas.android.com/tools"> + @@ -14,7 +15,7 @@ + android:gravity="center"> + + + app:activeMode="@{viewmodel.currentContentType == ContentType.DOWNLOADS}"/> 0.25 -2.5 - 1.2 - 204dp + 1.4 + 244dp 66dp 1.0