That fuck shit the fascists are using
at master 253 lines 8.8 kB view raw
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}