public synchronized void unsubscribe()

in aws-android-sdk-appsync/src/main/java/com/amazonaws/mobileconnectors/appsync/subscription/RealSubscriptionManager.java [344:398]


    public synchronized void unsubscribe(@Nonnull Subscription<?, ?, ?> subscription) {
        //Get matching subscription object from the subscriptionsById map
        SubscriptionObject subscriptionObject = getSubscriptionObjectFromIdMap(subscription);
        if (subscriptionObject == null ) {
            return;
        }

        if (subscriptionObject.isCancelled()) {
            return;
        }

        // Mark subscriptionObject as cancelled.
        subscriptionObject.setCancelled();

        //Remove subscriptionObject from all associated topics
        for (Object topic : subscriptionObject.getTopics()) {
            synchronized (subscriptionsByTopicLock) {
                Set<SubscriptionObject> subscriptionObjectsSet = getSubscriptionObjectSetFromTopicMap(topic.toString());
                if (subscriptionObjectsSet != null ) {
                    subscriptionObjectsSet.remove(subscriptionObject);
                }
            }
        }
        //Remove Subscription Object from subscriptionsById map
        removeSubscriptionObjectFromIdMap(subscriptionObject);


        //Sweep through all the topics. Unsubscribe all topics that have 0 subscriptions.
        synchronized (subscriptionsByTopicLock) {
            for (String topic: subscriptionsByTopic.keySet() ) {
                Set<SubscriptionObject> subscriptionObjectsSet = getSubscriptionObjectSetFromTopicMap(topic);
                if ( subscriptionObjectsSet != null && subscriptionObjectsSet.size() > 0 ) {
                    Log.v(TAG, "Subscription Infrastructure: SubscriptionObjects still exist for topic [" + topic + "]. Will not unsubscribe at the MQTT level");
                    continue;
                }

                Log.v(TAG, "Subscription Infrastructure: Number of SubscriptionObjects for topic [" + topic + "] is 0. Unsubscribing at the MQTT Level...");
                //Get connection from the topic to Connection map.
                MqttSubscriptionClient client = topicConnectionMap.get(topic);
                if (client == null ) {
                    continue;
                }
                //Call unsubscribe at the MQTT level
                client.unsubscribe(topic);
                subscriptionsByTopic.remove(topic);

                //Check if the client has any topics left. If not, close it.
                if (client.getTopics() == null || client.getTopics().size() == 0) {
                    Log.v(TAG, "Subscription Infrastructure: MQTT Client has no active topics. Disconnecting...");
                    client.close();
                }
            }
        }

    }