ADD week 5
This commit is contained in:
		| @@ -0,0 +1,239 @@ | ||||
| package androidx.localbroadcastmanager.content; | ||||
|  | ||||
| import android.content.BroadcastReceiver; | ||||
| import android.content.Context; | ||||
| import android.content.Intent; | ||||
| import android.content.IntentFilter; | ||||
| import android.net.Uri; | ||||
| import android.os.Handler; | ||||
| import android.os.Message; | ||||
| import android.util.Log; | ||||
| import java.util.ArrayList; | ||||
| import java.util.HashMap; | ||||
| import java.util.Set; | ||||
|  | ||||
| /* loaded from: classes.dex */ | ||||
| public final class LocalBroadcastManager { | ||||
|     private static final boolean DEBUG = false; | ||||
|     static final int MSG_EXEC_PENDING_BROADCASTS = 1; | ||||
|     private static final String TAG = "LocalBroadcastManager"; | ||||
|     private static LocalBroadcastManager mInstance; | ||||
|     private static final Object mLock = new Object(); | ||||
|     private final Context mAppContext; | ||||
|     private final Handler mHandler; | ||||
|     private final HashMap<BroadcastReceiver, ArrayList<ReceiverRecord>> mReceivers = new HashMap<>(); | ||||
|     private final HashMap<String, ArrayList<ReceiverRecord>> mActions = new HashMap<>(); | ||||
|     private final ArrayList<BroadcastRecord> mPendingBroadcasts = new ArrayList<>(); | ||||
|  | ||||
|     private static final class ReceiverRecord { | ||||
|         boolean broadcasting; | ||||
|         boolean dead; | ||||
|         final IntentFilter filter; | ||||
|         final BroadcastReceiver receiver; | ||||
|  | ||||
|         ReceiverRecord(IntentFilter intentFilter, BroadcastReceiver broadcastReceiver) { | ||||
|             this.filter = intentFilter; | ||||
|             this.receiver = broadcastReceiver; | ||||
|         } | ||||
|  | ||||
|         public String toString() { | ||||
|             StringBuilder sb = new StringBuilder(128); | ||||
|             sb.append("Receiver{"); | ||||
|             sb.append(this.receiver); | ||||
|             sb.append(" filter="); | ||||
|             sb.append(this.filter); | ||||
|             if (this.dead) { | ||||
|                 sb.append(" DEAD"); | ||||
|             } | ||||
|             sb.append("}"); | ||||
|             return sb.toString(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static final class BroadcastRecord { | ||||
|         final Intent intent; | ||||
|         final ArrayList<ReceiverRecord> receivers; | ||||
|  | ||||
|         BroadcastRecord(Intent intent, ArrayList<ReceiverRecord> arrayList) { | ||||
|             this.intent = intent; | ||||
|             this.receivers = arrayList; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static LocalBroadcastManager getInstance(Context context) { | ||||
|         LocalBroadcastManager localBroadcastManager; | ||||
|         synchronized (mLock) { | ||||
|             if (mInstance == null) { | ||||
|                 mInstance = new LocalBroadcastManager(context.getApplicationContext()); | ||||
|             } | ||||
|             localBroadcastManager = mInstance; | ||||
|         } | ||||
|         return localBroadcastManager; | ||||
|     } | ||||
|  | ||||
|     private LocalBroadcastManager(Context context) { | ||||
|         this.mAppContext = context; | ||||
|         this.mHandler = new Handler(context.getMainLooper()) { // from class: androidx.localbroadcastmanager.content.LocalBroadcastManager.1 | ||||
|             @Override // android.os.Handler | ||||
|             public void handleMessage(Message message) { | ||||
|                 if (message.what == 1) { | ||||
|                     LocalBroadcastManager.this.executePendingBroadcasts(); | ||||
|                 } else { | ||||
|                     super.handleMessage(message); | ||||
|                 } | ||||
|             } | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     public void registerReceiver(BroadcastReceiver broadcastReceiver, IntentFilter intentFilter) { | ||||
|         synchronized (this.mReceivers) { | ||||
|             ReceiverRecord receiverRecord = new ReceiverRecord(intentFilter, broadcastReceiver); | ||||
|             ArrayList<ReceiverRecord> arrayList = this.mReceivers.get(broadcastReceiver); | ||||
|             if (arrayList == null) { | ||||
|                 arrayList = new ArrayList<>(1); | ||||
|                 this.mReceivers.put(broadcastReceiver, arrayList); | ||||
|             } | ||||
|             arrayList.add(receiverRecord); | ||||
|             for (int i = 0; i < intentFilter.countActions(); i++) { | ||||
|                 String action = intentFilter.getAction(i); | ||||
|                 ArrayList<ReceiverRecord> arrayList2 = this.mActions.get(action); | ||||
|                 if (arrayList2 == null) { | ||||
|                     arrayList2 = new ArrayList<>(1); | ||||
|                     this.mActions.put(action, arrayList2); | ||||
|                 } | ||||
|                 arrayList2.add(receiverRecord); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void unregisterReceiver(BroadcastReceiver broadcastReceiver) { | ||||
|         synchronized (this.mReceivers) { | ||||
|             ArrayList<ReceiverRecord> remove = this.mReceivers.remove(broadcastReceiver); | ||||
|             if (remove == null) { | ||||
|                 return; | ||||
|             } | ||||
|             for (int size = remove.size() - 1; size >= 0; size--) { | ||||
|                 ReceiverRecord receiverRecord = remove.get(size); | ||||
|                 receiverRecord.dead = true; | ||||
|                 for (int i = 0; i < receiverRecord.filter.countActions(); i++) { | ||||
|                     String action = receiverRecord.filter.getAction(i); | ||||
|                     ArrayList<ReceiverRecord> arrayList = this.mActions.get(action); | ||||
|                     if (arrayList != null) { | ||||
|                         for (int size2 = arrayList.size() - 1; size2 >= 0; size2--) { | ||||
|                             ReceiverRecord receiverRecord2 = arrayList.get(size2); | ||||
|                             if (receiverRecord2.receiver == broadcastReceiver) { | ||||
|                                 receiverRecord2.dead = true; | ||||
|                                 arrayList.remove(size2); | ||||
|                             } | ||||
|                         } | ||||
|                         if (arrayList.size() <= 0) { | ||||
|                             this.mActions.remove(action); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public boolean sendBroadcast(Intent intent) { | ||||
|         ArrayList<ReceiverRecord> arrayList; | ||||
|         int i; | ||||
|         String str; | ||||
|         synchronized (this.mReceivers) { | ||||
|             String action = intent.getAction(); | ||||
|             String resolveTypeIfNeeded = intent.resolveTypeIfNeeded(this.mAppContext.getContentResolver()); | ||||
|             Uri data = intent.getData(); | ||||
|             String scheme = intent.getScheme(); | ||||
|             Set<String> categories = intent.getCategories(); | ||||
|             boolean z = (intent.getFlags() & 8) != 0; | ||||
|             if (z) { | ||||
|                 Log.v(TAG, "Resolving type " + resolveTypeIfNeeded + " scheme " + scheme + " of intent " + intent); | ||||
|             } | ||||
|             ArrayList<ReceiverRecord> arrayList2 = this.mActions.get(intent.getAction()); | ||||
|             if (arrayList2 != null) { | ||||
|                 if (z) { | ||||
|                     Log.v(TAG, "Action list: " + arrayList2); | ||||
|                 } | ||||
|                 ArrayList arrayList3 = null; | ||||
|                 int i2 = 0; | ||||
|                 while (i2 < arrayList2.size()) { | ||||
|                     ReceiverRecord receiverRecord = arrayList2.get(i2); | ||||
|                     if (z) { | ||||
|                         Log.v(TAG, "Matching against filter " + receiverRecord.filter); | ||||
|                     } | ||||
|                     if (receiverRecord.broadcasting) { | ||||
|                         if (z) { | ||||
|                             Log.v(TAG, "  Filter's target already added"); | ||||
|                         } | ||||
|                         arrayList = arrayList2; | ||||
|                         i = i2; | ||||
|                         str = action; | ||||
|                     } else { | ||||
|                         arrayList = arrayList2; | ||||
|                         i = i2; | ||||
|                         str = action; | ||||
|                         int match = receiverRecord.filter.match(action, resolveTypeIfNeeded, scheme, data, categories, TAG); | ||||
|                         if (match >= 0) { | ||||
|                             if (z) { | ||||
|                                 Log.v(TAG, "  Filter matched!  match=0x" + Integer.toHexString(match)); | ||||
|                             } | ||||
|                             if (arrayList3 == null) { | ||||
|                                 arrayList3 = new ArrayList(); | ||||
|                             } | ||||
|                             arrayList3.add(receiverRecord); | ||||
|                             receiverRecord.broadcasting = true; | ||||
|                         } else if (z) { | ||||
|                             Log.v(TAG, "  Filter did not match: " + (match != -4 ? match != -3 ? match != -2 ? match != -1 ? "unknown reason" : "type" : "data" : "action" : "category")); | ||||
|                         } | ||||
|                     } | ||||
|                     i2 = i + 1; | ||||
|                     arrayList2 = arrayList; | ||||
|                     action = str; | ||||
|                 } | ||||
|                 if (arrayList3 != null) { | ||||
|                     for (int i3 = 0; i3 < arrayList3.size(); i3++) { | ||||
|                         ((ReceiverRecord) arrayList3.get(i3)).broadcasting = false; | ||||
|                     } | ||||
|                     this.mPendingBroadcasts.add(new BroadcastRecord(intent, arrayList3)); | ||||
|                     if (!this.mHandler.hasMessages(1)) { | ||||
|                         this.mHandler.sendEmptyMessage(1); | ||||
|                     } | ||||
|                     return true; | ||||
|                 } | ||||
|             } | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void sendBroadcastSync(Intent intent) { | ||||
|         if (sendBroadcast(intent)) { | ||||
|             executePendingBroadcasts(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     void executePendingBroadcasts() { | ||||
|         int size; | ||||
|         BroadcastRecord[] broadcastRecordArr; | ||||
|         while (true) { | ||||
|             synchronized (this.mReceivers) { | ||||
|                 size = this.mPendingBroadcasts.size(); | ||||
|                 if (size <= 0) { | ||||
|                     return; | ||||
|                 } | ||||
|                 broadcastRecordArr = new BroadcastRecord[size]; | ||||
|                 this.mPendingBroadcasts.toArray(broadcastRecordArr); | ||||
|                 this.mPendingBroadcasts.clear(); | ||||
|             } | ||||
|             for (int i = 0; i < size; i++) { | ||||
|                 BroadcastRecord broadcastRecord = broadcastRecordArr[i]; | ||||
|                 int size2 = broadcastRecord.receivers.size(); | ||||
|                 for (int i2 = 0; i2 < size2; i2++) { | ||||
|                     ReceiverRecord receiverRecord = broadcastRecord.receivers.get(i2); | ||||
|                     if (!receiverRecord.dead) { | ||||
|                         receiverRecord.receiver.onReceive(this.mAppContext, broadcastRecord.intent); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user