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:
Julian_Chu 2017-02-03 16:03:21 +08:00
Родитель 50e9f09542
Коммит 0a1aacdde0
3 изменённых файлов: 87 добавлений и 0 удалений

Просмотреть файл

@ -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());
}
}