Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1436)

Unified Diff: content/public/android/java/src/org/chromium/content/browser/BackgroundSyncNetworkObserver.java

Issue 1294603003: [BackgroundSync] Trigger Background Sync events when Chrome is backgrounded on Android (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Don't register observers with nonexistant Autodetector Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/content_jni.gypi ('k') | testing/android/native_test/java/AndroidManifest.xml » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/public/android/java/src/org/chromium/content/browser/BackgroundSyncNetworkObserver.java
diff --git a/content/public/android/java/src/org/chromium/content/browser/BackgroundSyncNetworkObserver.java b/content/public/android/java/src/org/chromium/content/browser/BackgroundSyncNetworkObserver.java
new file mode 100644
index 0000000000000000000000000000000000000000..25c2846ff515952b775fb168a9a14ce7eb8aaaef
--- /dev/null
+++ b/content/public/android/java/src/org/chromium/content/browser/BackgroundSyncNetworkObserver.java
@@ -0,0 +1,109 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.content.browser;
+
+import android.Manifest;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.Process;
+
+import org.chromium.base.ThreadUtils;
+import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeClassQualifiedName;
+import org.chromium.net.NetworkChangeNotifierAutoDetect;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Contains the Java code used by the BackgroundSyncNetworkObserverAndroid C++ class.
+ *
+ * The purpose of this class is to listen for and forward network connectivity events to the
+ * BackgroundSyncNetworkObserverAndroid objects even when the application is paused. The standard
+ * NetworkChangeNotifier does not listen for connectivity events when the application is paused.
+ *
+ * This class maintains a NetworkChangeNotifierAutoDetect, which exists for as long as any
+ * BackgroundSyncNetworkObserverAndroid objects are registered.
+ *
+ * This class lives on the main thread.
+ */
+@JNINamespace("content")
+class BackgroundSyncNetworkObserver implements NetworkChangeNotifierAutoDetect.Observer {
+ private static final String TAG = "cr_BgSyncNetObserver";
+
+ private NetworkChangeNotifierAutoDetect mNotifier;
+ private Context mContext;
+
+ // The singleton instance.
+ private static BackgroundSyncNetworkObserver sInstance = null;
+
+ // List of native observers. These are each called when the network state changes.
+ private List<Long> mNativePtrs;
+
+ private BackgroundSyncNetworkObserver(Context ctx) {
+ ThreadUtils.assertOnUiThread();
+ mContext = ctx;
+ mNativePtrs = new ArrayList<Long>();
+ }
+
+ private static boolean canCreateObserver(Context ctx) {
+ return ctx.checkPermission(
+ Manifest.permission.ACCESS_NETWORK_STATE, Process.myPid(), Process.myUid())
+ == PackageManager.PERMISSION_GRANTED;
+ }
+
+ @CalledByNative
+ private static BackgroundSyncNetworkObserver createObserver(Context ctx, long nativePtr) {
+ ThreadUtils.assertOnUiThread();
+ if (sInstance == null) {
+ sInstance = new BackgroundSyncNetworkObserver(ctx);
+ }
+ sInstance.registerObserver(nativePtr);
+ return sInstance;
+ }
+
+ private void registerObserver(final long nativePtr) {
+ ThreadUtils.assertOnUiThread();
+ if (!canCreateObserver(mContext)) {
+ return;
+ }
+
+ // Create the NetworkChangeNotifierAutoDetect if it does not exist already.
+ if (mNotifier == null) {
+ mNotifier =
+ new NetworkChangeNotifierAutoDetect(this, mContext, true /* always listen */);
+ }
+ mNativePtrs.add(nativePtr);
+
+ nativeNotifyConnectionTypeChanged(
+ nativePtr, mNotifier.getCurrentConnectionType(mNotifier.getCurrentNetworkState()));
+ }
+
+ @CalledByNative
+ private void removeObserver(long nativePtr) {
+ ThreadUtils.assertOnUiThread();
+ mNativePtrs.remove(nativePtr);
+ // Destroy the NetworkChangeNotifierAutoDetect if there are no more observers.
+ if (mNativePtrs.size() == 0 && mNotifier != null) {
+ mNotifier.destroy();
+ mNotifier = null;
+ }
+ }
+
+ @Override
+ public void onConnectionTypeChanged(int newConnectionType) {
+ ThreadUtils.assertOnUiThread();
+ for (Long nativePtr : mNativePtrs) {
+ nativeNotifyConnectionTypeChanged(nativePtr, newConnectionType);
+ }
+ }
+
+ @Override
+ public void onMaxBandwidthChanged(double maxBandwidthMbps) {}
+
+ @NativeClassQualifiedName("BackgroundSyncNetworkObserverAndroid::Observer")
+ private native void nativeNotifyConnectionTypeChanged(long nativePtr, int newConnectionType);
+}
« no previous file with comments | « content/content_jni.gypi ('k') | testing/android/native_test/java/AndroidManifest.xml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698