Add nice transition effects & optimise

Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
Mario Danic 2019-01-02 00:41:35 +01:00
parent 43c0c6222e
commit 4ee88e0b17
10 changed files with 157 additions and 14 deletions

View File

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

View File

@ -109,6 +109,7 @@ import java.util.concurrent.TimeUnit;
import javax.inject.Inject; import javax.inject.Inject;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.core.view.ViewCompat;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import autodagger.AutoInjector; import autodagger.AutoInjector;
@ -421,15 +422,7 @@ public class ChatController extends BaseController implements MessagesListAdapte
.getString(R.string.nc_description_send_message_button)); .getString(R.string.nc_description_send_message_button));
if (conversationUser.hasSpreedCapabilityWithName("mention-flag") && getActivity() != null) { if (conversationUser.hasSpreedCapabilityWithName("mention-flag") && getActivity() != null) {
getActivity().findViewById(R.id.toolbar).setOnClickListener(v -> { getActivity().findViewById(R.id.toolbar).setOnClickListener(v -> 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())));
});
} }
if (adapterWasNull) { 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() { private void setupMentionAutocomplete() {
float elevation = 6f; float elevation = 6f;
Drawable backgroundDrawable = new ColorDrawable(Color.WHITE); Drawable backgroundDrawable = new ColorDrawable(Color.WHITE);
@ -986,6 +990,9 @@ public class ChatController extends BaseController implements MessagesListAdapte
case R.id.conversation_voice_call: case R.id.conversation_voice_call:
startACall(true); startACall(true);
return true; return true;
case R.id.conversation_info:
showConversationInfoScreen();
return true;
default: default:
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }

View File

@ -40,7 +40,9 @@ import android.widget.ProgressBar;
import android.widget.RelativeLayout; import android.widget.RelativeLayout;
import com.bluelinelabs.conductor.RouterTransaction; import com.bluelinelabs.conductor.RouterTransaction;
import com.bluelinelabs.conductor.changehandler.FadeChangeHandler;
import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler; import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler;
import com.bluelinelabs.conductor.changehandler.TransitionChangeHandlerCompat;
import com.bluelinelabs.conductor.changehandler.VerticalChangeHandler; import com.bluelinelabs.conductor.changehandler.VerticalChangeHandler;
import com.bluelinelabs.conductor.internal.NoOpControllerChangeHandler; import com.bluelinelabs.conductor.internal.NoOpControllerChangeHandler;
import com.bumptech.glide.load.model.GlideUrl; 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.ApiUtils;
import com.nextcloud.talk.utils.DisplayUtils; import com.nextcloud.talk.utils.DisplayUtils;
import com.nextcloud.talk.utils.KeyboardUtils; 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.bundle.BundleKeys;
import com.nextcloud.talk.utils.database.user.UserUtils; import com.nextcloud.talk.utils.database.user.UserUtils;
import com.nextcloud.talk.utils.glide.GlideApp; import com.nextcloud.talk.utils.glide.GlideApp;
@ -88,6 +91,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.widget.SearchView; import androidx.appcompat.widget.SearchView;
import androidx.core.view.MenuItemCompat; import androidx.core.view.MenuItemCompat;
import androidx.core.view.ViewCompat;
import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
@ -250,9 +254,11 @@ public class ConversationsListController extends BaseController implements Searc
public boolean onOptionsItemSelected(@NonNull MenuItem item) { public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.action_settings: case R.id.action_settings:
ArrayList<String> names = new ArrayList<>();
names.add("userAvatar.transitionTag");
getRouter().pushController((RouterTransaction.with(new SettingsController()) getRouter().pushController((RouterTransaction.with(new SettingsController())
.pushChangeHandler(new VerticalChangeHandler()) .pushChangeHandler(new TransitionChangeHandlerCompat(new SharedElementTransition(names), new VerticalChangeHandler()))
.popChangeHandler(new VerticalChangeHandler()))); .popChangeHandler(new TransitionChangeHandlerCompat(new SharedElementTransition(names), new VerticalChangeHandler()))));
return true; return true;
default: default:
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
@ -262,7 +268,6 @@ public class ConversationsListController extends BaseController implements Searc
@Override @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater); super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.menu_conversation_plus_filter, menu); inflater.inflate(R.menu.menu_conversation_plus_filter, menu);
searchItem = menu.findItem(R.id.action_search); searchItem = menu.findItem(R.id.action_search);
initSearchView(); initSearchView();

View File

@ -81,6 +81,7 @@ import javax.inject.Inject;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.core.view.ViewCompat;
import androidx.work.OneTimeWorkRequest; import androidx.work.OneTimeWorkRequest;
import androidx.work.WorkManager; import androidx.work.WorkManager;
import autodagger.AutoInjector; import autodagger.AutoInjector;
@ -190,6 +191,7 @@ public class SettingsController extends BaseController {
super.onViewBound(view); super.onViewBound(view);
setHasOptionsMenu(true); setHasOptionsMenu(true);
ViewCompat.setTransitionName(avatarImageView, "userAvatar.transitionTag");
NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this); NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this);
getCurrentUser(); getCurrentUser();

View File

@ -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);
}
}
}

View File

@ -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>

View File

@ -50,7 +50,8 @@
android:id="@+id/avatar_image" android:id="@+id/avatar_image"
android:layout_width="@dimen/avatar_size_big" android:layout_width="@dimen/avatar_size_big"
android:layout_height="@dimen/avatar_size_big" android:layout_height="@dimen/avatar_size_big"
android:layout_centerHorizontal="true" /> android:layout_centerHorizontal="true"
android:transitionName="userAvatar.transitionTag" />
<TextView <TextView
android:id="@+id/display_name_text" android:id="@+id/display_name_text"

View File

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

View File

@ -34,4 +34,11 @@
android:orderInCategory="1" android:orderInCategory="1"
android:title="@string/nc_conversation_menu_video_call" android:title="@string/nc_conversation_menu_video_call"
app:showAsAction="ifRoom|withText" /> 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> </menu>

View File

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