package im.actor.sdk.controllers; import android.app.Activity; import android.app.ProgressDialog; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.FragmentActivity; import android.support.v4.graphics.drawable.DrawableCompat; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; import im.actor.core.viewmodel.Command; import im.actor.core.viewmodel.CommandCallback; import im.actor.runtime.function.Consumer; import im.actor.runtime.function.Function; import im.actor.runtime.promise.Promise; import im.actor.runtime.promise.PromiseFunc; import im.actor.runtime.promise.PromiseResolver; import im.actor.sdk.ActorSDK; import im.actor.sdk.ActorStyle; import im.actor.sdk.R; import im.actor.sdk.controllers.tools.MediaPickerCallback; import im.actor.sdk.util.ViewUtils; public class BaseFragment extends BinderCompatFragment implements MediaPickerCallback { protected final ActorStyle style = ActorSDK.sharedActor().style; private boolean isRootFragment; private String title; private int titleRes; private String subtitle; private boolean showTitle = true; private boolean homeAsUp = false; private boolean showHome = false; private boolean showCustom = false; private ArrayList<WrappedPromise> pending = new ArrayList<>(); public boolean isRootFragment() { return isRootFragment; } public void setRootFragment(boolean rootFragment) { isRootFragment = rootFragment; setHasOptionsMenu(rootFragment); } public void setTitle(String title) { this.title = title; this.titleRes = 0; ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setTitle(title); } } public void setTitle(int titleRes) { this.title = null; this.titleRes = titleRes; ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setTitle(titleRes); } } public void setSubtitle(String subtitle) { this.subtitle = subtitle; ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setSubtitle(subtitle); } } public void setShowTitle(boolean showTitle) { this.showTitle = showTitle; ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayShowTitleEnabled(showTitle); } } public void setHomeAsUp(boolean homeAsUp) { this.homeAsUp = homeAsUp; ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(homeAsUp); } } public void setShowHome(boolean showHome) { this.showHome = showHome; ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayShowHomeEnabled(showHome); } } public void setShowCustom(boolean showCustom) { this.showCustom = showCustom; ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayShowCustomEnabled(showCustom); } } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (isRootFragment) { ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { if (titleRes != 0) { actionBar.setTitle(titleRes); } else { actionBar.setTitle(title); } actionBar.setSubtitle(subtitle); actionBar.setDisplayShowCustomEnabled(showCustom); actionBar.setDisplayHomeAsUpEnabled(homeAsUp); actionBar.setDisplayShowHomeEnabled(showHome); actionBar.setDisplayShowTitleEnabled(showTitle); onConfigureActionBar(actionBar); } } } public void onConfigureActionBar(ActionBar actionBar) { } @Override public void onCreate(Bundle saveInstance) { super.onCreate(saveInstance); // setHasOptionsMenu(true); } public void goneView(View view) { ViewUtils.goneView(view); } public void goneView(final View view, boolean isAnimated) { ViewUtils.goneView(view, isAnimated); } public void goneView(final View view, boolean isAnimated, boolean isSlow) { ViewUtils.goneView(view, isAnimated, isSlow); } public void hideView(View view) { ViewUtils.hideView(view); } public void hideView(final View view, boolean isAnimated) { ViewUtils.hideView(view, isAnimated); } public void hideView(final View view, boolean isAnimated, boolean isSlow) { ViewUtils.hideView(view, isAnimated, isSlow); } public void showView(View view) { ViewUtils.showView(view); } public void showView(final View view, boolean isAnimated) { ViewUtils.showView(view, isAnimated); } public void showView(final View view, boolean isAnimated, boolean isSlow) { ViewUtils.showView(view, isAnimated, isSlow); } public void wave(View[] layers, float scale, int duration, float offset) { ViewUtils.wave(layers, scale, duration, offset); } public void elevateView(View view) { ViewUtils.elevateView(view); } public void elevateView(View view, float scale) { ViewUtils.elevateView(view, scale); } public void elevateView(View view, boolean isAnamated, float scale) { ViewUtils.elevateView(view, isAnamated, scale); } public void elevateView(final View view, boolean isAnimated) { ViewUtils.elevateView(view, isAnimated); } public void demoteView(View view) { ViewUtils.demoteView(view); } public void demoteView(final View view, boolean isAnimated) { ViewUtils.demoteView(view, isAnimated); } public void onClick(View view, int id, final View.OnClickListener listener) { onClick(view.findViewById(id), listener); } public void onClick(View view, final View.OnClickListener listener) { view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { listener.onClick(v); } }); } public <T> void executeSilent(Command<T> cmd, final CommandCallback<T> callback) { cmd.start(callback); } public <T> void executeSilent(Command<T> cmd) { cmd.start(new CommandCallback<T>() { @Override public void onResult(T res) { } @Override public void onError(Exception e) { } }); } public <T> void execute(Command<T> cmd, int title, final CommandCallback<T> callback) { final ProgressDialog dialog = ProgressDialog.show(getContext(), "", getString(title), true, false); cmd.start(new CommandCallback<T>() { @Override public void onResult(T res) { dismissDialog(dialog); ; callback.onResult(res); } @Override public void onError(Exception e) { dismissDialog(dialog); ; callback.onError(e); } }); } public <T> void execute(Command<T> cmd) { execute(cmd, R.string.progress_common); } public <T> void execute(Command<T> cmd, int title) { final ProgressDialog dialog = ProgressDialog.show(getContext(), "", getString(title), true, false); cmd.start(new CommandCallback<T>() { @Override public void onResult(T res) { dismissDialog(dialog); ; } @Override public void onError(Exception e) { dismissDialog(dialog); ; } }); } public <T> Promise<T> execute(Promise<T> promise) { return execute(promise, R.string.progress_common); } public <T> Promise<T> execute(Promise<T> promise, int title) { final ProgressDialog dialog = ProgressDialog.show(getContext(), "", getString(title), true, false); promise.then(new Consumer<T>() { @Override public void apply(T t) { dismissDialog(dialog); } }).failure(new Consumer<Exception>() { @Override public void apply(Exception e) { dismissDialog(dialog); } }); return promise; } public View buildRecord(String titleText, String valueText, LayoutInflater inflater, ViewGroup container) { return buildRecord(titleText, valueText, 0, false, true, inflater, container); } public View buildRecord(String titleText, String valueText, boolean isLast, LayoutInflater inflater, ViewGroup container) { return buildRecord(titleText, valueText, 0, false, isLast, inflater, container); } public View buildRecord(String titleText, String valueText, int resourceId, boolean showIcon, boolean isLast, LayoutInflater inflater, ViewGroup container) { final View recordView = inflater.inflate(R.layout.contact_record, container, false); TextView value = (TextView) recordView.findViewById(R.id.value); TextView title = (TextView) recordView.findViewById(R.id.title); title.setText(titleText); title.setTextColor(style.getTextSecondaryColor()); value.setTextColor(style.getTextPrimaryColor()); value.setText(valueText); if (!isLast) { recordView.findViewById(R.id.divider).setVisibility(View.GONE); } if (resourceId != 0 && showIcon) { ImageView iconView = (ImageView) recordView.findViewById(R.id.recordIcon); Drawable drawable = DrawableCompat.wrap(getResources().getDrawable(resourceId)); drawable.mutate(); DrawableCompat.setTint(drawable, style.getSettingsIconColor()); iconView.setImageDrawable(drawable); } container.addView(recordView); return recordView; } public View buildRecordBig(String valueText, int resourceId, boolean showIcon, boolean isLast, LayoutInflater inflater, ViewGroup container) { final View recordView = inflater.inflate(R.layout.contact_record_big, container, false); TextView value = (TextView) recordView.findViewById(R.id.value); value.setTextColor(style.getTextPrimaryColor()); value.setText(valueText); if (!isLast) { recordView.findViewById(R.id.divider).setVisibility(View.GONE); } if (resourceId != 0 && showIcon) { ImageView iconView = (ImageView) recordView.findViewById(R.id.recordIcon); Drawable drawable = getResources().getDrawable(resourceId); drawable.mutate().setColorFilter(style.getSettingsIconColor(), PorterDuff.Mode.SRC_IN); iconView.setImageDrawable(drawable); } container.addView(recordView); return recordView; } public View buildRecordAction(String valueText, int resourceId, boolean showIcon, boolean isLast, LayoutInflater inflater, ViewGroup container) { final View recordView = inflater.inflate(R.layout.contact_record_big, container, false); TextView value = (TextView) recordView.findViewById(R.id.value); value.setTextColor(style.getGroupActionAddTextColor()); value.setText(valueText); if (!isLast) { recordView.findViewById(R.id.divider).setVisibility(View.GONE); } if (resourceId != 0 && showIcon) { ImageView iconView = (ImageView) recordView.findViewById(R.id.recordIcon); Drawable drawable = DrawableCompat.wrap(getResources().getDrawable(resourceId)); drawable.mutate(); DrawableCompat.setTint(drawable, style.getGroupActionAddIconColor()); iconView.setImageDrawable(drawable); } container.addView(recordView); return recordView; } public void dismissDialog(ProgressDialog progressDialog) { try { progressDialog.dismiss(); } catch (Exception ex) { ex.printStackTrace(); } } @Nullable public ActionBar getSupportActionBar() { FragmentActivity activity = getActivity(); if (activity instanceof AppCompatActivity) { AppCompatActivity compatActivity = (AppCompatActivity) activity; return compatActivity.getSupportActionBar(); } return null; } protected <T> Promise<T> wrap(Promise<T> p) { WrappedPromise<T> res = new WrappedPromise<>((PromiseFunc<T>) resolver -> p.pipeTo(resolver)); pending.add(res); return res; } @Override public void onPause() { super.onPause(); for (WrappedPromise w : pending) { w.kill(); } pending.clear(); } public void finishActivity() { Activity a = getActivity(); if (a != null) { a.finish(); } } @Override public void onUriPicked(Uri uri) { } @Override public void onFilesPicked(List<String> paths) { } @Override public void onPhotoPicked(String path) { } @Override public void onVideoPicked(String path) { } @Override public void onPhotoCropped(String path) { } @Override public void onContactPicked(String name, List<String> phones, List<String> emails, byte[] avatar) { } @Override public void onLocationPicked(double latitude, double longitude, String street, String place) { } private class WrappedPromise<T> extends Promise<T> { private boolean isKilled; public WrappedPromise(PromiseFunc<T> executor) { super(executor); } public void kill() { isKilled = true; } @Override protected void invokeDeliver() { if (isKilled) { return; } super.invokeDeliver(); } } }