зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1329144 - CustomTabsActivity supports ActionButton r=sebastian
3rd-party-app could launch CustomTabsActivity, and could also configure a custom action button. Now let CustomTabsActivity supports it by creating a MenuItem. MozReview-Commit-ID: 2KuMgBJy2gz --HG-- extra : rebase_source : 93bcfb33001005d307dba68f898375ab7d86adb2
This commit is contained in:
Родитель
50e9f09542
Коммит
0a1aacdde0
|
@ -5,14 +5,21 @@
|
|||
|
||||
package org.mozilla.gecko.customtabs;
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Intent;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.drawable.BitmapDrawable;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.VisibleForTesting;
|
||||
import android.support.v4.view.MenuItemCompat;
|
||||
import android.support.v7.app.ActionBar;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.Window;
|
||||
|
@ -198,15 +205,49 @@ public class CustomTabsActivity extends GeckoApp implements Tabs.OnTabsChangedLi
|
|||
super.onResume();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPrepareOptionsMenu(Menu menu) {
|
||||
insertActionButton(menu, getIntent());
|
||||
return super.onPrepareOptionsMenu(menu);
|
||||
}
|
||||
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
switch (item.getItemId()) {
|
||||
case android.R.id.home:
|
||||
finish();
|
||||
return true;
|
||||
case R.id.action_button:
|
||||
onActionButtonClicked();
|
||||
return true;
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
/**
|
||||
* To insert a MenuItem (as an ActionButton) into Menu.
|
||||
*
|
||||
* @param menu The options menu in which to place items.
|
||||
* @param intent which to launch this activity
|
||||
* @return the MenuItem which be created and inserted into menu. Otherwise, null.
|
||||
*/
|
||||
@VisibleForTesting
|
||||
MenuItem insertActionButton(Menu menu, Intent intent) {
|
||||
if (!IntentUtil.hasActionButton(intent)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// TODO: Bug 1336373 - Action button icon should support tint
|
||||
MenuItem item = menu.add(Menu.NONE,
|
||||
R.id.action_button,
|
||||
Menu.NONE,
|
||||
IntentUtil.getActionButtonDescription(intent));
|
||||
Bitmap bitmap = IntentUtil.getActionButtonIcon(intent);
|
||||
item.setIcon(new BitmapDrawable(getResources(), bitmap));
|
||||
MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
private void updateActionBarWithToolbar(final Toolbar toolbar) {
|
||||
setSupportActionBar(toolbar);
|
||||
final ActionBar ab = getSupportActionBar();
|
||||
|
@ -228,4 +269,13 @@ public class CustomTabsActivity extends GeckoApp implements Tabs.OnTabsChangedLi
|
|||
window.setStatusBarColor(ColorUtil.darken(toolbarColor, 0.25));
|
||||
}
|
||||
}
|
||||
|
||||
private void onActionButtonClicked() {
|
||||
PendingIntent pendingIntent = IntentUtil.getActionButtonPendingIntent(getIntent());
|
||||
try {
|
||||
pendingIntent.send();
|
||||
} catch (PendingIntent.CanceledException e) {
|
||||
Log.w(LOGTAG, "Action Button clicked, but pending intent was canceled", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,5 +19,6 @@
|
|||
<item type="id" name="updateServicePermissionNotification" />
|
||||
<item type="id" name="websiteContentNotification" />
|
||||
<item type="id" name="foregroundNotification" />
|
||||
<item type="id" name="action_button"/>
|
||||
|
||||
</resources>
|
||||
|
|
|
@ -3,10 +3,16 @@
|
|||
|
||||
package org.mozilla.gecko.customtabs;
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.BitmapFactory;
|
||||
import android.support.annotation.AnimRes;
|
||||
import android.support.customtabs.CustomTabsIntent;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
|
||||
import junit.framework.Assert;
|
||||
|
||||
|
@ -14,8 +20,10 @@ import org.junit.Before;
|
|||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.internal.util.reflection.Whitebox;
|
||||
import org.mozilla.gecko.R;
|
||||
import org.mozilla.gecko.background.testhelpers.TestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.fakes.RoboMenu;
|
||||
|
||||
import static org.mockito.Matchers.anyInt;
|
||||
import static org.mockito.Matchers.eq;
|
||||
|
@ -42,6 +50,7 @@ public class TestCustomTabsActivity {
|
|||
doReturn(THIRD_PARTY_PACKAGE_NAME).when(spyContext).getPackageName();
|
||||
|
||||
spyActivity = spy(new CustomTabsActivity());
|
||||
doReturn(RuntimeEnvironment.application.getResources()).when(spyActivity).getResources();
|
||||
|
||||
final CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
|
||||
builder.setExitAnimations(spyContext, enterRes, exitRes);
|
||||
|
@ -91,4 +100,31 @@ public class TestCustomTabsActivity {
|
|||
|
||||
Assert.assertEquals(THIRD_PARTY_PACKAGE_NAME, spyActivity.getPackageName());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testInsertActionButton() {
|
||||
// create properties for CustomTabsIntent
|
||||
final String description = "Description";
|
||||
final Intent actionIntent = new Intent(Intent.ACTION_VIEW);
|
||||
final int reqCode = 0x123;
|
||||
final PendingIntent pendingIntent = PendingIntent.getActivities(spyContext,
|
||||
reqCode,
|
||||
new Intent[]{actionIntent},
|
||||
PendingIntent.FLAG_CANCEL_CURRENT);
|
||||
final Bitmap bitmap = BitmapFactory.decodeResource(
|
||||
spyContext.getResources(),
|
||||
R.drawable.ic_action_settings); // arbitrary icon resource
|
||||
|
||||
// To create a CustomTabsIntent which is asking for ActionButton.
|
||||
final CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
|
||||
builder.setActionButton(bitmap, description, pendingIntent, true);
|
||||
|
||||
// CustomTabsActivity should return a MenuItem with corresponding attributes.
|
||||
Menu menu = new RoboMenu(spyContext);
|
||||
MenuItem item = spyActivity.insertActionButton(menu, builder.build().intent);
|
||||
Assert.assertNotNull(item);
|
||||
Assert.assertEquals(item.getTitle(), description);
|
||||
Assert.assertEquals(0, item.getOrder()); // should be the first one
|
||||
Assert.assertTrue(item.isVisible());
|
||||
}
|
||||
}
|
Загрузка…
Ссылка в новой задаче