I can't view Calendar

You must Login before you can answer or comment on any questions.

Hi! I want to view calendar in my app but it is not displaying any calendar. Android, SDK 1.7.5 I have seen Titanium.Android.Calendar in this url : http://developer.appcelerator.com/apidoc/mobile/latest/Titanium.Android.Calendar-module#examples but it is not working! If someone knows how can use this calendars please give this source code

3 Answers

Umidjon

From what I understand, if you have no calendars selected in the native app, then they will not be available to any applications.

The above code worked for me, but now I've simplified it. Try the following instead.

var calendars = [];
var selectedCalendarName;
var selectedCalendarId;
var pickerData = [];
 
var win = Ti.UI.createWindow({
  backgroundColor: 'white',
  exitOnClose: true,
  fullscreen: false,
  layout: 'vertical',
  title: 'Calendar Demo'
});
 
var scrollView = Ti.UI.createScrollView({
  backgroundColor: '#eee',
  height: 500,
  top: 20
});
 
var label = Ti.UI.createLabel({
  backgroundColor: 'white',
  text: 'Click on the button to display the events for the selected calendar',
  textAlign: Ti.UI.TEXT_ALIGNMENT_CENTER,
  top: 20
});
scrollView.add(label);
 
var selectableCalendars = Ti.Android.Calendar.selectableCalendars;
for (var i = 0, ilen = selectableCalendars.length; i < ilen; i++) {
  calendars.push({ name: selectableCalendars[i].name, id: selectableCalendars[i].id });
  pickerData.push( Ti.UI.createPickerRow({ title: calendars[i].name }) );
  if(i === 0){
    selectedCalendarName = selectableCalendars[i].name;
    selectedCalendarId = selectableCalendars[i].id;
  }
}
var selectableCalendars = null;
 
if(!calendars.length){
  label.text = 'No calendars available. Select at least one in the native calendar before using this app';
} else {
  label.text = 'Click button to view calendar events';
 
  var picker = Ti.UI.createPicker({
    top:20
  });
 
  picker.add(pickerData);
  win.add(picker);
 
  picker.addEventListener('change', function(e){
    for (var i = 0, ilen = calendars.length; i < ilen; i++) {
      if(calendars[i].name === e.row.title){
        selectedCalendarName = calendars[i].name;
        selectedCalendarId = calendars[i].id;
      }
    }
  });
 
  var button = Ti.UI.createButton({
    title: 'View events',
    top: 20
  });
  win.add(button);
 
  button.addEventListener('click', function(e){
    label.text = 'Generating...';
 
    var currentYear = new Date().getFullYear();
 
    var consoleString = '';
 
    function print(s) {
      if (consoleString.length) {
        consoleString = consoleString + '\n';
      }
      consoleString = consoleString + s;
    }
 
    var calendar = Ti.Android.Calendar.getCalendarById(selectedCalendarId);
 
    function printReminder(r) {
      var typetext = '[method unknown]';
      if (r.method == Ti.Android.Calendar.METHOD_EMAIL) {
        typetext = 'Email';
      } else if (r.method == Ti.Android.Calendar.METHOD_SMS) {
        typetext = 'SMS';
      } else if (r.method == Ti.Android.Calendar.METHOD_ALERT) {
        typetext = 'Alert';
      } else if (r.method == Ti.Android.Calendar.METHOD_DEFAULT) {
        typetext = '[default reminder method]';
      }
      print(typetext + ' reminder to be sent ' + r.minutes + ' minutes before the event');
    }
 
    function printAlert(a) {
      print('Alert id ' + a.id + ' begin ' + a.begin + '; end ' + a.end + '; alarmTime ' + a.alarmTime + '; minutes ' + a.minutes);
    }
 
    function printEvent(event) {
      if (event.allDay) {
        print('Event: ' + event.title + '; ' + event.begin.toLocaleDateString() + ' (all day)');
      } else {
        print('Event: ' + event.title + '; ' + event.begin.toLocaleDateString() + ' ' + event.begin.toLocaleTimeString()+ '-' + event.end.toLocaleTimeString());
      }
 
      var reminders = event.reminders;
      if (reminders && reminders.length) {
        print('There is/are ' + reminders.length + ' reminder(s)');
        for (var i = 0; i < reminders.length; i++) {
          printReminder(reminders[i]);
        }
      }
 
      print('hasAlarm? ' + event.hasAlarm);
      var alerts = event.alerts;
      if (alerts && alerts.length) {
        for (var i = 0; i < alerts.length; i++) {
          printAlert(alerts[i]);
        }
      }
 
      var status = event.status;
      if (status == Ti.Android.Calendar.STATUS_TENTATIVE) {
        print('This event is tentative');
      }
      if (status == Ti.Android.Calendar.STATUS_CONFIRMED) {
        print('This event is confirmed');
      }
      if (status == Ti.Android.Calendar.STATUS_CANCELED) {
        print('This event was canceled');
      }
    }
 
    var events = calendar.getEventsInYear(currentYear);
    if (events && events.length) {
      print(events.length + ' event(s) in ' + currentYear);
      print('');
      for (var i = 0; i < events.length; i++) {
        printEvent(events[i]);
        print('');
      }
    } else {
      print('No events');
    }
 
    label.text = consoleString;
  });
}
 
win.add(scrollView);
 
win.open();

— answered 1 year ago by Paul Dowsett
answer permalink
6 Comments
  • You may need to add permissions, for when the app is run on ICS and above.

    <ti:app>
      <android>
        <manifest>
          <uses-permission android:name="android.permission.READ_CALENDAR" />
          <uses-permission android:name="android.permission.WRITE_CALENDAR" />
        </manifest>
      </android>
    </ti:app>

    — commented 1 year ago by Paul Dowsett

  • i used this code but in my app displayed this " No calendars available. Select at least one in the native calendar before using this app ", also i add tiapp.xml forever it is not working, very strange :-) what should i do?

    — commented 1 year ago by Umidjon Umidjon

  • I think you are right, that it is not selected any native calendar and how can i select calendar???

    — commented 1 year ago by Umidjon Umidjon

  • Show 3 more comments

Umidjon

The following has been tested and works (Titanium 1.8.2, Android 2.3.3) when there are existing calendars on the device.

It's only a demo, so you will probably want to restructure it for a production app.

var win = Ti.UI.createWindow({
  backgroundColor: 'white',
  exitOnClose: true,
  fullscreen: false,
  layout: 'vertical',
  title: 'Calendar Demo'
});
 
function getCalendars(selectableCalendars) {
  var calendars = [];
  var thisCalendar = {};
  var isCalendarSelected = false;
  for (var i = 0, ilen = selectableCalendars.length; i < ilen; i++) {
    thisCalendar = { name: selectableCalendars[i].name, id: selectableCalendars[i].id, selected: false };
    if( Ti.App.Properties.hasProperty('selectedCalendarName') && (Ti.App.Properties.getString('selectedCalendarName') === selectableCalendars[i].name) ){
      thisCalendar.selected = true;
      isCalendarSelected = true;
    }
    calendars.push(thisCalendar);
  }
 
  if(!isCalendarSelected){
    Ti.App.Properties.setString('selectedCalendarName', selectableCalendars[0].name);
    Ti.App.Properties.setInt('selectedCalendarId', selectableCalendars[0].id);
    calendars[0].selected = true;
  }
  return calendars;
}
 
var pickerData = [];
var calendars = getCalendars(Ti.Android.Calendar.selectableCalendars);
var selectedPickerIndex = -1;
 
for (var i = 0, ilen = calendars.length; i < ilen; i++) {
  pickerData.push(Ti.UI.createPickerRow({
    title: calendars[i].name
  }));
  if(calendars[i].selected){
    selectedPickerIndex = i;
  }
}
 
var picker = Ti.UI.createPicker({
  top:20
});
 
picker.add(pickerData);
win.add(picker);
 
picker.addEventListener('change', function(e){
  for (var i = 0, ilen = calendars.length; i < ilen; i++) {
    if(calendars[i].name === e.row.title){
      Ti.App.Properties.setString('selectedCalendarName', calendars[i].name);
      Ti.App.Properties.setInt('selectedCalendarId', calendars[i].id);
    }
  }
});
 
var button = Ti.UI.createButton({
  title: 'View events',
  top: 20
});
win.add(button);
 
var scrollView = Ti.UI.createScrollView({
  backgroundColor: '#eee',
  height: 500,
  top: 20
});
win.add(scrollView);
 
var label = Ti.UI.createLabel({
  backgroundColor: 'white',
  color: 'black',
  text: 'Click button to view calendar events'
});
scrollView.add(label);
 
button.addEventListener('click', function(e){
  label.text = 'Generating...';
 
  var selectedCalendarName = Ti.App.Properties.getString('selectedCalendarName');
  var selectedCalendarId = Ti.App.Properties.getInt('selectedCalendarId');
  var currentYear = new Date().getFullYear();
 
  var consoleString = '';
 
  function print(s) {
    Ti.API.info(s);
    if (consoleString.length > 0) {
      consoleString = consoleString + '\n';
    }
    consoleString = consoleString + s;
  }
 
  var calendar = Ti.Android.Calendar.getCalendarById(selectedCalendarId);
 
  function printReminder(r) {
    var typetext = '[method unknown]';
    if (r.method == Ti.Android.Calendar.METHOD_EMAIL) {
      typetext = 'Email';
    } else if (r.method == Ti.Android.Calendar.METHOD_SMS) {
      typetext = 'SMS';
    } else if (r.method == Ti.Android.Calendar.METHOD_ALERT) {
      typetext = 'Alert';
    } else if (r.method == Ti.Android.Calendar.METHOD_DEFAULT) {
      typetext = '[default reminder method]';
    }
    print(typetext + ' reminder to be sent ' + r.minutes + ' minutes before the event');
  }
 
  function printAlert(a) {
    print('Alert id ' + a.id + ' begin ' + a.begin + '; end ' + a.end + '; alarmTime ' + a.alarmTime + '; minutes ' + a.minutes);
  }
 
  function printEvent(event) {
    if (event.allDay) {
      print('Event: ' + event.title + '; ' + event.begin.toLocaleDateString() + ' (all day)');
    } else {
      print('Event: ' + event.title + '; ' + event.begin.toLocaleDateString() + ' ' + event.begin.toLocaleTimeString()+ '-' + event.end.toLocaleTimeString());
    }
 
    var reminders = event.reminders;
    if (reminders && reminders.length) {
      print('There is/are ' + reminders.length + ' reminder(s)');
      for (var i = 0; i < reminders.length; i++) {
        printReminder(reminders[i]);
      }
    }
 
    print('hasAlarm? ' + event.hasAlarm);
    var alerts = event.alerts;
    if (alerts && alerts.length) {
      for (var i = 0; i < alerts.length; i++) {
        printAlert(alerts[i]);
      }
    }
 
    var status = event.status;
    if (status == Ti.Android.Calendar.STATUS_TENTATIVE) {
      print('This event is tentative');
    }
    if (status == Ti.Android.Calendar.STATUS_CONFIRMED) {
      print('This event is confirmed');
    }
    if (status == Ti.Android.Calendar.STATUS_CANCELED) {
      print('This event was canceled');
    }
  }
 
  var events = calendar.getEventsInYear(currentYear);
  if (events && events.length) {
    print(events.length + ' event(s) in ' + currentYear);
    print('');
    for (var i = 0; i < events.length; i++) {
      printEvent(events[i]);
      print('');
    }
  } else {
    print('No events');
  }
 
  label.text = consoleString;
});
 
win.open();
 
if(selectedPickerIndex > -1){
  picker.setSelectedRow(0, selectedPickerIndex);
}

— answered 1 year ago by Paul Dowsett
answer permalink
5 Comments
  • I updated my Titanium SDk to 1.8.2 and my Android is 2.3.3 I used your code, it gave me error : " Cannot read property 'name' of undefined " I think Ti.Android.Calendar.selectableCalendars is giving me empty!

    — commented 1 year ago by Umidjon Umidjon

  • I think Ti.Android.Calendar.selectableCalendars is giving me NULL!

    — commented 1 year ago by ramzi shadid

  • Yeag you are right ramzi! what should I do? Have u any idea?

    — commented 1 year ago by Umidjon Umidjon

  • Show 2 more comments

Your Answer

Think you can help? Login to answer this question!