mirror of
https://github.com/nextcloud/talk-android
synced 2025-06-20 03:59:35 +01:00
Add nice transition effects & optimise
Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
parent
43c0c6222e
commit
4ee88e0b17
@ -138,5 +138,4 @@ public class BaseActivity extends AppCompatActivity {
|
|||||||
super.onStop();
|
super.onStop();
|
||||||
eventBus.unregister(this);
|
eventBus.unregister(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
||||||
|
@ -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
app/src/main/res/drawable/ic_info_white_24dp.xml
Normal file
25
app/src/main/res/drawable/ic_info_white_24dp.xml
Normal 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>
|
@ -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"
|
||||||
|
@ -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>
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
Loading…
Reference in New Issue
Block a user