update fork #128

Manually merged
tristan merged 181 commits from mirror/monocles_chat_clean:master into master 2026-01-23 14:02:38 +01:00
3 changed files with 132 additions and 82 deletions
Showing only changes of commit dad737eec3 - Show all commits

Add menu option to show/hide stories

Arne 2025-12-30 14:45:03 +01:00

View file

@ -35,6 +35,7 @@ import static androidx.recyclerview.widget.ItemTouchHelper.RIGHT;
import android.app.Activity; import android.app.Activity;
import android.app.Fragment; import android.app.Fragment;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
@ -52,6 +53,7 @@ import android.widget.PopupMenu;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.databinding.DataBindingUtil; import androidx.databinding.DataBindingUtil;
import androidx.preference.PreferenceManager;
import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
@ -379,24 +381,34 @@ public class ConversationsOverviewFragment extends XmppFragment implements XmppC
return binding.getRoot(); return binding.getRoot();
} }
@Override @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) { public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) {
menuInflater.inflate(R.menu.fragment_conversations_overview, menu); menuInflater.inflate(R.menu.fragment_conversations_overview, menu);
AccountUtils.showHideMenuItems(menu); AccountUtils.showHideMenuItems(menu);
final MenuItem easyOnboardInvite = menu.findItem(R.id.action_easy_invite); final MenuItem easyOnboardInvite = menu.findItem(R.id.action_easy_invite);
MenuItem noteToSelf = menu.findItem(R.id.action_note_to_self); MenuItem noteToSelf = menu.findItem(R.id.action_note_to_self);
easyOnboardInvite.setVisible(EasyOnboardingInvite.anyHasSupport(activity == null ? null : activity.xmppConnectionService)); easyOnboardInvite.setVisible(EasyOnboardingInvite.anyHasSupport(activity == null ? null : activity.xmppConnectionService));
if (activity != null && activity.xmppConnectionService != null && activity.xmppConnectionService.isOnboarding()) { if (activity != null && activity.xmppConnectionService != null && activity.xmppConnectionService.isOnboarding()) {
final MenuItem manageAccounts = menu.findItem(R.id.action_accounts); final MenuItem manageAccounts = menu.findItem(R.id.action_accounts);
if (manageAccounts != null) manageAccounts.setVisible(false); if (manageAccounts != null) manageAccounts.setVisible(false);
final MenuItem settings = menu.findItem(R.id.action_settings); final MenuItem settings = menu.findItem(R.id.action_settings);
if (settings != null) settings.setVisible(false); if (settings != null) settings.setVisible(false);
} }
if (activity == null || activity.xmppConnectionService == null || activity.xmppConnectionService.getAccounts().size() != 1) { if (activity == null || activity.xmppConnectionService == null || activity.xmppConnectionService.getAccounts().size() != 1) {
noteToSelf.setVisible(false); noteToSelf.setVisible(false);
} }
} final MenuItem stories = menu.findItem(R.id.action_toggle_stories);
if (stories != null) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
boolean show = preferences.getBoolean("show_stories", true);
if (show) {
stories.setTitle(R.string.hide_stories);
} else {
stories.setTitle(R.string.show_stories);
}
}
}
@Override @Override
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) {
@ -508,11 +520,22 @@ public class ConversationsOverviewFragment extends XmppFragment implements XmppC
boolean navBarVisible = activity instanceof ConversationsActivity && ((ConversationsActivity) activity).navigationBarVisible(); boolean navBarVisible = activity instanceof ConversationsActivity && ((ConversationsActivity) activity).navigationBarVisible();
MenuItem manageAccount = menu.findItem(R.id.action_account); MenuItem manageAccount = menu.findItem(R.id.action_account);
MenuItem manageAccounts = menu.findItem(R.id.action_accounts); MenuItem manageAccounts = menu.findItem(R.id.action_accounts);
MenuItem addStory = menu.findItem(R.id.action_add_story);
if (navBarVisible) { if (navBarVisible) {
manageAccount.setVisible(false); manageAccount.setVisible(false);
manageAccounts.setVisible(false); manageAccounts.setVisible(false);
if (stories != null) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
boolean show = preferences.getBoolean("show_stories", true);
if (show) {
addStory.setVisible(true);
} else {
addStory.setVisible(false);
}
}
} else { } else {
AccountUtils.showHideMenuItems(menu); AccountUtils.showHideMenuItems(menu);
addStory.setVisible(false);
} }
} }
@ -528,9 +551,19 @@ public class ConversationsOverviewFragment extends XmppFragment implements XmppC
if (showed) { if (showed) {
this.binding.fab.setVisibility(View.GONE); this.binding.fab.setVisibility(View.GONE);
binding.fabStory.setVisibility(View.GONE);
} else { } else {
this.binding.fab.setVisibility(View.VISIBLE); this.binding.fab.setVisibility(View.VISIBLE);
} if (stories != null) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
boolean show = preferences.getBoolean("show_stories", true);
if (show) {
this.binding.fabStory.setVisibility(View.VISIBLE);
} else {
this.binding.fabStory.setVisibility(View.GONE);
}
}
}
} }
} }
@ -540,30 +573,46 @@ public class ConversationsOverviewFragment extends XmppFragment implements XmppC
Log.d(Config.LOGTAG, "ConversationsOverviewFragment.onResume()"); Log.d(Config.LOGTAG, "ConversationsOverviewFragment.onResume()");
} }
@Override @Override
public boolean onOptionsItemSelected(final MenuItem item) { public boolean onOptionsItemSelected(final MenuItem item) {
if (MenuDoubleTabUtil.shouldIgnoreTap()) { if (MenuDoubleTabUtil.shouldIgnoreTap()) {
return false; return false;
} }
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.action_search: case R.id.action_search:startActivity(new Intent(getActivity(), SearchActivity.class));
startActivity(new Intent(getActivity(), SearchActivity.class)); return true;
return true; case R.id.action_easy_invite:
case R.id.action_easy_invite: selectAccountToStartEasyInvite();
selectAccountToStartEasyInvite(); return true;
return true; case R.id.action_note_to_self:
case R.id.action_note_to_self: final List<Account> accounts = activity.xmppConnectionService.getAccounts();
final List<Account> accounts = activity.xmppConnectionService.getAccounts(); if (accounts.size() == 1) {
if (accounts.size() == 1) { final Contact self = new Contact(accounts.get(0).getSelfContact());
final Contact self = new Contact(accounts.get(0).getSelfContact()); Conversation conversation = activity.xmppConnectionService.findOrCreateConversation(self.getAccount(), self.getJid(), false, false, null, true, null);
Conversation conversation = activity.xmppConnectionService.findOrCreateConversation(self.getAccount(), self.getJid(), false, false, null, true, null); SoftKeyboardUtils.hideSoftKeyboard(activity);
SoftKeyboardUtils.hideSoftKeyboard(activity); activity.switchToConversation(conversation);
activity.switchToConversation(conversation); }
} return true;
} case R.id.action_toggle_stories:
return super.onOptionsItemSelected(item); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
} boolean show = preferences.getBoolean("show_stories", true);
preferences.edit().putBoolean("show_stories", !show).apply();
refresh();
activity.invalidateOptionsMenu();
return true;
case R.id.action_add_story:
selectAccountToPublishStory();
return true;
}
return super.onOptionsItemSelected(item);
}
private void setShowStories(boolean show) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
preferences.edit().putBoolean("show_stories", show).apply();
refresh();
activity.invalidateOptionsMenu();
}
private void selectAccountToStartEasyInvite() { private void selectAccountToStartEasyInvite() {
final List<Account> accounts = final List<Account> accounts =
EasyOnboardingInvite.getSupportingAccounts(activity.xmppConnectionService); EasyOnboardingInvite.getSupportingAccounts(activity.xmppConnectionService);
@ -616,7 +665,10 @@ public class ConversationsOverviewFragment extends XmppFragment implements XmppC
); );
Collections.sort(this.stories, (a,b) -> Long.compare(b.getPublished(), a.getPublished())); Collections.sort(this.stories, (a,b) -> Long.compare(b.getPublished(), a.getPublished()));
if (this.stories.isEmpty()) { SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
boolean show = preferences.getBoolean("show_stories", true);
if (this.stories.isEmpty() || !show) {
binding.storiesList.setVisibility(View.GONE); binding.storiesList.setVisibility(View.GONE);
} else { } else {
binding.storiesList.setVisibility(View.VISIBLE); binding.storiesList.setVisibility(View.VISIBLE);
@ -639,6 +691,7 @@ public class ConversationsOverviewFragment extends XmppFragment implements XmppC
} }
if (activity.xmppConnectionService != null && activity.xmppConnectionService.isOnboarding()) { if (activity.xmppConnectionService != null && activity.xmppConnectionService.isOnboarding()) {
binding.fab.setVisibility(View.GONE); binding.fab.setVisibility(View.GONE);
binding.fabStory.setVisibility(View.GONE);
if (this.conversations.size() == 1) { if (this.conversations.size() == 1) {
if (activity instanceof OnConversationSelected) { if (activity instanceof OnConversationSelected) {
@ -653,8 +706,16 @@ public class ConversationsOverviewFragment extends XmppFragment implements XmppC
if (showed) { if (showed) {
this.binding.fab.setVisibility(View.GONE); this.binding.fab.setVisibility(View.GONE);
this.binding.fabStory.setVisibility(View.GONE);
} else { } else {
this.binding.fab.setVisibility(View.VISIBLE); this.binding.fab.setVisibility(View.VISIBLE);
if (stories != null) {
if (show) {
this.binding.fabStory.setVisibility(View.VISIBLE);
} else {
this.binding.fabStory.setVisibility(View.GONE);
}
}
} }
} }
} }

View file

@ -1,67 +1,52 @@
<!-- <?xml version="1.0" encoding="utf-8"?>
~ Copyright (c) 2018, Daniel Gultsch All rights reserved.
~
~ Redistribution and use in source and binary forms, with or without modification,
~ are permitted provided that the following conditions are met:
~
~ 1. Redistributions of source code must retain the above copyright notice, this
~ list of conditions and the following disclaimer.
~
~ 2. Redistributions in binary form must reproduce the above copyright notice,
~ this list of conditions and the following disclaimer in the documentation and/or
~ other materials provided with the distribution.
~
~ 3. Neither the name of the copyright holder nor the names of its contributors
~ may be used to endorse or promote products derived from this software without
~ specific prior written permission.
~
~ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
~ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
~ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
~ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
~ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
~ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
~ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
~ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
~ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
~ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<menu xmlns:android="http://schemas.android.com/apk/res/android" <menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<item <item
android:id="@+id/action_search" android:id="@+id/action_search"
android:icon="@drawable/ic_search_24dp"
android:orderInCategory="1" android:orderInCategory="1"
android:title="@string/search_messages" android:title="@string/search_messages"
android:visible="@bool/show_individual_search_options" android:visible="@bool/show_individual_search_options"
android:icon="@drawable/ic_search_24dp" app:showAsAction="ifRoom" />
<item
android:id="@+id/action_add_story"
android:icon="@drawable/outline_amp_stories_24"
android:orderInCategory="2"
android:title="@string/add_story"
android:visible="false"
app:showAsAction="ifRoom" /> app:showAsAction="ifRoom" />
<item <item
android:id="@+id/action_note_to_self" android:id="@+id/action_note_to_self"
android:orderInCategory="80" android:orderInCategory="80"
android:title="@string/note_to_self" android:title="@string/note_to_self"
app:showAsAction="never"/> app:showAsAction="never" />
<item <item
android:id="@+id/action_easy_invite" android:id="@+id/action_easy_invite"
android:orderInCategory="89"
app:showAsAction="ifRoom"
android:icon="@drawable/ic_person_add_24dp" android:icon="@drawable/ic_person_add_24dp"
android:title="@string/invite_to_app" /> android:orderInCategory="89"
android:title="@string/invite_to_app"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_toggle_stories"
android:orderInCategory="90"
android:title="@string/show_stories"
app:showAsAction="never" />
<item <item
android:id="@+id/action_accounts" android:id="@+id/action_accounts"
android:orderInCategory="90" android:orderInCategory="91"
android:title="@string/action_accounts" android:title="@string/action_accounts"
app:showAsAction="never" /> app:showAsAction="never" />
<item <item
android:id="@+id/action_account" android:id="@+id/action_account"
android:orderInCategory="90" android:orderInCategory="91"
android:title="@string/action_account" android:title="@string/action_account"
app:showAsAction="never" /> app:showAsAction="never" />
<item android:id="@+id/action_privacy_policy" <item
android:visible="false" android:id="@+id/action_privacy_policy"
android:orderInCategory="98" android:orderInCategory="98"
android:title="@string/privacy_policy" android:title="@string/privacy_policy"
app:showAsAction="never"/> android:visible="false"
app:showAsAction="never" />
<item <item
android:id="@+id/action_settings" android:id="@+id/action_settings"
android:orderInCategory="100" android:orderInCategory="100"

View file

@ -1585,4 +1585,8 @@
<string name="delete_story_dialog_title">Delete story</string> <string name="delete_story_dialog_title">Delete story</string>
<string name="delete_story_dialog_message">Do you really want to delete this story</string> <string name="delete_story_dialog_message">Do you really want to delete this story</string>
<string name="story_deleted">Story deleted</string> <string name="story_deleted">Story deleted</string>
<string name="show_stories">Show stories</string>
<string name="hide_stories">Hide stories</string>
<string name="stories">Stories</string>
<string name="add_story">Add story</string>
</resources> </resources>