VulpesOS/assets/webapps/wallpaper.gaiamobile.org/js/share.js
OverSu b38dea0597 Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
2026-09-30 23:13:03 +02:00

15 lines
No EOL
3.9 KiB
JavaScript

;'use strict';window.onload=function(){navigator.mozSetMessageHandler('activity',function handler(activityRequest){var activityName=activityRequest.source.name;if(activityName!=='share'&&activityName!=='setwallpaper'){return;}
startShare(activityRequest);});var preview=document.getElementById('preview');var cancelButton=document.getElementById('cancel');var setButton=document.getElementById('set-wallpaper');var activity;var blob;var url;var gestureDetector=new GestureDetector(preview);var posX=0;var posY=0;var limitX;var limitY;var scale;var previewImage=document.getElementById('previewImage');var screenWidth,screenHeight;var windowWidth,windowHeight;if(screen.mozOrientation&&screen.mozOrientation.startsWith('landscape')){screenWidth=Math.max(screen.width,screen.height);windowWidth=Math.max(window.innerWidth,window.innerHeight);screenHeight=Math.min(screen.width,screen.height);windowHeight=Math.min(window.innerWidth,window.innerHeight);}else{screenWidth=Math.min(screen.width,screen.height);windowWidth=Math.min(window.innerWidth,window.innerHeight);screenHeight=Math.max(screen.width,screen.height);windowHeight=Math.max(window.innerWidth,window.innerHeight);}
screenWidth=Math.ceil(screenWidth*window.devicePixelRatio);screenHeight=Math.ceil(screenHeight*window.devicePixelRatio);function startShare(request){cancelButton.addEventListener('click',cancelShare);gestureDetector.startDetecting();activity=request;blob=activity.source.data.blobs[0];url=URL.createObjectURL(blob);ImageUtils.getSizeAndType(blob).then(gotImageData,imageDataError);function imageDataError(err){console.error('Could not set wallpaper:',err);activity.postError('Could not set wallpaper: '+err);endShare();}
function gotImageData(imgdata){if(imgdata.type===ImageUtils.JPEG){var scale=Math.max(screenWidth/imgdata.width,screenHeight/imgdata.height);var fragment=ImageUtils.Downsample.sizeNoMoreThan(scale);loadImage(url,fragment);}
else{loadImage(url);}}
function loadImage(url,fragment){previewImage.src=url+(fragment?fragment:'');previewImage.onload=function(){previewImage.hidden=false;var scalex=windowWidth/previewImage.width;var scaley=windowHeight/previewImage.height;scale=Math.max(scalex,scaley);previewImage.width=Math.round(previewImage.width*scale);limitX=windowWidth-previewImage.width;limitY=windowHeight-previewImage.height;posX=Math.round(limitX/2);posY=Math.round(limitY/2);previewImage.style.transform='translate('+posX+'px, '+posY+'px)';setButton.addEventListener('click',scaleImage);previewImage.addEventListener('pan',moveBackground);};}}
function moveBackground(evt){var positions=evt.detail.relative;posX+=positions.dx;if(posX>0){posX=0;}else if(posX<limitX){posX=limitX;}
posY+=positions.dy;if(posY>0){posY=0;}else if(posY<limitY){posY=limitY;}
previewImage.style.transform='translate('+posX+'px, '+posY+'px)';}
function scaleImage(){setButton.disabled=true;var canvas=document.createElement('canvas');canvas.width=screenWidth;canvas.height=screenHeight;var ctx=canvas.getContext('2d');var w=Math.round(windowWidth/scale);var h=Math.round(windowHeight/scale);var x=Math.round(-1*posX/scale);var y=Math.round(-1*posY/scale);if(x<0){x=0;console.error('The value of x shouldn\'t be negative.');}
if(y<0){y=0;console.error('The value of y shouldn\'t be negative.');}
ctx.drawImage(previewImage,x,y,w,h,0,0,canvas.width,canvas.height);canvas.toBlob(function(newBlob){blob=newBlob;setWallpaper();},'image/jpeg');}
function setWallpaper(){var request=navigator.mozSettings.createLock().set({'wallpaper.image':blob});request.onsuccess=function(){activity.postResult('shared');endShare();};request.onerror=function(){console.warn('error setting wallpaper.image:',request.error);activity.postError('could not set wallpaper: '+request.error);endShare();};}
function cancelShare(){activity.postError('cancelled');endShare();}
function endShare(){activity=null;window.URL.revokeObjectURL(url);window.URL.revokeObjectURL(previewImage.src);setButton.removeEventListener('click',scaleImage);cancelButton.removeEventListener('click',cancelShare);}};