package com.badoo.chateau.example; import android.app.Application; import android.support.annotation.NonNull; import android.support.v4.content.LocalBroadcastManager; import com.badoo.barf.data.repo.DelegatingRepository; import com.badoo.barf.data.repo.Repository; import com.badoo.barf.data.repo.annotations.HandlesUtil; import com.badoo.chateau.example.data.model.ExampleConversation; import com.badoo.chateau.example.data.model.ExampleMessage; import com.badoo.chateau.example.data.model.ExampleUser; import com.badoo.chateau.example.data.repos.conversations.ParseConversationDataSource; import com.badoo.chateau.example.data.repos.istyping.ParseIsTypingDataSource; import com.badoo.chateau.example.data.repos.messages.ExampleMessageMemoryDataSource; import com.badoo.chateau.example.data.repos.messages.ImageUploadService; import com.badoo.chateau.example.data.repos.messages.ParseMessageDataSource; import com.badoo.chateau.example.data.repos.session.ParseSessionDataSource; import com.badoo.chateau.example.data.repos.user.ParseUserDataSource; import com.badoo.chateau.example.data.util.ParseHelper; import com.badoo.chateau.example.ui.ExampleConfiguration; import com.badoo.chateau.example.ui.Injector; import com.badoo.chateau.example.ui.chat.ChatActivity; import com.badoo.chateau.example.ui.conversations.create.namegroup.NameGroupActivity; import com.badoo.chateau.example.ui.conversations.create.selectusers.SelectUserActivity; import com.badoo.chateau.example.ui.conversations.list.ConversationListActivity; import com.badoo.chateau.example.ui.session.login.LoginActivity; import com.badoo.chateau.example.ui.session.register.RegisterActivity; import com.badoo.chateau.example.ui.util.BackgroundListenerRegistrar; import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.imagepipeline.core.ImagePipelineConfig; import com.parse.Parse; import com.parse.ParseInstallation; import com.parse.ParseUser; import net.hockeyapp.android.CrashManager; public class ChatExampleApp extends Application { private static final int SOCKET_PORT = 9000; private static final String HOCKEY_APP_ID = "4f7532de86894fe1a8caf9b388dd888d"; //TODO Move to build param private final BackgroundListenerRegistrar mBackgroundListenerRegistrar = new BackgroundListenerRegistrar(); private SocketNotificationClient mSocketClient; @Override public void onCreate() { super.onCreate(); final Broadcaster broadcaster = new Broadcaster(getApplicationContext()); CrashManager.register(this, HOCKEY_APP_ID); // Register for socket notifications mSocketClient = new SocketNotificationClient(broadcaster, BuildConfig.SOCKET_NOTIFICATION_ENDPOINT, SOCKET_PORT); mBackgroundListenerRegistrar.register(this); mBackgroundListenerRegistrar.registerBackgroundListener(new BackgroundListenerRegistrar.BackgroundListener() { @Override public void movedToForeground() { mSocketClient.start(); } @Override public void movedToBackground() { mSocketClient.stop(); } }); LocalBroadcastManager.getInstance(this).registerReceiver(new Broadcaster.UserSignInStateChangedReceiver() { @Override public void onUserSignedIn() { mSocketClient.restart(); } @Override public void onUserSignedOut() { mSocketClient.restart(); } }, Broadcaster.getUserSignInStateChangedFilter()); // Parse Parse.initialize(this, BuildConfig.PARSE_APP_ID, BuildConfig.PARSE_CLIENT_KEY); ParseInstallation installation = ParseInstallation.getCurrentInstallation(); ParseUser user = ParseUser.getCurrentUser(); if (user != null) { installation.put("user", user); } installation.saveInBackground(); // Fresco final ImagePipelineConfig config = ImagePipelineConfig.newBuilder(getApplicationContext()) .setDownsampleEnabled(true) .setWebpSupportEnabled(true) .build(); Fresco.initialize(getApplicationContext(), config); // Register the repositories and their data sources ExampleConfiguration.setSessionRepository(createSessionRepo(broadcaster)); ExampleConfiguration.setConversationRepository(createConversationsRepo()); ExampleConfiguration.setUsersRepository(createUserRepository()); ExampleConfiguration.setMessageRepository(createMessageRepo()); ExampleConfiguration.setIsTypingRepository(createIsTypingRepository()); registerInjections(); } private Repository<ExampleUser> createIsTypingRepository() { final DelegatingRepository<ExampleUser> typingRepository = new DelegatingRepository<>(); HandlesUtil.registerHandlersFromAnnotations(typingRepository, new ParseIsTypingDataSource(getApplicationContext(), ParseHelper.INSTANCE)); return typingRepository; } private Repository<ExampleUser> createSessionRepo(Broadcaster broadcaster) { final DelegatingRepository<ExampleUser> repo = new DelegatingRepository<>(); HandlesUtil.registerHandlersFromAnnotations(repo, new ParseSessionDataSource(broadcaster, ParseHelper.INSTANCE)); return repo; } private Repository<ExampleConversation> createConversationsRepo() { final DelegatingRepository<ExampleConversation> conversationRepository = new DelegatingRepository<>(); final ParseConversationDataSource parseConversationDataSource = new ParseConversationDataSource(ParseHelper.INSTANCE); HandlesUtil.registerHandlersFromAnnotations(conversationRepository, parseConversationDataSource); Broadcaster.ConversationUpdatedReceiver pullLatestMessagesReceiver = new Broadcaster.ConversationUpdatedReceiver() { @Override public void onConversationUpdated(@NonNull String conversationId, long timestamp) { parseConversationDataSource.reloadConversation(conversationId); } @Override public void onImageUploaded(@NonNull String conversationId, @NonNull String messageId) { // Not used } }; LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(pullLatestMessagesReceiver, Broadcaster.getConversationUpdatedFilter()); return conversationRepository; } @NonNull private Repository<ExampleUser> createUserRepository() { final DelegatingRepository<ExampleUser> userRepository = new DelegatingRepository<>(); HandlesUtil.registerHandlersFromAnnotations(userRepository, new ParseUserDataSource(ParseHelper.INSTANCE)); return userRepository; } private Repository<ExampleMessage> createMessageRepo() { final DelegatingRepository<ExampleMessage> messageRepository = new DelegatingRepository<>(); final ParseMessageDataSource.ImageUploader imageUploader = (localId, uri) -> startService(ImageUploadService.createIntent(getApplicationContext(), localId, uri)); final ParseMessageDataSource networkDataSource = new ParseMessageDataSource(LocalBroadcastManager.getInstance(this), imageUploader, ParseHelper.INSTANCE); final ExampleMessageMemoryDataSource messageMemoryDataSource = new ExampleMessageMemoryDataSource(networkDataSource); HandlesUtil.registerHandlersFromAnnotations(messageRepository, messageMemoryDataSource); return messageRepository; } protected void registerInjections() { Injector.register(RegisterActivity.class, new RegisterActivity.DefaultConfiguration()); Injector.register(LoginActivity.class, new LoginActivity.DefaultConfiguration()); Injector.register(ConversationListActivity.class, new ConversationListActivity.DefaultConfiguration()); Injector.register(NameGroupActivity.class, new NameGroupActivity.DefaultConfiguration()); Injector.register(SelectUserActivity.class, new SelectUserActivity.DefaultConfiguration()); Injector.register(ChatActivity.class, new ChatActivity.DefaultConfiguration()); } }