Chromium Code Reviews| Index: win8/metro_driver/secondary_tile.cc |
| diff --git a/win8/metro_driver/secondary_tile.cc b/win8/metro_driver/secondary_tile.cc |
| index 97109c1924b5f79de574f1f0cdba58f3fef33e1f..7e9c6205a934709a0edb7d01c5b46a0935b8509c 100644 |
| --- a/win8/metro_driver/secondary_tile.cc |
| +++ b/win8/metro_driver/secondary_tile.cc |
| @@ -16,7 +16,78 @@ |
| namespace { |
| -void DeleteTileFromStartScreen(const string16& tile_id) { |
| +using base::win::MetroPinUmaResultCallback; |
| + |
| +// Callback for asynchronous pin requests. |
| +class TileRequestCompleter { |
| + public: |
| + enum PinType { |
| + PIN, |
| + UNPIN |
| + }; |
| + TileRequestCompleter(PinType type, const MetroPinUmaResultCallback& callback) |
| + : type_(type), callback_(callback) {} |
| + |
| + void Complete(mswr::ComPtr<winfoundtn::IAsyncOperation<bool>>& completion); |
| + |
| + private: |
| + HRESULT Respond(winfoundtn::IAsyncOperation<bool>* async, |
|
MAD
2012/11/30 18:18:37
Please add a comment that this will destroy the ob
tapted
2012/12/03 02:58:15
Done.
|
| + AsyncStatus status); |
| + |
| + PinType type_; |
| + MetroPinUmaResultCallback callback_; |
| +}; |
| + |
| +void TileRequestCompleter::Complete( |
| + mswr::ComPtr<winfoundtn::IAsyncOperation<bool>>& completion) { |
| + typedef winfoundtn::IAsyncOperationCompletedHandler<bool> RequestDoneType; |
| + mswr::ComPtr<RequestDoneType> handler(mswr::Callback<RequestDoneType>( |
| + this, &TileRequestCompleter::Respond)); |
| + DCHECK(handler.Get() != NULL); |
| + HRESULT hr = completion->put_Completed(handler.Get()); |
| + CheckHR(hr, "Failed to put_Completed"); |
| +} |
| + |
| +HRESULT TileRequestCompleter::Respond(winfoundtn::IAsyncOperation<bool>* async, |
| + AsyncStatus status) { |
| + base::win::MetroSecondaryTilePinUmaResult pin_state = |
| + base::win::METRO_PIN_STATE_NONE; |
| + |
| + if (status == Completed) { |
| + unsigned char result; |
| + CheckHR(async->GetResults(&result)); |
| + LOG(INFO) << __FUNCTION__ << " result " << static_cast<int>(result); |
| + switch (result) { |
| + case 0: |
| + pin_state = type_ == PIN ? |
| + base::win::METRO_PIN_RESULT_CANCEL : |
| + base::win::METRO_UNPIN_RESULT_CANCEL; |
| + break; |
| + case 1: |
| + pin_state = type_ == PIN ? |
| + base::win::METRO_PIN_RESULT_OK : |
| + base::win::METRO_UNPIN_RESULT_OK; |
| + break; |
| + default: |
| + pin_state = type_ == PIN ? |
| + base::win::METRO_PIN_RESULT_OTHER : |
| + base::win::METRO_UNPIN_RESULT_OTHER; |
| + break; |
| + } |
| + } else { |
| + LOG(ERROR) << __FUNCTION__ << " Unexpected async status " << status; |
| + pin_state = type_ == PIN ? |
| + base::win::METRO_PIN_RESULT_ERROR : |
| + base::win::METRO_UNPIN_RESULT_ERROR; |
| + } |
| + callback_.Run(pin_state); |
| + |
| + delete this; |
| + return S_OK; |
| +} |
| + |
| +void DeleteTileFromStartScreen(const string16& tile_id, |
| + const MetroPinUmaResultCallback& callback) { |
| DVLOG(1) << __FUNCTION__; |
| mswr::ComPtr<winui::StartScreen::ISecondaryTileFactory> tile_factory; |
| HRESULT hr = winrt_utils::CreateActivationFactory( |
| @@ -35,18 +106,23 @@ void DeleteTileFromStartScreen(const string16& tile_id) { |
| hr = tile->RequestDeleteAsync(completion.GetAddressOf()); |
| CheckHR(hr, "RequestDeleteAsync failed"); |
| - typedef winfoundtn::IAsyncOperationCompletedHandler<bool> RequestDoneType; |
| - mswr::ComPtr<RequestDoneType> handler(mswr::Callback<RequestDoneType>( |
| - globals.view, &ChromeAppView::TileRequestCreateDone)); |
| - DCHECK(handler.Get() != NULL); |
| - hr = completion->put_Completed(handler.Get()); |
| - CheckHR(hr, "Failed to put_Completed"); |
| + if (FAILED(hr)) { |
| + callback.Run(base::win::METRO_UNPIN_REQUEST_SHOW_ERROR); |
| + return; |
| + } |
| + |
| + // Deleted in TileRequestCompleter::Respond when the async operation |
| + // completes. |
| + TileRequestCompleter* completer = |
| + new TileRequestCompleter(TileRequestCompleter::UNPIN, callback); |
| + completer->Complete(completion); |
| } |
| void CreateTileOnStartScreen(const string16& tile_id, |
| const string16& title_str, |
| const string16& url_str, |
| - const FilePath& logo_path) { |
| + const FilePath& logo_path, |
| + const MetroPinUmaResultCallback& callback) { |
| VLOG(1) << __FUNCTION__; |
| mswr::ComPtr<winui::StartScreen::ISecondaryTileFactory> tile_factory; |
| @@ -99,12 +175,16 @@ void CreateTileOnStartScreen(const string16& tile_id, |
| hr = tile->RequestCreateAsync(completion.GetAddressOf()); |
| CheckHR(hr, "RequestCreateAsync failed"); |
| - typedef winfoundtn::IAsyncOperationCompletedHandler<bool> RequestDoneType; |
| - mswr::ComPtr<RequestDoneType> handler(mswr::Callback<RequestDoneType>( |
| - globals.view, &ChromeAppView::TileRequestCreateDone)); |
| - DCHECK(handler.Get() != NULL); |
| - hr = completion->put_Completed(handler.Get()); |
| - CheckHR(hr, "Failed to put_Completed"); |
| + if (FAILED(hr)) { |
| + callback.Run(base::win::METRO_PIN_REQUEST_SHOW_ERROR); |
| + return; |
| + } |
| + |
| + // Deleted in TileRequestCompleter::Respond when the async operation |
| + // completes. |
| + TileRequestCompleter* completer = |
| + new TileRequestCompleter(TileRequestCompleter::PIN, callback); |
| + completer->Complete(completion); |
| } |
| } // namespace |
| @@ -122,19 +202,24 @@ BOOL MetroIsPinnedToStartScreen(const string16& tile_id) { |
| return exists; |
| } |
| -void MetroUnPinFromStartScreen(const string16& tile_id) { |
| +void MetroUnPinFromStartScreen(const string16& tile_id, |
| + const MetroPinUmaResultCallback& callback) { |
| globals.appview_msg_loop->PostTask( |
| - FROM_HERE, base::Bind(&DeleteTileFromStartScreen, tile_id)); |
| + FROM_HERE, base::Bind(&DeleteTileFromStartScreen, |
| + tile_id, |
| + callback)); |
| } |
| void MetroPinToStartScreen(const string16& tile_id, |
| const string16& title, |
| const string16& url, |
| - const FilePath& logo_path) { |
| + const FilePath& logo_path, |
| + const MetroPinUmaResultCallback& callback) { |
| globals.appview_msg_loop->PostTask( |
| FROM_HERE, base::Bind(&CreateTileOnStartScreen, |
| tile_id, |
| title, |
| url, |
| - logo_path)); |
| + logo_path, |
| + callback)); |
| } |