OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 #include "athena/wm/split_view_controller.h" | 5 #include "athena/wm/split_view_controller.h" |
6 | 6 |
7 #include "athena/screen/public/screen_manager.h" | 7 #include "athena/screen/public/screen_manager.h" |
8 #include "athena/test/base/athena_test_base.h" | 8 #include "athena/test/base/athena_test_base.h" |
9 #include "athena/test/base/test_windows.h" | 9 #include "athena/test/base/test_windows.h" |
10 #include "athena/wm/public/window_list_provider.h" | 10 #include "athena/wm/public/window_list_provider.h" |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 DISALLOW_COPY_AND_ASSIGN(SplitViewControllerTest); | 96 DISALLOW_COPY_AND_ASSIGN(SplitViewControllerTest); |
97 }; | 97 }; |
98 | 98 |
99 // Tests that when split mode is activated, the windows on the left and right | 99 // Tests that when split mode is activated, the windows on the left and right |
100 // are selected correctly. | 100 // are selected correctly. |
101 TEST_F(SplitViewControllerTest, SplitModeActivation) { | 101 TEST_F(SplitViewControllerTest, SplitModeActivation) { |
102 aura::test::TestWindowDelegate delegate; | 102 aura::test::TestWindowDelegate delegate; |
103 ScopedVector<aura::Window> windows; | 103 ScopedVector<aura::Window> windows; |
104 const int kNumWindows = 6; | 104 const int kNumWindows = 6; |
105 for (size_t i = 0; i < kNumWindows; ++i) { | 105 for (size_t i = 0; i < kNumWindows; ++i) { |
106 scoped_ptr<aura::Window> window = test::CreateNormalWindow(NULL, NULL); | 106 scoped_ptr<aura::Window> window = |
| 107 test::CreateNormalWindow(nullptr, nullptr); |
107 windows.push_back(window.release()); | 108 windows.push_back(window.release()); |
108 windows[i]->Hide(); | 109 windows[i]->Hide(); |
109 } | 110 } |
110 | 111 |
111 windows[kNumWindows - 1]->Show(); | 112 windows[kNumWindows - 1]->Show(); |
112 wm::ActivateWindow(windows[kNumWindows - 1]); | 113 wm::ActivateWindow(windows[kNumWindows - 1]); |
113 | 114 |
114 SplitViewController* controller = api()->GetSplitViewController(); | 115 SplitViewController* controller = api()->GetSplitViewController(); |
115 ASSERT_FALSE(controller->IsSplitViewModeActive()); | 116 ASSERT_FALSE(controller->IsSplitViewModeActive()); |
116 | 117 |
117 controller->ActivateSplitMode(NULL, NULL, NULL); | 118 controller->ActivateSplitMode(nullptr, nullptr, nullptr); |
118 ASSERT_TRUE(controller->IsSplitViewModeActive()); | 119 ASSERT_TRUE(controller->IsSplitViewModeActive()); |
119 // The last two windows should be on the left and right, respectively. | 120 // The last two windows should be on the left and right, respectively. |
120 EXPECT_EQ(windows[kNumWindows - 1], controller->left_window()); | 121 EXPECT_EQ(windows[kNumWindows - 1], controller->left_window()); |
121 EXPECT_EQ(windows[kNumWindows - 2], controller->right_window()); | 122 EXPECT_EQ(windows[kNumWindows - 2], controller->right_window()); |
122 EXPECT_EQ(windows[kNumWindows - 1], GetTopmostWindow()); | 123 EXPECT_EQ(windows[kNumWindows - 1], GetTopmostWindow()); |
123 EXPECT_EQ(windows[kNumWindows - 2], GetSecondTopmostWindow()); | 124 EXPECT_EQ(windows[kNumWindows - 2], GetSecondTopmostWindow()); |
124 EXPECT_TRUE(OnlySplitViewWindowsVisible()); | 125 EXPECT_TRUE(OnlySplitViewWindowsVisible()); |
125 | 126 |
126 // Select the window that is currently on the left for the right panel. The | 127 // Select the window that is currently on the left for the right panel. The |
127 // windows should switch. | 128 // windows should switch. |
128 controller->ActivateSplitMode( | 129 controller->ActivateSplitMode( |
129 NULL, windows[kNumWindows - 1], windows[kNumWindows - 1]); | 130 nullptr, windows[kNumWindows - 1], windows[kNumWindows - 1]); |
130 EXPECT_EQ(windows[kNumWindows - 2], controller->left_window()); | 131 EXPECT_EQ(windows[kNumWindows - 2], controller->left_window()); |
131 EXPECT_EQ(windows[kNumWindows - 1], controller->right_window()); | 132 EXPECT_EQ(windows[kNumWindows - 1], controller->right_window()); |
132 EXPECT_EQ(windows[kNumWindows - 1], GetTopmostWindow()); | 133 EXPECT_EQ(windows[kNumWindows - 1], GetTopmostWindow()); |
133 EXPECT_EQ(windows[kNumWindows - 2], GetSecondTopmostWindow()); | 134 EXPECT_EQ(windows[kNumWindows - 2], GetSecondTopmostWindow()); |
134 EXPECT_TRUE(OnlySplitViewWindowsVisible()); | 135 EXPECT_TRUE(OnlySplitViewWindowsVisible()); |
135 | 136 |
136 controller->ActivateSplitMode( | 137 controller->ActivateSplitMode( |
137 windows[kNumWindows - 1], NULL, windows[kNumWindows - 1]); | 138 windows[kNumWindows - 1], nullptr, windows[kNumWindows - 1]); |
138 EXPECT_EQ(windows[kNumWindows - 1], controller->left_window()); | 139 EXPECT_EQ(windows[kNumWindows - 1], controller->left_window()); |
139 EXPECT_EQ(windows[kNumWindows - 2], controller->right_window()); | 140 EXPECT_EQ(windows[kNumWindows - 2], controller->right_window()); |
140 EXPECT_EQ(windows[kNumWindows - 1], GetTopmostWindow()); | 141 EXPECT_EQ(windows[kNumWindows - 1], GetTopmostWindow()); |
141 EXPECT_EQ(windows[kNumWindows - 2], GetSecondTopmostWindow()); | 142 EXPECT_EQ(windows[kNumWindows - 2], GetSecondTopmostWindow()); |
142 EXPECT_TRUE(OnlySplitViewWindowsVisible()); | 143 EXPECT_TRUE(OnlySplitViewWindowsVisible()); |
143 | 144 |
144 // Select the same windows, but pass in a different window to activate. | 145 // Select the same windows, but pass in a different window to activate. |
145 controller->ActivateSplitMode(windows[kNumWindows - 1], | 146 controller->ActivateSplitMode(windows[kNumWindows - 1], |
146 windows[kNumWindows - 2], | 147 windows[kNumWindows - 2], |
147 windows[kNumWindows - 2]); | 148 windows[kNumWindows - 2]); |
148 EXPECT_EQ(windows[kNumWindows - 1], controller->left_window()); | 149 EXPECT_EQ(windows[kNumWindows - 1], controller->left_window()); |
149 EXPECT_EQ(windows[kNumWindows - 2], controller->right_window()); | 150 EXPECT_EQ(windows[kNumWindows - 2], controller->right_window()); |
150 EXPECT_EQ(windows[kNumWindows - 2], GetTopmostWindow()); | 151 EXPECT_EQ(windows[kNumWindows - 2], GetTopmostWindow()); |
151 EXPECT_EQ(windows[kNumWindows - 1], GetSecondTopmostWindow()); | 152 EXPECT_EQ(windows[kNumWindows - 1], GetSecondTopmostWindow()); |
152 EXPECT_TRUE(OnlySplitViewWindowsVisible()); | 153 EXPECT_TRUE(OnlySplitViewWindowsVisible()); |
153 | 154 |
154 // Select one of the windows behind the stacks for the right panel. The window | 155 // Select one of the windows behind the stacks for the right panel. The window |
155 // on the left should remain unchanged. | 156 // on the left should remain unchanged. |
156 controller->ActivateSplitMode(NULL, windows[0], windows[0]); | 157 controller->ActivateSplitMode(nullptr, windows[0], windows[0]); |
157 EXPECT_EQ(windows[kNumWindows - 1], controller->left_window()); | 158 EXPECT_EQ(windows[kNumWindows - 1], controller->left_window()); |
158 EXPECT_EQ(windows[0], controller->right_window()); | 159 EXPECT_EQ(windows[0], controller->right_window()); |
159 EXPECT_EQ(windows[0], GetTopmostWindow()); | 160 EXPECT_EQ(windows[0], GetTopmostWindow()); |
160 EXPECT_EQ(windows[kNumWindows - 1], GetSecondTopmostWindow()); | 161 EXPECT_EQ(windows[kNumWindows - 1], GetSecondTopmostWindow()); |
161 EXPECT_TRUE(OnlySplitViewWindowsVisible()); | 162 EXPECT_TRUE(OnlySplitViewWindowsVisible()); |
162 | 163 |
163 controller->ActivateSplitMode(windows[1], NULL, NULL); | 164 controller->ActivateSplitMode(windows[1], nullptr, nullptr); |
164 EXPECT_EQ(windows[1], controller->left_window()); | 165 EXPECT_EQ(windows[1], controller->left_window()); |
165 EXPECT_EQ(windows[0], controller->right_window()); | 166 EXPECT_EQ(windows[0], controller->right_window()); |
166 EXPECT_EQ(windows[0], GetTopmostWindow()); | 167 EXPECT_EQ(windows[0], GetTopmostWindow()); |
167 EXPECT_EQ(windows[1], GetSecondTopmostWindow()); | 168 EXPECT_EQ(windows[1], GetSecondTopmostWindow()); |
168 EXPECT_TRUE(OnlySplitViewWindowsVisible()); | 169 EXPECT_TRUE(OnlySplitViewWindowsVisible()); |
169 | 170 |
170 controller->ActivateSplitMode(windows[4], windows[5], windows[5]); | 171 controller->ActivateSplitMode(windows[4], windows[5], windows[5]); |
171 EXPECT_EQ(windows[4], controller->left_window()); | 172 EXPECT_EQ(windows[4], controller->left_window()); |
172 EXPECT_EQ(windows[5], controller->right_window()); | 173 EXPECT_EQ(windows[5], controller->right_window()); |
173 EXPECT_EQ(windows[5], GetTopmostWindow()); | 174 EXPECT_EQ(windows[5], GetTopmostWindow()); |
174 EXPECT_EQ(windows[4], GetSecondTopmostWindow()); | 175 EXPECT_EQ(windows[4], GetSecondTopmostWindow()); |
175 EXPECT_TRUE(OnlySplitViewWindowsVisible()); | 176 EXPECT_TRUE(OnlySplitViewWindowsVisible()); |
176 | 177 |
177 controller->ActivateSplitMode(windows[0], NULL, windows[0]); | 178 controller->ActivateSplitMode(windows[0], nullptr, windows[0]); |
178 EXPECT_EQ(windows[0], controller->left_window()); | 179 EXPECT_EQ(windows[0], controller->left_window()); |
179 EXPECT_EQ(windows[5], controller->right_window()); | 180 EXPECT_EQ(windows[5], controller->right_window()); |
180 EXPECT_EQ(windows[0], GetTopmostWindow()); | 181 EXPECT_EQ(windows[0], GetTopmostWindow()); |
181 EXPECT_EQ(windows[5], GetSecondTopmostWindow()); | 182 EXPECT_EQ(windows[5], GetSecondTopmostWindow()); |
182 EXPECT_TRUE(OnlySplitViewWindowsVisible()); | 183 EXPECT_TRUE(OnlySplitViewWindowsVisible()); |
183 } | 184 } |
184 | 185 |
185 // Helper function used to return the x-translation value of the layer | 186 // Helper function used to return the x-translation value of the layer |
186 // containing |window|. | 187 // containing |window|. |
187 float XTranslationForWindow(aura::Window* window) { | 188 float XTranslationForWindow(aura::Window* window) { |
188 return window->layer()->transform().To2dTranslation().x(); | 189 return window->layer()->transform().To2dTranslation().x(); |
189 } | 190 } |
190 | 191 |
191 // Tests that calls to the methods of DragHandleScrollDelegate will disengage | 192 // Tests that calls to the methods of DragHandleScrollDelegate will disengage |
192 // split view mode under the correct circumstances. | 193 // split view mode under the correct circumstances. |
193 TEST_F(SplitViewControllerTest, ScrollDragHandle) { | 194 TEST_F(SplitViewControllerTest, ScrollDragHandle) { |
194 aura::test::TestWindowDelegate delegate; | 195 aura::test::TestWindowDelegate delegate; |
195 ScopedVector<aura::Window> windows; | 196 ScopedVector<aura::Window> windows; |
196 const int kNumWindows = 2; | 197 const int kNumWindows = 2; |
197 for (size_t i = 0; i < kNumWindows; ++i) { | 198 for (size_t i = 0; i < kNumWindows; ++i) { |
198 scoped_ptr<aura::Window> window = test::CreateNormalWindow(NULL, NULL); | 199 scoped_ptr<aura::Window> window = |
| 200 test::CreateNormalWindow(nullptr, nullptr); |
199 windows.push_back(window.release()); | 201 windows.push_back(window.release()); |
200 windows[i]->Hide(); | 202 windows[i]->Hide(); |
201 } | 203 } |
202 | 204 |
203 SplitViewController* controller = api()->GetSplitViewController(); | 205 SplitViewController* controller = api()->GetSplitViewController(); |
204 ASSERT_FALSE(controller->IsSplitViewModeActive()); | 206 ASSERT_FALSE(controller->IsSplitViewModeActive()); |
205 | 207 |
206 aura::Window* left_window = windows[0]; | 208 aura::Window* left_window = windows[0]; |
207 aura::Window* right_window = windows[1]; | 209 aura::Window* right_window = windows[1]; |
208 left_window->Show(); | 210 left_window->Show(); |
(...skipping 23 matching lines...) Expand all Loading... |
232 ASSERT_TRUE(controller->IsSplitViewModeActive()); | 234 ASSERT_TRUE(controller->IsSplitViewModeActive()); |
233 EXPECT_EQ(left_window, controller->left_window()); | 235 EXPECT_EQ(left_window, controller->left_window()); |
234 EXPECT_EQ(right_window, controller->right_window()); | 236 EXPECT_EQ(right_window, controller->right_window()); |
235 | 237 |
236 // Scroll far enough to the right to be able to disengage split view. Split | 238 // Scroll far enough to the right to be able to disengage split view. Split |
237 // view should be disengaged with the left window active. | 239 // view should be disengaged with the left window active. |
238 HandleScrollBegin(small_distance); | 240 HandleScrollBegin(small_distance); |
239 HandleScrollUpdate(large_distance); | 241 HandleScrollUpdate(large_distance); |
240 HandleScrollEnd(0.0f); | 242 HandleScrollEnd(0.0f); |
241 ASSERT_FALSE(controller->IsSplitViewModeActive()); | 243 ASSERT_FALSE(controller->IsSplitViewModeActive()); |
242 EXPECT_EQ(NULL, controller->left_window()); | 244 EXPECT_EQ(nullptr, controller->left_window()); |
243 EXPECT_EQ(NULL, controller->right_window()); | 245 EXPECT_EQ(nullptr, controller->right_window()); |
244 EXPECT_EQ(left_window, GetTopmostWindow()); | 246 EXPECT_EQ(left_window, GetTopmostWindow()); |
245 | 247 |
246 // Re-activate split view mode. | 248 // Re-activate split view mode. |
247 controller->ActivateSplitMode(left_window, right_window, left_window); | 249 controller->ActivateSplitMode(left_window, right_window, left_window); |
248 | 250 |
249 // Start scrolling a small distance and then fling, but not fast enough to | 251 // Start scrolling a small distance and then fling, but not fast enough to |
250 // disengage split view (see kMinFlingVelocity). Split view mode should | 252 // disengage split view (see kMinFlingVelocity). Split view mode should |
251 // remain engaged. Also verify that |right_window| is translated correctly. | 253 // remain engaged. Also verify that |right_window| is translated correctly. |
252 EXPECT_EQ(0.0f, XTranslationForWindow(right_window)); | 254 EXPECT_EQ(0.0f, XTranslationForWindow(right_window)); |
253 HandleScrollBegin(-small_distance + 1.0f); | 255 HandleScrollBegin(-small_distance + 1.0f); |
254 EXPECT_EQ(-small_distance + 1.0f, XTranslationForWindow(right_window)); | 256 EXPECT_EQ(-small_distance + 1.0f, XTranslationForWindow(right_window)); |
255 HandleScrollUpdate(-small_distance); | 257 HandleScrollUpdate(-small_distance); |
256 EXPECT_EQ(-small_distance, XTranslationForWindow(right_window)); | 258 EXPECT_EQ(-small_distance, XTranslationForWindow(right_window)); |
257 HandleScrollEnd(slow_velocity); | 259 HandleScrollEnd(slow_velocity); |
258 EXPECT_EQ(0.0f, XTranslationForWindow(right_window)); | 260 EXPECT_EQ(0.0f, XTranslationForWindow(right_window)); |
259 ASSERT_TRUE(controller->IsSplitViewModeActive()); | 261 ASSERT_TRUE(controller->IsSplitViewModeActive()); |
260 EXPECT_EQ(left_window, controller->left_window()); | 262 EXPECT_EQ(left_window, controller->left_window()); |
261 EXPECT_EQ(right_window, controller->right_window()); | 263 EXPECT_EQ(right_window, controller->right_window()); |
262 | 264 |
263 // Scroll far enough to the left to be able to disengage split view, then | 265 // Scroll far enough to the left to be able to disengage split view, then |
264 // fling to the right (but not faster than kMinFlingVelocity). Split view | 266 // fling to the right (but not faster than kMinFlingVelocity). Split view |
265 // should be disengaged with the right window active. | 267 // should be disengaged with the right window active. |
266 HandleScrollBegin(-small_distance); | 268 HandleScrollBegin(-small_distance); |
267 HandleScrollUpdate(-large_distance); | 269 HandleScrollUpdate(-large_distance); |
268 HandleScrollEnd(slow_velocity); | 270 HandleScrollEnd(slow_velocity); |
269 ASSERT_FALSE(controller->IsSplitViewModeActive()); | 271 ASSERT_FALSE(controller->IsSplitViewModeActive()); |
270 EXPECT_EQ(NULL, controller->left_window()); | 272 EXPECT_EQ(nullptr, controller->left_window()); |
271 EXPECT_EQ(NULL, controller->right_window()); | 273 EXPECT_EQ(nullptr, controller->right_window()); |
272 EXPECT_EQ(right_window, GetTopmostWindow()); | 274 EXPECT_EQ(right_window, GetTopmostWindow()); |
273 | 275 |
274 // Re-activate split view mode. | 276 // Re-activate split view mode. |
275 controller->ActivateSplitMode(left_window, right_window, left_window); | 277 controller->ActivateSplitMode(left_window, right_window, left_window); |
276 | 278 |
277 // Scroll far enough to the left to be able to disengage split view, then | 279 // Scroll far enough to the left to be able to disengage split view, then |
278 // fling to the right, this time faster than kMinFlingVelocity). Split view | 280 // fling to the right, this time faster than kMinFlingVelocity). Split view |
279 // should be disengaged with the left window active. | 281 // should be disengaged with the left window active. |
280 HandleScrollBegin(-small_distance); | 282 HandleScrollBegin(-small_distance); |
281 HandleScrollUpdate(-large_distance); | 283 HandleScrollUpdate(-large_distance); |
282 HandleScrollEnd(fast_velocity); | 284 HandleScrollEnd(fast_velocity); |
283 ASSERT_FALSE(controller->IsSplitViewModeActive()); | 285 ASSERT_FALSE(controller->IsSplitViewModeActive()); |
284 EXPECT_EQ(NULL, controller->left_window()); | 286 EXPECT_EQ(nullptr, controller->left_window()); |
285 EXPECT_EQ(NULL, controller->right_window()); | 287 EXPECT_EQ(nullptr, controller->right_window()); |
286 EXPECT_EQ(left_window, GetTopmostWindow()); | 288 EXPECT_EQ(left_window, GetTopmostWindow()); |
287 } | 289 } |
288 | 290 |
289 TEST_F(SplitViewControllerTest, LandscapeOnly) { | 291 TEST_F(SplitViewControllerTest, LandscapeOnly) { |
290 aura::test::TestWindowDelegate delegate; | 292 aura::test::TestWindowDelegate delegate; |
291 ScopedVector<aura::Window> windows; | 293 ScopedVector<aura::Window> windows; |
292 const int kNumWindows = 2; | 294 const int kNumWindows = 2; |
293 for (size_t i = 0; i < kNumWindows; ++i) { | 295 for (size_t i = 0; i < kNumWindows; ++i) { |
294 scoped_ptr<aura::Window> window = test::CreateNormalWindow(NULL, NULL); | 296 scoped_ptr<aura::Window> window = |
| 297 test::CreateNormalWindow(nullptr, nullptr); |
295 window->Hide(); | 298 window->Hide(); |
296 windows.push_back(window.release()); | 299 windows.push_back(window.release()); |
297 } | 300 } |
298 windows[kNumWindows - 1]->Show(); | 301 windows[kNumWindows - 1]->Show(); |
299 wm::ActivateWindow(windows[kNumWindows - 1]); | 302 wm::ActivateWindow(windows[kNumWindows - 1]); |
300 | 303 |
301 ASSERT_EQ(gfx::Display::ROTATE_0, | 304 ASSERT_EQ(gfx::Display::ROTATE_0, |
302 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().rotation()); | 305 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().rotation()); |
303 | 306 |
304 SplitViewController* controller = api()->GetSplitViewController(); | 307 SplitViewController* controller = api()->GetSplitViewController(); |
305 ASSERT_TRUE(IsSplitViewAllowed()); | 308 ASSERT_TRUE(IsSplitViewAllowed()); |
306 ASSERT_FALSE(controller->IsSplitViewModeActive()); | 309 ASSERT_FALSE(controller->IsSplitViewModeActive()); |
307 | 310 |
308 controller->ActivateSplitMode(NULL, NULL, NULL); | 311 controller->ActivateSplitMode(nullptr, nullptr, nullptr); |
309 ASSERT_TRUE(controller->IsSplitViewModeActive()); | 312 ASSERT_TRUE(controller->IsSplitViewModeActive()); |
310 | 313 |
311 // Screen rotation should be locked while in splitview. | 314 // Screen rotation should be locked while in splitview. |
312 ScreenManager::Get()->SetRotation(gfx::Display::ROTATE_90); | 315 ScreenManager::Get()->SetRotation(gfx::Display::ROTATE_90); |
313 EXPECT_EQ(gfx::Display::ROTATE_0, | 316 EXPECT_EQ(gfx::Display::ROTATE_0, |
314 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().rotation()); | 317 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().rotation()); |
315 | 318 |
316 // Screen is rotated on exiting splitview. | 319 // Screen is rotated on exiting splitview. |
317 controller->DeactivateSplitMode(); | 320 controller->DeactivateSplitMode(); |
318 ASSERT_EQ(gfx::Display::ROTATE_90, | 321 ASSERT_EQ(gfx::Display::ROTATE_90, |
319 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().rotation()); | 322 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().rotation()); |
320 | 323 |
321 // Entering splitview should now be disabled now that the screen is in a | 324 // Entering splitview should now be disabled now that the screen is in a |
322 // portrait orientation. | 325 // portrait orientation. |
323 EXPECT_FALSE(IsSplitViewAllowed()); | 326 EXPECT_FALSE(IsSplitViewAllowed()); |
324 | 327 |
325 // Rotating back to 0 allows splitview again. | 328 // Rotating back to 0 allows splitview again. |
326 ScreenManager::Get()->SetRotation(gfx::Display::ROTATE_0); | 329 ScreenManager::Get()->SetRotation(gfx::Display::ROTATE_0); |
327 EXPECT_TRUE(IsSplitViewAllowed()); | 330 EXPECT_TRUE(IsSplitViewAllowed()); |
328 } | 331 } |
329 | 332 |
330 } // namespace athena | 333 } // namespace athena |
OLD | NEW |