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