Skip to content

Commit f8b68c4

Browse files
Merge pull request #2882 from nextcloud/feat/status-choosin
feat: status choosing
2 parents e7e2422 + 71492ac commit f8b68c4

39 files changed

+2013
-20
lines changed

app/build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,9 @@ dependencies {
152152
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
153153
implementation 'androidx.work:work-runtime:2.10.5'
154154
implementation 'com.google.android.material:material:1.13.0'
155+
156+
// Vanitech
157+
implementation 'com.vanniktech:emoji-google:0.21.0'
155158

156159
// Database
157160
implementation "androidx.room:room-runtime:${roomVersion}"

app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/AccountSwitcherDialog.java

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,34 @@
1414
import android.graphics.drawable.LayerDrawable;
1515
import android.net.Uri;
1616
import android.os.Bundle;
17+
import android.view.View;
1718

1819
import androidx.annotation.NonNull;
1920
import androidx.fragment.app.DialogFragment;
2021

2122
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
23+
import com.owncloud.android.lib.resources.users.Status;
24+
import com.owncloud.android.lib.resources.users.StatusType;
25+
26+
import java.util.concurrent.ExecutorService;
27+
import java.util.concurrent.Executors;
2228

2329
import it.niedermann.owncloud.notes.NotesApplication;
2430
import it.niedermann.owncloud.notes.R;
31+
import it.niedermann.owncloud.notes.accountswitcher.adapter.accountSwitcher.AccountSwitcherAdapter;
32+
import it.niedermann.owncloud.notes.accountswitcher.bottomSheet.AccountSwitcherBottomSheetTag;
33+
import it.niedermann.owncloud.notes.accountswitcher.repository.UserStatusRepository;
2534
import it.niedermann.owncloud.notes.branding.BrandedDialogFragment;
2635
import it.niedermann.owncloud.notes.branding.BrandingUtil;
2736
import it.niedermann.owncloud.notes.databinding.DialogAccountSwitcherBinding;
2837
import it.niedermann.owncloud.notes.manageaccounts.ManageAccountsActivity;
2938
import it.niedermann.owncloud.notes.persistence.NotesRepository;
3039
import it.niedermann.owncloud.notes.persistence.entity.Account;
3140
import it.niedermann.owncloud.notes.share.helper.AvatarLoader;
41+
import it.niedermann.owncloud.notes.shared.util.DisplayUtils;
42+
import it.niedermann.owncloud.notes.util.ActivityExtensionsKt;
43+
import it.niedermann.owncloud.notes.util.StatusTypeExtensionsKt;
44+
import kotlin.Unit;
3245

3346
/**
3447
* Displays all available {@link Account} entries and provides basic operations for them, like adding or switching
@@ -41,6 +54,9 @@ public class AccountSwitcherDialog extends BrandedDialogFragment {
4154
private DialogAccountSwitcherBinding binding;
4255
private AccountSwitcherListener accountSwitcherListener;
4356
private long currentAccountId;
57+
private UserStatusRepository repository;
58+
private Status currentStatus;
59+
private final ExecutorService executor = Executors.newSingleThreadExecutor();
4460

4561
@Override
4662
public void onAttach(@NonNull Context context) {
@@ -60,6 +76,38 @@ public void onAttach(@NonNull Context context) {
6076
}
6177

6278
repo = NotesRepository.getInstance(requireContext());
79+
initRepositoryAndFetchCurrentStatus();
80+
}
81+
82+
private void initRepositoryAndFetchCurrentStatus() {
83+
ActivityExtensionsKt.ssoAccount(requireActivity(), account -> {
84+
if (account != null) {
85+
repository = new UserStatusRepository(requireContext(), account);
86+
} else {
87+
DisplayUtils.showSnackMessage(requireView(), R.string.account_switch_dialog_status_fetching_error_message);
88+
}
89+
executor.execute(() -> {
90+
currentStatus = repository.fetchUserStatus();
91+
requireActivity().runOnUiThread(() -> {
92+
final var message = currentStatus.getMessage();
93+
if (message != null) {
94+
binding.accountStatus.setVisibility(View.VISIBLE);
95+
binding.accountStatus.setText(message);
96+
}
97+
98+
final var emoji = currentStatus.getIcon();
99+
if (emoji != null) {
100+
binding.accountStatusEmoji.setVisibility(View.VISIBLE);
101+
binding.accountStatusEmoji.setText(emoji);
102+
} else {
103+
final var status = currentStatus.getStatus();
104+
binding.accountStatusIcon.setVisibility(View.VISIBLE);
105+
binding.accountStatusIcon.setImageResource(StatusTypeExtensionsKt.getImageResource(status));
106+
}
107+
});
108+
});
109+
return Unit.INSTANCE;
110+
});
63111
}
64112

65113
@NonNull
@@ -76,6 +124,14 @@ public Dialog onCreateDialog(Bundle savedInstanceState) {
76124
AvatarLoader.INSTANCE.load(requireContext(), binding.currentAccountItemAvatar, currentLocalAccount);
77125
binding.accountLayout.setOnClickListener((v) -> dismiss());
78126

127+
binding.onlineStatus.setOnClickListener(v -> {
128+
showBottomSheetDialog(AccountSwitcherBottomSheetTag.ONLINE_STATUS);
129+
});
130+
131+
binding.statusMessage.setOnClickListener(v -> {
132+
showBottomSheetDialog(AccountSwitcherBottomSheetTag.MESSAGE_STATUS);
133+
});
134+
79135
final var adapter = new AccountSwitcherAdapter((localAccount -> {
80136
accountSwitcherListener.onAccountChosen(localAccount);
81137
dismiss();
@@ -112,6 +168,17 @@ public Dialog onCreateDialog(Bundle savedInstanceState) {
112168
return builder.create();
113169
}
114170

171+
private void showBottomSheetDialog(@NonNull AccountSwitcherBottomSheetTag tag) {
172+
if (repository == null || currentStatus == null) {
173+
DisplayUtils.showSnackMessage(requireView(), R.string.account_switch_dialog_status_fetching_error_message);
174+
return;
175+
}
176+
177+
final var fragment = tag.fragment(repository, currentStatus);
178+
fragment.show(requireActivity().getSupportFragmentManager(), tag.name());
179+
dismiss();
180+
}
181+
115182
public static DialogFragment newInstance(long currentAccountId) {
116183
final var dialog = new AccountSwitcherDialog();
117184

app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/AccountSwitcherAdapter.java renamed to app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/adapter/accountSwitcher/AccountSwitcherAdapter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* SPDX-FileCopyrightText: 2020 Stefan Niedermann <[email protected]>
66
* SPDX-License-Identifier: GPL-3.0-or-later
77
*/
8-
package it.niedermann.owncloud.notes.accountswitcher;
8+
package it.niedermann.owncloud.notes.accountswitcher.adapter.accountSwitcher;
99

1010
import android.view.LayoutInflater;
1111
import android.view.ViewGroup;

app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/AccountSwitcherViewHolder.java renamed to app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/adapter/accountSwitcher/AccountSwitcherViewHolder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* SPDX-FileCopyrightText: 2020-2021 Stefan Niedermann <[email protected]>
66
* SPDX-License-Identifier: GPL-3.0-or-later
77
*/
8-
package it.niedermann.owncloud.notes.accountswitcher;
8+
package it.niedermann.owncloud.notes.accountswitcher.adapter.accountSwitcher;
99

1010
import android.net.Uri;
1111
import android.view.View;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/*
2+
* Nextcloud Notes - Android Client
3+
*
4+
* SPDX-FileCopyrightText: 2022 Tim Krüger <[email protected]
5+
* SPDX-License-Identifier: GPL-3.0-or-later
6+
*/
7+
package it.niedermann.owncloud.notes.accountswitcher.adapter.predefinedStatus
8+
9+
import com.owncloud.android.lib.resources.users.PredefinedStatus
10+
11+
interface PredefinedStatusClickListener {
12+
fun onClick(predefinedStatus: PredefinedStatus)
13+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* Nextcloud Notes - Android Client
3+
*
4+
* SPDX-FileCopyrightText: 2020 Tobias Kaminsky <[email protected]>
5+
* SPDX-FileCopyrightText: 2020 Nextcloud GmbH
6+
* SPDX-License-Identifier: GPL-3.0-or-later
7+
*/
8+
package it.niedermann.owncloud.notes.accountswitcher.adapter.predefinedStatus
9+
10+
import android.content.Context
11+
import android.view.LayoutInflater
12+
import android.view.ViewGroup
13+
import androidx.recyclerview.widget.RecyclerView
14+
import com.owncloud.android.lib.resources.users.PredefinedStatus
15+
import it.niedermann.owncloud.notes.databinding.PredefinedStatusBinding
16+
17+
class PredefinedStatusListAdapter(private val clickListener: PredefinedStatusClickListener, val context: Context) :
18+
RecyclerView.Adapter<PredefinedStatusViewHolder>() {
19+
internal var list: List<PredefinedStatus> = emptyList()
20+
21+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PredefinedStatusViewHolder {
22+
val itemBinding = PredefinedStatusBinding.inflate(LayoutInflater.from(parent.context), parent, false)
23+
return PredefinedStatusViewHolder(itemBinding)
24+
}
25+
26+
override fun onBindViewHolder(holder: PredefinedStatusViewHolder, position: Int) {
27+
holder.bind(list[position], clickListener, context)
28+
}
29+
30+
override fun getItemCount(): Int = list.size
31+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* Nextcloud Notes - Android Client
3+
*
4+
* SPDX-FileCopyrightText: 2020 Tobias Kaminsky <[email protected]>
5+
* SPDX-FileCopyrightText: 2020 Nextcloud GmbH
6+
* SPDX-License-Identifier: GPL-3.0-or-later
7+
*/
8+
package it.niedermann.owncloud.notes.accountswitcher.adapter.predefinedStatus
9+
10+
import android.content.Context
11+
import androidx.recyclerview.widget.RecyclerView
12+
import com.owncloud.android.lib.resources.users.PredefinedStatus
13+
import it.niedermann.owncloud.notes.R
14+
import it.niedermann.owncloud.notes.databinding.PredefinedStatusBinding
15+
import it.niedermann.owncloud.notes.shared.util.DisplayUtils
16+
17+
private const val ONE_SECOND_IN_MILLIS = 1000
18+
19+
class PredefinedStatusViewHolder(private val binding: PredefinedStatusBinding) : RecyclerView.ViewHolder(binding.root) {
20+
21+
fun bind(status: PredefinedStatus, clickListener: PredefinedStatusClickListener, context: Context) {
22+
binding.root.setOnClickListener { clickListener.onClick(status) }
23+
binding.icon.text = status.icon
24+
binding.name.text = status.message
25+
26+
if (status.clearAt == null) {
27+
binding.clearAt.text = context.getString(R.string.dontClear)
28+
} else {
29+
val clearAt = status.clearAt
30+
if (clearAt?.type == "period") {
31+
binding.clearAt.text = DisplayUtils.getRelativeTimestamp(
32+
context,
33+
System.currentTimeMillis() + clearAt.time.toInt() * ONE_SECOND_IN_MILLIS,
34+
true
35+
)
36+
} else {
37+
// end-of
38+
if (clearAt?.time == "day") {
39+
binding.clearAt.text = context.getString(R.string.today)
40+
}
41+
}
42+
}
43+
}
44+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* Nextcloud Notes - Android Client
3+
*
4+
* SPDX-FileCopyrightText: 2015-2025 Nextcloud GmbH and Nextcloud contributors
5+
* SPDX-License-Identifier: GPL-3.0-or-later
6+
*/
7+
package it.niedermann.owncloud.notes.accountswitcher.bottomSheet
8+
9+
import com.owncloud.android.lib.resources.users.Status
10+
import it.niedermann.owncloud.notes.accountswitcher.repository.UserStatusRepository
11+
import it.niedermann.owncloud.notes.branding.BrandedBottomSheetDialogFragment
12+
13+
enum class AccountSwitcherBottomSheetTag(tag: String) {
14+
ONLINE_STATUS("fragment_set_status"),
15+
MESSAGE_STATUS("fragment_set_status_message");
16+
17+
fun fragment(
18+
repository: UserStatusRepository,
19+
currentStatus: Status
20+
): BrandedBottomSheetDialogFragment {
21+
return when (this) {
22+
ONLINE_STATUS -> {
23+
SetOnlineStatusBottomSheet(repository, currentStatus)
24+
}
25+
26+
MESSAGE_STATUS -> {
27+
SetStatusMessageBottomSheet(repository, currentStatus)
28+
}
29+
}
30+
}
31+
}

0 commit comments

Comments
 (0)