Rabbit-R1/switch port/java/sources/androidx/appcompat/widget/ActivityChooserModel.java
2024-05-21 17:08:36 -04:00

525 lines
20 KiB
Java

package androidx.appcompat.widget;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.database.DataSetObservable;
import android.os.AsyncTask;
import android.text.TextUtils;
import android.util.Log;
import android.util.Xml;
import com.google.android.exoplayer2.C;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
/* JADX INFO: Access modifiers changed from: package-private */
/* loaded from: classes.dex */
public class ActivityChooserModel extends DataSetObservable {
static final String ATTRIBUTE_ACTIVITY = "activity";
static final String ATTRIBUTE_TIME = "time";
static final String ATTRIBUTE_WEIGHT = "weight";
static final boolean DEBUG = false;
private static final int DEFAULT_ACTIVITY_INFLATION = 5;
private static final float DEFAULT_HISTORICAL_RECORD_WEIGHT = 1.0f;
public static final String DEFAULT_HISTORY_FILE_NAME = "activity_choser_model_history.xml";
public static final int DEFAULT_HISTORY_MAX_LENGTH = 50;
private static final String HISTORY_FILE_EXTENSION = ".xml";
private static final int INVALID_INDEX = -1;
static final String LOG_TAG = "ActivityChooserModel";
static final String TAG_HISTORICAL_RECORD = "historical-record";
static final String TAG_HISTORICAL_RECORDS = "historical-records";
private OnChooseActivityListener mActivityChoserModelPolicy;
final Context mContext;
final String mHistoryFileName;
private Intent mIntent;
private static final Object sRegistryLock = new Object();
private static final Map<String, ActivityChooserModel> sDataModelRegistry = new HashMap();
private final Object mInstanceLock = new Object();
private final List<ActivityResolveInfo> mActivities = new ArrayList();
private final List<HistoricalRecord> mHistoricalRecords = new ArrayList();
private ActivitySorter mActivitySorter = new DefaultSorter();
private int mHistoryMaxSize = 50;
boolean mCanReadHistoricalData = true;
private boolean mReadShareHistoryCalled = false;
private boolean mHistoricalRecordsChanged = true;
private boolean mReloadActivities = false;
/* loaded from: classes.dex */
public interface ActivityChooserModelClient {
void setActivityChooserModel(ActivityChooserModel activityChooserModel);
}
/* loaded from: classes.dex */
public interface ActivitySorter {
void sort(Intent intent, List<ActivityResolveInfo> list, List<HistoricalRecord> list2);
}
/* loaded from: classes.dex */
public interface OnChooseActivityListener {
boolean onChooseActivity(ActivityChooserModel activityChooserModel, Intent intent);
}
public static ActivityChooserModel get(Context context, String str) {
ActivityChooserModel activityChooserModel;
synchronized (sRegistryLock) {
Map<String, ActivityChooserModel> map = sDataModelRegistry;
activityChooserModel = map.get(str);
if (activityChooserModel == null) {
activityChooserModel = new ActivityChooserModel(context, str);
map.put(str, activityChooserModel);
}
}
return activityChooserModel;
}
private ActivityChooserModel(Context context, String str) {
this.mContext = context.getApplicationContext();
if (TextUtils.isEmpty(str) || str.endsWith(HISTORY_FILE_EXTENSION)) {
this.mHistoryFileName = str;
} else {
this.mHistoryFileName = str + HISTORY_FILE_EXTENSION;
}
}
public void setIntent(Intent intent) {
synchronized (this.mInstanceLock) {
if (this.mIntent == intent) {
return;
}
this.mIntent = intent;
this.mReloadActivities = true;
ensureConsistentState();
}
}
public Intent getIntent() {
Intent intent;
synchronized (this.mInstanceLock) {
intent = this.mIntent;
}
return intent;
}
public int getActivityCount() {
int size;
synchronized (this.mInstanceLock) {
ensureConsistentState();
size = this.mActivities.size();
}
return size;
}
public ResolveInfo getActivity(int i) {
ResolveInfo resolveInfo;
synchronized (this.mInstanceLock) {
ensureConsistentState();
resolveInfo = this.mActivities.get(i).resolveInfo;
}
return resolveInfo;
}
public int getActivityIndex(ResolveInfo resolveInfo) {
synchronized (this.mInstanceLock) {
ensureConsistentState();
List<ActivityResolveInfo> list = this.mActivities;
int size = list.size();
for (int i = 0; i < size; i++) {
if (list.get(i).resolveInfo == resolveInfo) {
return i;
}
}
return -1;
}
}
public Intent chooseActivity(int i) {
synchronized (this.mInstanceLock) {
if (this.mIntent == null) {
return null;
}
ensureConsistentState();
ActivityResolveInfo activityResolveInfo = this.mActivities.get(i);
ComponentName componentName = new ComponentName(activityResolveInfo.resolveInfo.activityInfo.packageName, activityResolveInfo.resolveInfo.activityInfo.name);
Intent intent = new Intent(this.mIntent);
intent.setComponent(componentName);
if (this.mActivityChoserModelPolicy != null) {
if (this.mActivityChoserModelPolicy.onChooseActivity(this, new Intent(intent))) {
return null;
}
}
addHistoricalRecord(new HistoricalRecord(componentName, System.currentTimeMillis(), 1.0f));
return intent;
}
}
public void setOnChooseActivityListener(OnChooseActivityListener onChooseActivityListener) {
synchronized (this.mInstanceLock) {
this.mActivityChoserModelPolicy = onChooseActivityListener;
}
}
public ResolveInfo getDefaultActivity() {
synchronized (this.mInstanceLock) {
ensureConsistentState();
if (this.mActivities.isEmpty()) {
return null;
}
return this.mActivities.get(0).resolveInfo;
}
}
public void setDefaultActivity(int i) {
synchronized (this.mInstanceLock) {
ensureConsistentState();
ActivityResolveInfo activityResolveInfo = this.mActivities.get(i);
ActivityResolveInfo activityResolveInfo2 = this.mActivities.get(0);
addHistoricalRecord(new HistoricalRecord(new ComponentName(activityResolveInfo.resolveInfo.activityInfo.packageName, activityResolveInfo.resolveInfo.activityInfo.name), System.currentTimeMillis(), activityResolveInfo2 != null ? (activityResolveInfo2.weight - activityResolveInfo.weight) + 5.0f : 1.0f));
}
}
private void persistHistoricalDataIfNeeded() {
if (!this.mReadShareHistoryCalled) {
throw new IllegalStateException("No preceding call to #readHistoricalData");
}
if (this.mHistoricalRecordsChanged) {
this.mHistoricalRecordsChanged = false;
if (TextUtils.isEmpty(this.mHistoryFileName)) {
return;
}
new PersistHistoryAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new ArrayList(this.mHistoricalRecords), this.mHistoryFileName);
}
}
public void setActivitySorter(ActivitySorter activitySorter) {
synchronized (this.mInstanceLock) {
if (this.mActivitySorter == activitySorter) {
return;
}
this.mActivitySorter = activitySorter;
if (sortActivitiesIfNeeded()) {
notifyChanged();
}
}
}
public void setHistoryMaxSize(int i) {
synchronized (this.mInstanceLock) {
if (this.mHistoryMaxSize == i) {
return;
}
this.mHistoryMaxSize = i;
pruneExcessiveHistoricalRecordsIfNeeded();
if (sortActivitiesIfNeeded()) {
notifyChanged();
}
}
}
public int getHistoryMaxSize() {
int i;
synchronized (this.mInstanceLock) {
i = this.mHistoryMaxSize;
}
return i;
}
public int getHistorySize() {
int size;
synchronized (this.mInstanceLock) {
ensureConsistentState();
size = this.mHistoricalRecords.size();
}
return size;
}
private void ensureConsistentState() {
boolean loadActivitiesIfNeeded = loadActivitiesIfNeeded() | readHistoricalDataIfNeeded();
pruneExcessiveHistoricalRecordsIfNeeded();
if (loadActivitiesIfNeeded) {
sortActivitiesIfNeeded();
notifyChanged();
}
}
private boolean sortActivitiesIfNeeded() {
if (this.mActivitySorter == null || this.mIntent == null || this.mActivities.isEmpty() || this.mHistoricalRecords.isEmpty()) {
return false;
}
this.mActivitySorter.sort(this.mIntent, this.mActivities, Collections.unmodifiableList(this.mHistoricalRecords));
return true;
}
private boolean loadActivitiesIfNeeded() {
if (!this.mReloadActivities || this.mIntent == null) {
return false;
}
this.mReloadActivities = false;
this.mActivities.clear();
List<ResolveInfo> queryIntentActivities = this.mContext.getPackageManager().queryIntentActivities(this.mIntent, 0);
int size = queryIntentActivities.size();
for (int i = 0; i < size; i++) {
this.mActivities.add(new ActivityResolveInfo(queryIntentActivities.get(i)));
}
return true;
}
private boolean readHistoricalDataIfNeeded() {
if (!this.mCanReadHistoricalData || !this.mHistoricalRecordsChanged || TextUtils.isEmpty(this.mHistoryFileName)) {
return false;
}
this.mCanReadHistoricalData = false;
this.mReadShareHistoryCalled = true;
readHistoricalDataImpl();
return true;
}
private boolean addHistoricalRecord(HistoricalRecord historicalRecord) {
boolean add = this.mHistoricalRecords.add(historicalRecord);
if (add) {
this.mHistoricalRecordsChanged = true;
pruneExcessiveHistoricalRecordsIfNeeded();
persistHistoricalDataIfNeeded();
sortActivitiesIfNeeded();
notifyChanged();
}
return add;
}
private void pruneExcessiveHistoricalRecordsIfNeeded() {
int size = this.mHistoricalRecords.size() - this.mHistoryMaxSize;
if (size <= 0) {
return;
}
this.mHistoricalRecordsChanged = true;
for (int i = 0; i < size; i++) {
this.mHistoricalRecords.remove(0);
}
}
/* loaded from: classes.dex */
public static final class HistoricalRecord {
public final ComponentName activity;
public final long time;
public final float weight;
public HistoricalRecord(String str, long j, float f) {
this(ComponentName.unflattenFromString(str), j, f);
}
public HistoricalRecord(ComponentName componentName, long j, float f) {
this.activity = componentName;
this.time = j;
this.weight = f;
}
public int hashCode() {
ComponentName componentName = this.activity;
int hashCode = componentName == null ? 0 : componentName.hashCode();
long j = this.time;
return ((((hashCode + 31) * 31) + ((int) (j ^ (j >>> 32)))) * 31) + Float.floatToIntBits(this.weight);
}
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
HistoricalRecord historicalRecord = (HistoricalRecord) obj;
ComponentName componentName = this.activity;
if (componentName == null) {
if (historicalRecord.activity != null) {
return false;
}
} else if (!componentName.equals(historicalRecord.activity)) {
return false;
}
return this.time == historicalRecord.time && Float.floatToIntBits(this.weight) == Float.floatToIntBits(historicalRecord.weight);
}
public String toString() {
StringBuilder sb = new StringBuilder("[; activity:");
sb.append(this.activity);
sb.append("; time:").append(this.time);
sb.append("; weight:").append(new BigDecimal(this.weight));
sb.append("]");
return sb.toString();
}
}
/* loaded from: classes.dex */
public static final class ActivityResolveInfo implements Comparable<ActivityResolveInfo> {
public final ResolveInfo resolveInfo;
public float weight;
public ActivityResolveInfo(ResolveInfo resolveInfo) {
this.resolveInfo = resolveInfo;
}
public int hashCode() {
return Float.floatToIntBits(this.weight) + 31;
}
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
return obj != null && getClass() == obj.getClass() && Float.floatToIntBits(this.weight) == Float.floatToIntBits(((ActivityResolveInfo) obj).weight);
}
@Override // java.lang.Comparable
public int compareTo(ActivityResolveInfo activityResolveInfo) {
return Float.floatToIntBits(activityResolveInfo.weight) - Float.floatToIntBits(this.weight);
}
public String toString() {
StringBuilder sb = new StringBuilder("[resolveInfo:");
sb.append(this.resolveInfo.toString());
sb.append("; weight:").append(new BigDecimal(this.weight));
sb.append("]");
return sb.toString();
}
}
/* loaded from: classes.dex */
private static final class DefaultSorter implements ActivitySorter {
private static final float WEIGHT_DECAY_COEFFICIENT = 0.95f;
private final Map<ComponentName, ActivityResolveInfo> mPackageNameToActivityMap = new HashMap();
DefaultSorter() {
}
@Override // androidx.appcompat.widget.ActivityChooserModel.ActivitySorter
public void sort(Intent intent, List<ActivityResolveInfo> list, List<HistoricalRecord> list2) {
Map<ComponentName, ActivityResolveInfo> map = this.mPackageNameToActivityMap;
map.clear();
int size = list.size();
for (int i = 0; i < size; i++) {
ActivityResolveInfo activityResolveInfo = list.get(i);
activityResolveInfo.weight = 0.0f;
map.put(new ComponentName(activityResolveInfo.resolveInfo.activityInfo.packageName, activityResolveInfo.resolveInfo.activityInfo.name), activityResolveInfo);
}
float f = 1.0f;
for (int size2 = list2.size() - 1; size2 >= 0; size2--) {
HistoricalRecord historicalRecord = list2.get(size2);
ActivityResolveInfo activityResolveInfo2 = map.get(historicalRecord.activity);
if (activityResolveInfo2 != null) {
activityResolveInfo2.weight += historicalRecord.weight * f;
f *= WEIGHT_DECAY_COEFFICIENT;
}
}
Collections.sort(list);
}
}
private void readHistoricalDataImpl() {
XmlPullParser newPullParser;
try {
FileInputStream openFileInput = this.mContext.openFileInput(this.mHistoryFileName);
try {
try {
newPullParser = Xml.newPullParser();
newPullParser.setInput(openFileInput, C.UTF8_NAME);
for (int i = 0; i != 1 && i != 2; i = newPullParser.next()) {
}
} catch (Throwable th) {
if (openFileInput != null) {
try {
openFileInput.close();
} catch (IOException unused) {
}
}
throw th;
}
} catch (IOException e) {
Log.e(LOG_TAG, "Error reading historical recrod file: " + this.mHistoryFileName, e);
if (openFileInput == null) {
return;
}
} catch (XmlPullParserException e2) {
Log.e(LOG_TAG, "Error reading historical recrod file: " + this.mHistoryFileName, e2);
if (openFileInput == null) {
return;
}
}
if (!TAG_HISTORICAL_RECORDS.equals(newPullParser.getName())) {
throw new XmlPullParserException("Share records file does not start with historical-records tag.");
}
List<HistoricalRecord> list = this.mHistoricalRecords;
list.clear();
while (true) {
int next = newPullParser.next();
if (next == 1) {
if (openFileInput == null) {
return;
}
} else if (next != 3 && next != 4) {
if (!TAG_HISTORICAL_RECORD.equals(newPullParser.getName())) {
throw new XmlPullParserException("Share records file not well-formed.");
}
list.add(new HistoricalRecord(newPullParser.getAttributeValue(null, ATTRIBUTE_ACTIVITY), Long.parseLong(newPullParser.getAttributeValue(null, ATTRIBUTE_TIME)), Float.parseFloat(newPullParser.getAttributeValue(null, ATTRIBUTE_WEIGHT))));
}
}
try {
openFileInput.close();
} catch (IOException unused2) {
}
} catch (FileNotFoundException unused3) {
}
}
/* JADX INFO: Access modifiers changed from: private */
/* loaded from: classes.dex */
public final class PersistHistoryAsyncTask extends AsyncTask<Object, Void, Void> {
PersistHistoryAsyncTask() {
}
/* JADX WARN: Code restructure failed: missing block: B:12:0x006f, code lost:
if (r15 != null) goto L46;
*/
/* JADX WARN: Code restructure failed: missing block: B:13:0x00dd, code lost:
return null;
*/
/* JADX WARN: Code restructure failed: missing block: B:16:0x0071, code lost:
r15.close();
*/
/* JADX WARN: Code restructure failed: missing block: B:31:0x00b8, code lost:
if (r15 == null) goto L30;
*/
/* JADX WARN: Code restructure failed: missing block: B:35:0x0096, code lost:
if (r15 == null) goto L30;
*/
/* JADX WARN: Code restructure failed: missing block: B:39:0x00da, code lost:
if (r15 == null) goto L30;
*/
@Override // android.os.AsyncTask
/*
Code decompiled incorrectly, please refer to instructions dump.
To view partially-correct add '--show-bad-code' argument
*/
public java.lang.Void doInBackground(java.lang.Object... r15) {
/*
Method dump skipped, instructions count: 252
To view this dump add '--comments-level debug' option
*/
throw new UnsupportedOperationException("Method not decompiled: androidx.appcompat.widget.ActivityChooserModel.PersistHistoryAsyncTask.doInBackground(java.lang.Object[]):java.lang.Void");
}
}
}