1 /*
2 * Copyright 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 
17 package com.example.android.lnotifications;
18 
19 import android.app.Fragment;
20 import android.app.Notification;
21 import android.app.NotificationManager;
22 import android.content.Context;
23 import android.os.Bundle;
24 import android.view.LayoutInflater;
25 import android.view.View;
26 import android.view.ViewGroup;
27 import android.widget.Button;
28 import android.widget.RadioGroup;
29 import android.widget.Toast;
30 
31 import java.util.Random;
32 
33 
34 /**
35  * Fragment that demonstrates how notifications with different visibility metadata differ on
36  * a lockscreen.
37  */
38 public class VisibilityMetadataFragment extends Fragment {
39 
40     private NotificationManager mNotificationManager;
41 
42     /**
43      * {@link RadioGroup} that has Visibility RadioButton in its children.
44      */
45     private RadioGroup mRadioGroup;
46 
47     /**
48      * Incremental Integer used for ID for notifications so that each notification will be
49      * treated differently.
50      */
51     private Integer mIncrementalNotificationId = Integer.valueOf(0);
52 
53     /**
54      * Button to show a notification.
55      */
56     private Button mShowNotificationButton;
57 
58     /**
59      * Use this factory method to create a new instance of
60      * this fragment using the provided parameters.
61      *
62      * @return A new instance of fragment NotificationFragment.
63      */
newInstance()64     public static VisibilityMetadataFragment newInstance() {
65         VisibilityMetadataFragment fragment = new VisibilityMetadataFragment();
66         fragment.setRetainInstance(true);
67         return fragment;
68     }
69 
VisibilityMetadataFragment()70     public VisibilityMetadataFragment() {
71         // Required empty public constructor
72     }
73 
74     @Override
onCreate(Bundle savedInstanceState)75     public void onCreate(Bundle savedInstanceState) {
76         super.onCreate(savedInstanceState);
77         mNotificationManager = (NotificationManager) getActivity().getSystemService(Context
78                 .NOTIFICATION_SERVICE);
79     }
80 
81     @Override
onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)82     public View onCreateView(LayoutInflater inflater, ViewGroup container,
83                              Bundle savedInstanceState) {
84         // Inflate the layout for this fragment
85         return inflater.inflate(R.layout.fragment_visibility_metadata_notification, container, false);
86     }
87 
88     @Override
onViewCreated(View view, Bundle savedInstanceState)89     public void onViewCreated(View view, Bundle savedInstanceState) {
90         super.onViewCreated(view, savedInstanceState);
91         mShowNotificationButton = (Button) view.findViewById(R.id.show_notification_button);
92         mShowNotificationButton.setOnClickListener(new View.OnClickListener() {
93             @Override
94             public void onClick(View view) {
95                 NotificationVisibility visibility = getVisibilityFromSelectedRadio(mRadioGroup);
96                 showNotificationClicked(visibility);
97             }
98         });
99         mRadioGroup = (RadioGroup) view.findViewById(R.id.visibility_radio_group);
100     }
101 
102     /**
103      * Creates a new notification with a different visibility level.
104      *
105      * @param visibility The visibility of the notification to be created.
106      *
107      * @return A Notification instance.
108      */
109     //@VisibleForTesting
createNotification(NotificationVisibility visibility)110     Notification createNotification(NotificationVisibility visibility) {
111         Notification.Builder notificationBuilder = new Notification.Builder(getActivity())
112                 .setContentTitle("Notification for Visibility metadata");
113 
114         notificationBuilder.setVisibility(visibility.getVisibility());
115         notificationBuilder.setContentText(String.format("Visibility : %s",
116                 visibility.getDescription()));
117         notificationBuilder.setSmallIcon(visibility.getNotificationIconId());
118 
119         return notificationBuilder.build();
120     }
121 
122     /**
123      * Returns a {@link NotificationVisibility} depending on which RadioButton in the radiogroup
124      * is selected.
125      *
126      * @param radiogroup The RadioGroup.
127      * @return The instance of {@link NotificationVisibility} corresponding to RadioButton.
128      */
getVisibilityFromSelectedRadio(RadioGroup radiogroup)129     private NotificationVisibility getVisibilityFromSelectedRadio(RadioGroup radiogroup) {
130         switch (radiogroup.getCheckedRadioButtonId()) {
131             case R.id.visibility_public_radio_button:
132                 return NotificationVisibility.PUBLIC;
133             case R.id.visibility_private_radio_button:
134                 return NotificationVisibility.PRIVATE;
135             case R.id.visibility_secret_radio_button:
136                 return NotificationVisibility.SECRET;
137             default:
138                 //If not selected, returns PUBLIC as default.
139                 return NotificationVisibility.PUBLIC;
140         }
141     }
142 
143     /**
144      * Invoked when {@link #mShowNotificationButton} is clicked.
145      * Creates a new notification with a different visibility level.
146      *
147      * @param visibility The visibility of the notification to be created.
148      */
showNotificationClicked(NotificationVisibility visibility)149     private void showNotificationClicked(NotificationVisibility visibility) {
150         // Assigns a unique (incremented) notification ID in order to treat each notification as a
151         // different one. This helps demonstrate how a notification with a different visibility
152         // level differs on the lockscreen.
153         mIncrementalNotificationId = new Integer(mIncrementalNotificationId + 1);
154         mNotificationManager.notify(mIncrementalNotificationId, createNotification(visibility));
155         Toast.makeText(getActivity(), "Show Notification clicked", Toast.LENGTH_SHORT).show();
156     }
157 
158     /**
159      * Enum indicating possible visibility levels for notifications and related data(String
160      * representation of visibility levels, an icon ID to create a notification) to
161      * create a notification.
162      */
163     //@VisibleForTesting
164     static enum NotificationVisibility {
165         PUBLIC(Notification.VISIBILITY_PUBLIC, "Public", R.drawable.ic_public_notification),
166         PRIVATE(Notification.VISIBILITY_PRIVATE, "Private", R.drawable.ic_private_notification),
167         SECRET(Notification.VISIBILITY_SECRET, "Secret", R.drawable.ic_secret_notification);
168 
169         /**
170          * Visibility level of the notification.
171          */
172         private final int mVisibility;
173 
174         /**
175          * String representation of the visibility.
176          */
177         private final String mDescription;
178 
179         /**
180          * Id of an icon used for notifications created from the visibility.
181          */
182         private final int mNotificationIconId;
183 
NotificationVisibility(int visibility, String description, int notificationIconId)184         NotificationVisibility(int visibility, String description, int notificationIconId) {
185             mVisibility = visibility;
186             mDescription = description;
187             mNotificationIconId = notificationIconId;
188         }
189 
getVisibility()190         public int getVisibility() {
191             return mVisibility;
192         }
193 
getDescription()194         public String getDescription() {
195             return mDescription;
196         }
197 
getNotificationIconId()198         public int getNotificationIconId() {
199             return mNotificationIconId;
200         }
201     }
202 }
203