Search in sources :

Example 6 with FileCallback

use of im.actor.core.viewmodel.FileCallback in project actor-platform by actorapp.

the class DialogView method buildLayout.

@Override
public DialogLayout buildLayout(Dialog arg, int width, int height) {
    if (!isStylesLoaded) {
        isStylesLoaded = true;
        ActorStyle style = ActorSDK.sharedActor().style;
        Context context = getContext();
        titlePaint = createTextPaint(Fonts.medium(), 16, style.getDialogsTitleColor());
        titleSecurePaint = createTextPaint(Fonts.medium(), 16, style.getDialogsTitleSecureColor());
        datePaint = createTextPaint(Fonts.regular(), 14, style.getDialogsTimeColor());
        textPaint = createTextPaint(Fonts.regular(), 16, style.getDialogsTimeColor());
        textActivePaint = createTextPaint(Fonts.regular(), 16, style.getDialogsActiveTextColor());
        senderTextColor = style.getDialogsActiveTextColor();
        groupIcon = new TintDrawable(context.getResources().getDrawable(R.drawable.ic_group_black_18dp), style.getDialogsTitleColor());
        channelIcon = new TintDrawable(context.getResources().getDrawable(R.drawable.ic_megaphone_18dp_black), style.getDialogsTitleColor());
        botIcon = new TintDrawable(context.getResources().getDrawable(R.drawable.ic_robot_black_18dp), style.getDialogsTitleColor());
        secretIcon = new TintDrawable(context.getResources().getDrawable(R.drawable.ic_lock_black_18dp), style.getDialogsTitleSecureColor());
        counterTextPaint = createTextPaint(Fonts.medium(), 14, style.getDialogsCounterTextColor());
        counterTextPaint.setTextAlign(Paint.Align.CENTER);
        counterBgPaint = createFilledPaint(style.getDialogsCounterBackgroundColor());
        fillPaint = createFilledPaint(Color.BLACK);
        placeholderColors = ActorSDK.sharedActor().style.getDefaultAvatarPlaceholders();
        avatarBorder = new Paint();
        avatarBorder.setStyle(Paint.Style.STROKE);
        avatarBorder.setAntiAlias(true);
        avatarBorder.setColor(0x19000000);
        avatarBorder.setStrokeWidth(1);
        avatarTextColor = createTextPaint(Fonts.regular(), 20, Color.WHITE);
        avatarTextColor.setTextAlign(Paint.Align.CENTER);
        typingText = messenger().getFormatter().formatTyping();
        stateSent = new TintDrawable(context.getResources().getDrawable(R.drawable.msg_check_1), style.getDialogsStateSentColor());
        stateReceived = new TintDrawable(context.getResources().getDrawable(R.drawable.msg_check_2), style.getDialogsStateDeliveredColor());
        stateRead = new TintDrawable(context.getResources().getDrawable(R.drawable.msg_check_2), style.getDialogsStateReadColor());
    }
    DialogLayout res = new DialogLayout();
    res.setPlaceholderIndex(Math.abs(arg.getPeer().getPeerId()) % placeholderColors.length);
    res.setShortName(buildShortName(arg.getDialogTitle()));
    if (arg.getDialogAvatar() != null) {
        AvatarImage image = getAvatarImage(arg.getDialogAvatar());
        if (image != null) {
            String desc = messenger().findDownloadedDescriptor(image.getFileReference().getFileId());
            if (desc != null) {
                ImageRequest request = ImageRequestBuilder.newBuilderWithSource(Uri.fromFile(new File(desc))).setResizeOptions(new ResizeOptions(Screen.dp(52), Screen.dp(52))).setImageType(ImageRequest.ImageType.SMALL).build();
                res.setImageRequest(request);
            } else {
                InvalidationContext invalidationContext = getCurrentLayoutContext();
                messenger().bindRawFile(image.getFileReference(), true, new FileCallback() {

                    @Override
                    public void onNotDownloaded() {
                        if (invalidationContext.isCancelled()) {
                            messenger().unbindRawFile(image.getFileReference().getFileId(), false, this);
                        }
                    }

                    @Override
                    public void onDownloading(float progress) {
                        if (invalidationContext.isCancelled()) {
                            messenger().unbindRawFile(image.getFileReference().getFileId(), false, this);
                        }
                    }

                    @Override
                    public void onDownloaded(FileSystemReference reference) {
                        messenger().unbindRawFile(image.getFileReference().getFileId(), false, this);
                        invalidationContext.invalidate();
                    }
                });
            }
        }
    }
    // Top Row
    int maxTitleWidth = (width - Screen.dp(72)) - Screen.dp(8);
    if (arg.getDate() > 0) {
        String dateText = messenger().getFormatter().formatShortDate(arg.getDate());
        int dateWidth = (int) datePaint.measureText(dateText);
        res.setDate(dateText, dateWidth);
        maxTitleWidth -= dateWidth + Screen.dp(16);
    }
    if (arg.getPeer().getPeerType() == PeerType.GROUP) {
        if (arg.isChannel()) {
            res.setTitleIcon(channelIcon);
            res.setTitleIconTop(Screen.dp(33));
        } else {
            res.setTitleIcon(groupIcon);
            res.setTitleIconTop(Screen.dp(33));
        }
        maxTitleWidth -= Screen.dp(16 + /*icon width*/
        4);
    } else if (arg.getPeer().getPeerType() == PeerType.PRIVATE_ENCRYPTED) {
        res.setTitleIcon(secretIcon);
        res.setTitleIconTop(Screen.dp(31));
        maxTitleWidth -= Screen.dp(16 + /*icon width*/
        4);
    } else if (arg.getPeer().getPeerType() == PeerType.PRIVATE) {
        if (arg.isBot()) {
            res.setTitleIcon(botIcon);
            res.setTitleIconTop(Screen.dp(33));
            maxTitleWidth -= Screen.dp(16 + /*icon width*/
            4);
        }
    }
    if (arg.getSenderId() == messenger().myUid()) {
        if (arg.isRead()) {
            res.setState(stateRead);
        } else if (arg.isReceived()) {
            res.setState(stateReceived);
        } else {
            res.setState(stateSent);
        }
        maxTitleWidth -= Screen.dp(20);
    }
    res.setTitleLayout(singleLineText(arg.getDialogTitle(), arg.getPeer().getPeerType() == PeerType.PRIVATE_ENCRYPTED ? titleSecurePaint : titlePaint, maxTitleWidth));
    // Second Row
    int maxWidth = width - Screen.dp(72) - Screen.dp(8);
    if (arg.getUnreadCount() > 0) {
        String counterText = "" + arg.getUnreadCount();
        int counterWidth = (int) counterTextPaint.measureText(counterText) + Screen.sp(10);
        counterWidth = Math.max(counterWidth, Screen.dp(22));
        res.setCounter(counterText, counterWidth);
        maxWidth -= counterWidth + Screen.dp(8);
    }
    if (arg.getSenderId() > 0) {
        String contentText = messenger().getFormatter().formatContentText(arg.getSenderId(), arg.getMessageType(), arg.getText().replace("\n", " "), arg.getRelatedUid(), arg.isChannel());
        if (arg.getPeer().getPeerType() == PeerType.GROUP) {
            if (messenger().getFormatter().isLargeDialogMessage(arg.getMessageType())) {
                res.setTextLayout(singleLineText(handleEmoji(contentText), textActivePaint, maxWidth));
            } else {
                String senderName = messenger().getFormatter().formatPerformerName(arg.getSenderId()) + ": ";
                if (arg.getMessageType() == ContentType.TEXT) {
                    SpannableStringBuilder builder = new SpannableStringBuilder();
                    builder.append(senderName);
                    builder.setSpan(new ForegroundColorSpan(senderTextColor), 0, senderName.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
                    builder.append(contentText);
                    res.setTextLayout(singleLineText(builder, textPaint, maxWidth));
                } else {
                    CharSequence contentResult = handleEmoji(senderName, contentText);
                    res.setTextLayout(singleLineText(contentResult, textActivePaint, maxWidth));
                }
            }
        } else {
            if (arg.getMessageType() == ContentType.TEXT) {
                res.setTextLayout(singleLineText(handleEmoji(contentText), textPaint, maxWidth));
            } else {
                res.setTextLayout(singleLineText(handleEmoji(contentText), textActivePaint, maxWidth));
            }
        }
    }
    return res;
}
Also used : Context(android.content.Context) FileSystemReference(im.actor.runtime.files.FileSystemReference) ForegroundColorSpan(android.text.style.ForegroundColorSpan) TintDrawable(im.actor.sdk.view.TintDrawable) TextPaint(android.text.TextPaint) Paint(android.graphics.Paint) TextPaint(android.text.TextPaint) Paint(android.graphics.Paint) FileCallback(im.actor.core.viewmodel.FileCallback) ActorStyle(im.actor.sdk.ActorStyle) ResizeOptions(com.facebook.imagepipeline.common.ResizeOptions) ImageRequest(com.facebook.imagepipeline.request.ImageRequest) AvatarImage(im.actor.core.entity.AvatarImage) File(java.io.File) SpannableStringBuilder(android.text.SpannableStringBuilder)

Example 7 with FileCallback

use of im.actor.core.viewmodel.FileCallback in project actor-platform by actorapp.

the class DownloadManager method unbindDownload.

public void unbindDownload(long fileId, boolean autoCancel, FileCallback callback) {
    if (LOG) {
        Log.d(TAG, "Unbind file #" + fileId);
    }
    QueueItem queueItem = findItem(fileId);
    if (queueItem == null) {
        if (LOG) {
            Log.d(TAG, "- Not present in queue");
        }
    } else {
        if (autoCancel) {
            if (queueItem.isStarted) {
                if (LOG) {
                    Log.d(TAG, "- Stopping actor");
                }
                queueItem.taskRef.send(PoisonPill.INSTANCE);
                queueItem.taskRef = null;
                queueItem.isStarted = false;
            }
            if (!queueItem.isStopped) {
                if (LOG) {
                    Log.d(TAG, "- Marking as stopped");
                }
                queueItem.isStopped = true;
                for (final FileCallback c : getSubscribers(fileId)) {
                    if (c != callback) {
                        im.actor.runtime.Runtime.dispatch(() -> c.onNotDownloaded());
                    }
                }
            }
            queue.remove(queueItem);
        } else {
            if (LOG) {
                Log.d(TAG, "- Removing callback");
            }
            getSubscribers(fileId).remove(callback);
        }
    }
    checkQueue();
}
Also used : FileCallback(im.actor.core.viewmodel.FileCallback)

Example 8 with FileCallback

use of im.actor.core.viewmodel.FileCallback in project actor-platform by actorapp.

the class DownloadManager method onDownloadError.

public void onDownloadError(long fileId) {
    if (LOG) {
        Log.d(TAG, "onDownloadError file #" + fileId);
    }
    QueueItem queueItem = findItem(fileId);
    if (queueItem == null) {
        return;
    }
    if (!queueItem.isStarted) {
        return;
    }
    queueItem.taskRef.send(PoisonPill.INSTANCE);
    queueItem.isStopped = true;
    queueItem.isStarted = false;
    for (final FileCallback fileCallback : getSubscribers(fileId)) {
        im.actor.runtime.Runtime.dispatch(() -> fileCallback.onNotDownloaded());
    }
    checkQueue();
}
Also used : FileCallback(im.actor.core.viewmodel.FileCallback)

Example 9 with FileCallback

use of im.actor.core.viewmodel.FileCallback in project actor-platform by actorapp.

the class DownloadManager method cancelDownload.

public void cancelDownload(long fileId) {
    if (LOG) {
        Log.d(TAG, "Stopping download #" + fileId);
    }
    QueueItem queueItem = findItem(fileId);
    if (queueItem == null) {
        if (LOG) {
            Log.d(TAG, "- Not present in queue");
        }
    } else {
        if (queueItem.isStarted) {
            if (LOG) {
                Log.d(TAG, "- Stopping actor");
            }
            queueItem.taskRef.send(PoisonPill.INSTANCE);
            queueItem.taskRef = null;
            queueItem.isStarted = false;
        }
        if (LOG) {
            Log.d(TAG, "- Marking as stopped");
        }
        queueItem.isStopped = true;
        for (final FileCallback callback : getSubscribers(fileId)) {
            im.actor.runtime.Runtime.dispatch(() -> callback.onNotDownloaded());
        }
    }
    checkQueue();
}
Also used : FileCallback(im.actor.core.viewmodel.FileCallback)

Aggregations

FileCallback (im.actor.core.viewmodel.FileCallback)9 FileSystemReference (im.actor.runtime.files.FileSystemReference)3 FileReference (im.actor.core.entity.FileReference)2 FileLocalSource (im.actor.core.entity.content.FileLocalSource)2 FileRemoteSource (im.actor.core.entity.content.FileRemoteSource)2 PhotoContent (im.actor.core.entity.content.PhotoContent)2 Downloaded (im.actor.core.modules.file.entity.Downloaded)2 UploadFileCallback (im.actor.core.viewmodel.UploadFileCallback)2 Activity (android.app.Activity)1 Context (android.content.Context)1 Paint (android.graphics.Paint)1 SpannableStringBuilder (android.text.SpannableStringBuilder)1 TextPaint (android.text.TextPaint)1 ForegroundColorSpan (android.text.style.ForegroundColorSpan)1 ResizeOptions (com.facebook.imagepipeline.common.ResizeOptions)1 ImageRequest (com.facebook.imagepipeline.request.ImageRequest)1 AvatarImage (im.actor.core.entity.AvatarImage)1 AnimationContent (im.actor.core.entity.content.AnimationContent)1 DocumentContent (im.actor.core.entity.content.DocumentContent)1 VideoContent (im.actor.core.entity.content.VideoContent)1