// Path: bletia-core/src/main/java/info/izumin/android/bletia/core/BletiaException.java
// public class BletiaException extends Exception {
// 
//     private final String mTag;
//     private final BletiaErrorType mType;
//     private AbstractAction mAction = null;
// 
//     public BletiaException(AbstractAction action, BletiaErrorType type) {
//         this(action, type.getName(), type);
//     }
// 
//     public BletiaException(AbstractAction action, String detailMessage, BletiaErrorType type) {
//         this(action.getClass().getSimpleName(), detailMessage, type);
//         mAction = action;
//     }
// 
//     public BletiaException(BleErrorType type) {
//         super();
//         mType = type;
//         mTag = getStackTrace()[0].getMethodName();
//     }
// 
//     public BletiaException(String tag, BletiaErrorType type) {
//         this(tag, type.getName(), type);
//     }
// 
//     public BletiaException(String tag, String detailMessage, BletiaErrorType type) {
//         super(detailMessage);
//         mType = type;
//         mTag = tag;
//     }
// 
//     @Override
//     public String getMessage() {
//         return "[" + mTag + "] " + super.getMessage();
//     }
// 
//     public String getTag() {
//         return mTag;
//     }
// 
//     public BletiaErrorType getType() {
//         return mType;
//     }
// 
//     public AbstractAction getAction() {
//         return mAction;
//     }
// }
// 
// Path: bletia-core/src/main/java/info/izumin/android/bletia/core/action/AbstractEnableNotificationAction.java
// public abstract class AbstractEnableNotificationAction<R> extends AbstractCharacteristicAction<R> {
// 
//     private final boolean mEnabled;
// 
//     public AbstractEnableNotificationAction(BluetoothGattCharacteristic characteristic, boolean enabled,
//                                             ResolveStrategy<BluetoothGattCharacteristic, BletiaException, R> resolveStrategy) {
//         super(characteristic, Type.ENABLE_NOTIFICATION, resolveStrategy);
//         mEnabled = enabled;
//     }
// 
//     @Override
//     public boolean execute(BluetoothGattWrapper gattWrapper) {
//         if (gattWrapper.setCharacteristicNotification(getCharacteristic(), mEnabled)) {
//             BluetoothGattDescriptor descriptor = NotificationUtils.getDescriptor(getCharacteristic(), mEnabled);
//             if (!gattWrapper.writeDescriptor(descriptor)) {
//                 reject(new BletiaException(this, BleErrorType.OPERATION_INITIATED_FAILURE));
//                 return false;
//             }
//         } else {
//             reject(new BletiaException(this, BleErrorType.REQUEST_FAILURE));
//             return false;
//         }
//         return true;
//     }
// 
//     public boolean getEnabled() {
//         return mEnabled;
//     }
// }
// 
// Path: rxbletia/src/main/java/info/izumin/android/bletia/rx/RxObservableStrategy.java
// public class RxObservableStrategy<T, E extends Throwable> implements ResolveStrategy<T, E, Observable<T>> {
//     public static final String TAG = RxObservableStrategy.class.getSimpleName();
// 
//     private final PublishSubject<T> mSubject;
// 
//     public RxObservableStrategy() {
//         mSubject = PublishSubject.create();
//     }
// 
//     protected PublishSubject<T> getSubject() {
//         return mSubject;
//     }
// 
//     @Override
//     public void resolve(T value) {
//         mSubject.onNext(value);
//         mSubject.onCompleted();
//     }
// 
//     @Override
//     public void reject(E throwable) {
//         mSubject.onError(throwable);
//     }
// 
//     @Override
//     public Observable<T> getResolver() {
//         return mSubject;
//     }
// }


import android.bluetooth.BluetoothGattCharacteristic;
import info.izumin.android.bletia.core.BletiaException;
import info.izumin.android.bletia.core.action.AbstractEnableNotificationAction;
import info.izumin.android.bletia.rx.RxObservableStrategy;
import rx.Observable;
package info.izumin.android.bletia.rx.action;



/**
 * Created by izumin on 11/15/15.
 */
public class RxDisableNotificationAction extends AbstractEnableNotificationAction<Observable<BluetoothGattCharacteristic>> {
    public static final String TAG = RxDisableNotificationAction.class.getSimpleName();

// Path: bletia-core/src/main/java/info/izumin/android/bletia/core/BletiaException.java
// public class BletiaException extends Exception {
// 
//     private final String mTag;
//     private final BletiaErrorType mType;
//     private AbstractAction mAction = null;
// 
//     public BletiaException(AbstractAction action, BletiaErrorType type) {
//         this(action, type.getName(), type);
//     }
// 
//     public BletiaException(AbstractAction action, String detailMessage, BletiaErrorType type) {
//         this(action.getClass().getSimpleName(), detailMessage, type);
//         mAction = action;
//     }
// 
//     public BletiaException(BleErrorType type) {
//         super();
//         mType = type;
//         mTag = getStackTrace()[0].getMethodName();
//     }
// 
//     public BletiaException(String tag, BletiaErrorType type) {
//         this(tag, type.getName(), type);
//     }
// 
//     public BletiaException(String tag, String detailMessage, BletiaErrorType type) {
//         super(detailMessage);
//         mType = type;
//         mTag = tag;
//     }
// 
//     @Override
//     public String getMessage() {
//         return "[" + mTag + "] " + super.getMessage();
//     }
// 
//     public String getTag() {
//         return mTag;
//     }
// 
//     public BletiaErrorType getType() {
//         return mType;
//     }
// 
//     public AbstractAction getAction() {
//         return mAction;
//     }
// }
// 
// Path: bletia-core/src/main/java/info/izumin/android/bletia/core/action/AbstractEnableNotificationAction.java
// public abstract class AbstractEnableNotificationAction<R> extends AbstractCharacteristicAction<R> {
// 
//     private final boolean mEnabled;
// 
//     public AbstractEnableNotificationAction(BluetoothGattCharacteristic characteristic, boolean enabled,
//                                             ResolveStrategy<BluetoothGattCharacteristic, BletiaException, R> resolveStrategy) {
//         super(characteristic, Type.ENABLE_NOTIFICATION, resolveStrategy);
//         mEnabled = enabled;
//     }
// 
//     @Override
//     public boolean execute(BluetoothGattWrapper gattWrapper) {
//         if (gattWrapper.setCharacteristicNotification(getCharacteristic(), mEnabled)) {
//             BluetoothGattDescriptor descriptor = NotificationUtils.getDescriptor(getCharacteristic(), mEnabled);
//             if (!gattWrapper.writeDescriptor(descriptor)) {
//                 reject(new BletiaException(this, BleErrorType.OPERATION_INITIATED_FAILURE));
//                 return false;
//             }
//         } else {
//             reject(new BletiaException(this, BleErrorType.REQUEST_FAILURE));
//             return false;
//         }
//         return true;
//     }
// 
//     public boolean getEnabled() {
//         return mEnabled;
//     }
// }
// 
// Path: rxbletia/src/main/java/info/izumin/android/bletia/rx/RxObservableStrategy.java
// public class RxObservableStrategy<T, E extends Throwable> implements ResolveStrategy<T, E, Observable<T>> {
//     public static final String TAG = RxObservableStrategy.class.getSimpleName();
// 
//     private final PublishSubject<T> mSubject;
// 
//     public RxObservableStrategy() {
//         mSubject = PublishSubject.create();
//     }
// 
//     protected PublishSubject<T> getSubject() {
//         return mSubject;
//     }
// 
//     @Override
//     public void resolve(T value) {
//         mSubject.onNext(value);
//         mSubject.onCompleted();
//     }
// 
//     @Override
//     public void reject(E throwable) {
//         mSubject.onError(throwable);
//     }
// 
//     @Override
//     public Observable<T> getResolver() {
//         return mSubject;
//     }
// }


// Path: rxbletia/src/main/java/info/izumin/android/bletia/rx/action/RxDisableNotificationAction.java
import android.bluetooth.BluetoothGattCharacteristic;
import info.izumin.android.bletia.core.BletiaException;
import info.izumin.android.bletia.core.action.AbstractEnableNotificationAction;
import info.izumin.android.bletia.rx.RxObservableStrategy;
import rx.Observable;

package info.izumin.android.bletia.rx.action;



/**
 * Created by izumin on 11/15/15.
 */
public class RxDisableNotificationAction extends AbstractEnableNotificationAction<Observable<BluetoothGattCharacteristic>> {
    public static final String TAG = RxDisableNotificationAction.class.getSimpleName();

    public RxDisableNotificationAction(BluetoothGattCharacteristic characteristic) {