Chromium Code Reviews| Index: services/android/src/org/chromium/mojo/android/ActivityImpl.java |
| diff --git a/services/android/src/org/chromium/mojo/android/ActivityImpl.java b/services/android/src/org/chromium/mojo/android/ActivityImpl.java |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..a7e646075195daf96fc05eb7d397bf09d0b67d67 |
| --- /dev/null |
| +++ b/services/android/src/org/chromium/mojo/android/ActivityImpl.java |
| @@ -0,0 +1,280 @@ |
| +// 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.mojo.android; |
| + |
| +import android.app.Application.ActivityLifecycleCallbacks; |
| +import android.content.ActivityNotFoundException; |
| +import android.content.pm.ActivityInfo; |
| +import android.net.Uri; |
| +import android.os.Build; |
| +import android.os.Bundle; |
| +import android.util.Log; |
| +import android.view.HapticFeedbackConstants; |
| +import android.view.SoundEffectConstants; |
| +import android.view.View; |
| + |
| +import org.chromium.mojo.bindings.InterfaceRequest; |
| +import org.chromium.mojo.system.MojoException; |
| +import org.chromium.mojom.activity.Activity; |
| +import org.chromium.mojom.activity.AuralFeedbackType; |
| +import org.chromium.mojom.activity.ComponentName; |
| +import org.chromium.mojom.activity.HapticFeedbackType; |
| +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; |
| +import org.chromium.mojom.activity.UserFeedback; |
| + |
| +/** |
| + * Android implementation of VSyncProvider. |
|
ppi
2015/11/24 12:17:57
Update comment and say that this is a port of http
qsr
2015/11/24 13:05:05
Done.
|
| + */ |
| +public class ActivityImpl implements Activity { |
| + private static final String TAG = "AndroidImpl"; |
| + |
| + private final android.app.Activity mActivity; |
| + private int mVisibility = SystemUiVisibility.STANDARD; |
| + |
| + private static class UserFeedBackImpl implements UserFeedback { |
| + private final View mView; |
| + |
| + public UserFeedBackImpl(View view) { |
| + mView = view; |
| + } |
| + |
| + @Override |
| + public void close() {} |
| + |
| + @Override |
| + public void onConnectionError(MojoException e) {} |
| + |
| + /** |
| + * @see UserFeedback#performHapticFeedback(int) |
| + */ |
| + @Override |
| + public void performHapticFeedback(int type) { |
| + int androidType = 0; |
| + switch (type) { |
| + case HapticFeedbackType.LONG_PRESS: |
| + androidType = HapticFeedbackConstants.LONG_PRESS; |
| + break; |
| + case HapticFeedbackType.VIRTUAL_KEY: |
| + androidType = HapticFeedbackConstants.VIRTUAL_KEY; |
| + break; |
| + case HapticFeedbackType.KEYBOARD_TAP: |
| + androidType = HapticFeedbackConstants.KEYBOARD_TAP; |
| + break; |
| + case HapticFeedbackType.CLOCK_TICK: |
| + androidType = HapticFeedbackConstants.CLOCK_TICK; |
| + break; |
| + default: |
| + Log.e(TAG, "Unknown HapticFeedbackType " + type); |
| + return; |
| + } |
| + mView.performHapticFeedback( |
| + androidType, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); |
| + } |
| + |
| + /** |
| + * @see UserFeedback#performAuralFeedback(int) |
| + */ |
| + @Override |
| + public void performAuralFeedback(int type) { |
| + int androidType = 0; |
| + switch (type) { |
| + case AuralFeedbackType.CLICK: |
| + androidType = SoundEffectConstants.CLICK; |
| + break; |
| + case AuralFeedbackType.NAVIGATION_LEFT: |
| + androidType = SoundEffectConstants.NAVIGATION_LEFT; |
| + break; |
| + case AuralFeedbackType.NAVIGATION_UP: |
| + androidType = SoundEffectConstants.NAVIGATION_UP; |
| + break; |
| + case AuralFeedbackType.NAVIGATION_RIGHT: |
| + androidType = SoundEffectConstants.NAVIGATION_RIGHT; |
| + break; |
| + case AuralFeedbackType.NAVIGATION_DOWN: |
| + androidType = SoundEffectConstants.NAVIGATION_DOWN; |
| + break; |
| + default: |
| + Log.e(TAG, "Unknown AuralFeedbackType " + type); |
| + return; |
| + } |
| + mView.playSoundEffect(androidType); |
| + } |
| + } |
| + |
| + /** |
| + * Constructor. |
| + */ |
| + public ActivityImpl(android.app.Activity activity) { |
| + mActivity = activity; |
| + activity.getApplication().registerActivityLifecycleCallbacks( |
| + new ActivityLifecycleCallbacks() { |
| + |
| + @Override |
| + public void onActivityStopped(android.app.Activity activity) {} |
| + |
| + @Override |
| + public void onActivityStarted(android.app.Activity activity) {} |
| + |
| + @Override |
| + public void onActivitySaveInstanceState( |
| + android.app.Activity activity, Bundle bundle) {} |
| + |
| + @Override |
| + public void onActivityResumed(android.app.Activity activity) { |
| + if (activity == mActivity) { |
| + updateSystemUiVisibility(); |
| + } |
| + } |
| + |
| + @Override |
| + public void onActivityPaused(android.app.Activity activity) {} |
| + |
| + @Override |
| + public void onActivityDestroyed(android.app.Activity activity) {} |
| + |
| + @Override |
| + public void onActivityCreated(android.app.Activity activity, Bundle bundle) {} |
| + }); |
| + } |
| + |
| + @Override |
| + public void close() {} |
| + |
| + @Override |
| + public void onConnectionError(MojoException e) {} |
| + |
| + /** |
| + * @see Activity#getUserFeedback(InterfaceRequest) |
| + */ |
| + @Override |
| + public void getUserFeedback(final InterfaceRequest<UserFeedback> userFeedback) { |
| + mActivity.runOnUiThread(new Runnable() { |
| + @Override |
| + public void run() { |
| + UserFeedback.MANAGER.bind( |
| + new UserFeedBackImpl(mActivity.getWindow().getDecorView()), userFeedback); |
| + } |
| + }); |
| + } |
| + |
| + /** |
| + * @see Activity#startActivity(Intent) |
| + */ |
| + @Override |
| + public void startActivity(Intent intent) { |
| + final android.content.Intent androidIntent = |
| + new android.content.Intent(intent.action, Uri.parse(intent.url)); |
| + |
| + if (intent.component != null) { |
| + ComponentName component = intent.component; |
| + android.content.ComponentName androidComponent = |
| + new android.content.ComponentName(component.packageName, component.className); |
| + androidIntent.setComponent(androidComponent); |
| + } |
| + |
| + if (intent.stringExtras != null) { |
| + for (StringExtra extra : intent.stringExtras) { |
| + androidIntent.putExtra(extra.name, extra.value); |
| + } |
| + } |
| + |
| + if (intent.flags != 0) { |
| + androidIntent.setFlags(intent.flags); |
| + } |
| + |
| + if (intent.type != null) { |
| + androidIntent.setType(intent.type); |
| + } |
| + |
| + try { |
| + mActivity.startActivity(androidIntent); |
| + } catch (ActivityNotFoundException e) { |
| + Log.e(TAG, "Unable to startActivity", e); |
| + } |
| + } |
| + |
| + /** |
| + * @see Activity#finishCurrentActivity() |
| + */ |
| + @Override |
| + public void finishCurrentActivity() { |
| + Log.e(TAG, "finishCurrentActivity() is not implemented."); |
| + } |
| + |
| + /** |
| + * @see Activity#setTaskDescription(TaskDescription) |
| + */ |
| + @Override |
| + public void setTaskDescription(TaskDescription description) { |
| + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { |
| + return; |
| + } |
| + mActivity.setTaskDescription(new android.app.ActivityManager.TaskDescription( |
| + description.label, null, description.primaryColor)); |
| + } |
| + |
| + /** |
| + * @see Activity#setSystemUiVisibility(int) |
| + */ |
| + @Override |
| + public void setSystemUiVisibility(int visibility) { |
| + mVisibility = visibility; |
| + updateSystemUiVisibility(); |
| + } |
| + |
| + /** |
| + * @see Activity#setRequestedOrientation(int) |
| + */ |
| + @Override |
| + public void setRequestedOrientation(int orientation) { |
| + int androidOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; |
| + |
| + switch (orientation) { |
| + case ScreenOrientation.UNSPECIFIED: |
| + androidOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; |
| + break; |
| + case ScreenOrientation.LANDSCAPE: |
| + androidOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; |
| + break; |
| + case ScreenOrientation.PORTRAIT: |
| + androidOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; |
| + break; |
| + case ScreenOrientation.NOSENSOR: |
| + androidOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR; |
| + break; |
| + default: |
| + Log.w(TAG, |
| + "Unable to set the requested orientation. Unknown value: " + orientation); |
| + break; |
| + } |
| + |
| + mActivity.setRequestedOrientation(androidOrientation); |
| + } |
| + |
| + private void updateSystemUiVisibility() { |
| + int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; |
| + |
| + if (mVisibility >= SystemUiVisibility.FULLSCREEN) { |
| + flags |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
| + | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN; |
| + } |
| + |
| + if (mVisibility >= SystemUiVisibility.IMMERSIVE) { |
| + flags |= View.SYSTEM_UI_FLAG_IMMERSIVE | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; |
| + } |
| + |
| + final int finalFlags = flags; |
| + mActivity.runOnUiThread(new Runnable() { |
| + @Override |
| + public void run() { |
| + mActivity.getWindow().getDecorView().setSystemUiVisibility(finalFlags); |
| + } |
| + }); |
| + } |
| +} |