瀏覽代碼

Add nice transition effects & optimise

Signed-off-by: Mario Danic <mario@lovelyhq.com>
Mario Danic 6 年之前
父節點
當前提交
4ee88e0b17

+ 0 - 1
app/src/main/java/com/nextcloud/talk/activities/BaseActivity.java

@@ -138,5 +138,4 @@ public class BaseActivity extends AppCompatActivity {
         super.onStop();
         eventBus.unregister(this);
     }
-
 }

+ 16 - 9
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);
         }

+ 8 - 3
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<String> 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();

+ 2 - 0
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();

+ 94 - 0
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 <mario@lovelyhq.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 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<String> names;
+
+    public SharedElementTransition() {
+        names = new ArrayList<>();
+    }
+
+    public SharedElementTransition(ArrayList<String> 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<String> 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);
+        }
+    }
+}

+ 25 - 0
app/src/main/res/drawable/ic_info_white_24dp.xml

@@ -0,0 +1,25 @@
+<!--
+  ~ Nextcloud Talk application
+  ~
+  ~ @author Mario Danic
+  ~ Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.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/>.
+  -->
+
+<vector android:autoMirrored="true" android:height="24dp"
+    android:tint="#FFFFFF" android:viewportHeight="24.0"
+    android:viewportWidth="24.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="#FF000000" android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,17h-2v-6h2v6zM13,9h-2L11,7h2v2z"/>
+</vector>

+ 2 - 1
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" />
 
             <TextView
                 android:id="@+id/display_name_text"

+ 1 - 0
app/src/main/res/menu/menu_contacts.xml

@@ -32,6 +32,7 @@
     <item
         android:id="@+id/contacts_selection_done"
         android:title="@string/nc_contacts_done"
+        android:transitionName="userAvatar.transitionTag"
         android:visible="false"
         app:showAsAction="always" />
 </menu>

+ 7 - 0
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" />
+
+    <item
+        android:id="@+id/conversation_info"
+        android:icon="@drawable/ic_info_white_24dp"
+        android:orderInCategory="1"
+        android:title="@string/nc_conversation_menu_conversation_info"
+        app:showAsAction="never|withText" />
 </menu>

+ 2 - 0
app/src/main/res/values/styles.xml

@@ -6,5 +6,7 @@
         <item name="colorPrimary">@color/colorPrimary</item>
         <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
         <item name="colorAccent">@color/colorPrimary</item>
+        <item name="android:panelFullBackground">@color/colorPrimary</item>
+        <item name="android:itemBackground">@color/colorPrimary</item>
     </style>
 </resources>