From 325add3f0aa2b6deb6e8e70a0c549da5446c5872 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20B=C3=B6hler?= Date: Wed, 27 Feb 2019 09:21:41 +0100 Subject: [PATCH] Remove duplicate queue # Conflicts: # app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/BtLEQueue.java --- .../service/btle/AbstractTransaction.java | 49 ++++++++++++++++++ .../gadgetbridge/service/btle/BtLEQueue.java | 50 +++++-------------- .../service/btle/ServerTransaction.java | 21 +++----- .../service/btle/Transaction.java | 27 +++------- 4 files changed, 76 insertions(+), 71 deletions(-) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/AbstractTransaction.java diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/AbstractTransaction.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/AbstractTransaction.java new file mode 100644 index 000000000..68da4be31 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/AbstractTransaction.java @@ -0,0 +1,49 @@ +/* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Andreas Boehler + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.btle; + +import java.text.DateFormat; +import java.util.Date; +import java.util.Locale; + +public abstract class AbstractTransaction { + private final String mName; + private final long creationTimestamp = System.currentTimeMillis(); + + + public AbstractTransaction(String taskName) { + this.mName = taskName; + } + + public String getTaskName() { + return mName; + } + + protected String getCreationTime() { + return DateFormat.getTimeInstance(DateFormat.MEDIUM).format(new Date(creationTimestamp)); + } + + public int getActionSize() { + return 0; + } + + @Override + public String toString() { + return String.format(Locale.US, "%s: Transaction task: %s with %d actions", getCreationTime(), getTaskName(), getActionSize()); + } + +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/BtLEQueue.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/BtLEQueue.java index 9f8da69f6..e0d6941f4 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/BtLEQueue.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/BtLEQueue.java @@ -38,10 +38,10 @@ import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Queue; import java.util.Set; -import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.BlockingQueue; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.LinkedBlockingQueue; import androidx.annotation.Nullable; import nodomain.freeyourgadget.gadgetbridge.GBApplication; @@ -57,15 +57,13 @@ public final class BtLEQueue { private static final Logger LOG = LoggerFactory.getLogger(BtLEQueue.class); private final Object mGattMonitor = new Object(); - private final Object mTransactionMonitor = new Object(); private final GBDevice mGbDevice; private final BluetoothAdapter mBluetoothAdapter; private BluetoothGatt mBluetoothGatt; private BluetoothGattServer mBluetoothGattServer; private final Set mSupportedServerServices; - private final Queue mTransactions = new ConcurrentLinkedQueue<>(); - private final Queue mServerTransactions = new ConcurrentLinkedQueue<>(); + private final BlockingQueue mTransactions = new LinkedBlockingQueue<>(); private volatile boolean mDisposed; private volatile boolean mCrashed; private volatile boolean mAbortTransaction; @@ -88,17 +86,7 @@ public final class BtLEQueue { while (!mDisposed && !mCrashed) { try { - if(mTransactions.isEmpty() && mServerTransactions.isEmpty()) { - synchronized (mTransactionMonitor) { - try { - mTransactionMonitor.wait(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - } - Transaction transaction = mTransactions.poll(); - ServerTransaction serverTransaction = mServerTransactions.poll(); + AbstractTransaction qTransaction = mTransactions.take(); if (!isConnected()) { LOG.debug("not connected, waiting for connection..."); @@ -115,7 +103,8 @@ public final class BtLEQueue { mConnectionLatch = null; } - if(serverTransaction != null) { + if(qTransaction instanceof ServerTransaction) { + ServerTransaction serverTransaction = (ServerTransaction)qTransaction; internalGattServerCallback.setTransactionGattCallback(serverTransaction.getGattCallback()); mAbortServerTransaction = false; @@ -144,7 +133,8 @@ public final class BtLEQueue { } } - if(transaction != null) { + if(qTransaction instanceof Transaction) { + Transaction transaction = (Transaction)qTransaction; internalGattCallback.setTransactionGattCallback(transaction.getGattCallback()); mAbortTransaction = false; // Run all actions of the transaction until one doesn't succeed @@ -308,10 +298,9 @@ public final class BtLEQueue { if (mWaitForServerActionResultLatch != null) { mWaitForServerActionResultLatch.countDown(); } - synchronized(mTransactionMonitor) { - mTransactionMonitor.notify(); - } + boolean wasInitialized = mGbDevice.isInitialized(); + setDeviceConnectionState(State.NOT_CONNECTED); // either we've been disconnected because the device is out of range @@ -368,9 +357,6 @@ public final class BtLEQueue { LOG.debug("about to add: " + transaction); if (!transaction.isEmpty()) { mTransactions.add(transaction); - synchronized(mTransactionMonitor) { - mTransactionMonitor.notify(); - } } } @@ -382,10 +368,7 @@ public final class BtLEQueue { public void add(ServerTransaction transaction) { LOG.debug("about to add: " + transaction); if(!transaction.isEmpty()) { - mServerTransactions.add(transaction); - synchronized(mTransactionMonitor) { - mTransactionMonitor.notify(); - } + mTransactions.add(transaction); } } @@ -399,26 +382,19 @@ public final class BtLEQueue { public void insert(Transaction transaction) { LOG.debug("about to insert: " + transaction); if (!transaction.isEmpty()) { - List tail = new ArrayList<>(mTransactions.size() + 2); + List tail = new ArrayList<>(mTransactions.size() + 2); //mTransactions.drainTo(tail); - for( Transaction t : mTransactions) { + for( AbstractTransaction t : mTransactions) { tail.add(t); } mTransactions.clear(); mTransactions.add(transaction); mTransactions.addAll(tail); - synchronized(mTransactionMonitor) { - mTransactionMonitor.notify(); - } } } public void clear() { mTransactions.clear(); - mServerTransactions.clear(); - synchronized(mTransactionMonitor) { - mTransactionMonitor.notify(); - } } /** diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/ServerTransaction.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/ServerTransaction.java index 701aec798..f1dbe2a5a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/ServerTransaction.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/ServerTransaction.java @@ -16,10 +16,8 @@ along with this program. If not, see . */ package nodomain.freeyourgadget.gadgetbridge.service.btle; -import java.text.DateFormat; import java.util.ArrayList; import java.util.Collections; -import java.util.Date; import java.util.List; import java.util.Locale; @@ -31,20 +29,14 @@ import androidx.annotation.Nullable; * * @author TREND */ -public class ServerTransaction { - private final String mName; +public class ServerTransaction extends AbstractTransaction { private final List mActions = new ArrayList<>(4); - private final long creationTimestamp = System.currentTimeMillis(); private @Nullable GattServerCallback gattCallback; public ServerTransaction(String taskName) { - this.mName = taskName; - } - - public String getTaskName() { - return mName; + super(taskName); } public void add(BtLEServerAction action) { @@ -59,10 +51,6 @@ public class ServerTransaction { return mActions.isEmpty(); } - protected String getCreationTime() { - return DateFormat.getTimeInstance(DateFormat.MEDIUM).format(new Date(creationTimestamp)); - } - @Override public String toString() { return String.format(Locale.US, "%s: Transaction task: %s with %d actions", getCreationTime(), getTaskName(), mActions.size()); @@ -80,4 +68,9 @@ public class ServerTransaction { GattServerCallback getGattCallback() { return gattCallback; } + + @Override + public int getActionSize() { + return mActions.size(); + } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/Transaction.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/Transaction.java index ba91feca7..1dc0ecabf 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/Transaction.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/Transaction.java @@ -17,12 +17,9 @@ along with this program. If not, see . */ package nodomain.freeyourgadget.gadgetbridge.service.btle; -import java.text.DateFormat; import java.util.ArrayList; import java.util.Collections; -import java.util.Date; import java.util.List; -import java.util.Locale; import androidx.annotation.Nullable; @@ -32,20 +29,14 @@ import androidx.annotation.Nullable; * * @author TREND */ -public class Transaction { - private final String mName; +public class Transaction extends AbstractTransaction { private final List mActions = new ArrayList<>(4); - private final long creationTimestamp = System.currentTimeMillis(); private @Nullable GattCallback gattCallback; public Transaction(String taskName) { - this.mName = taskName; - } - - public String getTaskName() { - return mName; + super(taskName); } public void add(BtLEAction action) { @@ -60,15 +51,6 @@ public class Transaction { return mActions.isEmpty(); } - protected String getCreationTime() { - return DateFormat.getTimeInstance(DateFormat.MEDIUM).format(new Date(creationTimestamp)); - } - - @Override - public String toString() { - return String.format(Locale.US, "%s: Transaction task: %s with %d actions", getCreationTime(), getTaskName(), mActions.size()); - } - public void setGattCallback(@Nullable GattCallback callback) { gattCallback = callback; } @@ -81,4 +63,9 @@ public class Transaction { GattCallback getGattCallback() { return gattCallback; } + + @Override + public int getActionSize() { + return mActions.size(); + } }