From 4ee88e0b17b72c5bd3fcfed445012a6a9cd426d9 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Wed, 2 Jan 2019 00:41:35 +0100 Subject: [PATCH] Add nice transition effects & optimise Signed-off-by: Mario Danic --- .../talk/activities/BaseActivity.java | 1 - .../talk/controllers/ChatController.java | 25 +++-- .../ConversationsListController.java | 11 ++- .../talk/controllers/SettingsController.java | 2 + .../animations/SharedElementTransition.java | 94 +++++++++++++++++++ .../main/res/drawable/ic_info_white_24dp.xml | 25 +++++ .../main/res/layout/controller_settings.xml | 3 +- app/src/main/res/menu/menu_contacts.xml | 1 + app/src/main/res/menu/menu_conversation.xml | 7 ++ app/src/main/res/values/styles.xml | 2 + 10 files changed, 157 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/com/nextcloud/talk/utils/animations/SharedElementTransition.java create mode 100644 app/src/main/res/drawable/ic_info_white_24dp.xml diff --git a/app/src/main/java/com/nextcloud/talk/activities/BaseActivity.java b/app/src/main/java/com/nextcloud/talk/activities/BaseActivity.java index 1636b78f9..537f9cc01 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/BaseActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/BaseActivity.java @@ -138,5 +138,4 @@ public class BaseActivity extends AppCompatActivity { super.onStop(); eventBus.unregister(this); } - } diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java index b0f0c553c..36629219b 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java @@ -109,6 +109,7 @@ import java.util.concurrent.TimeUnit; import javax.inject.Inject; import androidx.annotation.NonNull; +import androidx.core.view.ViewCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import autodagger.AutoInjector; @@ -421,15 +422,7 @@ public class ChatController extends BaseController implements MessagesListAdapte .getString(R.string.nc_description_send_message_button)); if (conversationUser.hasSpreedCapabilityWithName("mention-flag") && getActivity() != null) { - getActivity().findViewById(R.id.toolbar).setOnClickListener(v -> { - Bundle bundle = new Bundle(); - bundle.putParcelable(BundleKeys.KEY_USER_ENTITY, Parcels.wrap(conversationUser)); - bundle.putString(BundleKeys.KEY_BASE_URL, baseUrl); - bundle.putString(BundleKeys.KEY_ROOM_TOKEN, roomToken); - getRouter().pushController((RouterTransaction.with(new ConversationInfoController(bundle)) - .pushChangeHandler(new HorizontalChangeHandler()) - .popChangeHandler(new HorizontalChangeHandler()))); - }); + getActivity().findViewById(R.id.toolbar).setOnClickListener(v -> showConversationInfoScreen()); } if (adapterWasNull) { @@ -446,6 +439,17 @@ public class ChatController extends BaseController implements MessagesListAdapte } + private void showConversationInfoScreen() { + Bundle bundle = new Bundle(); + bundle.putParcelable(BundleKeys.KEY_USER_ENTITY, Parcels.wrap(conversationUser)); + bundle.putString(BundleKeys.KEY_BASE_URL, baseUrl); + bundle.putString(BundleKeys.KEY_ROOM_TOKEN, roomToken); + getRouter().pushController((RouterTransaction.with(new ConversationInfoController(bundle)) + .pushChangeHandler(new HorizontalChangeHandler()) + .popChangeHandler(new HorizontalChangeHandler()))); + + } + private void setupMentionAutocomplete() { float elevation = 6f; Drawable backgroundDrawable = new ColorDrawable(Color.WHITE); @@ -986,6 +990,9 @@ public class ChatController extends BaseController implements MessagesListAdapte case R.id.conversation_voice_call: startACall(true); return true; + case R.id.conversation_info: + showConversationInfoScreen(); + return true; default: return super.onOptionsItemSelected(item); } diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java index 52d4d8e40..a87ead9bb 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java @@ -40,7 +40,9 @@ import android.widget.ProgressBar; import android.widget.RelativeLayout; import com.bluelinelabs.conductor.RouterTransaction; +import com.bluelinelabs.conductor.changehandler.FadeChangeHandler; import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler; +import com.bluelinelabs.conductor.changehandler.TransitionChangeHandlerCompat; import com.bluelinelabs.conductor.changehandler.VerticalChangeHandler; import com.bluelinelabs.conductor.internal.NoOpControllerChangeHandler; import com.bumptech.glide.load.model.GlideUrl; @@ -68,6 +70,7 @@ import com.nextcloud.talk.models.json.rooms.Conversation; import com.nextcloud.talk.utils.ApiUtils; import com.nextcloud.talk.utils.DisplayUtils; import com.nextcloud.talk.utils.KeyboardUtils; +import com.nextcloud.talk.utils.animations.SharedElementTransition; import com.nextcloud.talk.utils.bundle.BundleKeys; import com.nextcloud.talk.utils.database.user.UserUtils; import com.nextcloud.talk.utils.glide.GlideApp; @@ -88,6 +91,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.widget.SearchView; import androidx.core.view.MenuItemCompat; +import androidx.core.view.ViewCompat; import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; @@ -250,9 +254,11 @@ public class ConversationsListController extends BaseController implements Searc public boolean onOptionsItemSelected(@NonNull MenuItem item) { switch (item.getItemId()) { case R.id.action_settings: + ArrayList names = new ArrayList<>(); + names.add("userAvatar.transitionTag"); getRouter().pushController((RouterTransaction.with(new SettingsController()) - .pushChangeHandler(new VerticalChangeHandler()) - .popChangeHandler(new VerticalChangeHandler()))); + .pushChangeHandler(new TransitionChangeHandlerCompat(new SharedElementTransition(names), new VerticalChangeHandler())) + .popChangeHandler(new TransitionChangeHandlerCompat(new SharedElementTransition(names), new VerticalChangeHandler())))); return true; default: return super.onOptionsItemSelected(item); @@ -262,7 +268,6 @@ public class ConversationsListController extends BaseController implements Searc @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); - inflater.inflate(R.menu.menu_conversation_plus_filter, menu); searchItem = menu.findItem(R.id.action_search); initSearchView(); diff --git a/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java b/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java index 5989c6130..9a217c4d6 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java @@ -81,6 +81,7 @@ import javax.inject.Inject; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.view.ViewCompat; import androidx.work.OneTimeWorkRequest; import androidx.work.WorkManager; import autodagger.AutoInjector; @@ -190,6 +191,7 @@ public class SettingsController extends BaseController { super.onViewBound(view); setHasOptionsMenu(true); + ViewCompat.setTransitionName(avatarImageView, "userAvatar.transitionTag"); NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this); getCurrentUser(); diff --git a/app/src/main/java/com/nextcloud/talk/utils/animations/SharedElementTransition.java b/app/src/main/java/com/nextcloud/talk/utils/animations/SharedElementTransition.java new file mode 100644 index 000000000..94842a7f7 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/utils/animations/SharedElementTransition.java @@ -0,0 +1,94 @@ +/* + * Nextcloud Talk application + * + * @author Mario Danic + * Copyright (C) 2017-2018 Mario Danic + * + * 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 . + */ + +package com.nextcloud.talk.utils.animations; + +import android.os.Bundle; +import android.transition.ChangeBounds; +import android.transition.ChangeClipBounds; +import android.transition.ChangeTransform; +import android.transition.Explode; +import android.transition.Fade; +import android.transition.Slide; +import android.transition.Transition; +import android.transition.TransitionSet; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; + +import com.bluelinelabs.conductor.changehandler.SharedElementTransitionChangeHandler; + +import java.util.ArrayList; +import java.util.List; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +public class SharedElementTransition extends SharedElementTransitionChangeHandler { + private static final String KEY_WAIT_FOR_TRANSITION_NAMES = "SharedElementTransition.names"; + + private final ArrayList names; + + public SharedElementTransition() { + names = new ArrayList<>(); + } + + public SharedElementTransition(ArrayList names) { + this.names = names; + } + + @Override + public void saveToBundle(@NonNull Bundle bundle) { + bundle.putStringArrayList(KEY_WAIT_FOR_TRANSITION_NAMES, names); + } + + @Override + public void restoreFromBundle(@NonNull Bundle bundle) { + List savedNames = bundle.getStringArrayList(KEY_WAIT_FOR_TRANSITION_NAMES); + if (savedNames != null) { + names.addAll(savedNames); + } + } + + @Nullable + public Transition getExitTransition(@NonNull ViewGroup container, @Nullable View from, @Nullable View to, boolean isPush) { + return new Fade(Fade.OUT); + } + + @Override + @Nullable + public Transition getSharedElementTransition(@NonNull ViewGroup container, @Nullable View from, @Nullable View to, boolean isPush) { + return new TransitionSet().addTransition(new ChangeBounds()).addTransition(new ChangeClipBounds()).addTransition(new ChangeTransform()); + } + + @Override + @Nullable + public Transition getEnterTransition(@NonNull ViewGroup container, @Nullable View from, @Nullable View to, boolean isPush) { + return new Fade(Fade.IN); + } + + @Override + public void configureSharedElements(@NonNull ViewGroup container, @Nullable View from, @Nullable View to, boolean isPush) { + for (String name : names) { + addSharedElement(name); + //waitOnSharedElementNamed(name); + } + } +} diff --git a/app/src/main/res/drawable/ic_info_white_24dp.xml b/app/src/main/res/drawable/ic_info_white_24dp.xml new file mode 100644 index 000000000..feb198567 --- /dev/null +++ b/app/src/main/res/drawable/ic_info_white_24dp.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/app/src/main/res/layout/controller_settings.xml b/app/src/main/res/layout/controller_settings.xml index 3875b355f..46f7fb650 100644 --- a/app/src/main/res/layout/controller_settings.xml +++ b/app/src/main/res/layout/controller_settings.xml @@ -50,7 +50,8 @@ android:id="@+id/avatar_image" android:layout_width="@dimen/avatar_size_big" android:layout_height="@dimen/avatar_size_big" - android:layout_centerHorizontal="true" /> + android:layout_centerHorizontal="true" + android:transitionName="userAvatar.transitionTag" /> \ No newline at end of file diff --git a/app/src/main/res/menu/menu_conversation.xml b/app/src/main/res/menu/menu_conversation.xml index 16bd5262f..a6f7be396 100644 --- a/app/src/main/res/menu/menu_conversation.xml +++ b/app/src/main/res/menu/menu_conversation.xml @@ -34,4 +34,11 @@ android:orderInCategory="1" android:title="@string/nc_conversation_menu_video_call" app:showAsAction="ifRoom|withText" /> + + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index e2aa1b45f..fdc907d33 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -6,5 +6,7 @@ @color/colorPrimary @color/colorPrimaryDark @color/colorPrimary + @color/colorPrimary + @color/colorPrimary