That fuck shit the fascists are using
1package org.tm.archive;
2
3import android.annotation.SuppressLint;
4import android.app.Activity;
5import android.content.Context;
6import android.content.Intent;
7import android.net.Uri;
8import android.os.Bundle;
9import android.view.View;
10import android.view.ViewTreeObserver;
11
12import androidx.annotation.NonNull;
13import androidx.annotation.Nullable;
14import androidx.core.content.ContextCompat;
15import androidx.lifecycle.ViewModelProvider;
16
17import com.google.android.material.dialog.MaterialAlertDialogBuilder;
18
19import org.signal.core.util.concurrent.LifecycleDisposable;
20import org.signal.donations.StripeApi;
21import org.tm.archive.components.DebugLogsPromptDialogFragment;
22import org.tm.archive.components.PromptBatterySaverDialogFragment;
23import org.tm.archive.components.settings.app.AppSettingsActivity;
24import org.tm.archive.components.voice.VoiceNoteMediaController;
25import org.tm.archive.components.voice.VoiceNoteMediaControllerOwner;
26import org.tm.archive.conversationlist.RelinkDevicesReminderBottomSheetFragment;
27import org.tm.archive.devicetransfer.olddevice.OldDeviceExitActivity;
28import org.tm.archive.keyvalue.SignalStore;
29import org.tm.archive.net.DeviceTransferBlockingInterceptor;
30import org.tm.archive.notifications.VitalsViewModel;
31import org.tm.archive.stories.tabs.ConversationListTabRepository;
32import org.tm.archive.stories.tabs.ConversationListTabsViewModel;
33import org.tm.archive.util.AppStartup;
34import org.tm.archive.util.CachedInflater;
35import org.tm.archive.util.CommunicationActions;
36import org.tm.archive.util.DynamicNoActionBarTheme;
37import org.tm.archive.util.DynamicTheme;
38import org.tm.archive.util.SplashScreenUtil;
39import org.tm.archive.util.WindowUtil;
40
41public class MainActivity extends PassphraseRequiredActivity implements VoiceNoteMediaControllerOwner {
42
43 public static final int RESULT_CONFIG_CHANGED = Activity.RESULT_FIRST_USER + 901;
44
45 private final DynamicTheme dynamicTheme = new DynamicNoActionBarTheme();
46 private final MainNavigator navigator = new MainNavigator(this);
47
48 private VoiceNoteMediaController mediaController;
49 private ConversationListTabsViewModel conversationListTabsViewModel;
50 private VitalsViewModel vitalsViewModel;
51
52 private final LifecycleDisposable lifecycleDisposable = new LifecycleDisposable();
53
54 private boolean onFirstRender = false;
55
56 public static @NonNull Intent clearTop(@NonNull Context context) {
57 Intent intent = new Intent(context, MainActivity.class);
58
59 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
60 Intent.FLAG_ACTIVITY_NEW_TASK |
61 Intent.FLAG_ACTIVITY_SINGLE_TOP);
62
63 return intent;
64 }
65
66 @Override
67 protected void onCreate(Bundle savedInstanceState, boolean ready) {
68 AppStartup.getInstance().onCriticalRenderEventStart();
69 super.onCreate(savedInstanceState, ready);
70
71 setContentView(R.layout.main_activity);
72 final View content = findViewById(android.R.id.content);
73 content.getViewTreeObserver().addOnPreDrawListener(
74 new ViewTreeObserver.OnPreDrawListener() {
75 @Override
76 public boolean onPreDraw() {
77 // Use pre draw listener to delay drawing frames till conversation list is ready
78 if (onFirstRender) {
79 content.getViewTreeObserver().removeOnPreDrawListener(this);
80 return true;
81 } else {
82 return false;
83 }
84 }
85 });
86
87 lifecycleDisposable.bindTo(this);
88
89 mediaController = new VoiceNoteMediaController(this, true);
90
91 ConversationListTabRepository repository = new ConversationListTabRepository();
92 ConversationListTabsViewModel.Factory factory = new ConversationListTabsViewModel.Factory(repository);
93
94 handleDeeplinkIntent(getIntent());
95
96 CachedInflater.from(this).clear();
97
98 conversationListTabsViewModel = new ViewModelProvider(this, factory).get(ConversationListTabsViewModel.class);
99 updateTabVisibility();
100
101 vitalsViewModel = new ViewModelProvider(this).get(VitalsViewModel.class);
102
103 lifecycleDisposable.add(
104 vitalsViewModel
105 .getVitalsState()
106 .subscribe(this::presentVitalsState)
107 );
108 }
109
110 @SuppressLint("NewApi")
111 private void presentVitalsState(VitalsViewModel.State state) {
112 switch (state) {
113 case NONE:
114 break;
115 case PROMPT_BATTERY_SAVER_DIALOG:
116 PromptBatterySaverDialogFragment.show(getSupportFragmentManager());
117 break;
118 case PROMPT_DEBUGLOGS_FOR_NOTIFICATIONS:
119 DebugLogsPromptDialogFragment.show(this, DebugLogsPromptDialogFragment.Purpose.NOTIFICATIONS);
120 case PROMPT_DEBUGLOGS_FOR_CRASH:
121 DebugLogsPromptDialogFragment.show(this, DebugLogsPromptDialogFragment.Purpose.CRASH);
122 break;
123 }
124 }
125
126 @Override
127 public Intent getIntent() {
128 return super.getIntent().setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
129 Intent.FLAG_ACTIVITY_NEW_TASK |
130 Intent.FLAG_ACTIVITY_SINGLE_TOP);
131 }
132
133 @Override
134 protected void onNewIntent(Intent intent) {
135 super.onNewIntent(intent);
136 handleDeeplinkIntent(intent);
137 }
138
139 @Override
140 protected void onPreCreate() {
141 super.onPreCreate();
142 dynamicTheme.onCreate(this);
143 }
144
145 @Override
146 protected void onResume() {
147 super.onResume();
148 dynamicTheme.onResume(this);
149 if (SignalStore.misc().isOldDeviceTransferLocked()) {
150 new MaterialAlertDialogBuilder(this)
151 .setTitle(R.string.OldDeviceTransferLockedDialog__complete_registration_on_your_new_device)
152 .setMessage(R.string.OldDeviceTransferLockedDialog__your_signal_account_has_been_transferred_to_your_new_device)
153 .setPositiveButton(R.string.OldDeviceTransferLockedDialog__done, (d, w) -> OldDeviceExitActivity.exit(this))
154 .setNegativeButton(R.string.OldDeviceTransferLockedDialog__cancel_and_activate_this_device, (d, w) -> {
155 SignalStore.misc().setOldDeviceTransferLocked(false);
156 DeviceTransferBlockingInterceptor.getInstance().unblockNetwork();
157 })
158 .setCancelable(false)
159 .show();
160 }
161
162 if (SignalStore.misc().getShouldShowLinkedDevicesReminder()) {
163 SignalStore.misc().setShouldShowLinkedDevicesReminder(false);
164 RelinkDevicesReminderBottomSheetFragment.show(getSupportFragmentManager());
165 }
166
167 updateTabVisibility();
168
169 vitalsViewModel.checkSlowNotificationHeuristics();
170 }
171
172 @Override
173 protected void onStop() {
174 super.onStop();
175 SplashScreenUtil.setSplashScreenThemeIfNecessary(this, SignalStore.settings().getTheme());
176 }
177
178 @Override
179 public void onBackPressed() {
180 if (!navigator.onBackPressed()) {
181 super.onBackPressed();
182 }
183 }
184
185 @Override
186 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
187 super.onActivityResult(requestCode, resultCode, data);
188 if (requestCode == MainNavigator.REQUEST_CONFIG_CHANGES && resultCode == RESULT_CONFIG_CHANGED) {
189 recreate();
190 }
191 }
192
193 private void updateTabVisibility() {
194 findViewById(R.id.conversation_list_tabs).setVisibility(View.VISIBLE);
195 WindowUtil.setNavigationBarColor(this, ContextCompat.getColor(this, R.color.signal_colorSurface2));
196 }
197
198 public @NonNull MainNavigator getNavigator() {
199 return navigator;
200 }
201
202 private void handleDeeplinkIntent(Intent intent) {
203 handleGroupLinkInIntent(intent);
204 handleProxyInIntent(intent);
205 handleSignalMeIntent(intent);
206 handleCallLinkInIntent(intent);
207 handleDonateReturnIntent(intent);
208 }
209
210 private void handleGroupLinkInIntent(Intent intent) {
211 Uri data = intent.getData();
212 if (data != null) {
213 CommunicationActions.handlePotentialGroupLinkUrl(this, data.toString());
214 }
215 }
216
217 private void handleProxyInIntent(Intent intent) {
218 Uri data = intent.getData();
219 if (data != null) {
220 CommunicationActions.handlePotentialProxyLinkUrl(this, data.toString());
221 }
222 }
223
224 private void handleSignalMeIntent(Intent intent) {
225 Uri data = intent.getData();
226 if (data != null) {
227 CommunicationActions.handlePotentialSignalMeUrl(this, data.toString());
228 }
229 }
230
231 private void handleCallLinkInIntent(Intent intent) {
232 Uri data = intent.getData();
233 if (data != null) {
234 CommunicationActions.handlePotentialCallLinkUrl(this, data.toString());
235 }
236 }
237
238 private void handleDonateReturnIntent(Intent intent) {
239 Uri data = intent.getData();
240 if (data != null && data.toString().startsWith(StripeApi.RETURN_URL_IDEAL)) {
241 startActivity(AppSettingsActivity.manageSubscriptions(this));
242 }
243 }
244
245 public void onFirstRender() {
246 onFirstRender = true;
247 }
248
249 @Override
250 public @NonNull VoiceNoteMediaController getVoiceNoteMediaController() {
251 return mediaController;
252 }
253}