1 // Copyright 2016 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.chromoting; 6 7 import android.app.Activity; 8 import android.content.Context; 9 import android.content.Intent; 10 import android.graphics.drawable.Drawable; 11 import android.view.LayoutInflater; 12 import android.view.View; 13 import android.view.ViewGroup; 14 import android.widget.AdapterView; 15 import android.widget.ArrayAdapter; 16 import android.widget.ListView; 17 import android.widget.TextView; 18 19 import org.chromium.base.ApiCompatibilityUtils; 20 import org.chromium.chromoting.help.HelpContext; 21 22 /** 23 * Describes the appearance and behavior of the navigation menu. This also implements 24 * AdapterView.OnItemClickListener so it can be used as the ListView's onItemClickListener. 25 */ 26 public class NavigationMenuAdapter extends ArrayAdapter<NavigationMenuAdapter.NavigationMenuItem> 27 implements AdapterView.OnItemClickListener { 28 /** 29 * Defines a menu item. 30 */ 31 public static class NavigationMenuItem { 32 public static final NavigationMenuItem SEPARATOR = new NavigationMenuItem(null, null, null); 33 34 private String mText; 35 private Drawable mIcon; 36 private Runnable mCallback; 37 NavigationMenuItem(String text, Drawable icon, Runnable callback)38 public NavigationMenuItem(String text, Drawable icon, Runnable callback) { 39 mText = text; 40 mIcon = icon; 41 mCallback = callback; 42 } 43 } 44 createNavigationMenu(final Chromoting chromoting)45 public static ListView createNavigationMenu(final Chromoting chromoting) { 46 ListView navigationMenu = 47 (ListView) chromoting.getLayoutInflater().inflate(R.layout.navigation_list, null); 48 49 NavigationMenuItem feedbackItem = new NavigationMenuItem( 50 chromoting.getResources().getString(R.string.actionbar_send_feedback), 51 getIcon(chromoting, R.drawable.ic_announcement), chromoting::launchFeedback); 52 53 NavigationMenuItem helpItem = 54 new NavigationMenuItem(chromoting.getResources().getString(R.string.actionbar_help), 55 getIcon(chromoting, R.drawable.ic_help), 56 () -> chromoting.launchHelp(HelpContext.HOST_LIST)); 57 58 NavigationMenuItem tosItem = new NavigationMenuItem( 59 chromoting.getResources().getString(R.string.terms_of_service), null, () -> { 60 chromoting.startActivity(new Intent(chromoting, TermsOfServiceActivity.class)); 61 }); 62 63 NavigationMenuItem privacyPolicyItem = new NavigationMenuItem( 64 chromoting.getResources().getString(R.string.privacy_policy), null, () -> { 65 chromoting.startActivity(new Intent(chromoting, PrivacyPolicyActivity.class)); 66 }); 67 68 NavigationMenuItem[] navigationMenuItems = { 69 feedbackItem, helpItem, NavigationMenuItem.SEPARATOR, tosItem, privacyPolicyItem}; 70 NavigationMenuAdapter adapter = new NavigationMenuAdapter(chromoting, navigationMenuItems); 71 navigationMenu.setAdapter(adapter); 72 navigationMenu.setOnItemClickListener(adapter); 73 return navigationMenu; 74 } 75 76 /** Returns the drawable of |drawableId| that can be used to draw icon for a navigation item. */ getIcon(Activity activity, int drawableId)77 private static Drawable getIcon(Activity activity, int drawableId) { 78 Drawable drawable = ApiCompatibilityUtils.getDrawable(activity.getResources(), drawableId); 79 drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); 80 return drawable; 81 } 82 NavigationMenuAdapter(Context context, NavigationMenuItem[] objects)83 private NavigationMenuAdapter(Context context, NavigationMenuItem[] objects) { 84 super(context, -1, objects); 85 } 86 87 /** Generates a View corresponding to the particular navigation item. */ 88 @Override getView(int position, View convertView, ViewGroup parent)89 public View getView(int position, View convertView, ViewGroup parent) { 90 NavigationMenuItem item = getItem(position); 91 Preconditions.notNull(item); 92 if (item == NavigationMenuItem.SEPARATOR) { 93 if (convertView == null || convertView instanceof TextView) { 94 convertView = 95 getInflater().inflate(R.layout.navigation_list_separator, parent, false); 96 } 97 Preconditions.notNull(convertView); 98 return convertView; 99 } 100 if (convertView == null || !(convertView instanceof TextView)) { 101 convertView = getInflater().inflate(R.layout.navigation_list_item, parent, false); 102 } 103 Preconditions.notNull(convertView); 104 TextView textView = convertView.findViewById(R.id.navigation_item_label); 105 textView.setCompoundDrawables(item.mIcon, null, null, null); 106 textView.setText(item.mText); 107 return convertView; 108 } 109 110 111 /** AdapterView.OnItemClickListener override. */ 112 @Override onItemClick(AdapterView<?> parent, View view, int position, long id)113 public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 114 getItem(position).mCallback.run(); 115 } 116 getInflater()117 private LayoutInflater getInflater() { 118 return (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 119 } 120 } 121