public MediaPresentationModel (final @Nonnull Media media, final @Nonnull Object ... capabilities) { // FIXME: Media doesn't expose Downloadable through its Lookup, // and AsLookupWithSupport doesn't include the owner Lookup when owner is Lookup.Provider. // So we have to explicitly expose those roles below. super(merged(new Object[] { media, media.as(Downloadable), media.as(Identifiable), media.as(Removable), media.as(PlainTextRenderable) }, capabilities)); }
/******************************************************************************************************************* * * ******************************************************************************************************************/ public boolean isMediaInStatus (final @Nonnull Status ... status) { return Arrays.asList(status).contains(media.as(Downloadable).getStatus()); } }
@Override public void run() { media.as(Downloadable).refresh(); } });
@Override public void run() { media.as(Downloadable).download(); } });
/******************************************************************************************************************* * * {@inheritDoc} * ******************************************************************************************************************/ @Nonnull public Controller play (final @Nonnull Media media) throws IOException { logger.info("play(%s)", media); MediaPlayer oldPlayer = null; MediaPlayer newPlayer = null; synchronized (this) { oldPlayer = playerMapByMedia.remove(media); final Uri uri = Uri.fromFile(media.as(Downloadable).getFile()); newPlayer = MediaPlayer.create(context, uri); logger.info(">>>> created %s for %s", newPlayer, uri); if (newPlayer == null) // sometimes it happens { dispose(oldPlayer); throw new IOException("MediaPlayer.create() failed for " + uri); } playerMapByMedia.put(media, newPlayer); } dispose(oldPlayer); newPlayer.start(); // prepare() already done by create() return new AndroidMediaPlayerController(newPlayer); }
/******************************************************************************************************************* * * {@inheritDoc} * ******************************************************************************************************************/ @Nonnull public Controller play (final @Nonnull Media media) throws IOException { logger.info("play(%s)", media); MediaPlayer oldPlayer = null; MediaPlayer newPlayer = null; synchronized (this) { oldPlayer = playerMapByMedia.remove(media); final Uri uri = Uri.fromFile(media.as(Downloadable).getFile()); newPlayer = MediaPlayer.create(context, uri); logger.info(">>>> created %s for %s", newPlayer, uri); if (newPlayer == null) // sometimes it happens { dispose(oldPlayer); throw new IOException("MediaPlayer.create() failed for " + uri); } playerMapByMedia.put(media, newPlayer); } dispose(oldPlayer); newPlayer.start(); // prepare() already done by create() return new AndroidMediaPlayerController(newPlayer); }
final Media media = new Media().with(Media.ID, new Id(uri.toASCIIString())); final Downloadable downloadable = media.as(Downloadable); downloadable.download(); downloadable.waitUntilDownloadingCompleted();
/******************************************************************************************************************* * * ******************************************************************************************************************/ @ThreadConfined(type=NOT_UI) protected void createPresentationModels (final @Nonnull Taxon taxon) throws NotFoundException { log.info("createPresentationModels({})", taxon); // stillImages.addAll(taxon.as(Documentable).getFactSheet().getMultiple(FOAF_IMAGE)); for (final Media stillImage : taxon.as(Documentable).getFactSheet().getMultiple(FOAF_IMAGE)) { addPresentationModel(stillImage.with(ID, replacedId(stillImage.get(ID))).as(Presentable).createPresentationModel()); } }
/******************************************************************************************************************* * * ******************************************************************************************************************/ @ThreadConfined(type=NOT_UI) protected void createPresentationModels (final @Nonnull Taxon taxon) throws IOException { log.info("createPresentationModels({})", taxon); for (final Observation observation : loadObservationSet(taxon).find(Observation).results()) { final Media media = observation.as(Media); final ActionProvider actionProvider = new SoundActionProvider(DefaultTaxonSoundFactSheetViewController.this, view, playController, media, observation); addPresentationModel(media.as(Presentable).createPresentationModel(observation, actionProvider)); } }
@Override public void onConfirm() { try { media.as(Removable).remove(); final double freeSpace = masterFileSystem.get().getExternalFileSystem().getFreeSpace() / MEGA; view.notifyCompletion(notification().withText(_, "deletionCompleted", freeSpace)); } catch (Exception e) { log.warn("Can't delete sound", e); view.notifyError(notification().withText(_, "deletionFailed")); } // Needed because at this point the PropertyChangeListener has been detached. // Maybe it would be better to keep the listener attached, implement a dispose() method that // detaches it at the end. controller.notifyStatusChanged(); } }));
/******************************************************************************************************************* * * ******************************************************************************************************************/ protected void doDownloadMedia (final @Nonnull Runnable runnable) { final FileSystem externalFileSystem = masterFileSystem.get().getExternalFileSystem(); if (!externalFileSystem.isWritable()) { view.notifySdCardNotReady(notificationWithFeedback().withCaption(_, "downloadFailed") .withText(_, "diskNotMountedMessage")); } else if (externalFileSystem.getFreeSpace() < MIN_FREE_SPACE) { view.notifySdCardNotReady(notificationWithFeedback().withCaption(_, "downloadFailed") .withText(_, "diskFullMessage", MIN_FREE_SPACE / MEGA)); } else { media.as(Downloadable).addPropertyChangeListener(downloadablePropertyChangeListener); runnable.run(); } } }
final Downloadable downloadable = m.as(Downloadable); downloadable.download(); downloadable.waitUntilDownloadingCompleted();