content: package im.actor;
  
  import android.graphics.Color;
  import android.graphics.PorterDuff;
  import android.os.Bundle;
  import android.support.multidex.MultiDex;
  import android.support.v4.app.Fragment;
  import android.text.Spannable;
  import android.view.LayoutInflater;
  import android.view.View;
  import android.view.ViewGroup;
  import android.widget.CheckBox;
  import android.widget.Toast;
  
  import org.jetbrains.annotations.Nullable;
  
  import java.util.ArrayList;
  
  import im.actor.core.entity.Message;
  import im.actor.core.entity.Peer;
  import im.actor.core.entity.content.JsonContent;
  import im.actor.core.entity.content.PhotoContent;
  import im.actor.develop.R;
  import im.actor.fragments.AttachFragmentEx;
  import im.actor.fragments.RootFragmentEx;
  import im.actor.runtime.json.JSONException;
  import im.actor.runtime.json.JSONObject;
  import im.actor.sdk.ActorSDK;
  import im.actor.sdk.ActorSDKApplication;
  import im.actor.sdk.ActorStyle;
  import im.actor.sdk.BaseActorSDKDelegate;
  import im.actor.sdk.controllers.conversation.attach.AbsAttachFragment;
  import im.actor.sdk.controllers.conversation.messages.BubbleLayouter;
  import im.actor.sdk.controllers.conversation.messages.DefaultLayouter;
  import im.actor.sdk.controllers.conversation.messages.JsonXmlBubbleLayouter;
  import im.actor.sdk.controllers.conversation.messages.XmlBubbleLayouter;
  import im.actor.sdk.controllers.conversation.messages.content.PhotoHolder;
  import im.actor.sdk.controllers.conversation.messages.content.TextHolder;
  import im.actor.sdk.controllers.conversation.messages.content.preprocessor.PreprocessedData;
  import im.actor.sdk.controllers.settings.ActorSettingsCategories;
  import im.actor.sdk.controllers.settings.ActorSettingsCategory;
  import im.actor.sdk.controllers.settings.ActorSettingsField;
  import im.actor.sdk.controllers.settings.BaseActorSettingsActivity;
  import im.actor.sdk.controllers.settings.BaseActorSettingsFragment;
  import im.actor.sdk.intents.ActorIntentFragmentActivity;
  
  public class Application extends ActorSDKApplication {
  
      @Override
      public void onCreate() {
          MultiDex.install(this);
          super.onCreate();
      }
  
      @Override
      public void onConfigureActorSDK() {
          ActorSDK.sharedActor().setDelegate(new ActorSDKDelegate());
          ActorSDK.sharedActor().setPushId(209133700967L);
          ActorSDK.sharedActor().setOnClientPrivacyEnabled(true);
  
          ActorStyle style = ActorSDK.sharedActor().style;
          style.setDialogsActiveTextColor(0xff5882ac);
          style.setShowAvatarPrivateInTitle(false);
  
          ActorSDK.sharedActor().setFastShareEnabled(true);
  
          ActorSDK.sharedActor().setCallsEnabled(true);
  
          ActorSDK.sharedActor().setTosUrl("http://actor.im");
          ActorSDK.sharedActor().setPrivacyText("bla bla bla");
  
          ActorSDK.sharedActor().setVideoCallsEnabled(true);
  
          ActorSDK.sharedActor().setAutoJoinGroups(new String[]{
                  "actor_news"
          });
  
  
  //        ActorSDK.sharedActor().setTwitter("");
  //        ActorSDK.sharedActor().setHomePage("http://www.foo.com");
  //        ActorSDK.sharedActor().setInviteUrl("http://www.foo.com");
  //        ActorSDK.sharedActor().setCallsEnabled(true);
  
  //        ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://192.168.1.184:9070"});
  
  //        ActorStyle style = ActorSDK.sharedActor().style;
  //        style.setMainColor(Color.parseColor("#529a88"));
  //        style.setAvatarBackgroundResource(R.drawable.img_profile_avatar_default);
  //        AbsContent.registerConverter(new ContentConverter() {
  //            @Override
  //            public AbsContent convert(AbsContentContainer container) {
  //                return JsonContent.convert(container, new TCBotMesaage());
  //            }
  //
  //            @Override
  //            public boolean validate(AbsContent content) {
  //                return content instanceof TCBotMesaage;
  //            }
  //        });
      }
  
      private class ActorSDKDelegate extends BaseActorSDKDelegate {
  
          @Override
          public void configureChatViewHolders(ArrayList<BubbleLayouter> layouters) {
  //            layouters.add(0, new BubbleTextHolderLayouter());
              layouters.add(0, new DefaultLayouter(DefaultLayouter.TEXT_HOLDER, (adapter2, root2, peer2) -> new TextHolder(adapter2, root2, peer2){
                  @Override
                  public void bindRawText(CharSequence rawText, long readDate, long receiveDate, Spannable reactions, Message message, boolean isItalic) {
                      super.bindRawText(rawText, readDate, receiveDate, reactions, message, isItalic);
                      text.append("\n\n" + message.getSortDate());
                  }
              }));
  
              layouters.add(0, new DefaultLayouter(DefaultLayouter.TEXT_HOLDER, CensoredTextHolderEx::new));
  
              layouters.add(0, new XmlBubbleLayouter(content -> content instanceof PhotoContent, R.layout.adapter_dialog_photo, (adapter1, root1, peer1) -> new PhotoHolder(adapter1, root1, peer1) {
                  @Override
                  protected void onConfigureViewHolder() {
                      previewView.setColorFilter(ActorStyle.adjustColorAlpha(Color.CYAN, 20), PorterDuff.Mode.ADD);
                  }
              }));
              layouters.add(0, new JsonXmlBubbleLayouter(null, R.layout.adapter_dialog_text, (adapter, root, peer) -> new TextHolder(adapter, root, peer) {
                  @Override
                  protected void bindData(Message message, long readDate, long receiveDate, boolean isUpdated, PreprocessedData preprocessedData) {
                      String jsonString = "can't read json";
                      try {
                          JSONObject jsonObject = new JSONObject(((JsonContent) message.getContent()).getRawJson());
                          String dataType = jsonObject.getString("dataType");
                          JSONObject data = jsonObject.getJSONObject("data");
                          jsonString = dataType + "\n\n";
                          jsonString += data.toString(3);
                      } catch (JSONException e) {
                          e.printStackTrace();
                      }
                      bindRawText(jsonString, readDate, receiveDate, reactions, message, false);
                  }
              }));
          }
  
          @Nullable
          @Override
          public Fragment fragmentForRoot() {
              return new RootFragmentEx();
          }
  
          @Nullable
          @Override
          public AbsAttachFragment fragmentForAttachMenu(Peer peer) {
              return new AttachFragmentEx(peer);
          }
  
  //        @Override
  //        public BaseGroupInfoActivity getGroupInfoIntent(int gid) {
  //            return new BaseGroupInfoActivity() {
  //                @Override
  //                public GroupInfoFragment getGroupInfoFragment(int chatId) {
  //                    return GroupInfoEx.create(chatId);
  //                }
  //            };
  //        }
  
          @Override
          public ActorIntentFragmentActivity getSettingsIntent() {
              return new BaseActorSettingsActivity() {
                  @Override
                  public BaseActorSettingsFragment getSettingsFragment() {
                      return new BaseActorSettingsFragment() {
                          CheckBox blablaCheckBox;
  
                          @Override
                          public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                              blablaCheckBox = new CheckBox(getContext());
                              return super.onCreateView(inflater, container, savedInstanceState);
                          }
  
                          @Override
                          public ActorSettingsCategories getBeforeSettingsCategories() {
                              return new ActorSettingsCategories()
                                      .addCategory(new ActorSettingsCategory("azaza")
                                              .addField(new ActorSettingsField(R.id.terminateSessions)
                                                      .setName("blabla")
                                                      .setIconResourceId(R.drawable.ic_edit_black_24dp)
                                                      .setRightView(blablaCheckBox)
                                              )
                                      );
                          }
  
                          @Override
                          public View.OnClickListener getMenuFieldOnClickListener() {
                              return new View.OnClickListener() {
                                  @Override
                                  public void onClick(View v) {
                                      switch (v.getId()) {
                                          case R.id.terminateSessions:
                                              Toast.makeText(v.getContext(), "hey", Toast.LENGTH_LONG).show();
                                              blablaCheckBox.toggle();
                                              break;
                                      }
                                  }
                              };
                          }
  
                      };
                  }
              };
          }
      }
  
  }
  