466 lines
20 KiB
Java
466 lines
20 KiB
Java
package androidx.sharetarget;
|
|
|
|
import android.content.Context;
|
|
import android.graphics.Bitmap;
|
|
import android.graphics.BitmapFactory;
|
|
import android.text.TextUtils;
|
|
import android.util.Log;
|
|
import androidx.annotation.AnyThread;
|
|
import androidx.annotation.RequiresApi;
|
|
import androidx.annotation.RestrictTo;
|
|
import androidx.annotation.WorkerThread;
|
|
import androidx.collection.ArrayMap;
|
|
import androidx.concurrent.futures.ResolvableFuture;
|
|
import androidx.core.content.pm.ShortcutInfoCompat;
|
|
import androidx.core.content.pm.ShortcutInfoCompatSaver;
|
|
import androidx.core.graphics.drawable.IconCompat;
|
|
import androidx.sharetarget.ShortcutsInfoSerialization;
|
|
import c.i.b.d.a.a;
|
|
import java.io.File;
|
|
import java.io.FileOutputStream;
|
|
import java.io.IOException;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Set;
|
|
import java.util.UUID;
|
|
import java.util.concurrent.Callable;
|
|
import java.util.concurrent.ExecutorService;
|
|
import java.util.concurrent.LinkedBlockingQueue;
|
|
import java.util.concurrent.ThreadPoolExecutor;
|
|
import java.util.concurrent.TimeUnit;
|
|
@RequiresApi(19)
|
|
@RestrictTo({RestrictTo.Scope.LIBRARY_GROUP_PREFIX})
|
|
public class ShortcutInfoCompatSaverImpl extends ShortcutInfoCompatSaver<a<Void>> {
|
|
private static final String DIRECTORY_BITMAPS = "ShortcutInfoCompatSaver_share_targets_bitmaps";
|
|
private static final String DIRECTORY_TARGETS = "ShortcutInfoCompatSaver_share_targets";
|
|
private static final int EXECUTOR_KEEP_ALIVE_TIME_SECS = 20;
|
|
private static final String FILENAME_XML = "targets.xml";
|
|
private static final Object GET_INSTANCE_LOCK = new Object();
|
|
public static final String TAG = "ShortcutInfoCompatSaver";
|
|
private static volatile ShortcutInfoCompatSaverImpl sInstance;
|
|
public final File mBitmapsDir;
|
|
public final ExecutorService mCacheUpdateService;
|
|
public final Context mContext;
|
|
private final ExecutorService mDiskIoService;
|
|
public final Map<String, a<?>> mScheduledBitmapTasks = new ArrayMap();
|
|
public final Map<String, ShortcutsInfoSerialization.ShortcutContainer> mShortcutsMap = new ArrayMap();
|
|
public final File mTargetsXmlFile;
|
|
|
|
/* renamed from: androidx.sharetarget.ShortcutInfoCompatSaverImpl$1 reason: invalid class name */
|
|
public class AnonymousClass1 implements Runnable {
|
|
public final /* synthetic */ File val$workingDirectory;
|
|
|
|
public AnonymousClass1(File file) {
|
|
this.val$workingDirectory = file;
|
|
}
|
|
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
try {
|
|
ShortcutInfoCompatSaverImpl.ensureDir(this.val$workingDirectory);
|
|
ShortcutInfoCompatSaverImpl.ensureDir(ShortcutInfoCompatSaverImpl.this.mBitmapsDir);
|
|
ShortcutInfoCompatSaverImpl shortcutInfoCompatSaverImpl = ShortcutInfoCompatSaverImpl.this;
|
|
shortcutInfoCompatSaverImpl.mShortcutsMap.putAll(ShortcutsInfoSerialization.loadFromXml(shortcutInfoCompatSaverImpl.mTargetsXmlFile, shortcutInfoCompatSaverImpl.mContext));
|
|
ShortcutInfoCompatSaverImpl.this.deleteDanglingBitmaps(new ArrayList(ShortcutInfoCompatSaverImpl.this.mShortcutsMap.values()));
|
|
} catch (Exception e) {
|
|
Log.w("ShortcutInfoCompatSaver", "ShortcutInfoCompatSaver started with an exceptions ", e);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* renamed from: androidx.sharetarget.ShortcutInfoCompatSaverImpl$10 reason: invalid class name */
|
|
public class AnonymousClass10 implements Runnable {
|
|
public final /* synthetic */ List val$containers;
|
|
|
|
public AnonymousClass10(List list) {
|
|
this.val$containers = list;
|
|
}
|
|
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
ShortcutInfoCompatSaverImpl.this.deleteDanglingBitmaps(this.val$containers);
|
|
ShortcutsInfoSerialization.saveAsXml(this.val$containers, ShortcutInfoCompatSaverImpl.this.mTargetsXmlFile);
|
|
}
|
|
}
|
|
|
|
/* renamed from: androidx.sharetarget.ShortcutInfoCompatSaverImpl$11 reason: invalid class name */
|
|
public class AnonymousClass11 implements Runnable {
|
|
public final /* synthetic */ a val$future;
|
|
public final /* synthetic */ ResolvableFuture val$output;
|
|
|
|
public AnonymousClass11(a aVar, ResolvableFuture resolvableFuture) {
|
|
this.val$future = aVar;
|
|
this.val$output = resolvableFuture;
|
|
}
|
|
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
try {
|
|
this.val$future.get();
|
|
this.val$output.set(null);
|
|
} catch (Exception e) {
|
|
this.val$output.setException(e);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* renamed from: androidx.sharetarget.ShortcutInfoCompatSaverImpl$2 reason: invalid class name */
|
|
public class AnonymousClass2 implements Runnable {
|
|
public final /* synthetic */ List val$idList;
|
|
public final /* synthetic */ ResolvableFuture val$result;
|
|
|
|
public AnonymousClass2(List list, ResolvableFuture resolvableFuture) {
|
|
this.val$idList = list;
|
|
this.val$result = resolvableFuture;
|
|
}
|
|
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
for (String str : this.val$idList) {
|
|
ShortcutInfoCompatSaverImpl.this.mShortcutsMap.remove(str);
|
|
a<?> remove = ShortcutInfoCompatSaverImpl.this.mScheduledBitmapTasks.remove(str);
|
|
if (remove != null) {
|
|
remove.cancel(false);
|
|
}
|
|
}
|
|
ShortcutInfoCompatSaverImpl.this.scheduleSyncCurrentState(this.val$result);
|
|
}
|
|
}
|
|
|
|
/* renamed from: androidx.sharetarget.ShortcutInfoCompatSaverImpl$3 reason: invalid class name */
|
|
public class AnonymousClass3 implements Runnable {
|
|
public final /* synthetic */ ResolvableFuture val$result;
|
|
|
|
public AnonymousClass3(ResolvableFuture resolvableFuture) {
|
|
this.val$result = resolvableFuture;
|
|
}
|
|
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
ShortcutInfoCompatSaverImpl.this.mShortcutsMap.clear();
|
|
for (a<?> aVar : ShortcutInfoCompatSaverImpl.this.mScheduledBitmapTasks.values()) {
|
|
aVar.cancel(false);
|
|
}
|
|
ShortcutInfoCompatSaverImpl.this.mScheduledBitmapTasks.clear();
|
|
ShortcutInfoCompatSaverImpl.this.scheduleSyncCurrentState(this.val$result);
|
|
}
|
|
}
|
|
|
|
/* renamed from: androidx.sharetarget.ShortcutInfoCompatSaverImpl$4 reason: invalid class name */
|
|
public class AnonymousClass4 implements Callable<ArrayList<ShortcutInfoCompat>> {
|
|
public AnonymousClass4() {
|
|
}
|
|
|
|
@Override // java.util.concurrent.Callable
|
|
public ArrayList<ShortcutInfoCompat> call() {
|
|
ArrayList<ShortcutInfoCompat> arrayList = new ArrayList<>();
|
|
for (ShortcutsInfoSerialization.ShortcutContainer shortcutContainer : ShortcutInfoCompatSaverImpl.this.mShortcutsMap.values()) {
|
|
arrayList.add(new ShortcutInfoCompat.Builder(shortcutContainer.mShortcutInfo).build());
|
|
}
|
|
return arrayList;
|
|
}
|
|
}
|
|
|
|
/* renamed from: androidx.sharetarget.ShortcutInfoCompatSaverImpl$5 reason: invalid class name */
|
|
public class AnonymousClass5 implements Callable<ShortcutsInfoSerialization.ShortcutContainer> {
|
|
public final /* synthetic */ String val$shortcutId;
|
|
|
|
public AnonymousClass5(String str) {
|
|
this.val$shortcutId = str;
|
|
}
|
|
|
|
@Override // java.util.concurrent.Callable
|
|
public ShortcutsInfoSerialization.ShortcutContainer call() {
|
|
return ShortcutInfoCompatSaverImpl.this.mShortcutsMap.get(this.val$shortcutId);
|
|
}
|
|
}
|
|
|
|
/* renamed from: androidx.sharetarget.ShortcutInfoCompatSaverImpl$6 reason: invalid class name */
|
|
public class AnonymousClass6 implements Callable<Bitmap> {
|
|
public final /* synthetic */ ShortcutsInfoSerialization.ShortcutContainer val$container;
|
|
|
|
public AnonymousClass6(ShortcutsInfoSerialization.ShortcutContainer shortcutContainer) {
|
|
this.val$container = shortcutContainer;
|
|
}
|
|
|
|
@Override // java.util.concurrent.Callable
|
|
public Bitmap call() {
|
|
return BitmapFactory.decodeFile(this.val$container.mBitmapPath);
|
|
}
|
|
}
|
|
|
|
/* renamed from: androidx.sharetarget.ShortcutInfoCompatSaverImpl$7 reason: invalid class name */
|
|
public class AnonymousClass7 implements Runnable {
|
|
public final /* synthetic */ List val$copy;
|
|
public final /* synthetic */ ResolvableFuture val$result;
|
|
|
|
/* renamed from: androidx.sharetarget.ShortcutInfoCompatSaverImpl$7$1 reason: invalid class name */
|
|
public class AnonymousClass1 implements Runnable {
|
|
public final /* synthetic */ a val$future;
|
|
public final /* synthetic */ String val$id;
|
|
|
|
public AnonymousClass1(String str, a aVar) {
|
|
this.val$id = str;
|
|
this.val$future = aVar;
|
|
}
|
|
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
ShortcutInfoCompatSaverImpl.this.mScheduledBitmapTasks.remove(this.val$id);
|
|
if (!this.val$future.isCancelled()) {
|
|
try {
|
|
this.val$future.get();
|
|
} catch (Exception e) {
|
|
AnonymousClass7.this.val$result.setException(e);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public AnonymousClass7(List list, ResolvableFuture resolvableFuture) {
|
|
this.val$copy = list;
|
|
this.val$result = resolvableFuture;
|
|
}
|
|
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
for (ShortcutInfoCompat shortcutInfoCompat : this.val$copy) {
|
|
Set<String> categories = shortcutInfoCompat.getCategories();
|
|
if (categories != null && !categories.isEmpty()) {
|
|
ShortcutsInfoSerialization.ShortcutContainer containerFrom = ShortcutInfoCompatSaverImpl.this.containerFrom(shortcutInfoCompat);
|
|
Bitmap bitmap = containerFrom.mBitmapPath != null ? shortcutInfoCompat.getIcon().getBitmap() : null;
|
|
String id2 = shortcutInfoCompat.getId();
|
|
ShortcutInfoCompatSaverImpl.this.mShortcutsMap.put(id2, containerFrom);
|
|
if (bitmap != null) {
|
|
a<Void> scheduleBitmapSaving = ShortcutInfoCompatSaverImpl.this.scheduleBitmapSaving(bitmap, containerFrom.mBitmapPath);
|
|
a<?> put = ShortcutInfoCompatSaverImpl.this.mScheduledBitmapTasks.put(id2, scheduleBitmapSaving);
|
|
if (put != null) {
|
|
put.cancel(false);
|
|
}
|
|
scheduleBitmapSaving.addListener(new AnonymousClass1(id2, scheduleBitmapSaving), ShortcutInfoCompatSaverImpl.this.mCacheUpdateService);
|
|
}
|
|
}
|
|
}
|
|
ShortcutInfoCompatSaverImpl.this.scheduleSyncCurrentState(this.val$result);
|
|
}
|
|
}
|
|
|
|
/* renamed from: androidx.sharetarget.ShortcutInfoCompatSaverImpl$8 reason: invalid class name */
|
|
public class AnonymousClass8 implements Runnable {
|
|
public final /* synthetic */ Bitmap val$bitmap;
|
|
public final /* synthetic */ String val$path;
|
|
|
|
public AnonymousClass8(Bitmap bitmap, String str) {
|
|
this.val$bitmap = bitmap;
|
|
this.val$path = str;
|
|
}
|
|
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
ShortcutInfoCompatSaverImpl.this.saveBitmap(this.val$bitmap, this.val$path);
|
|
}
|
|
}
|
|
|
|
/* renamed from: androidx.sharetarget.ShortcutInfoCompatSaverImpl$9 reason: invalid class name */
|
|
public class AnonymousClass9 implements Runnable {
|
|
public final /* synthetic */ ResolvableFuture val$result;
|
|
public final /* synthetic */ Runnable val$runnable;
|
|
|
|
public AnonymousClass9(ResolvableFuture resolvableFuture, Runnable runnable) {
|
|
this.val$result = resolvableFuture;
|
|
this.val$runnable = runnable;
|
|
}
|
|
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
if (!this.val$result.isCancelled()) {
|
|
try {
|
|
this.val$runnable.run();
|
|
this.val$result.set(null);
|
|
} catch (Exception e) {
|
|
this.val$result.setException(e);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@AnyThread
|
|
public ShortcutInfoCompatSaverImpl(Context context, ExecutorService executorService, ExecutorService executorService2) {
|
|
this.mContext = context.getApplicationContext();
|
|
this.mCacheUpdateService = executorService;
|
|
this.mDiskIoService = executorService2;
|
|
File file = new File(context.getFilesDir(), "ShortcutInfoCompatSaver_share_targets");
|
|
this.mBitmapsDir = new File(file, "ShortcutInfoCompatSaver_share_targets_bitmaps");
|
|
this.mTargetsXmlFile = new File(file, "targets.xml");
|
|
executorService.submit(new AnonymousClass1(file));
|
|
}
|
|
|
|
@AnyThread
|
|
public static ExecutorService createExecutorService() {
|
|
return new ThreadPoolExecutor(0, 1, 20, TimeUnit.SECONDS, new LinkedBlockingQueue());
|
|
}
|
|
|
|
public static boolean ensureDir(File file) {
|
|
if (file.exists() && !file.isDirectory() && !file.delete()) {
|
|
return false;
|
|
}
|
|
if (!file.exists()) {
|
|
return file.mkdirs();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
@AnyThread
|
|
public static ShortcutInfoCompatSaverImpl getInstance(Context context) {
|
|
if (sInstance == null) {
|
|
synchronized (GET_INSTANCE_LOCK) {
|
|
if (sInstance == null) {
|
|
sInstance = new ShortcutInfoCompatSaverImpl(context, createExecutorService(), createExecutorService());
|
|
}
|
|
}
|
|
}
|
|
return sInstance;
|
|
}
|
|
|
|
private a<Void> submitDiskOperation(Runnable runnable) {
|
|
ResolvableFuture create = ResolvableFuture.create();
|
|
this.mDiskIoService.submit(new AnonymousClass9(create, runnable));
|
|
return create;
|
|
}
|
|
|
|
@Override // androidx.core.content.pm.ShortcutInfoCompatSaver
|
|
@AnyThread
|
|
public a<Void> addShortcuts(List<ShortcutInfoCompat> list) {
|
|
ArrayList arrayList = new ArrayList(list.size());
|
|
for (ShortcutInfoCompat shortcutInfoCompat : list) {
|
|
arrayList.add(new ShortcutInfoCompat.Builder(shortcutInfoCompat).build());
|
|
}
|
|
ResolvableFuture create = ResolvableFuture.create();
|
|
this.mCacheUpdateService.submit(new AnonymousClass7(arrayList, create));
|
|
return create;
|
|
}
|
|
|
|
/* JADX WARNING: Code restructure failed: missing block: B:7:0x0012, code lost:
|
|
if (r2 != 5) goto L_0x003b;
|
|
*/
|
|
public ShortcutsInfoSerialization.ShortcutContainer containerFrom(ShortcutInfoCompat shortcutInfoCompat) {
|
|
String str;
|
|
String str2;
|
|
IconCompat icon = shortcutInfoCompat.getIcon();
|
|
if (icon != null) {
|
|
int type = icon.getType();
|
|
if (type != 1) {
|
|
if (type == 2) {
|
|
str2 = this.mContext.getResources().getResourceName(icon.getResId());
|
|
str = null;
|
|
return new ShortcutsInfoSerialization.ShortcutContainer(new ShortcutInfoCompat.Builder(shortcutInfoCompat).setIcon(null).build(), str2, str);
|
|
}
|
|
}
|
|
str = new File(this.mBitmapsDir, UUID.randomUUID().toString()).getAbsolutePath();
|
|
str2 = null;
|
|
return new ShortcutsInfoSerialization.ShortcutContainer(new ShortcutInfoCompat.Builder(shortcutInfoCompat).setIcon(null).build(), str2, str);
|
|
}
|
|
str2 = null;
|
|
str = null;
|
|
return new ShortcutsInfoSerialization.ShortcutContainer(new ShortcutInfoCompat.Builder(shortcutInfoCompat).setIcon(null).build(), str2, str);
|
|
}
|
|
|
|
public void deleteDanglingBitmaps(List<ShortcutsInfoSerialization.ShortcutContainer> list) {
|
|
ArrayList arrayList = new ArrayList();
|
|
for (ShortcutsInfoSerialization.ShortcutContainer shortcutContainer : list) {
|
|
if (!TextUtils.isEmpty(shortcutContainer.mBitmapPath)) {
|
|
arrayList.add(shortcutContainer.mBitmapPath);
|
|
}
|
|
}
|
|
File[] listFiles = this.mBitmapsDir.listFiles();
|
|
for (File file : listFiles) {
|
|
if (!arrayList.contains(file.getAbsolutePath())) {
|
|
file.delete();
|
|
}
|
|
}
|
|
}
|
|
|
|
@WorkerThread
|
|
public IconCompat getShortcutIcon(String str) throws Exception {
|
|
Bitmap bitmap;
|
|
ShortcutsInfoSerialization.ShortcutContainer shortcutContainer = (ShortcutsInfoSerialization.ShortcutContainer) this.mCacheUpdateService.submit(new AnonymousClass5(str)).get();
|
|
if (shortcutContainer == null) {
|
|
return null;
|
|
}
|
|
if (!TextUtils.isEmpty(shortcutContainer.mResourceName)) {
|
|
int i = 0;
|
|
try {
|
|
i = this.mContext.getResources().getIdentifier(shortcutContainer.mResourceName, null, null);
|
|
} catch (Exception unused) {
|
|
}
|
|
if (i != 0) {
|
|
return IconCompat.createWithResource(this.mContext, i);
|
|
}
|
|
}
|
|
if (TextUtils.isEmpty(shortcutContainer.mBitmapPath) || (bitmap = (Bitmap) this.mDiskIoService.submit(new AnonymousClass6(shortcutContainer)).get()) == null) {
|
|
return null;
|
|
}
|
|
return IconCompat.createWithBitmap(bitmap);
|
|
}
|
|
|
|
@Override // androidx.core.content.pm.ShortcutInfoCompatSaver
|
|
@WorkerThread
|
|
public List<ShortcutInfoCompat> getShortcuts() throws Exception {
|
|
return (List) this.mCacheUpdateService.submit(new AnonymousClass4()).get();
|
|
}
|
|
|
|
@Override // androidx.core.content.pm.ShortcutInfoCompatSaver
|
|
@AnyThread
|
|
public a<Void> removeAllShortcuts() {
|
|
ResolvableFuture create = ResolvableFuture.create();
|
|
this.mCacheUpdateService.submit(new AnonymousClass3(create));
|
|
return create;
|
|
}
|
|
|
|
@Override // androidx.core.content.pm.ShortcutInfoCompatSaver
|
|
@AnyThread
|
|
public a<Void> removeShortcuts(List<String> list) {
|
|
ArrayList arrayList = new ArrayList(list);
|
|
ResolvableFuture create = ResolvableFuture.create();
|
|
this.mCacheUpdateService.submit(new AnonymousClass2(arrayList, create));
|
|
return create;
|
|
}
|
|
|
|
@WorkerThread
|
|
public void saveBitmap(Bitmap bitmap, String str) {
|
|
if (bitmap == null) {
|
|
throw new IllegalArgumentException("bitmap is null");
|
|
} else if (!TextUtils.isEmpty(str)) {
|
|
try {
|
|
FileOutputStream fileOutputStream = new FileOutputStream(new File(str));
|
|
try {
|
|
if (bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream)) {
|
|
fileOutputStream.close();
|
|
return;
|
|
}
|
|
Log.wtf("ShortcutInfoCompatSaver", "Unable to compress bitmap");
|
|
throw new RuntimeException("Unable to compress bitmap for saving " + str);
|
|
} catch (Throwable th) {
|
|
th.addSuppressed(th);
|
|
}
|
|
} catch (IOException | OutOfMemoryError | RuntimeException e) {
|
|
Log.wtf("ShortcutInfoCompatSaver", "Unable to write bitmap to file", e);
|
|
throw new RuntimeException(c.d.b.a.a.t("Unable to write bitmap to file ", str), e);
|
|
}
|
|
} else {
|
|
throw new IllegalArgumentException("path is empty");
|
|
}
|
|
throw th;
|
|
}
|
|
|
|
public a<Void> scheduleBitmapSaving(Bitmap bitmap, String str) {
|
|
return submitDiskOperation(new AnonymousClass8(bitmap, str));
|
|
}
|
|
|
|
public void scheduleSyncCurrentState(ResolvableFuture<Void> resolvableFuture) {
|
|
a<Void> submitDiskOperation = submitDiskOperation(new AnonymousClass10(new ArrayList(this.mShortcutsMap.values())));
|
|
submitDiskOperation.addListener(new AnonymousClass11(submitDiskOperation, resolvableFuture), this.mCacheUpdateService);
|
|
}
|
|
}
|