From 13355a99b0da82e7923af096a573d43bc65b2609 Mon Sep 17 00:00:00 2001 From: Adam Barth Date: Fri, 21 Aug 2015 11:27:17 -0700 Subject: [PATCH] Add SetRequestedOrientation to Activity service Fixes #743 --- examples/address_book/lib/main.dart | 4 +- examples/demo_launcher/lib/main.dart | 14 +++--- examples/fitness/lib/main.dart | 4 +- examples/game/lib/main.dart | 6 +-- examples/game/test_drawatlas.dart | 7 ++- examples/game/test_performance.dart | 8 ++-- examples/mine_digger/lib/main.dart | 4 +- examples/rendering/interactive_flex.dart | 4 +- examples/stocks/lib/main.dart | 4 +- examples/widgets/card_collection.dart | 4 +- examples/widgets/ensure_visible.dart | 6 +-- examples/widgets/overlay_geometry.dart | 2 +- examples/widgets/pageable_list.dart | 15 ++---- examples/widgets/progress_indicator.dart | 4 +- examples/widgets/sector.dart | 4 +- sky/packages/sky/lib/mojo/activity.dart | 33 +++---------- sky/packages/sky/lib/widgets.dart | 2 +- sky/packages/sky/lib/widgets/framework.dart | 4 +- .../sky/lib/widgets/task_description.dart | 21 --------- sky/services/activity/activity.mojom | 9 ++++ .../org/domokit/activity/ActivityImpl.java | 47 ++++++++++++++----- 21 files changed, 92 insertions(+), 114 deletions(-) delete mode 100644 sky/packages/sky/lib/widgets/task_description.dart diff --git a/examples/address_book/lib/main.dart b/examples/address_book/lib/main.dart index 9de6b88feed..321d529c693 100644 --- a/examples/address_book/lib/main.dart +++ b/examples/address_book/lib/main.dart @@ -135,8 +135,8 @@ class AddressBookApp extends App { data: theme, child: new DefaultTextStyle( style: typography.error, // if you see this, you've forgotten to correctly configure the text style! - child: new TaskDescription( - label: 'Address Book', + child: new Title( + title: 'Address Book', child: new Navigator(_navigationState) ) ) diff --git a/examples/demo_launcher/lib/main.dart b/examples/demo_launcher/lib/main.dart index 39f3f7fc9f4..562bf9370a4 100644 --- a/examples/demo_launcher/lib/main.dart +++ b/examples/demo_launcher/lib/main.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:sky/mojo/activity.dart' as activity; +import 'package:sky/mojo/activity.dart'; import 'package:sky/mojo/asset_bundle.dart'; import 'package:sky/painting/box_painter.dart'; import 'package:sky/theme/colors.dart' as colors; @@ -25,17 +25,17 @@ EventDisposition launch(String relativeUrl, String bundle) { Uri base = rootBundle == null ? Uri.base : productionBase; Uri url = base.resolve(relativeUrl); - activity.ComponentName component = new activity.ComponentName() + ComponentName component = new ComponentName() ..packageName = 'org.domokit.sky.demo' ..className = 'org.domokit.sky.demo.SkyDemoActivity'; - activity.Intent intent = new activity.Intent() + Intent intent = new Intent() ..action = 'android.intent.action.VIEW' ..component = component - ..flags = activity.MULTIPLE_TASK | activity.NEW_DOCUMENT + ..flags = MULTIPLE_TASK | NEW_DOCUMENT ..url = url.toString(); if (bundle != null) { - activity.StringExtra extra = new activity.StringExtra() + StringExtra extra = new StringExtra() ..name = 'bundleName' ..value = bundle; intent.stringExtras = [extra]; @@ -191,8 +191,8 @@ class SkyHome extends App { brightness: ThemeBrightness.light, primarySwatch: colors.Teal ), - child: new TaskDescription( - label: 'Sky Demos', + child: new Title( + title: 'Sky Demos', child: new Scaffold( toolbar: new ToolBar(center: new Text('Sky Demos')), body: new Material( diff --git a/examples/fitness/lib/main.dart b/examples/fitness/lib/main.dart index 0755d56559e..e269113cb88 100644 --- a/examples/fitness/lib/main.dart +++ b/examples/fitness/lib/main.dart @@ -171,8 +171,8 @@ class FitnessApp extends App { primarySwatch: colors.Indigo, accentColor: colors.PinkAccent[200] ), - child: new TaskDescription( - label: 'Fitness', + child: new Title( + title: 'Fitness', child: new Navigator(_navigationState) ) ); diff --git a/examples/game/lib/main.dart b/examples/game/lib/main.dart index df2e18cde55..1a6aeb6bb16 100644 --- a/examples/game/lib/main.dart +++ b/examples/game/lib/main.dart @@ -12,7 +12,7 @@ import 'package:sky/widgets/basic.dart'; import 'package:sky/widgets/button_base.dart'; import 'package:sky/widgets/navigator.dart'; import 'package:sky/widgets/framework.dart'; -import 'package:sky/widgets/task_description.dart'; +import 'package:sky/widgets/title.dart'; import 'package:sky/widgets/theme.dart'; import 'game_demo.dart'; @@ -104,8 +104,8 @@ class GameDemoApp extends App { return new Theme( data: theme, - child: new TaskDescription( - label: 'Asteroids', + child: new Title( + title: 'Asteroids', child: new Navigator(_navigationState) ) ); diff --git a/examples/game/test_drawatlas.dart b/examples/game/test_drawatlas.dart index f98ee561e9c..76fa427404d 100644 --- a/examples/game/test_drawatlas.dart +++ b/examples/game/test_drawatlas.dart @@ -6,8 +6,7 @@ import 'package:sky/mojo/asset_bundle.dart'; import 'package:sky/rendering/object.dart'; import 'package:sky/theme/colors.dart' as colors; import 'package:sky/widgets/basic.dart'; -import 'package:sky/widgets/task_description.dart'; -import 'package:sky/widgets/theme.dart'; +import 'package:sky/widgets.dart'; AssetBundle _initBundle() { if (rootBundle != null) @@ -45,8 +44,8 @@ class TestDrawAtlasApp extends App { return new Theme( data: theme, - child: new TaskDescription( - label: 'Test drawAtlas', + child: new Title( + title: 'Test drawAtlas', child: new SpriteWidget( new TestDrawAtlas(), SpriteBoxTransformMode.fixedWidth diff --git a/examples/game/test_performance.dart b/examples/game/test_performance.dart index 4d379d6ca7d..97ebd9da746 100644 --- a/examples/game/test_performance.dart +++ b/examples/game/test_performance.dart @@ -4,9 +4,7 @@ import 'dart:math' as math; import 'package:sky/mojo/asset_bundle.dart'; import 'package:sky/rendering/object.dart'; import 'package:sky/theme/colors.dart' as colors; -import 'package:sky/widgets/basic.dart'; -import 'package:sky/widgets/task_description.dart'; -import 'package:sky/widgets/theme.dart'; +import 'package:sky/widgets.dart'; import 'lib/sprites.dart'; @@ -46,8 +44,8 @@ class TestApp extends App { return new Theme( data: theme, - child: new TaskDescription( - label: 'Test Sprite Performance', + child: new Title( + title: 'Test Sprite Performance', child: new SpriteWidget(new TestPerformance()) ) ); diff --git a/examples/mine_digger/lib/main.dart b/examples/mine_digger/lib/main.dart index 94559c9f6b3..8b0b919aebf 100644 --- a/examples/mine_digger/lib/main.dart +++ b/examples/mine_digger/lib/main.dart @@ -183,8 +183,8 @@ class MineDiggerApp extends App { Widget build() { // We build the board before we build the toolbar because we compute the win state during build step. Widget board = buildBoard(); - return new TaskDescription( - label: 'Mine Digger', + return new Title( + title: 'Mine Digger', child: new Scaffold( toolbar: buildToolBar(), body: new Container( diff --git a/examples/rendering/interactive_flex.dart b/examples/rendering/interactive_flex.dart index e22bf478a28..30e43d15314 100644 --- a/examples/rendering/interactive_flex.dart +++ b/examples/rendering/interactive_flex.dart @@ -5,7 +5,7 @@ import 'dart:sky'; import 'dart:math' as math; -import 'package:sky/mojo/activity.dart' as activity; +import 'package:sky/mojo/activity.dart'; import 'package:sky/mojo/net/image_cache.dart' as image_cache; import 'package:sky/rendering.dart'; @@ -98,7 +98,7 @@ Pancetta meatball tongue tenderloin rump tail jowl boudin."""; child: row ); - activity.updateTaskDescription('Interactive Flex', topColor); + updateTaskDescription('Interactive Flex', topColor); new SkyBinding(root: root); view.setEventCallback(handleEvent); } diff --git a/examples/stocks/lib/main.dart b/examples/stocks/lib/main.dart index 9a5a4e0d726..4f271c2e760 100644 --- a/examples/stocks/lib/main.dart +++ b/examples/stocks/lib/main.dart @@ -95,8 +95,8 @@ class StocksApp extends App { data: theme, child: new DefaultTextStyle( style: typography.error, // if you see this, you've forgotten to correctly configure the text style! - child: new TaskDescription( - label: 'Stocks', + child: new Title( + title: 'Stocks', child: new Navigator(_navigationState) ) ) diff --git a/examples/widgets/card_collection.dart b/examples/widgets/card_collection.dart index 5dce65c2128..e74371163e6 100644 --- a/examples/widgets/card_collection.dart +++ b/examples/widgets/card_collection.dart @@ -117,8 +117,8 @@ class CardCollectionApp extends App { primarySwatch: colors.Blue, accentColor: colors.RedAccent[200] ), - child: new TaskDescription( - label: 'Cards', + child: new Title( + title: 'Cards', child: new Scaffold( toolbar: new ToolBar(center: new Text('Swipe Away')), body: cardCollection diff --git a/examples/widgets/ensure_visible.dart b/examples/widgets/ensure_visible.dart index 78aab2e68eb..8da1d3abed0 100644 --- a/examples/widgets/ensure_visible.dart +++ b/examples/widgets/ensure_visible.dart @@ -21,7 +21,7 @@ class EnsureVisibleApp extends App { const TextStyle(color: colors.white, fontSize: 18.0, fontWeight: bold); static const TextStyle selectedCardLabelStyle = - const TextStyle(color: white, fontSize: 24.0, fontWeight: bold); + const TextStyle(color: colors.white, fontSize: 24.0, fontWeight: bold); List cardModels; BlockViewportLayoutState layoutState = new BlockViewportLayoutState(); @@ -89,8 +89,8 @@ class EnsureVisibleApp extends App { primarySwatch: colors.Blue, accentColor: colors.RedAccent[200] ), - child: new TaskDescription( - label: 'Cards', + child: new Title( + title: 'Cards', child: new Scaffold( toolbar: new ToolBar(center: new Text('Tap a Card')), body: cardCollection diff --git a/examples/widgets/overlay_geometry.dart b/examples/widgets/overlay_geometry.dart index bb2821d1e6b..fdf89fc870a 100644 --- a/examples/widgets/overlay_geometry.dart +++ b/examples/widgets/overlay_geometry.dart @@ -167,7 +167,7 @@ class OverlayGeometryApp extends App { primarySwatch: colors.Blue, accentColor: colors.RedAccent[200] ), - child: new TaskDescription(label: 'Cards', child: new Stack(layers)) + child: new Title(title: 'Cards', child: new Stack(layers)) ) ); } diff --git a/examples/widgets/pageable_list.dart b/examples/widgets/pageable_list.dart index dcb27bb991e..607d0726422 100644 --- a/examples/widgets/pageable_list.dart +++ b/examples/widgets/pageable_list.dart @@ -3,17 +3,8 @@ // found in the LICENSE file. import 'package:sky/base/lerp.dart'; -import 'package:sky/painting/text_style.dart'; import 'package:sky/theme/colors.dart'; -import 'package:sky/widgets/basic.dart'; -import 'package:sky/widgets/card.dart'; -import 'package:sky/widgets/icon.dart'; -import 'package:sky/widgets/scrollable.dart'; -import 'package:sky/widgets/scaffold.dart'; -import 'package:sky/widgets/theme.dart'; -import 'package:sky/widgets/tool_bar.dart'; -import 'package:sky/widgets/framework.dart'; -import 'package:sky/widgets/task_description.dart'; +import 'package:sky/widgets.dart'; class CardModel { CardModel(this.value, this.size, this.color); @@ -105,8 +96,8 @@ class PageableListApp extends App { primarySwatch: Blue, accentColor: RedAccent[200] ), - child: new TaskDescription( - label: 'PageableList', + child: new Title( + title: 'PageableList', child: new Scaffold( toolbar: new Listener( onGestureTap: handleToolbarTap, diff --git a/examples/widgets/progress_indicator.dart b/examples/widgets/progress_indicator.dart index 6139b544288..e7e37fe69d5 100644 --- a/examples/widgets/progress_indicator.dart +++ b/examples/widgets/progress_indicator.dart @@ -98,8 +98,8 @@ class ProgressIndicatorApp extends App { primarySwatch: colors.Blue, accentColor: colors.RedAccent[200] ), - child: new TaskDescription( - label: 'Cards', + child: new Title( + title: 'Cards', child: new Scaffold( toolbar: new ToolBar(center: new Text('Progress Indicators')), body: body diff --git a/examples/widgets/sector.dart b/examples/widgets/sector.dart index 5049f94f773..8a475151613 100644 --- a/examples/widgets/sector.dart +++ b/examples/widgets/sector.dart @@ -122,8 +122,8 @@ class SectorApp extends App { Widget build() { return new Theme( data: new ThemeData.light(), - child: new TaskDescription( - label: 'Sector Layout', + child: new Title( + title: 'Sector Layout', child: new Scaffold( toolbar: new ToolBar( center: new Text('Sector Layout in a Widget Tree') diff --git a/sky/packages/sky/lib/mojo/activity.dart b/sky/packages/sky/lib/mojo/activity.dart index 87b0041d5a4..f1936385b96 100644 --- a/sky/packages/sky/lib/mojo/activity.dart +++ b/sky/packages/sky/lib/mojo/activity.dart @@ -19,17 +19,18 @@ const int NEW_DOCUMENT = 0x00080000; const int NEW_TASK = 0x10000000; const int MULTIPLE_TASK = 0x08000000; -ActivityProxy _initActivity() { +ActivityProxy _initActivityProxy() { ActivityProxy activity = new ActivityProxy.unbound(); shell.requestService('mojo:sky_viewer', activity); return activity; } -final ActivityProxy _activity = _initActivity(); +final ActivityProxy _activityProxy = _initActivityProxy(); +final Activity activity = _activityProxy.ptr; UserFeedbackProxy _initUserFeedbackProxy() { UserFeedbackProxy proxy = new UserFeedbackProxy.unbound(); - _activity.ptr.getUserFeedback(proxy); + _activityProxy.ptr.getUserFeedback(proxy); return proxy; } @@ -39,16 +40,6 @@ final UserFeedback userFeedback = _userFeedbackProxy.ptr; Color _cachedPrimaryColor; String _cachedLabel; -/// Ends the current activity. -void finishCurrentActivity() { - _activity.ptr.finishCurrentActivity(); -} - -/// Asks the Android ActivityManager to start a new Intent-based Activity. -void startActivity(Intent intent) { - _activity.ptr.startActivity(intent); -} - /// Sets the TaskDescription for the current Activity void updateTaskDescription(String label, Color color) { if (_cachedPrimaryColor == color && _cachedLabel == label) @@ -61,18 +52,8 @@ void updateTaskDescription(String label, Color color) { ..label = label ..primaryColor = (color != null ? color.value : null); - _activity.ptr.setTaskDescription(description); + _activityProxy.ptr.setTaskDescription(description); } -int _cachedSystemUiVisibility = SystemUIVisibility_STANDARD; - -void setSystemUiVisibility(int visibility) { - if (_cachedSystemUiVisibility == visibility) - return; - _cachedSystemUiVisibility = visibility; - _activity.ptr.setSystemUiVisibility(visibility); -} - -Future getFilesDir() async => (await _activity.ptr.getFilesDir()).path; - -Future getCacheDir() async => (await _activity.ptr.getCacheDir()).path; +Future getFilesDir() async => (await _activityProxy.ptr.getFilesDir()).path; +Future getCacheDir() async => (await _activityProxy.ptr.getCacheDir()).path; diff --git a/sky/packages/sky/lib/widgets.dart b/sky/packages/sky/lib/widgets.dart index fac64311906..16ddebaf912 100644 --- a/sky/packages/sky/lib/widgets.dart +++ b/sky/packages/sky/lib/widgets.dart @@ -42,8 +42,8 @@ export 'widgets/scrollable.dart'; export 'widgets/snack_bar.dart'; export 'widgets/switch.dart'; export 'widgets/tabs.dart'; -export 'widgets/task_description.dart'; export 'widgets/theme.dart'; +export 'widgets/title.dart'; export 'widgets/tool_bar.dart'; export 'widgets/transitions.dart'; diff --git a/sky/packages/sky/lib/widgets/framework.dart b/sky/packages/sky/lib/widgets/framework.dart index e9720dfe87e..424bfaa30ee 100644 --- a/sky/packages/sky/lib/widgets/framework.dart +++ b/sky/packages/sky/lib/widgets/framework.dart @@ -8,7 +8,7 @@ import 'dart:sky' as sky; import 'package:sky/base/hit_test.dart'; import 'package:sky/base/scheduler.dart' as scheduler; -import 'package:sky/mojo/activity.dart' as activity; +import 'package:sky/mojo/activity.dart'; import 'package:sky/rendering/box.dart'; import 'package:sky/rendering/object.dart'; import 'package:sky/rendering/sky_binding.dart'; @@ -1146,7 +1146,7 @@ abstract class MultiChildRenderObjectWrapper extends RenderObjectWrapper { syncChild(null, oldChild, null); } oldChildrenBottom -= 1; - } + } } // middle of the lists - new list diff --git a/sky/packages/sky/lib/widgets/task_description.dart b/sky/packages/sky/lib/widgets/task_description.dart deleted file mode 100644 index c5378c02d06..00000000000 --- a/sky/packages/sky/lib/widgets/task_description.dart +++ /dev/null @@ -1,21 +0,0 @@ -// 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. - -import 'package:sky/mojo/activity.dart' as activity; -import 'package:sky/widgets/theme.dart'; -import 'package:sky/widgets/framework.dart'; - -class TaskDescription extends Component { - - TaskDescription({ this.label, this.child }); - - final Widget child; - final String label; - - Widget build() { - activity.updateTaskDescription(label, Theme.of(this).primaryColor); - return child; - } - -} diff --git a/sky/services/activity/activity.mojom b/sky/services/activity/activity.mojom index 23e2beb1c8e..45a8d1e5321 100644 --- a/sky/services/activity/activity.mojom +++ b/sky/services/activity/activity.mojom @@ -34,6 +34,14 @@ enum SystemUIVisibility { IMMERSIVE, }; +// See http://developer.android.com/intl/es/reference/android/R.attr.html#screenOrientation +enum ScreenOrientation { + UNSPECIFIED, + LANDSCAPE, + PORTRAIT, + NOSENSOR, +}; + // TODO(abarth): This interface seems very specific to Android. Do we want to // have a higher-level abstraction here? Do we want a collection // of services that only work on specific platforms? We need to @@ -45,6 +53,7 @@ interface Activity { FinishCurrentActivity(); SetTaskDescription(TaskDescription description); SetSystemUIVisibility(SystemUIVisibility visibility); + SetRequestedOrientation(ScreenOrientation orientation); // These are stored off the Activity on Android, but probably belong in a // separate FileSystem service. diff --git a/sky/services/activity/src/org/domokit/activity/ActivityImpl.java b/sky/services/activity/src/org/domokit/activity/ActivityImpl.java index e3c935a060e..55687f54be3 100644 --- a/sky/services/activity/src/org/domokit/activity/ActivityImpl.java +++ b/sky/services/activity/src/org/domokit/activity/ActivityImpl.java @@ -5,6 +5,7 @@ package org.domokit.activity; import android.content.ActivityNotFoundException; +import android.content.pm.ActivityInfo; import android.net.Uri; import android.os.Build; import android.util.Log; @@ -15,6 +16,7 @@ import org.chromium.mojo.system.MojoException; import org.chromium.mojom.activity.Activity; import org.chromium.mojom.activity.ComponentName; import org.chromium.mojom.activity.Intent; +import org.chromium.mojom.activity.ScreenOrientation; import org.chromium.mojom.activity.StringExtra; import org.chromium.mojom.activity.SystemUiVisibility; import org.chromium.mojom.activity.TaskDescription; @@ -108,24 +110,43 @@ public class ActivityImpl implements Activity { @Override public void setSystemUiVisibility(int visibility) { + if (sCurrentActivity == null) { + return; + } + int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE | + View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; + + if (visibility >= SystemUiVisibility.FULLSCREEN) { + flags |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | + View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | + View.SYSTEM_UI_FLAG_FULLSCREEN; + } + + if (visibility >= SystemUiVisibility.IMMERSIVE) { + flags |= View.SYSTEM_UI_FLAG_IMMERSIVE | + View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; + } + + sCurrentActivity.getWindow().getDecorView().setSystemUiVisibility(flags); + } + + @Override + public void setRequestedOrientation(int orientation) { if (sCurrentActivity == null) { return; } - int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE | - View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; + int androidOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; - if (visibility >= SystemUiVisibility.FULLSCREEN) { - flags |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | - View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | - View.SYSTEM_UI_FLAG_FULLSCREEN; - } + if (orientation == ScreenOrientation.UNSPECIFIED) + androidOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; + else if (androidOrientation == ScreenOrientation.LANDSCAPE) + androidOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; + else if (androidOrientation == ScreenOrientation.PORTRAIT) + androidOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; + else if (androidOrientation == ScreenOrientation.NOSENSOR) + androidOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR; - if (visibility >= SystemUiVisibility.IMMERSIVE) { - flags |= View.SYSTEM_UI_FLAG_IMMERSIVE | - View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; - } - - sCurrentActivity.getWindow().getDecorView().setSystemUiVisibility(flags); + sCurrentActivity.setRequestedOrientation(androidOrientation); } @Override