package im.actor.sdk.controllers.activity; import android.app.ProgressDialog; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.TextView; import im.actor.core.entity.Avatar; import im.actor.core.viewmodel.Command; import im.actor.core.viewmodel.CommandCallback; import im.actor.core.viewmodel.GroupVM; import im.actor.core.viewmodel.UserVM; import im.actor.runtime.function.BiFunction; import im.actor.runtime.function.Function; import im.actor.runtime.promise.Promise; import im.actor.sdk.ActorSDK; import im.actor.sdk.ActorStyle; import im.actor.sdk.R; import im.actor.sdk.controllers.ActorBinder; import im.actor.sdk.view.avatar.AvatarView; import im.actor.runtime.mvvm.ValueChangedListener; import im.actor.runtime.mvvm.ValueDoubleChangedListener; import im.actor.runtime.mvvm.Value; import static im.actor.sdk.util.ActorSDKMessenger.messenger; public class BaseActivity extends AppCompatActivity { public static final ActorStyle STYLE = ActorSDK.sharedActor().style; private final ActorBinder BINDER = new ActorBinder(); private boolean isResumed = false; @Override protected void onCreate(Bundle savedInstanceState) { ActorSDK.sharedActor().waitForReady(); super.onCreate(savedInstanceState); notifyOnResume(); if (getSupportActionBar() != null && STYLE.getToolBarColor() != 0) { getSupportActionBar().setBackgroundDrawable(new ColorDrawable(STYLE.getToolBarColor())); } } @Override protected void onResume() { super.onResume(); onPerformBind(); notifyOnResume(); } @Override protected void onPause() { super.onPause(); BINDER.unbindAll(); notifyOnPause(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); notifyOnPause(); } @Override protected void onStop() { super.onStop(); notifyOnPause(); } @Override protected void onDestroy() { super.onDestroy(); notifyOnPause(); } // Binding protected void onPerformBind() { } public void bind(final TextView textView, Value<String> value) { BINDER.bind(textView, value); } public <T> void bind(TextView textView, Value<T> value, Function<T, CharSequence> bind) { BINDER.bind(value, (val, valueModel) -> { textView.setText(bind.apply(val)); }); } public <T1, T2> void bind(TextView textView, Value<T1> value1, Value<T2> value2, BiFunction<T1, T2, CharSequence> bind) { BINDER.bind(value1, value2, (val, valueModel, val2, valueModel2) -> { textView.setText(bind.apply(val, val2)); }); } public void bind(final AvatarView avatarView, final int id, final Value<Avatar> avatar, final Value<String> name) { BINDER.bind(avatarView, id, avatar, name); } public void bind(final TextView textView, final UserVM user) { BINDER.bind(textView, user); } public void bind(final TextView textView, View titleContainer, GroupVM value) { BINDER.bind(textView, titleContainer, value); } public void bindGlobalCounter(ValueChangedListener<Integer> callback) { BINDER.bindGlobalCounter(callback); } public void bindGroupTyping(final TextView textView, final View container, final View titleContainer, final Value<int[]> typing) { BINDER.bindGroupTyping(textView, container, titleContainer, typing); } public void bindPrivateTyping(final TextView textView, final View container, final View titleContainer, final Value<Boolean> typing) { BINDER.bindPrivateTyping(textView, container, titleContainer, typing); } public <T> void bind(Value<T> value, ValueChangedListener<T> listener) { BINDER.bind(value, listener); } public <T> void bind(Value<T> value, ValueChangedListener<T> listener, boolean notify) { BINDER.bind(value, listener, notify); } public <T, V> void bind(final Value<T> value1, final Value<V> value2, final ValueDoubleChangedListener<T, V> listener) { BINDER.bind(value1, value2, listener); } // Toolbar protected void setToolbar(int text, boolean enableBack) { if (getSupportActionBar() == null) { throw new RuntimeException("Action bar is not set!"); } getSupportActionBar().setDisplayShowCustomEnabled(false); getSupportActionBar().setDisplayHomeAsUpEnabled(true); if (enableBack) { getSupportActionBar().setDisplayShowHomeEnabled(true); } getSupportActionBar().setDisplayShowTitleEnabled(true); getSupportActionBar().setDisplayUseLogoEnabled(false); getSupportActionBar().setTitle(text); } protected void setToolbar(int text) { setToolbar(text, true); } protected void setToolbar(View view, ActionBar.LayoutParams params, boolean enableBack) { if (getSupportActionBar() == null) { throw new RuntimeException("Action bar is not set!"); } getSupportActionBar().setDisplayShowCustomEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowTitleEnabled(false); getSupportActionBar().setDisplayUseLogoEnabled(false); getSupportActionBar().setCustomView(view, params); if (enableBack) { getSupportActionBar().setDisplayShowHomeEnabled(true); } else { getSupportActionBar().setDisplayShowHomeEnabled(false); getSupportActionBar().setDisplayHomeAsUpEnabled(false); Toolbar parent = (Toolbar) view.getParent(); parent.setContentInsetsAbsolute(0, 0); } } protected void setToolbar(View view, ActionBar.LayoutParams params) { setToolbar(view, params, true); } // Executions public <T> void execute(Command<T> cmd, int title, final CommandCallback<T> callback) { final ProgressDialog progressDialog = new ProgressDialog(this); progressDialog.setMessage(getString(title)); progressDialog.setCancelable(false); progressDialog.setCanceledOnTouchOutside(false); progressDialog.show(); cmd.start(new CommandCallback<T>() { @Override public void onResult(T res) { dismissDialog(progressDialog); callback.onResult(res); } @Override public void onError(Exception e) { dismissDialog(progressDialog); callback.onError(e); } }); } public <T> void execute(Command<T> cmd) { execute(cmd, R.string.progress_common); } public <T> void execute(Command<T> cmd, final CommandCallback<T> callback) { cmd.start(callback); } public <T> void execute(Command<T> cmd, int title) { final ProgressDialog progressDialog = new ProgressDialog(this); progressDialog.setMessage(getString(title)); progressDialog.setCancelable(false); progressDialog.setCanceledOnTouchOutside(false); progressDialog.show(); cmd.start(new CommandCallback<T>() { @Override public void onResult(T res) { dismissDialog(progressDialog); } @Override public void onError(Exception e) { dismissDialog(progressDialog); } }); } public <T> void execute(Promise<T> promise) { execute(promise, R.string.progress_common); } public <T> void execute(Promise<T> promise, int title) { final ProgressDialog dialog = ProgressDialog.show(this, "", getString(title), true, false); promise.then(t -> dismissDialog(dialog)) .failure(e -> dismissDialog(dialog)); } // Tools public void dismissDialog(ProgressDialog progressDialog) { try { progressDialog.dismiss(); } catch (Exception ex) { ex.printStackTrace(); } } private void notifyOnResume() { if (isResumed) { return; } isResumed = true; messenger().onActivityOpen(); } private void notifyOnPause() { if (!isResumed) { return; } isResumed = false; messenger().onActivityClosed(); } protected boolean getIsResumed() { return isResumed; } }