Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.content.browser; | 5 package org.chromium.content.browser; |
| 6 | 6 |
| 7 import android.view.View; | 7 import android.view.View; |
| 8 import android.view.ViewTreeObserver; | 8 import android.view.ViewTreeObserver; |
| 9 | 9 |
| 10 import java.util.ArrayList; | 10 import org.chromium.base.ObserverList; |
| 11 | 11 |
| 12 /** | 12 /** |
| 13 * Used to register listeners that can be notified of changes to the position of a view. | 13 * Used to register listeners that can be notified of changes to the position of a view. |
| 14 */ | 14 */ |
| 15 public class ViewPositionObserver implements PositionObserver { | 15 public class ViewPositionObserver implements PositionObserver { |
| 16 private View mView; | 16 private View mView; |
| 17 // Absolute position of the container view relative to its parent window. | 17 // Absolute position of the container view relative to its parent window. |
| 18 private final int[] mPosition = new int[2]; | 18 private final int[] mPosition = new int[2]; |
| 19 | 19 |
| 20 private final ArrayList<Listener> mListeners; | 20 private final ObserverList<Listener> mListeners; |
|
Yaron
2014/07/22 19:20:25
Note that there is slightly more overhead to using
wajahat
2014/07/23 04:24:16
ok reverting this change
| |
| 21 private ViewTreeObserver.OnPreDrawListener mPreDrawListener; | 21 private ViewTreeObserver.OnPreDrawListener mPreDrawListener; |
| 22 | 22 |
| 23 /** | 23 /** |
| 24 * @param view The view to observe. | 24 * @param view The view to observe. |
| 25 */ | 25 */ |
| 26 public ViewPositionObserver(View view) { | 26 public ViewPositionObserver(View view) { |
| 27 mView = view; | 27 mView = view; |
| 28 mListeners = new ArrayList<Listener>(); | 28 mListeners = new ObserverList<Listener>(); |
| 29 updatePosition(); | 29 updatePosition(); |
| 30 mPreDrawListener = new ViewTreeObserver.OnPreDrawListener() { | 30 mPreDrawListener = new ViewTreeObserver.OnPreDrawListener() { |
| 31 @Override | 31 @Override |
| 32 public boolean onPreDraw() { | 32 public boolean onPreDraw() { |
| 33 updatePosition(); | 33 updatePosition(); |
| 34 return true; | 34 return true; |
| 35 } | 35 } |
| 36 }; | 36 }; |
| 37 } | 37 } |
| 38 | 38 |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 54 // The stored position may be out-of-date. Get the real current position . | 54 // The stored position may be out-of-date. Get the real current position . |
| 55 updatePosition(); | 55 updatePosition(); |
| 56 return mPosition[1]; | 56 return mPosition[1]; |
| 57 } | 57 } |
| 58 | 58 |
| 59 /** | 59 /** |
| 60 * Register a listener to be called when the position of the underlying view changes. | 60 * Register a listener to be called when the position of the underlying view changes. |
| 61 */ | 61 */ |
| 62 @Override | 62 @Override |
| 63 public void addListener(Listener listener) { | 63 public void addListener(Listener listener) { |
| 64 if (mListeners.contains(listener)) return; | |
|
Yaron
2014/07/22 19:20:25
This is different than what ObserverList is deisgn
wajahat
2014/07/23 04:24:16
ok, reverting this change
| |
| 65 | |
| 66 if (mListeners.isEmpty()) { | 64 if (mListeners.isEmpty()) { |
| 67 mView.getViewTreeObserver().addOnPreDrawListener(mPreDrawListener); | 65 mView.getViewTreeObserver().addOnPreDrawListener(mPreDrawListener); |
| 68 updatePosition(); | 66 updatePosition(); |
| 69 } | 67 } |
| 70 | 68 |
| 71 mListeners.add(listener); | 69 mListeners.addObserver(listener); |
| 72 } | 70 } |
| 73 | 71 |
| 74 /** | 72 /** |
| 75 * Remove a previously installed listener. | 73 * Remove a previously installed listener. |
| 76 */ | 74 */ |
| 77 @Override | 75 @Override |
| 78 public void removeListener(Listener listener) { | 76 public void removeListener(Listener listener) { |
| 79 if (!mListeners.contains(listener)) return; | 77 mListeners.removeObserver(listener); |
| 80 | |
| 81 mListeners.remove(listener); | |
| 82 | 78 |
| 83 if (mListeners.isEmpty()) { | 79 if (mListeners.isEmpty()) { |
| 84 mView.getViewTreeObserver().removeOnPreDrawListener(mPreDrawListener ); | 80 mView.getViewTreeObserver().removeOnPreDrawListener(mPreDrawListener ); |
| 85 } | 81 } |
| 86 } | 82 } |
| 87 | 83 |
| 88 private void notifyListeners() { | 84 private void notifyListeners() { |
| 89 for (int i = 0; i < mListeners.size(); i++) { | 85 for (PositionObserver.Listener listener : mListeners) { |
| 90 mListeners.get(i).onPositionChanged(mPosition[0], mPosition[1]); | 86 listener.onPositionChanged(mPosition[0], mPosition[1]); |
| 91 } | 87 } |
| 92 } | 88 } |
| 93 | 89 |
| 94 private void updatePosition() { | 90 private void updatePosition() { |
| 95 int previousPositionX = mPosition[0]; | 91 int previousPositionX = mPosition[0]; |
| 96 int previousPositionY = mPosition[1]; | 92 int previousPositionY = mPosition[1]; |
| 97 mView.getLocationInWindow(mPosition); | 93 mView.getLocationInWindow(mPosition); |
| 98 if (mPosition[0] != previousPositionX || mPosition[1] != previousPositio nY) { | 94 if (mPosition[0] != previousPositionX || mPosition[1] != previousPositio nY) { |
| 99 notifyListeners(); | 95 notifyListeners(); |
| 100 } | 96 } |
| 101 } | 97 } |
| 98 | |
| 99 /** | |
| 100 * Clears installed listener(s). | |
| 101 */ | |
| 102 public void clearListener() { | |
| 103 mListeners.clear(); | |
| 104 } | |
| 102 } | 105 } |
| 103 | 106 |
| OLD | NEW |