导航菜单

页面标题

页面副标题

Plus 12 v10.13.1.1 - NotificationImageProvider.java 源代码

正在查看: Plus 12 v10.13.1.1 应用的 NotificationImageProvider.java JAVA 源代码文件

本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。


package org.telegram.messenger;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
import android.text.TextUtils;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import org.telegram.messenger.NotificationCenter;

public class NotificationImageProvider extends ContentProvider implements NotificationCenter.NotificationCenterDelegate {
    private static String authority;
    private static UriMatcher matcher;
    private HashSet<String> waitingForFiles = new HashSet<>();
    private final Object sync = new Object();
    private HashMap<String, Long> fileStartTimes = new HashMap<>();

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return 0;
    }

    @Override
    public String getType(Uri uri) {
        return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        return null;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        return null;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        return 0;
    }

    public static String getAuthority() {
        if (authority == null) {
            authority = ApplicationLoader.getApplicationId() + ".notification_image_provider";
        }
        return authority;
    }

    private static UriMatcher getUriMatcher() {
        if (matcher == null) {
            UriMatcher uriMatcher = new UriMatcher(-1);
            matcher = uriMatcher;
            uriMatcher.addURI(getAuthority(), "msg_media_raw/#/*", 1);
        }
        return matcher;
    }

    @Override
    public boolean onCreate() {
        for (int i = 0; i < UserConfig.getActivatedAccountsCount(); i++) {
            NotificationCenter.getInstance(i).addObserver(this, NotificationCenter.fileLoaded);
        }
        return true;
    }

    @Override
    public void shutdown() {
        for (int i = 0; i < UserConfig.getActivatedAccountsCount(); i++) {
            NotificationCenter.getInstance(i).removeObserver(this, NotificationCenter.fileLoaded);
        }
    }

    @Override
    public String[] getStreamTypes(Uri uri, String mimeTypeFilter) {
        if (mimeTypeFilter.startsWith("*/") || mimeTypeFilter.startsWith("image/")) {
            return new String[]{"image/jpeg", "image/png", "image/webp"};
        }
        return null;
    }

    @Override
    public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
        if (!"r".equals(mode)) {
            throw new SecurityException("Can only open files for read");
        }
        if (getUriMatcher().match(uri) == 1) {
            List<String> pathSegments = uri.getPathSegments();
            Integer.parseInt(pathSegments.get(1));
            String str = pathSegments.get(2);
            String queryParameter = uri.getQueryParameter("final_path");
            String queryParameter2 = uri.getQueryParameter("fallback");
            File file = new File(queryParameter);
            ApplicationLoader.postInitApplication();
            if (AndroidUtilities.isInternalUri(Uri.fromFile(file))) {
                throw new SecurityException("trying to read internal file");
            }
            if (!file.exists()) {
                Long l = this.fileStartTimes.get(str);
                long longValue = l != null ? l.longValue() : System.currentTimeMillis();
                if (l == null) {
                    this.fileStartTimes.put(str, Long.valueOf(longValue));
                }
                while (!file.exists()) {
                    if (System.currentTimeMillis() - longValue >= 3000) {
                        if (BuildVars.LOGS_ENABLED) {
                            FileLog.w("Waiting for " + str + " to download timed out");
                        }
                        if (TextUtils.isEmpty(queryParameter2)) {
                            throw new FileNotFoundException("Download timed out");
                        }
                        File file2 = new File(queryParameter2);
                        if (AndroidUtilities.isInternalUri(Uri.fromFile(file2))) {
                            throw new SecurityException("trying to read internal file");
                        }
                        return ParcelFileDescriptor.open(file2, 268435456);
                    }
                    synchronized (this.sync) {
                        this.waitingForFiles.add(str);
                        try {
                            this.sync.wait(1000L);
                        } catch (InterruptedException unused) {
                        }
                    }
                }
                if (AndroidUtilities.isInternalUri(Uri.fromFile(file))) {
                    throw new SecurityException("trying to read internal file");
                }
            }
            return ParcelFileDescriptor.open(file, 268435456);
        }
        throw new FileNotFoundException("Invalid URI");
    }

    public void didReceivedNotification(int id, int account, Object... args) {
        if (id == NotificationCenter.fileLoaded) {
            synchronized (this.sync) {
                String str = (String) args[0];
                if (this.waitingForFiles.remove(str)) {
                    this.fileStartTimes.remove(str);
                    this.sync.notifyAll();
                }
            }
        }
    }
}