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.Notification; 20 import android.app.NotificationManager; 21 import android.content.Context; 22 import android.os.Bundle; 23 import android.support.v4.app.Fragment; 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 32 /** 33 * Fragment that demonstrates how notifications with different visibility metadata differ on 34 * a lockscreen. 35 */ 36 public class VisibilityMetadataFragment extends Fragment { 37 38 private NotificationManager mNotificationManager; 39 40 /** 41 * {@link RadioGroup} that has Visibility RadioButton in its children. 42 */ 43 private RadioGroup mRadioGroup; 44 45 /** 46 * Incremental int used for ID for notifications so that each notification will be 47 * treated differently. 48 */ 49 private int mIncrementalNotificationId = 0; 50 51 /** 52 * Button to show a notification. 53 */ 54 private Button mShowNotificationButton; 55 56 /** 57 * Use this factory method to create a new instance of 58 * this fragment using the provided parameters. 59 * 60 * @return A new instance of fragment NotificationFragment. 61 */ newInstance()62 public static VisibilityMetadataFragment newInstance() { 63 VisibilityMetadataFragment fragment = new VisibilityMetadataFragment(); 64 fragment.setRetainInstance(true); 65 return fragment; 66 } 67 VisibilityMetadataFragment()68 public VisibilityMetadataFragment() { 69 // Required empty public constructor 70 } 71 72 @Override onCreate(Bundle savedInstanceState)73 public void onCreate(Bundle savedInstanceState) { 74 super.onCreate(savedInstanceState); 75 mNotificationManager = (NotificationManager) getActivity().getSystemService(Context 76 .NOTIFICATION_SERVICE); 77 } 78 79 @Override onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)80 public View onCreateView(LayoutInflater inflater, ViewGroup container, 81 Bundle savedInstanceState) { 82 // Inflate the layout for this fragment 83 return inflater.inflate(R.layout.fragment_visibility_metadata_notification, container, false); 84 } 85 86 @Override onViewCreated(View view, Bundle savedInstanceState)87 public void onViewCreated(View view, Bundle savedInstanceState) { 88 super.onViewCreated(view, savedInstanceState); 89 mShowNotificationButton = (Button) view.findViewById(R.id.show_notification_button); 90 mShowNotificationButton.setOnClickListener(new View.OnClickListener() { 91 @Override 92 public void onClick(View view) { 93 NotificationVisibility visibility = getVisibilityFromSelectedRadio(mRadioGroup); 94 showNotificationClicked(visibility); 95 } 96 }); 97 mRadioGroup = (RadioGroup) view.findViewById(R.id.visibility_radio_group); 98 } 99 100 /** 101 * Creates a new notification with a different visibility level. 102 * 103 * @param visibility The visibility of the notification to be created. 104 * 105 * @return A Notification instance. 106 */ createNotification(NotificationVisibility visibility)107 private Notification createNotification(NotificationVisibility visibility) { 108 Notification.Builder notificationBuilder = new Notification.Builder(getActivity()) 109 .setContentTitle("Notification for Visibility metadata"); 110 111 notificationBuilder.setVisibility(visibility.getVisibility()); 112 notificationBuilder.setContentText(String.format("Visibility : %s", 113 visibility.getDescription())); 114 notificationBuilder.setSmallIcon(visibility.getNotificationIconId()); 115 116 return notificationBuilder.build(); 117 } 118 119 /** 120 * Returns a {@link NotificationVisibility} depending on which RadioButton in the radiogroup 121 * is selected. 122 * 123 * @param radiogroup The RadioGroup. 124 * @return The instance of {@link NotificationVisibility} corresponding to RadioButton. 125 */ getVisibilityFromSelectedRadio(RadioGroup radiogroup)126 private NotificationVisibility getVisibilityFromSelectedRadio(RadioGroup radiogroup) { 127 switch (radiogroup.getCheckedRadioButtonId()) { 128 case R.id.visibility_public_radio_button: 129 return NotificationVisibility.PUBLIC; 130 case R.id.visibility_private_radio_button: 131 return NotificationVisibility.PRIVATE; 132 case R.id.visibility_secret_radio_button: 133 return NotificationVisibility.SECRET; 134 default: 135 //If not selected, returns PUBLIC as default. 136 return NotificationVisibility.PUBLIC; 137 } 138 } 139 140 /** 141 * Invoked when {@link #mShowNotificationButton} is clicked. 142 * Creates a new notification with a different visibility level. 143 * 144 * @param visibility The visibility of the notification to be created. 145 */ showNotificationClicked(NotificationVisibility visibility)146 private void showNotificationClicked(NotificationVisibility visibility) { 147 // Assigns a unique (incremented) notification ID in order to treat each notification as a 148 // different one. This helps demonstrate how a notification with a different visibility 149 // level differs on the lockscreen. 150 mIncrementalNotificationId++; 151 mNotificationManager.notify(mIncrementalNotificationId, createNotification(visibility)); 152 Toast.makeText(getActivity(), "Show Notification clicked", Toast.LENGTH_SHORT).show(); 153 } 154 155 /** 156 * Enum indicating possible visibility levels for notifications and related data(String 157 * representation of visibility levels, an icon ID to create a notification) to 158 * create a notification. 159 */ 160 private enum NotificationVisibility { 161 PUBLIC(Notification.VISIBILITY_PUBLIC, "Public", R.drawable.ic_public_notification), 162 PRIVATE(Notification.VISIBILITY_PRIVATE, "Private", R.drawable.ic_private_notification), 163 SECRET(Notification.VISIBILITY_SECRET, "Secret", R.drawable.ic_secret_notification); 164 165 /** 166 * Visibility level of the notification. 167 */ 168 private final int mVisibility; 169 170 /** 171 * String representation of the visibility. 172 */ 173 private final String mDescription; 174 175 /** 176 * Id of an icon used for notifications created from the visibility. 177 */ 178 private final int mNotificationIconId; 179 NotificationVisibility(int visibility, String description, int notificationIconId)180 NotificationVisibility(int visibility, String description, int notificationIconId) { 181 mVisibility = visibility; 182 mDescription = description; 183 mNotificationIconId = notificationIconId; 184 } 185 getVisibility()186 public int getVisibility() { 187 return mVisibility; 188 } 189 getDescription()190 public String getDescription() { 191 return mDescription; 192 } 193 getNotificationIconId()194 public int getNotificationIconId() { 195 return mNotificationIconId; 196 } 197 } 198 } 199