diff options
author | David Su <dysu@google.com> | 2020-04-02 03:34:14 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2020-04-02 03:34:14 +0000 |
commit | 609329c636398be2d1fe6eb4a5f63f1fecdd0bce (patch) | |
tree | e7f86e8db4717deb8c97a8874b22ff0d1d4ca61b /service | |
parent | 06cb4730c40de3806b980b4535a305502169ac40 (diff) | |
parent | 9bd55639ba67c8da80ea6d136c128d313a6c23f5 (diff) |
Merge changes Ide4d040b,I1b84bb11 into rvc-dev
* changes:
Clean up WifiTrafficPoller
Stop depending on android.system.Os.chown
Diffstat (limited to 'service')
3 files changed, 60 insertions, 57 deletions
diff --git a/service/java/com/android/server/wifi/WifiConfigStore.java b/service/java/com/android/server/wifi/WifiConfigStore.java index 9a73f52d5..2853bbac5 100644 --- a/service/java/com/android/server/wifi/WifiConfigStore.java +++ b/service/java/com/android/server/wifi/WifiConfigStore.java @@ -936,7 +936,7 @@ public class WifiConfigStore { FileOutputStream out = null; try { out = mAtomicFile.startWrite(); - FileUtils.setPermissions(mFileName, FILE_MODE, -1, -1); + FileUtils.chmod(mFileName, FILE_MODE); out.write(mWriteData); mAtomicFile.finishWrite(out); } catch (IOException e) { diff --git a/service/java/com/android/server/wifi/WifiTrafficPoller.java b/service/java/com/android/server/wifi/WifiTrafficPoller.java index 4491449e2..8349f7b13 100644 --- a/service/java/com/android/server/wifi/WifiTrafficPoller.java +++ b/service/java/com/android/server/wifi/WifiTrafficPoller.java @@ -33,67 +33,83 @@ import java.io.PrintWriter; * Polls for traffic stats and notifies the clients */ public class WifiTrafficPoller { - private static final String TAG = "WifiTrafficPoller"; - private long mTxPkts; - private long mRxPkts; - /* Tracks last reported data activity */ - private int mDataActivity; + private long mTxPkts = 0; + private long mRxPkts = 0; + + private int mLastActivity = -1; + + private static class CallbackWrapper { + public final ITrafficStateCallback callback; + /** + * On the first invocation, the callback is invoked no matter if the data activity changed + * or not. + */ + public boolean isFirstInvocation = true; - private final ExternalCallbackTracker<ITrafficStateCallback> mRegisteredCallbacks; + CallbackWrapper(ITrafficStateCallback callback) { + this.callback = callback; + } + } - WifiTrafficPoller(@NonNull Handler handler) { + private final ExternalCallbackTracker<CallbackWrapper> mRegisteredCallbacks; + + public WifiTrafficPoller(@NonNull Handler handler) { mRegisteredCallbacks = new ExternalCallbackTracker<>(handler); } /** * Add a new callback to the traffic poller. */ - public void addCallback(IBinder binder, ITrafficStateCallback callback, - int callbackIdentifier) { - if (!mRegisteredCallbacks.add(binder, callback, callbackIdentifier)) { + public void addCallback(IBinder binder, ITrafficStateCallback callback, int callbackId) { + if (!mRegisteredCallbacks.add(binder, new CallbackWrapper(callback), callbackId)) { Log.e(TAG, "Failed to add callback"); - return; } } /** * Remove an existing callback from the traffic poller. */ - public void removeCallback(int callbackIdentifier) { - mRegisteredCallbacks.remove(callbackIdentifier); + public void removeCallback(int callbackId) { + mRegisteredCallbacks.remove(callbackId); } - void notifyOnDataActivity(long txPkts, long rxPkts) { - long sent, received; - long preTxPkts = mTxPkts, preRxPkts = mRxPkts; + /** + * Notifies clients of data activity if the activity changed since the last update. + */ + public void notifyOnDataActivity(long newTxPkts, long newRxPkts) { + if (newTxPkts <= 0 && newRxPkts <= 0) { + return; + } + + long sent = newTxPkts - mTxPkts; + long received = newRxPkts - mRxPkts; int dataActivity = WifiManager.TrafficStateCallback.DATA_ACTIVITY_NONE; - mTxPkts = txPkts; - mRxPkts = rxPkts; - - if (preTxPkts > 0 || preRxPkts > 0) { - sent = mTxPkts - preTxPkts; - received = mRxPkts - preRxPkts; - if (sent > 0) { - dataActivity |= WifiManager.TrafficStateCallback.DATA_ACTIVITY_OUT; - } - if (received > 0) { - dataActivity |= WifiManager.TrafficStateCallback.DATA_ACTIVITY_IN; - } + if (sent > 0) { + dataActivity |= WifiManager.TrafficStateCallback.DATA_ACTIVITY_OUT; + } + if (received > 0) { + dataActivity |= WifiManager.TrafficStateCallback.DATA_ACTIVITY_IN; + } - if (dataActivity != mDataActivity) { - mDataActivity = dataActivity; - for (ITrafficStateCallback callback : mRegisteredCallbacks.getCallbacks()) { - try { - callback.onStateChanged(mDataActivity); - } catch (RemoteException e) { - // Failed to reach, skip - // Client removal is handled in WifiService - } + for (CallbackWrapper wrapper : mRegisteredCallbacks.getCallbacks()) { + // if this callback hasn't been triggered before, or the data activity changed, + // notify the callback + if (wrapper.isFirstInvocation || dataActivity != mLastActivity) { + wrapper.isFirstInvocation = false; + try { + wrapper.callback.onStateChanged(dataActivity); + } catch (RemoteException e) { + // Failed to reach, skip + // Client removal is handled in WifiService } } } + + mTxPkts = newTxPkts; + mRxPkts = newRxPkts; + mLastActivity = dataActivity; } /** @@ -102,8 +118,7 @@ public class WifiTrafficPoller { public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println("mTxPkts " + mTxPkts); pw.println("mRxPkts " + mRxPkts); - pw.println("mDataActivity " + mDataActivity); + pw.println("mLastActivity " + mLastActivity); pw.println("mRegisteredCallbacks " + mRegisteredCallbacks.getNumCallbacks()); } - } diff --git a/service/java/com/android/server/wifi/util/FileUtils.java b/service/java/com/android/server/wifi/util/FileUtils.java index 07b1155c3..fb8214246 100644 --- a/service/java/com/android/server/wifi/util/FileUtils.java +++ b/service/java/com/android/server/wifi/util/FileUtils.java @@ -33,31 +33,20 @@ public final class FileUtils { private static final String TAG = "FileUtils"; /** - * Set owner and mode of of given path. + * Change the mode of a file. * + * @param path path of the file * @param mode to apply through {@code chmod} - * @param uid to apply through {@code chown}, or -1 to leave unchanged - * @param gid to apply through {@code chown}, or -1 to leave unchanged * @return 0 on success, otherwise errno. */ - public static int setPermissions(String path, int mode, int uid, int gid) { + public static int chmod(String path, int mode) { try { Os.chmod(path, mode); + return 0; } catch (ErrnoException e) { - Log.w(TAG, "Failed to chmod(" + path + "): " + e); + Log.w(TAG, "Failed to chmod(" + path + ", " + mode + "): ", e); return e.errno; } - - if (uid >= 0 || gid >= 0) { - try { - Os.chown(path, uid, gid); - } catch (ErrnoException e) { - Log.w(TAG, "Failed to chown(" + path + "): " + e); - return e.errno; - } - } - - return 0; } /** @@ -80,5 +69,4 @@ public final class FileUtils { public static void stringToFile(String filename, String string) throws IOException { bytesToFile(filename, string.getBytes(StandardCharsets.UTF_8)); } - } |