/* The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is collection of files collectively known as Open Camera. The Initial Developer of the Original Code is Almalence Inc. Portions created by Initial Developer are Copyright (C) 2013 by Almalence Inc. All Rights Reserved. */ /* <!-- +++ package com.almalence.opencam_plus; +++ --> */ // <!-- -+- package com.almalence.opencam; //-+- --> import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.onepf.oms.OpenIabHelper; import org.onepf.oms.appstore.googleUtils.IabHelper; import org.onepf.oms.appstore.googleUtils.IabResult; import org.onepf.oms.appstore.googleUtils.Inventory; import org.onepf.oms.appstore.googleUtils.Purchase; import android.annotation.TargetApi; import android.app.Activity; import android.app.AlertDialog; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.content.pm.PackageManager; import android.content.res.Resources; import android.graphics.Color; import android.graphics.ImageFormat; import android.graphics.Point; import android.hardware.Camera; import android.media.AudioManager; import android.media.CamcorderProfile; import android.media.MediaPlayer; import android.net.Uri; import android.nfc.NfcAdapter; import android.os.Build; import android.os.CountDownTimer; import android.os.Debug; import android.preference.CheckBoxPreference; import android.preference.ListPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.PreferenceFragment; import android.preference.PreferenceManager; import android.util.Log; import android.util.Pair; import android.view.Display; import android.view.Gravity; import android.view.KeyEvent; import android.view.Surface; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup.LayoutParams; import android.view.Window; import android.view.WindowManager; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.almalence.plugins.capture.panoramaaugmented.PanoramaAugmentedCapturePlugin; import com.almalence.plugins.capture.video.VideoCapturePlugin; import com.almalence.sony.cameraremote.SimpleStreamSurfaceView; import com.almalence.sony.cameraremote.utils.NFCHandler; import com.almalence.sony.cameraremote.utils.WifiHandler; import com.almalence.util.Util; //<!-- -+- import com.almalence.opencam.cameracontroller.CameraController; import com.almalence.opencam.ui.AlmalenceGUI; import com.almalence.opencam.ui.GLLayer; import com.almalence.opencam.ui.GUI; import com.almalence.util.AppRater; //-+- --> /* <!-- +++ import com.almalence.opencam_plus.cameracontroller.CameraController; import com.almalence.opencam_plus.ui.AlmalenceGUI; import com.almalence.opencam_plus.ui.GLLayer; import com.almalence.opencam_plus.ui.GUI; +++ --> */ /*** * MainScreen - main activity screen with camera functionality * * Passes all main events to PluginManager ***/ @SuppressWarnings("deprecation") public class MainScreen extends ApplicationScreen { // >>Description // section with different global parameters available for everyone // // Camera parameters and possibly access to camera instance // // Global defines and others // // Description<< private static final int MODE_GENERAL = 0; private static final int MODE_SMART_MULTISHOT_AND_NIGHT = 1; private static final int MODE_PANORAMA = 2; private static final int MODE_VIDEO = 3; private static final int MIN_MPIX_SUPPORTED = 1280 * 960; private static final int MIN_MPIX_PREVIEW = 600 * 400; public static MainScreen thiz; // Common preferences private int imageSizeIdxPreference; private int multishotImageSizeIdxPreference; private boolean shutterPreference = true; private int shotOnTapPreference = 0; private boolean showHelp = false; private static boolean maxScreenBrightnessPreference; // >>Description // section with initialize, resume, start, stop procedures, preferences // access // // Initialize, stop etc depends on plugin type. // // Create main GUI controls and plugin specific controls. // // Description<< // Clicked mode id from widget. public static final String EXTRA_ITEM = "WidgetModeID"; public static final String EXTRA_TORCH = "WidgetTorchMode"; public static final String EXTRA_BARCODE = "WidgetBarcodeMode"; public static final String EXTRA_SHOP = "WidgetGoShopping"; private static boolean launchTorch = false; private static boolean launchBarcode = false; private static boolean goShopping = false; private static int prefFlash = -1; private static boolean prefBarcode = false; private static final int VOLUME_FUNC_SHUTTER = 0; private static final int VOLUME_FUNC_EXPO = 2; private static final int VOLUME_FUNC_NONE = 3; public static String sKeepScreenOn; public static String sFastSwitchShutterOn; public static String sDelayedCapturePref; public static String sShowDelayedCapturePref; public static String sDelayedSoundPref; public static String sDelayedFlashPref; public static String sDelayedCaptureIntervalPref; public static String sPhotoTimeLapseCaptureIntervalPref; public static String sPhotoTimeLapseCaptureIntervalMeasurmentPref; public static String sPhotoTimeLapseActivePref; public static String sPhotoTimeLapseIsRunningPref; public static String sPhotoTimeLapseCount; public static String sSwipingEnabledPref; private static String sShutterPref; private static String sShotOnTapPref; private static String sVolumeButtonPref; public static String sSonyCamerasPref; public static String sDefaultInfoSetPref; public static String sSWCheckedPref; public static String sSavePathPref; public static String sExportNamePref; public static String sExportNamePrefixPref; public static String sExportNamePostfixPref; public static String sSaveToPref; public static String sLastPhotoModePref; // Camera parameters info int cameraId; List<CameraController.Size> preview_sizes; List<CameraController.Size> video_sizes; List<CameraController.Size> picture_sizes; boolean supports_video_stabilization; List<String> flash_values; List<String> focus_values; List<String> scene_modes_values; List<String> white_balances_values; List<String> isos; String flattenParamteters; private NfcAdapter mNfcAdapter; private WifiHandler mWifiHandler; public static MainScreen getInstance() { return thiz; } protected void createPluginManager() { pluginManager = PluginManager.getInstance(); } /* * Try to catch NFC intent */ @Override protected void onNewIntent(Intent intent) { try { //reading params passed from widget SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainScreen.getMainContext()); String mode = intent.getStringExtra(EXTRA_ITEM); if (null != mode) prefs.edit().putString("defaultModeName", mode).commit(); launchTorch = intent.getBooleanExtra(EXTRA_TORCH, false); launchBarcode = intent.getBooleanExtra(EXTRA_BARCODE, false); Pair<String, String> cameraWifiSettings = NFCHandler.parseIntent(intent); mWifiHandler.createIfNeededThenConnectToWifi(cameraWifiSettings.first, cameraWifiSettings.second); } catch (Exception e) { e.printStackTrace(); } } @Override protected void duringOnCreate() { thiz = this; mApplicationStarted = false; isForceClose = false; sDelayedCapturePref = getResources().getString(R.string.Preference_DelayedCaptureValue); sShowDelayedCapturePref = getResources().getString(R.string.Preference_ShowDelayedCaptureValue); sDelayedSoundPref = getResources().getString(R.string.Preference_DelayedSoundValue); sDelayedFlashPref = getResources().getString(R.string.Preference_DelayedFlashValue); sDelayedCaptureIntervalPref = getResources().getString(R.string.Preference_DelayedCaptureIntervalValue); sDelayedCapturePref = getResources().getString(R.string.Preference_DelayedCaptureValue); sShowDelayedCapturePref = getResources().getString(R.string.Preference_ShowDelayedCaptureValue); sDelayedSoundPref = getResources().getString(R.string.Preference_DelayedSoundValue); sDelayedFlashPref = getResources().getString(R.string.Preference_DelayedFlashValue); sDelayedCaptureIntervalPref = getResources().getString(R.string.Preference_DelayedCaptureIntervalValue); sPhotoTimeLapseCaptureIntervalPref = getResources() .getString(R.string.Preference_PhotoTimeLapseCaptureInterval); sPhotoTimeLapseCaptureIntervalMeasurmentPref = getResources().getString( R.string.Preference_PhotoTimeLapseCaptureIntervalMeasurment); sPhotoTimeLapseActivePref = getResources().getString(R.string.Preference_PhotoTimeLapseSWChecked); sPhotoTimeLapseIsRunningPref = getResources().getString(R.string.Preference_PhotoTimeLapseIsRunning); sPhotoTimeLapseCount = getResources().getString(R.string.Preference_PhotoTimeLapseCount); sSwipingEnabledPref = getResources().getString(R.string.Preference_SwipingEnabledChecked); sShutterPref = getResources().getString(R.string.Preference_ShutterCommonValue); sSonyCamerasPref = getResources().getString(R.string.Preference_ConnectToSonyCameras); sShotOnTapPref = getResources().getString(R.string.Preference_ShotOnTapValue); sVolumeButtonPref = getResources().getString(R.string.Preference_VolumeButtonValue); sDefaultInfoSetPref = getResources().getString(R.string.Preference_DefaultInfoSetValue); sSWCheckedPref = getResources().getString(R.string.Preference_SWCheckedValue); sExportNamePref = getResources().getString(R.string.Preference_ExportNameValue); sExportNamePrefixPref = getResources().getString(R.string.Preference_SavePathPrefixValue); sExportNamePostfixPref = getResources().getString(R.string.Preference_SavePathPostfixValue); sSortByDataPref = getResources().getString(R.string.Preference_SortByDataValue); sEnableExifOrientationTagPref = getResources().getString(R.string.Preference_EnableExifTagOrientationValue); sAdditionalRotationPref = getResources().getString(R.string.Preference_AdditionalRotationValue); sKeepScreenOn = getResources().getString(R.string.Preference_KeepScreenOnValue); sFastSwitchShutterOn = getResources().getString(R.string.Preference_ShowFastSwitchShutterValue); sSavePathPref = getResources().getString(R.string.Preference_SavePathValue); sSaveToPref = getResources().getString(R.string.Preference_SaveToValue); sLastPhotoModePref = getResources().getString(R.string.Preference_LastPhotoModeValue); Intent intent = this.getIntent(); String mode = intent.getStringExtra(EXTRA_ITEM); launchTorch = intent.getBooleanExtra(EXTRA_TORCH, false); launchBarcode = intent.getBooleanExtra(EXTRA_BARCODE, false); // reset or save settings resetOrSaveSettings(); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainScreen.getMainContext()); SavingService.initSavingPrefs(getApplicationContext()); if (null != mode) prefs.edit().putString("defaultModeName", mode).commit(); if (launchTorch) { prefFlash = prefs.getInt(sFlashModePref, CameraParameters.FLASH_MODE_AUTO); prefs.edit().putInt(sFlashModePref, CameraParameters.FLASH_MODE_TORCH).commit(); } if (launchBarcode) { prefBarcode = prefs.getBoolean("PrefBarcodescannerVF", false); prefs.edit().putBoolean("PrefBarcodescannerVF", true).commit(); } // <!-- -+- /**** Billing *****/ if (true == prefs.contains("unlock_all_forever")) { unlockAllPurchased = prefs.getBoolean("unlock_all_forever", false); } if (true == prefs.contains("plugin_almalence_hdr")) { hdrPurchased = prefs.getBoolean("plugin_almalence_hdr", false); } if (true == prefs.contains("plugin_almalence_panorama")) { panoramaPurchased = prefs.getBoolean("plugin_almalence_panorama", false); } if (true == prefs.contains("plugin_almalence_moving_burst")) { multishotsPurchased = prefs.getBoolean("plugin_almalence_moving_burst", false); } if (true == prefs.contains("subscription_unlock_all_year")) { unlockAllSubscriptionYear = prefs.getBoolean("subscription_unlock_all_year", false); } if (true == prefs.contains("plugin_almalence_super")) { superPurchased = prefs.getBoolean("plugin_almalence_super", false); } if (!unlockAllPurchased) createBillingHandler(); /**** Billing *****/ // application rating helper AppRater.app_launched(this); // -+- --> keepScreenOn = prefs.getBoolean(sKeepScreenOn, false); mNfcAdapter = NfcAdapter.getDefaultAdapter(this); mWifiHandler = new WifiHandler(this); } @Override protected void afterOnCreate() { PluginManager.getInstance().setupDefaultMode(); // init gui manager guiManager = new AlmalenceGUI(); Intent intent = this.getIntent(); goShopping = intent.getBooleanExtra(EXTRA_SHOP, false); // <!-- -+- if (goShopping) { if (titleUnlockAll == null || titleUnlockAll.endsWith("check for sale")) { Toast.makeText(MainScreen.getMainContext(), "Error connecting to Google Play. Check internet connection.", Toast.LENGTH_LONG).show(); return; } guiManager.showStore(); } // -+- --> } @Override protected void onApplicationStart() { setContentView(R.layout.opencamera_main_layout); findViewById(R.id.SurfaceView02).setVisibility(View.GONE); preview = (SurfaceView) this.findViewById(R.id.SurfaceView01); preview.setOnClickListener(this); preview.setOnTouchListener(this); preview.setKeepScreenOn(true); surfaceHolder = preview.getHolder(); surfaceHolder.addCallback(this); mWifiHandler.register(); CameraController.controlCameraLevel(); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mainContext); boolean isCamera2 = prefs.getBoolean(getResources().getString(R.string.Preference_UseCamera2Key), CameraController.checkHardwareLevel()); CameraController.setUseCamera2(isCamera2); prefs.edit() .putBoolean(getResources().getString(R.string.Preference_UseCamera2Key), CameraController.isUseCamera2()) .commit(); int cameraSelected = prefs.getInt(MainScreen.sCameraModePref, 0); if (cameraSelected == CameraController.getNumberOfCameras() - 1) { prefs.edit().putInt(ApplicationScreen.sCameraModePref, 0).commit(); MainScreen.getGUIManager().setCameraModeGUI(0); } CameraController.onStart(); MainScreen.getGUIManager().onStart(); PluginManager.getInstance().onStart(); } @Override protected void onApplicationResume() { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); // <!-- -+- //check appturbo app of the month conditions // if (!unlockAllPurchased) // { // if (isAppturboUnlockable(this)) // { // unlockAllPurchased = true; // Editor prefsEditor = prefs.edit(); // prefsEditor.putBoolean("unlock_all_forever", true).commit(); // Toast.makeText(MainScreen.getMainContext(), this.getResources().getString(R.string.string_appoftheday), Toast.LENGTH_LONG).show(); // } // } if (isABCUnlockedInstalled(this)) { unlockAllPurchased = true; prefs.edit().putBoolean("unlock_all_forever", true).commit(); } // -+- --> isCameraConfiguring = false; mWifiHandler.register(); if (mNfcAdapter != null) { mNfcAdapter.enableForegroundDispatch(this, NFCHandler.getPendingIntent(this), NFCHandler.getIntentFilterArray(), NFCHandler.getTechListArray()); } //Such separation is needed due to Android 6 bug with half-visible preview on Nexus 5 //At this moment we only found that CountDownTimer somehow affect on it. //Corrupted preview still occurs but less often //TODO: investigate deeper that problem if(CameraController.isUseCamera2()) onResumeCamera(); else onResumeTimer = new CountDownTimer(50, 50) { public void onTick(long millisUntilFinished){} public void onFinish() { onResumeCamera(); } }.start(); shutterPlayer = new SoundPlayer(this.getBaseContext(), getResources().openRawResourceFd( R.raw.plugin_capture_tick)); if (screenTimer != null) { if (isScreenTimerRunning) screenTimer.cancel(); screenTimer.start(); isScreenTimerRunning = true; } //checking for available memory long memoryFree = getAvailableInternalMemory(); if (memoryFree < 30) Toast.makeText(MainScreen.getMainContext(), "Almost no free space left on internal storage.", Toast.LENGTH_LONG).show(); boolean dismissKeyguard = prefs.getBoolean("dismissKeyguard", true); if (dismissKeyguard) getWindow() .addFlags( WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); else { getWindow() .clearFlags( WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); } } protected void onResumeCamera() { SharedPreferences prefs = PreferenceManager .getDefaultSharedPreferences(MainScreen.getMainContext()); updatePreferences(); captureFormat = CameraController.JPEG; maxScreenBrightnessPreference = prefs.getBoolean("maxScreenBrightnessPref", false); setScreenBrightness(maxScreenBrightnessPreference); MainScreen.thiz.findViewById(R.id.mainLayout2).setVisibility(View.VISIBLE); boolean openCamera = false; String modeId = PluginManager.getInstance().getActiveModeID(); if (CameraController.isRemoteCamera() && !(modeId.contains("single") || modeId.contains("video"))) { openCamera = true; prefs.edit().putInt(MainScreen.sCameraModePref, 0).commit(); CameraController.setCameraIndex(0); guiManager.setCameraModeGUI(0); } CameraController.onResume(); MainScreen.getGUIManager().onResume(); PluginManager.getInstance().onResume(); MainScreen.thiz.mPausing = false; if (!CameraController.isRemoteCamera()) { // set preview, on click listener and surface buffers findViewById(R.id.SurfaceView02).setVisibility(View.GONE); preview = (SurfaceView) findViewById(R.id.SurfaceView01); surfaceHolder = preview.getHolder(); surfaceHolder.addCallback(MainScreen.this); preview.setVisibility(View.VISIBLE); preview.setOnClickListener(MainScreen.this); preview.setOnTouchListener(MainScreen.this); preview.setKeepScreenOn(true); if (CameraController.isUseCamera2()) { Log.d("MainScreen", "onResume: CameraController.setupCamera(null)"); CameraController.setupCamera(null, !switchingMode || openCamera); if (glView != null) { glView.onResume(); Log.d("GL", "glView onResume"); } } else if ((surfaceCreated && (!CameraController.isCameraCreated())) || // this is for change mode without camera restart! (surfaceCreated && MainScreen.getInstance().getSwitchingMode())) { CameraController.setupCamera(surfaceHolder, !switchingMode || openCamera); if (glView != null) { glView.onResume(); Log.d("GL", "glView onResume"); } } } else { sonyCameraSelected(); } if (preview != null) { preview.setKeepScreenOn(keepScreenOn); } orientListener.enable(); } @Override protected void onApplicationPause() { if (mNfcAdapter != null) { mNfcAdapter.disableForegroundDispatch(this); } if (onResumeTimer != null) { onResumeTimer.cancel(); } mApplicationStarted = false; MainScreen.getGUIManager().onPause(); PluginManager.getInstance().onPause(true); orientListener.disable(); if (shutterPreference) { if (Build.VERSION.SDK_INT < 23) { AudioManager mgr = (AudioManager) MainScreen.thiz.getSystemService(MainScreen.AUDIO_SERVICE); mgr.setStreamMute(AudioManager.STREAM_SYSTEM, false); } } this.mPausing = true; this.hideOpenGLLayer(); if (screenTimer != null) { if (isScreenTimerRunning) screenTimer.cancel(); isScreenTimerRunning = false; } CameraController.onPause(switchingMode); switchingMode = false; if (CameraController.isRemoteCamera()) { stopRemotePreview(); } this.findViewById(R.id.mainLayout2).setVisibility(View.INVISIBLE); if (shutterPlayer != null) { shutterPlayer.release(); shutterPlayer = null; } } @Override protected void onApplicationStop() { switchingMode = false; mApplicationStarted = false; orientationMain = 0; orientationMainPrevious = 0; ApplicationScreen.getGUIManager().onStop(); ApplicationScreen.getPluginManager().onStop(); CameraController.onStop(); mWifiHandler.reconnectToLastWifi(); mWifiHandler.unregister(); } @Override protected void onApplicationDestroy() { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainScreen.getMainContext()); if (launchTorch && prefs.getInt(sFlashModePref, -1) == CameraParameters.FLASH_MODE_TORCH) { prefs.edit().putInt(sFlashModePref, prefFlash).commit(); } if (launchBarcode && prefs.getBoolean("PrefBarcodescannerVF", false)) { prefs.edit().putBoolean("PrefBarcodescannerVF", prefBarcode).commit(); } prefs.edit().putBoolean(MainScreen.sPhotoTimeLapseIsRunningPref, false); prefs.edit().putBoolean(MainScreen.sPhotoTimeLapseActivePref, false); MainScreen.getGUIManager().onDestroy(); PluginManager.getInstance().onDestroy(); CameraController.onDestroy(); // <!-- -+- /**** Billing *****/ destroyBillingHandler(); /**** Billing *****/ // -+- --> } private void updatePreferences() { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainScreen.getMainContext()); CameraController.setCameraIndex(prefs.getInt(MainScreen.sCameraModePref, 0)); shutterPreference = prefs.getBoolean(MainScreen.sShutterPref, false); shotOnTapPreference = Integer.parseInt(prefs.getString(MainScreen.sShotOnTapPref, "0")); if (!CameraController.isRemoteCamera()) { imageSizeIdxPreference = Integer.parseInt(prefs.getString( CameraController.getCameraIndex() == 0 ? MainScreen.sImageSizeRearPref : MainScreen.sImageSizeFrontPref, "-1")); multishotImageSizeIdxPreference = Integer .parseInt(prefs.getString(CameraController.getCameraIndex() == 0 ? sImageSizeMultishotBackPref : sImageSizeMultishotFrontPref, "-1")); } else { imageSizeIdxPreference = Integer.parseInt(prefs.getString(MainScreen.sImageSizeSonyRemotePref, "-1")); multishotImageSizeIdxPreference = Integer.parseInt(prefs.getString( MainScreen.sImageSizeMultishotSonyRemotePref, "-1")); } multishotImageSizeIdxPreference = Integer.parseInt(prefs.getString( CameraController.getCameraIndex() == 0 ? sImageSizeMultishotBackPref : sImageSizeMultishotFrontPref, "-1")); keepScreenOn = prefs.getBoolean(sKeepScreenOn, false); } public void pauseMain() { onPause(); } public void stopMain() { onStop(); } public void startMain() { onStart(); } public void resumeMain() { onResume(); } @Override public void surfaceChanged(final SurfaceHolder holder, final int format, final int width, final int height) { if (!cameraPermissionGranted || !storagePermissionGranted) return; mCameraSurface = holder.getSurface(); //In camera2 mode we have to wait a second call of surfaceChanged to continue configuring of camera //First call of this function occurs after setSurfaceFixedSize(1, 1) call in onResumeCamera method. //Variable isSurfaceConfiguring is used to separate first 'fake' call on surfaceChanged from second 'real' call //when we set desired surfaceView size //More info read from: https://code.google.com/p/android/issues/detail?id=191251 if (isCameraConfiguring) { PluginManager.getInstance().sendMessage(ApplicationInterface.MSG_SURFACE_CONFIGURED, 0); isCameraConfiguring = false; } else { new CountDownTimer(50, 50) { public void onTick(long millisUntilFinished) { // Not used } public void onFinish() { updatePreferences(); if (!MainScreen.thiz.mPausing && surfaceCreated && (!CameraController.isCameraCreated())) { MainScreen.thiz.findViewById(R.id.mainLayout2).setVisibility(View.VISIBLE); Log.d("MainScreen", "surfaceChanged: CameraController.setupCamera(null). SurfaceSize = " + width + "x" + height); if (!CameraController.isRemoteCamera()) { if (!CameraController.isUseCamera2()) { CameraController.setupCamera(holder, !switchingMode); } else { messageHandler.sendEmptyMessage(ApplicationInterface.MSG_SURFACE_READY); } } } } }.start(); } } public void getCameraParametersBundle() { try { cameraId = CameraController.getCameraIndex(); supports_video_stabilization = CameraController.getVideoStabilizationSupported(); scene_modes_values = CameraController.getSupportedSceneModesNames(); white_balances_values = CameraController.getSupportedWhiteBalanceNames(); isos = CameraController.getSupportedISONames(); preview_sizes = CameraController.getSupportedPreviewSizes(); picture_sizes = CameraController.getSupportedPictureSizes(); video_sizes = CameraController.getSupportedVideoSizes(); flash_values = CameraController.getSupportedFlashModesNames(); focus_values = CameraController.getSupportedFocusModesNames(); Camera.Parameters params = CameraController.getCameraParameters(); if (params != null) { flattenParamteters = params.flatten(); } } catch (Exception e) { e.printStackTrace(); } } @Override public SimpleStreamSurfaceView getSimpleStreamSurfaceView() { return (SimpleStreamSurfaceView) preview; } @Override public int getImageSizeIndex() { return MainScreen.getInstance().imageSizeIdxPreference; } @Override public int getMultishotImageSizeIndex() { return MainScreen.getInstance().multishotImageSizeIdxPreference; } @Override public boolean isShutterSoundEnabled() { return shutterPreference; } @Override public int isShotOnTap() { return MainScreen.getInstance().shotOnTapPreference; } public static boolean isShowHelp() { return MainScreen.getInstance().showHelp; } public static void setShowHelp(boolean show) { MainScreen.getInstance().showHelp = show; } /* * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Get/Set method for private variables */ @Override public void onPreferenceCreate(PreferenceFragment prefActivity) { try{ setImageSizeOptions(prefActivity, MODE_GENERAL); } catch (Exception e) { e.printStackTrace();} try{ setImageSizeOptions(prefActivity, MODE_SMART_MULTISHOT_AND_NIGHT); } catch (Exception e) { e.printStackTrace();} try{ setImageSizeOptions(prefActivity, MODE_PANORAMA); } catch (Exception e) { e.printStackTrace();} try { setImageSizeOptions(prefActivity, MODE_VIDEO); } catch (Exception e) { e.printStackTrace();} } private void setColorEffectOptions(PreferenceFragment prefActivity) { CharSequence[] entries = null; CharSequence[] entryValues = null; String opt1 = sRearColorEffectPref; String opt2 = sFrontColorEffectPref; ListPreference lp = (ListPreference) prefActivity.findPreference(opt1); ListPreference lp2 = (ListPreference) prefActivity.findPreference(opt2); int[] colorEfects = CameraController.getSupportedColorEffects(); if (colorEfects == null || CameraController.ColorEffectsNamesList == null || !CameraController.isColorEffectSupported()) { if (lp != null) { prefActivity.getPreferenceScreen().removePreference(lp); } if (lp2 != null) { prefActivity.getPreferenceScreen().removePreference(lp2); } return; } entries = CameraController.ColorEffectsNamesList .toArray(new CharSequence[CameraController.ColorEffectsNamesList.size()]); entryValues = new CharSequence[colorEfects.length]; for (int i = 0; i < colorEfects.length; i++) { entryValues[i] = Integer.toString(colorEfects[i]); } if (CameraController.isFrontCamera() && lp2 != null) prefActivity.getPreferenceScreen().removePreference(lp2); else if (lp != null && lp2 != null) { prefActivity.getPreferenceScreen().removePreference(lp); lp = lp2; } if (lp != null) { lp.setEntries(entries); lp.setEntryValues(entryValues); } } private void setImageSizeOptions(PreferenceFragment prefActivity, int mode) { CharSequence[] entries = null; CharSequence[] entryValues = null; int idx = 0; int currentIdx = -1; String opt1 = ""; String opt2 = ""; String opt3 = ""; if (mode == MODE_GENERAL) { opt1 = sImageSizeRearPref; opt2 = sImageSizeFrontPref; opt3 = sImageSizeSonyRemotePref; currentIdx = MainScreen.thiz.getImageSizeIndex(); if (currentIdx == -1) { currentIdx = 0; } entries = CameraController.getResolutionsNamesList().toArray( new CharSequence[CameraController.getResolutionsNamesList().size()]); entryValues = CameraController.getResolutionsIdxesList().toArray( new CharSequence[CameraController.getResolutionsIdxesList().size()]); } else if (mode == MODE_SMART_MULTISHOT_AND_NIGHT) { opt1 = sImageSizeMultishotBackPref; opt2 = sImageSizeMultishotFrontPref; if (!CameraController.isRemoteCamera()) { currentIdx = Integer.parseInt(CameraController.MultishotResolutionsIdxesList.get(selectImageDimensionMultishot())); entries = CameraController.MultishotResolutionsNamesList .toArray(new CharSequence[CameraController.MultishotResolutionsNamesList.size()]); entryValues = CameraController.MultishotResolutionsIdxesList .toArray(new CharSequence[CameraController.MultishotResolutionsIdxesList.size()]); } } else if (mode == MODE_PANORAMA) { opt1 = sImageSizePanoramaBackPref; opt2 = sImageSizePanoramaFrontPref; if (!CameraController.isRemoteCamera()) { PanoramaAugmentedCapturePlugin.onDefaultSelectResolutons(); currentIdx = PanoramaAugmentedCapturePlugin.prefResolution; entries = PanoramaAugmentedCapturePlugin.getResolutionsPictureNamesList().toArray( new CharSequence[PanoramaAugmentedCapturePlugin.getResolutionsPictureNamesList().size()]); entryValues = PanoramaAugmentedCapturePlugin.getResolutionsPictureIndexesList().toArray( new CharSequence[PanoramaAugmentedCapturePlugin.getResolutionsPictureIndexesList().size()]); } } else if (mode == MODE_VIDEO) { opt1 = sImageSizeVideoBackPref; opt2 = sImageSizeVideoFrontPref; SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainScreen.getMainContext()); currentIdx = Integer.parseInt(prefs.getString(CameraController.getCameraIndex() == 0 ? opt1 : opt2, "6")); List<CameraController.Size> vsz = CameraController.SupportedVideoSizesList; CharSequence[] entriesTmp = new CharSequence[6]; CharSequence[] entryValuesTmp = new CharSequence[6]; if (CamcorderProfile.hasProfile(CameraController.getCameraIndex(), VideoCapturePlugin.QUALITY_4K) || Util.listContainsSize(vsz, new CameraController.Size(4096, 2160))) { entriesTmp[idx] = "4K"; entryValuesTmp[idx] = "9"; idx++; } if (CamcorderProfile.hasProfile(CameraController.getCameraIndex(), CamcorderProfile.QUALITY_2160P) || Util.listContainsSize(vsz, new CameraController.Size(3840, 2160))) { entriesTmp[idx] = "2160p"; entryValuesTmp[idx] = String.valueOf(CamcorderProfile.QUALITY_2160P); idx++; } if (CamcorderProfile.hasProfile(CameraController.getCameraIndex(), CamcorderProfile.QUALITY_1080P)) { entriesTmp[idx] = "1080p"; entryValuesTmp[idx] = String.valueOf(CamcorderProfile.QUALITY_1080P); idx++; } if (CamcorderProfile.hasProfile(CameraController.getCameraIndex(), CamcorderProfile.QUALITY_720P)) { entriesTmp[idx] = "720p"; entryValuesTmp[idx] = String.valueOf(CamcorderProfile.QUALITY_720P); idx++; } if (CamcorderProfile.hasProfile(CameraController.getCameraIndex(), CamcorderProfile.QUALITY_480P)) { entriesTmp[idx] = "480p"; entryValuesTmp[idx] = String.valueOf(CamcorderProfile.QUALITY_480P); idx++; } if (CamcorderProfile.hasProfile(CameraController.getCameraIndex(), CamcorderProfile.QUALITY_CIF)) { entriesTmp[idx] = "352 x 288"; entryValuesTmp[idx] = String.valueOf(CamcorderProfile.QUALITY_CIF); idx++; } if (CamcorderProfile.hasProfile(CameraController.getCameraIndex(), CamcorderProfile.QUALITY_QCIF)) { entriesTmp[idx] = "176 x 144"; entryValuesTmp[idx] = String.valueOf(CamcorderProfile.QUALITY_QCIF); idx++; } entries = new CharSequence[idx]; entryValues = new CharSequence[idx]; for (int i = 0; i < idx; i++) { entries[i] = entriesTmp[i]; entryValues[i] = entryValuesTmp[i]; } } if (CameraController.getResolutionsIdxesList() != null) { ListPreference lp = (ListPreference) prefActivity.findPreference(opt1); ListPreference lp2 = (ListPreference) prefActivity.findPreference(opt2); ListPreference lp3 = (ListPreference) prefActivity.findPreference(opt3); if (!CameraController.isRemoteCamera()) { if (lp3 != null) { prefActivity.getPreferenceScreen().removePreference(lp3); } if (CameraController.getCameraIndex() == 0 && lp2 != null) prefActivity.getPreferenceScreen().removePreference(lp2); else if (lp != null && lp2 != null) { prefActivity.getPreferenceScreen().removePreference(lp); lp = lp2; } } else { prefActivity.getPreferenceScreen().removePreference(lp); prefActivity.getPreferenceScreen().removePreference(lp2); lp = lp3; } if (lp != null) { lp.setEntries(entries); lp.setEntryValues(entryValues); if (currentIdx != -1) { // set currently selected image size for (idx = 0; idx < entryValues.length; ++idx) { if (Integer.valueOf(entryValues[idx].toString()) == currentIdx) { lp.setValueIndex(idx); break; } } } else { lp.setValueIndex(0); } if (mode == MODE_GENERAL) { lp.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { thiz.imageSizeIdxPreference = Integer.parseInt(newValue.toString()); setCameraImageSizeIndex(Integer.parseInt(newValue.toString()), false); return true; } }); } if (mode == MODE_PANORAMA) { lp.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { int value = Integer.parseInt(newValue.toString()); PanoramaAugmentedCapturePlugin.prefResolution = value; for (int i = 0; i < PanoramaAugmentedCapturePlugin.getResolutionsPictureIndexesList().size(); i++) { if (PanoramaAugmentedCapturePlugin.getResolutionsPictureIndexesList().get(i) .equals(newValue)) { final int idx = i; final Point point = PanoramaAugmentedCapturePlugin.getResolutionsPictureSizeslist() .get(idx); // frames_fit_count may decrease when // returning to main view due to slightly // more memory used, so in text messages we // report both exact and decreased count to // the user final int frames_fit_count = (int) (PanoramaAugmentedCapturePlugin .getAmountOfMemoryToFitFrames() / PanoramaAugmentedCapturePlugin .getFrameSizeInBytes(point.x, point.y)); Toast.makeText( MainScreen.getInstance(), String.format( MainScreen .getInstance() .getString( R.string.pref_plugin_capture_panoramaaugmented_imageheight_warning), frames_fit_count), Toast.LENGTH_SHORT).show(); return true; } } return true; } }); } } } } @Override public void onAdvancePreferenceCreate(PreferenceFragment prefActivity) { CheckBoxPreference cp = (CheckBoxPreference) prefActivity.findPreference(getResources().getString( R.string.Preference_UseCamera1Key)); final CheckBoxPreference fp = (CheckBoxPreference) prefActivity.findPreference(MainScreen.sCaptureRAWPref); if (cp != null) { if (!CameraController.isCamera2Allowed()) { cp.setEnabled(false); cp.setEnabled(true); } else cp.setEnabled(true); if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) { cp.setChecked(true); cp.setEnabled(false); } cp.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object useCamera1) { PreferenceManager.getDefaultSharedPreferences(MainScreen.getMainContext()).edit() .putBoolean(ApplicationScreen.sInitModeListPref, true).commit(); boolean new_value = Boolean.parseBoolean(useCamera1.toString()); if (!new_value) { if (fp != null && CameraController.isRAWCaptureSupported() )//&& !PreferenceManager.getDefaultSharedPreferences(mainContext).getBoolean(mainContext.getResources().getString(R.string.Preference_UseCamera1Key), false)) fp.setEnabled(true); else fp.setEnabled(false); } else if (fp != null) { PreferenceManager.getDefaultSharedPreferences(MainScreen.getMainContext()).edit() .putBoolean(MainScreen.sCaptureRAWPref, false).commit(); fp.setEnabled(false); } return true; } }); } final PreferenceFragment mPref = prefActivity; if (fp != null) { fp.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object captureRAW) { boolean new_value = Boolean.parseBoolean(captureRAW.toString()); if (new_value) { new AlertDialog.Builder(mPref.getActivity()) .setIcon(R.drawable.gui_almalence_alert_dialog_icon) .setTitle(R.string.Pref_Common_CaptureRAW_Title) .setMessage(R.string.Pref_Common_CaptureRAW_Description) .setPositiveButton(android.R.string.ok, null).create().show(); } return true; } }); if (CameraController.isRAWCaptureSupported() && CameraController.isUseCamera2()) fp.setEnabled(true); else fp.setEnabled(false); } //Real exposure preference should be available only in Camera2 mode CheckBoxPreference realExposurePf = (CheckBoxPreference) prefActivity.findPreference(MainScreen.sRealExposureTimeOnPreviewPref); if(realExposurePf != null) { boolean isCamera2 = PreferenceManager.getDefaultSharedPreferences( MainScreen.getMainContext()).getBoolean(getResources().getString(R.string.Preference_UseCamera2Key), false); if (!isCamera2) { realExposurePf.setEnabled(false); } else realExposurePf.setEnabled(true); } setColorEffectOptions(prefActivity); } @Override protected void stopRemotePreview() { if (preview != null && SimpleStreamSurfaceView.class.isInstance(preview)) { ((SimpleStreamSurfaceView) preview).stop(); } } public void setCameraImageSizeIndex(int captureIndex, boolean init) { CameraController.setCameraImageSizeIndex(captureIndex); if (init) { if (!CameraController.isRemoteCamera()) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mainContext); prefs.edit() .putString( CameraController.getCameraIndex() == 0 ? MainScreen.sImageSizeRearPref : MainScreen.sImageSizeFrontPref, String.valueOf(captureIndex)).commit(); } else { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mainContext); prefs.edit().putString(MainScreen.sImageSizeSonyRemotePref, String.valueOf(captureIndex)).commit(); } } } @Override public void setSpecialImageSizeIndexPref(int iIndex) { SharedPreferences.Editor prefEditor = PreferenceManager.getDefaultSharedPreferences(mainContext).edit(); prefEditor.putString(CameraController.getCameraIndex() == 0 ? MainScreen.sImageSizeMultishotBackPref : MainScreen.sImageSizeMultishotFrontPref, String.valueOf(iIndex)); prefEditor.commit(); } @Override public String getSpecialImageSizeIndexPref() { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mainContext); return prefs.getString(CameraController.getCameraIndex() == 0 ? MainScreen.sImageSizeMultishotBackPref : MainScreen.sImageSizeMultishotFrontPref, "-1"); } @Override public int selectImageDimensionMultishot() { String modeName = PluginManager.getInstance().getActiveModeID(); if (CameraController.isUseCamera2() && modeName.contains("night")) { return 0; } long maxMem = Runtime.getRuntime().maxMemory() - Debug.getNativeHeapAllocatedSize(); long maxMpix = (maxMem - 1000000) / 3; // 2 x Mpix - result, 1/4 x Mpix // x 4 - compressed input jpegs, // 1Mb - safe reserve // find index selected in preferences SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainScreen.getMainContext()); int prefIdx = Integer.parseInt(prefs.getString( CameraController.getCameraIndex() == 0 ? sImageSizeMultishotBackPref : sImageSizeMultishotFrontPref, "-1")); // ----- Find max-resolution capture dimensions int minMPIX = MIN_MPIX_PREVIEW; int defaultCaptureIdx = -1; long defaultCaptureMpix = 0; long captureMpix = 0; int captureIdx = -1; boolean prefFound = false; // figure default resolution for (int ii = 0; ii < CameraController.MultishotResolutionsSizeList.size(); ++ii) { CameraController.Size s = CameraController.MultishotResolutionsSizeList.get(ii); long mpix = (long) s.getWidth() * s.getHeight(); if ((mpix >= minMPIX) && (mpix < maxMpix) && (mpix > defaultCaptureMpix)) { defaultCaptureIdx = ii; defaultCaptureMpix = mpix; } } for (int ii = 0; ii < CameraController.MultishotResolutionsSizeList.size(); ++ii) { CameraController.Size s = CameraController.MultishotResolutionsSizeList.get(ii); long mpix = (long) s.getWidth() * s.getHeight(); if ((Integer.valueOf(CameraController.MultishotResolutionsIdxesList.get(ii)) == prefIdx) && (mpix >= minMPIX)) { prefFound = true; captureIdx = ii; captureMpix = mpix; break; } if (mpix > captureMpix) { captureIdx = ii; captureMpix = mpix; } } if (defaultCaptureMpix > 0 && !prefFound) { captureIdx = defaultCaptureIdx; captureMpix = defaultCaptureMpix; } return captureIdx; } @Override public void addSurfaceCallback() { thiz.surfaceHolder.addCallback(thiz); } @Override public void configureCamera(boolean createGUI) { switchingMode = false; CameraController.updateCameraFeatures(); // ----- Select preview dimensions with ratio correspondent to // full-size image PluginManager.getInstance().setCameraPreviewSize(); if (!CameraController.isRemoteCamera()) { if (CameraController.isUseCamera2()) { configureCamera2Camera(captureFormat); guiManager.setupViewfinderPreviewSize(new CameraController.Size(previewWidth, previewHeight)); } else { Camera.Size sz = CameraController.getCameraParameters().getPreviewSize(); Log.e("MainScreen", "Viewfinder preview size: " + sz.width + "x" + sz.height); guiManager.setupViewfinderPreviewSize(new CameraController.Size(sz.width, sz.height)); double bufferSize = sz.width * sz.height * ImageFormat.getBitsPerPixel(CameraController.getCameraParameters().getPreviewFormat()) / 8.0d; CameraController.allocatePreviewBuffer(bufferSize); CameraController.getCamera().setErrorCallback(CameraController.getInstance()); onCameraConfigured(); } } else { guiManager.setupViewfinderPreviewSize(new CameraController.Size(((SimpleStreamSurfaceView) preview) .getSurfaceWidth(), ((SimpleStreamSurfaceView) preview).getSurfaceHeight())); onCameraConfigured(); } // Log.e("MainScreen", "createGUI is " + createGUI); if (createGUI) { MainScreen.getGUIManager().onGUICreate(); PluginManager.getInstance().onGUICreate(); } } @Override public void surfaceCreated(SurfaceHolder holder) { // Log.e("MainScreen", "SURFACE CREATED"); // ----- Find 'normal' orientation of the device Display display = ((WindowManager) this.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); int rotation = display.getRotation(); if ((rotation == Surface.ROTATION_90) || (rotation == Surface.ROTATION_270)) landscapeIsNormal = true; // false; - if landscape view orientation // set for MainScreen else landscapeIsNormal = false; surfaceCreated = true; mCameraSurface = surfaceHolder.getSurface(); } // Probably used only by Panorama plugin. Added to avoid non direct // interface (message/handler) public static void takePicture() { PluginManager.getInstance().takePicture(); } @Override public void captureFailed() { MainScreen.getMessageHandler().sendEmptyMessage(ApplicationInterface.MSG_EXPORT_FINISHED_IOEXCEPTION); MainScreen.getInstance().muteShutter(false); } @TargetApi(14) public boolean isFaceDetectionAvailable(Camera.Parameters params) { return params.getMaxNumDetectedFaces() > 0; } public CameraController.Size getPreviewSize() { if (SimpleStreamSurfaceView.class.isInstance(preview)) { return new CameraController.Size(((SimpleStreamSurfaceView) preview).getSurfaceWidth(), ((SimpleStreamSurfaceView) preview).getSurfaceHeight()); } else { LayoutParams lp = preview.getLayoutParams(); if (lp == null) return null; return new CameraController.Size(lp.width, lp.height); } } /* * CAMERA PARAMETERS SECTION Supplementary methods for those plugins that * need an icons of supported camera parameters (scene, iso, wb, flash, * focus) Methods return id of drawable icon */ public int getSceneIcon(int sceneMode) { return guiManager.getSceneIcon(sceneMode); } public int getWBIcon(int wb) { return guiManager.getWBIcon(wb); } public int getFocusIcon(int focusMode) { return guiManager.getFocusIcon(focusMode); } public int getFlashIcon(int flashMode) { return guiManager.getFlashIcon(flashMode); } public int getISOIcon(int isoMode) { return guiManager.getISOIcon(isoMode); } public void setCameraMeteringMode(int mode) { if (CameraParameters.meteringModeAuto == mode) CameraController.setCameraMeteringAreas(null); else if (CameraParameters.meteringModeMatrix == mode) { int maxAreasCount = CameraController.getMaxNumMeteringAreas(); if (maxAreasCount > 4) CameraController.setCameraMeteringAreas(mMeteringAreaMatrix5); else if (maxAreasCount > 3) CameraController.setCameraMeteringAreas(mMeteringAreaMatrix4); else if (maxAreasCount > 0) CameraController.setCameraMeteringAreas(mMeteringAreaMatrix1); else CameraController.setCameraMeteringAreas(null); } else if (CameraParameters.meteringModeCenter == mode) CameraController.setCameraMeteringAreas(mMeteringAreaCenter); else if (CameraParameters.meteringModeSpot == mode) CameraController.setCameraMeteringAreas(mMeteringAreaSpot); currentMeteringMode = mode; } /* * * CAMERA parameters access function ended */ // >>Description // section with user control procedures and main capture functions // // all events translated to PluginManager // Description<< @Override public boolean onKeyUpEvent(int keyCode, KeyEvent event) { // Prevent system sounds, for volume buttons. if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_UP) { return true; } return false; } @Override public boolean onKeyDownEvent(int keyCode, KeyEvent event) { if (!mApplicationStarted) return true; // menu button processing if (keyCode == KeyEvent.KEYCODE_MENU) { menuButtonPressed(); return true; } // shutter/camera button processing if (keyCode == KeyEvent.KEYCODE_CAMERA || keyCode == KeyEvent.KEYCODE_DPAD_CENTER) { MainScreen.getGUIManager().onHardwareShutterButtonPressed(); return true; } // focus/half-press button processing if (keyCode == KeyEvent.KEYCODE_FOCUS) { if (event.getDownTime() == event.getEventTime()) { MainScreen.getGUIManager().onHardwareFocusButtonPressed(); } return true; } // check if Headset Hook button has some functions except standard if (keyCode == KeyEvent.KEYCODE_HEADSETHOOK) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainScreen.getMainContext()); boolean headsetFunc = prefs.getBoolean("headsetPrefCommon", false); if (headsetFunc) { //removed as not needed??? SM 21.08.15 was focusing on HW button pressed when AFL was enabled //MainScreen.getGUIManager().onHardwareFocusButtonPressed(); MainScreen.getGUIManager().onHardwareShutterButtonPressed(); return true; } } // check if volume button has some functions except Zoom-ing if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_UP) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainScreen.getMainContext()); int buttonFunc = Integer.parseInt(prefs.getString(MainScreen.sVolumeButtonPref, "0")); if (buttonFunc == VOLUME_FUNC_SHUTTER) { //removed as not needed??? SM 21.08.15 was focusing on HW button pressed when AFL was enabled //MainScreen.getGUIManager().onHardwareFocusButtonPressed(); MainScreen.getGUIManager().onHardwareShutterButtonPressed(); return true; } else if (buttonFunc == VOLUME_FUNC_EXPO) { MainScreen.getGUIManager().onVolumeBtnExpo(keyCode); return true; } else if (buttonFunc == VOLUME_FUNC_NONE) return true; } // <!-- -+- if (((RelativeLayout) guiManager.getMainView().findViewById(R.id.viewPagerLayoutMain)).getVisibility() == View.VISIBLE) { guiManager.hideStore(); return true; } // -+- --> if (PluginManager.getInstance().onKeyDown(true, keyCode, event)) return true; if (guiManager.onKeyDown(true, keyCode, event)) return true; // <!-- -+- if (keyCode == KeyEvent.KEYCODE_BACK) { if (AppRater.showRateDialogIfNeeded(this)) { return true; } } // -+- --> return false; } public void menuButtonPressed() { PluginManager.getInstance().menuButtonPressed(); } public void disableCameraParameter(GUI.CameraParameter iParam, boolean bDisable, boolean bInitMenu, boolean bModeInit) { guiManager.disableCameraParameter(iParam, bDisable, bInitMenu, bModeInit); } public void showOpenGLLayer(final int version) { if (glView == null) { glView = new GLLayer(MainScreen.getMainContext(), version); LayoutParams params = MainScreen.getPreviewSurfaceView().getLayoutParams(); glView.setLayoutParams(params); ((RelativeLayout) this.findViewById(R.id.mainLayout2)).addView(glView, 0); preview.bringToFront(); glView.setZOrderMediaOverlay(true); glView.onResume(); } } public void hideOpenGLLayer() { if (glView != null) { glView.onPause(); glView.destroyDrawingCache(); ((RelativeLayout) this.findViewById(R.id.mainLayout2)).removeView(glView); glView = null; } } @Override public void showCaptureIndication(boolean playShutter) { // play tick sound MainScreen.getGUIManager().showCaptureIndication(); if (playShutter) MainScreen.playShutter(); } public void playShutter(int sound) { if (!MainScreen.getInstance().isShutterSoundEnabled()) { MediaPlayer mediaPlayer = MediaPlayer.create(MainScreen.thiz, sound); mediaPlayer.start(); } } public static void playShutter() { if (!MainScreen.getInstance().isShutterSoundEnabled()) { if (thiz.shutterPlayer != null) thiz.shutterPlayer.play(); } } // set TRUE to mute and FALSE to unmute public void muteShutter(boolean mute) { if (MainScreen.getInstance().isShutterSoundEnabled()) { if (Build.VERSION.SDK_INT < 23) { AudioManager mgr = (AudioManager) MainScreen.thiz.getSystemService(MainScreen.AUDIO_SERVICE); mgr.setStreamMute(AudioManager.STREAM_SYSTEM, mute); } } } @Override public void setExpoPreviewPref(boolean previewMode) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mainContext); Editor prefsEditor = prefs.edit(); prefsEditor.putBoolean(MainScreen.sExpoPreviewModePref, previewMode); prefsEditor.commit(); } @Override public boolean getExpoPreviewPref() { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mainContext); if (true == prefs.contains(MainScreen.sExpoPreviewModePref)) { return prefs.getBoolean(MainScreen.sExpoPreviewModePref, true); } else return true; } public void setLastPhotoModePref(String mode) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mainContext); Editor prefsEditor = prefs.edit(); prefsEditor.putString(MainScreen.sLastPhotoModePref, mode); prefsEditor.commit(); } public String getLastPhotoModePref() { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mainContext); if (true == prefs.contains(MainScreen.sLastPhotoModePref)) { return prefs.getString(MainScreen.sLastPhotoModePref, "single"); } else return "single"; } public static boolean getWantLandscapePhoto() { return wantLandscapePhoto; } public static void setWantLandscapePhoto(boolean setWantLandscapePhoto) { wantLandscapePhoto = setWantLandscapePhoto; } public void setScreenBrightness(boolean setMax) { Window window = getWindow(); WindowManager.LayoutParams layoutpars = window.getAttributes(); // Set the brightness of this window if (setMax) layoutpars.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_FULL; else layoutpars.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE; // Apply attribute changes to this window window.setAttributes(layoutpars); } public void setKeepScreenOn(boolean keepScreenOn) { if (keepScreenOn) { preview.setKeepScreenOn(keepScreenOn); } else { preview.setKeepScreenOn(this.keepScreenOn); } } private static boolean showStore = false; public static Resources getAppResources() { return MainScreen.thiz.getResources(); } public static void setShowStore(boolean show) { showStore = show; } public static boolean isShowStore() { return showStore; } /*******************************************************/ /************************ Billing ************************/ // <!-- -+- protected static OpenIabHelper mHelper; private static boolean bOnSale = false; private static boolean couponSale = false; private static boolean unlockAllPurchased = false; private static boolean superPurchased = false; private static boolean hdrPurchased = false; private static boolean panoramaPurchased = false; private static boolean multishotsPurchased = false; private static boolean groupShotPurchased = false; private static boolean unlockAllSubscriptionMonth = false; private static boolean unlockAllSubscriptionYear = false; static final String SKU_SUPER = "plugin_almalence_super"; static final String SKU_HDR = "plugin_almalence_hdr"; static final String SKU_PANORAMA = "plugin_almalence_panorama"; static final String SKU_UNLOCK_ALL = "unlock_all_forever"; // barcode coupon static final String SKU_UNLOCK_ALL_COUPON = "unlock_all_forever_coupon"; // multishot currently static final String SKU_MOVING_SEQ = "plugin_almalence_moving_burst"; // unused. but if someone payed - will be unlocked multishot static final String SKU_GROUPSHOT = "plugin_almalence_groupshot"; // subscription static final String SKU_SUBSCRIPTION_YEAR = "subscription_unlock_all_year"; static final String SKU_SUBSCRIPTION_YEAR_NEW = "subscription_unlock_all_year_3free"; static final String SKU_SUBSCRIPTION_YEAR_CTRL = "subscription_unlock_all_year_controller"; static final String SKU_SALE1 = "abc_sale_controller1"; static final String SKU_SALE2 = "abc_sale_controller2"; static final String SKU_PROMO = "abc_promo"; static { // Yandex store OpenIabHelper.mapSku(SKU_SUPER, "com.yandex.store", "plugin_almalence_super"); OpenIabHelper.mapSku(SKU_HDR, "com.yandex.store", "plugin_almalence_hdr"); OpenIabHelper.mapSku(SKU_PANORAMA, "com.yandex.store", "plugin_almalence_panorama"); OpenIabHelper.mapSku(SKU_UNLOCK_ALL, "com.yandex.store", "unlock_all_forever"); OpenIabHelper.mapSku(SKU_UNLOCK_ALL_COUPON, "com.yandex.store", "unlock_all_forever_coupon"); OpenIabHelper.mapSku(SKU_MOVING_SEQ, "com.yandex.store", "plugin_almalence_moving_burst"); OpenIabHelper.mapSku(SKU_GROUPSHOT, "com.yandex.store", "plugin_almalence_groupshot"); OpenIabHelper.mapSku(SKU_SUBSCRIPTION_YEAR, "com.yandex.store", "subscription_unlock_all_year"); OpenIabHelper.mapSku(SKU_SUBSCRIPTION_YEAR_NEW, "com.yandex.store", "subscription_unlock_all_year_3free"); OpenIabHelper.mapSku(SKU_SUBSCRIPTION_YEAR_CTRL, "com.yandex.store", "subscription_unlock_all_year_controller"); OpenIabHelper.mapSku(SKU_SALE1, "com.yandex.store", "abc_sale_controller1"); OpenIabHelper.mapSku(SKU_SALE2, "com.yandex.store", "abc_sale_controller2"); OpenIabHelper.mapSku(SKU_PROMO, "com.yandex.store", "abc_promo"); // Amazon store OpenIabHelper.mapSku(SKU_SUPER, OpenIabHelper.NAME_AMAZON, "plugin_almalence_super_amazon"); OpenIabHelper.mapSku(SKU_HDR, OpenIabHelper.NAME_AMAZON, "plugin_almalence_hdr_amazon"); OpenIabHelper.mapSku(SKU_PANORAMA, OpenIabHelper.NAME_AMAZON, "plugin_almalence_panorama_amazon"); OpenIabHelper.mapSku(SKU_UNLOCK_ALL, OpenIabHelper.NAME_AMAZON, "unlock_all_forever_amazon"); OpenIabHelper.mapSku(SKU_UNLOCK_ALL_COUPON, OpenIabHelper.NAME_AMAZON, "unlock_all_forever_coupon_amazon"); OpenIabHelper.mapSku(SKU_MOVING_SEQ, OpenIabHelper.NAME_AMAZON, "plugin_almalence_moving_burst_amazon"); OpenIabHelper.mapSku(SKU_GROUPSHOT, OpenIabHelper.NAME_AMAZON, "plugin_almalence_groupshot_amazon"); OpenIabHelper.mapSku(SKU_SUBSCRIPTION_YEAR, OpenIabHelper.NAME_AMAZON, "subscription_unlock_all_year"); OpenIabHelper .mapSku(SKU_SUBSCRIPTION_YEAR_NEW, OpenIabHelper.NAME_AMAZON, "subscription_unlock_all_year_3free"); OpenIabHelper.mapSku(SKU_SUBSCRIPTION_YEAR_CTRL, OpenIabHelper.NAME_AMAZON, "subscription_unlock_all_year_controller"); OpenIabHelper.mapSku(SKU_SALE1, OpenIabHelper.NAME_AMAZON, "abc_sale_controller1_amazon"); OpenIabHelper.mapSku(SKU_SALE2, OpenIabHelper.NAME_AMAZON, "abc_sale_controller2_amazon"); OpenIabHelper.mapSku(SKU_PROMO, OpenIabHelper.NAME_AMAZON, "abc_promo_amazon"); } public void activateCouponSale() { couponSale = true; } public boolean isCouponSale() { return couponSale; } public boolean isUnlockedAll() { return unlockAllPurchased; } // controls subscription status request private static boolean subscriptionStatusRequest = false; private static long timeLastSubscriptionCheck = 0;// should check each 32 days - 32*24*60*60*1000 private long days32 = 32 * 24 * 60 * 60 * 1000L; private void createBillingHandler() { try { final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainScreen.getMainContext()); timeLastSubscriptionCheck = prefs.getLong("timeLastSubscriptionCheck", 0); if ((System.currentTimeMillis() - timeLastSubscriptionCheck) > days32) subscriptionStatusRequest = true; else subscriptionStatusRequest = false; if ((isInstalled("com.almalence.hdr_plus")) || (isInstalled("com.almalence.pixfix"))) { hdrPurchased = true; Editor prefsEditor = prefs.edit(); prefsEditor.putBoolean("plugin_almalence_hdr", true).commit(); } if (isInstalled("com.almalence.panorama.smoothpanorama")) { panoramaPurchased = true; Editor prefsEditor = prefs.edit(); prefsEditor.putBoolean("plugin_almalence_panorama", true).commit(); } //>>>Yandex patch!!! // { // hdrPurchased = true; // multishotsPurchased = true; // Editor prefsEditor = prefs.edit(); // prefsEditor.putBoolean("plugin_almalence_hdr", true).commit(); // prefsEditor.putBoolean("plugin_almalence_moving_burst", true).commit(); // } //<<<Yandex patch!!! String base64EncodedPublicKeyGoogle = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnztuXLNughHjGW55Zlgicr9r5bFP/K5DBc3jYhnOOo1GKX8M2grd7+SWeUHWwQk9lgQKat/ITESoNPE7ma0ZS1Qb/VfoY87uj9PhsRdkq3fg+31Q/tv5jUibSFrJqTf3Vmk1l/5K0ljnzX4bXI0p1gUoGd/DbQ0RJ3p4Dihl1p9pJWgfI9zUzYfvk2H+OQYe5GAKBYQuLORrVBbrF/iunmPkOFN8OcNjrTpLwWWAcxV5k0l5zFPrPVtkMZzKavTVWZhmzKNhCvs1d8NRwMM7XMejzDpI9A7T9egl6FAN4rRNWqlcZuGIMVizJJhvOfpCLtY971kQkYNXyilD40fefwIDAQAB"; String base64EncodedPublicKeyYandex = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6KzaraKmv48Y+Oay2ZpWu4BHtSKYZidyCxbaYZmmOH4zlRNic/PDze7OA4a1buwdrBg3AAHwfVbHFzd9o91yinnHIWYQqyPg7L1Swh5W70xguL4jlF2N/xI9VoL4vMRv3Bf/79VfQ11utcPLHEXPR8nPEp9PT0wN2Hqp4yCWFbfvhVVmy7sQjywnfLqcWTcFCT6N/Xdxs1quq0hTE345MiCgkbh1xVULmkmZrL0rWDVCaxfK4iZWSRgQJUywJ6GMtUh+FU6/7nXDenC/vPHqnDR0R6BRi+QsES0ZnEfQLqNJoL+rqJDr/sDIlBQQDMQDxVOx0rBihy/FlHY34UF+bwIDAQAB"; // Create the helper, passing it our context and the public key to // verify signatures with Map<String, String> storeKeys = new HashMap<String, String>(); storeKeys.put(OpenIabHelper.NAME_GOOGLE, base64EncodedPublicKeyGoogle); storeKeys.put("com.yandex.store", base64EncodedPublicKeyYandex); OpenIabHelper.Options.Builder builder = new OpenIabHelper.Options.Builder() .setStoreSearchStrategy(OpenIabHelper.Options.SEARCH_STRATEGY_INSTALLER_THEN_BEST_FIT) .setVerifyMode(OpenIabHelper.Options.VERIFY_EVERYTHING).addStoreKeys(storeKeys); mHelper = new OpenIabHelper(this, builder.build()); OpenIabHelper.enableDebugLogging(true); mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { public void onIabSetupFinished(IabResult result) { try { Log.v("Main billing", "Setup finished."); if (!result.isSuccess()) { Log.v("Main billing", "Problem setting up in-app billing: " + result); return; } List<String> additionalSkuList = new ArrayList<String>(); additionalSkuList.add(SKU_SUPER); additionalSkuList.add(SKU_HDR); additionalSkuList.add(SKU_PANORAMA); additionalSkuList.add(SKU_UNLOCK_ALL); additionalSkuList.add(SKU_UNLOCK_ALL_COUPON); additionalSkuList.add(SKU_MOVING_SEQ); additionalSkuList.add(SKU_GROUPSHOT); additionalSkuList.add(SKU_SUBSCRIPTION_YEAR_CTRL); additionalSkuList.add(SKU_PROMO); if (subscriptionStatusRequest) { // subscription year additionalSkuList.add(SKU_SUBSCRIPTION_YEAR); additionalSkuList.add(SKU_SUBSCRIPTION_YEAR_NEW); // reset subscription status unlockAllSubscriptionYear = false; prefs.edit().putBoolean("subscription_unlock_all_year", false).commit(); timeLastSubscriptionCheck = System.currentTimeMillis(); prefs.edit().putLong("timeLastSubscriptionCheck", timeLastSubscriptionCheck).commit(); } // for sale additionalSkuList.add(SKU_SALE1); additionalSkuList.add(SKU_SALE2); mHelper.queryInventoryAsync(true, additionalSkuList, mGotInventoryListener); } catch (Exception e) { e.printStackTrace(); Log.e("Main billing", "onIabSetupFinished exception: " + e.getMessage()); } } }); } catch (Exception e) { e.printStackTrace(); Log.e("Main billing", "createBillingHandler exception: " + e.getMessage()); } } private void destroyBillingHandler() { try { if (mHelper != null) mHelper.dispose(); mHelper = null; } catch (Exception e) { e.printStackTrace(); Log.e("Main billing", "destroyBillingHandler exception: " + e.getMessage()); } } public static String titleUnlockAll = "$6.95"; public static String titleUnlockAllCoupon = "$3.95"; public static String titleUnlockHDR = "$2.99"; public static String titleUnlockSuper = "$2.99"; public static String titleUnlockPano = "$2.99"; public static String titleUnlockMoving = "$3.99"; public static String titleUnlockGroup = "$2.99"; public static String titleSubscriptionYear = "$4.99"; public static String summary_SKU_PROMO = "alyrom0nap"; IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() { public void onQueryInventoryFinished( IabResult result, Inventory inventory) { if (inventory == null) { Log.e("Main billing", "mGotInventoryListener inventory null "); return; } SharedPreferences prefs = PreferenceManager .getDefaultSharedPreferences(MainScreen .getMainContext()); Editor prefsEditor = prefs.edit(); if (inventory .hasPurchase(SKU_SUPER)) { superPurchased = true; prefsEditor .putBoolean( "plugin_almalence_super", true).commit(); } if (inventory.hasPurchase(SKU_HDR)) { hdrPurchased = true; prefsEditor.putBoolean( "plugin_almalence_hdr", true).commit(); } if (inventory .hasPurchase(SKU_PANORAMA)) { panoramaPurchased = true; prefsEditor .putBoolean( "plugin_almalence_panorama", true).commit(); } if (inventory .hasPurchase(SKU_UNLOCK_ALL)) { unlockAllPurchased = true; prefsEditor.putBoolean( "unlock_all_forever", true).commit(); } if (inventory .hasPurchase(SKU_UNLOCK_ALL_COUPON)) { unlockAllPurchased = true; prefsEditor.putBoolean( "unlock_all_forever", true).commit(); } if (inventory .hasPurchase(SKU_MOVING_SEQ)) { multishotsPurchased = true; prefsEditor .putBoolean( "plugin_almalence_moving_burst", true).commit(); } if (inventory .hasPurchase(SKU_GROUPSHOT)) { multishotsPurchased = true; prefsEditor .putBoolean( "plugin_almalence_moving_burst", true).commit(); } if (inventory .hasPurchase(SKU_SUBSCRIPTION_YEAR)) { unlockAllSubscriptionYear = true; prefsEditor .putBoolean( "subscription_unlock_all_year", true).commit(); unlockAllPurchased = true; prefsEditor.putBoolean( "unlock_all_forever", true).commit(); } if (inventory .hasPurchase(SKU_SUBSCRIPTION_YEAR_NEW)) { unlockAllSubscriptionYear = true; prefsEditor .putBoolean( "subscription_unlock_all_year", true).commit(); unlockAllPurchased = true; prefsEditor.putBoolean( "unlock_all_forever", true).commit(); } try { String[] separated = inventory .getSkuDetails( SKU_SALE1) .getPrice().split(","); int price1 = Integer .valueOf(separated[0]); String[] separated2 = inventory .getSkuDetails( SKU_SALE2) .getPrice().split(","); int price2 = Integer .valueOf(separated2[0]); if (price1 < price2) bOnSale = true; else bOnSale = false; prefsEditor.putBoolean( "bOnSale", bOnSale) .commit(); } catch (Exception e) { Log.e("Main billing SALE", "No sale data available"); bOnSale = false; } try { titleUnlockAll = inventory .getSkuDetails( SKU_UNLOCK_ALL) .getPrice(); titleUnlockAllCoupon = inventory .getSkuDetails( SKU_UNLOCK_ALL_COUPON) .getPrice(); titleUnlockSuper = inventory .getSkuDetails( SKU_SUPER) .getPrice(); titleUnlockHDR = inventory .getSkuDetails(SKU_HDR) .getPrice(); titleUnlockPano = inventory .getSkuDetails( SKU_PANORAMA) .getPrice(); titleUnlockMoving = inventory .getSkuDetails( SKU_MOVING_SEQ) .getPrice(); titleUnlockGroup = inventory .getSkuDetails( SKU_GROUPSHOT) .getPrice(); titleSubscriptionYear = inventory .getSkuDetails( SKU_SUBSCRIPTION_YEAR_CTRL) .getPrice(); summary_SKU_PROMO = inventory .getSkuDetails( SKU_PROMO) .getDescription(); } catch (Exception e) { Log.e("Market", "Error Getting data for store!!!!!!!!"); } } }; private static int HDR_REQUEST = 100; private static int SUPER_REQUEST = 107; private static int PANORAMA_REQUEST = 101; private static int ALL_REQUEST = 102; private static int OBJECTREM_BURST_REQUEST = 103; private static int GROUPSHOT_REQUEST = 104; private static int SUBSCRIPTION_YEAR_REQUEST = 106; public static boolean isPurchasedAll() { return unlockAllPurchased; } public static boolean isPurchasedSuper() { return superPurchased; } public static boolean isPurchasedHDR() { return hdrPurchased; } public static boolean isPurchasedPanorama() { return panoramaPurchased; } public static boolean isPurchasedMultishots() { return multishotsPurchased; } public static boolean isPurchasedGroupshot() { return groupShotPurchased; } public static boolean isPurchasedUnlockAllSubscriptionMonth() { return unlockAllSubscriptionMonth; } public static boolean isPurchasedUnlockAllSubscriptionYear() { return unlockAllSubscriptionYear; } public static void purchaseAll() { if (isPurchasedAll()) return; // now will call store with abc unlocked callStoreForUnlocked(thiz); // TODO: this is for all other markets!!!!! Do not call store!!! // String payload = ""; // try // { // mHelper.launchPurchaseFlow(MainScreen.thiz, // isCouponSale()?SKU_UNLOCK_ALL_COUPON:SKU_UNLOCK_ALL, ALL_REQUEST, // mPreferencePurchaseFinishedListener, payload); // } // catch (Exception e) { // e.printStackTrace(); // Log.e("Main billing", "Purchase result " + e.getMessage()); // Toast.makeText(MainScreen.thiz, // "Error during purchase " + e.getMessage(), // Toast.LENGTH_LONG).show(); // } } public void purchaseSuper() { if (isPurchasedSuper() || isPurchasedAll()) return; String payload = ""; try { mHelper.launchPurchaseFlow(MainScreen.thiz, SKU_SUPER, SUPER_REQUEST, mPreferencePurchaseFinishedListener, payload); } catch (Exception e) { e.printStackTrace(); Log.e("Main billing", "Purchase result " + e.getMessage()); Toast.makeText(MainScreen.thiz, "Error during purchase " + e.getMessage(), Toast.LENGTH_LONG).show(); } } public void purchaseHDR() { if (isPurchasedHDR() || isPurchasedAll()) return; String payload = ""; try { mHelper.launchPurchaseFlow(MainScreen.thiz, SKU_HDR, HDR_REQUEST, mPreferencePurchaseFinishedListener, payload); } catch (Exception e) { e.printStackTrace(); Log.e("Main billing", "Purchase result " + e.getMessage()); Toast.makeText(MainScreen.thiz, "Error during purchase " + e.getMessage(), Toast.LENGTH_LONG).show(); } } public void purchasePanorama() { if (isPurchasedPanorama() || isPurchasedAll()) return; String payload = ""; try { mHelper.launchPurchaseFlow(MainScreen.thiz, SKU_PANORAMA, PANORAMA_REQUEST, mPreferencePurchaseFinishedListener, payload); } catch (Exception e) { e.printStackTrace(); Log.e("Main billing", "Purchase result " + e.getMessage()); Toast.makeText(MainScreen.thiz, "Error during purchase " + e.getMessage(), Toast.LENGTH_LONG).show(); } } public void purchaseMultishot() { if (isPurchasedMultishots() || isPurchasedAll()) return; String payload = ""; try { mHelper.launchPurchaseFlow(MainScreen.thiz, SKU_MOVING_SEQ, OBJECTREM_BURST_REQUEST, mPreferencePurchaseFinishedListener, payload); } catch (Exception e) { e.printStackTrace(); Log.e("Main billing", "Purchase result " + e.getMessage()); Toast.makeText(MainScreen.thiz, "Error during purchase " + e.getMessage(), Toast.LENGTH_LONG).show(); } } public static void purchasedUnlockAllSubscriptionYear() { if (isPurchasedUnlockAllSubscriptionYear() || isPurchasedAll()) return; String payload = ""; try { mHelper.launchPurchaseFlow(MainScreen.thiz, SKU_SUBSCRIPTION_YEAR_NEW, SUBSCRIPTION_YEAR_REQUEST, mPreferencePurchaseFinishedListener, payload); } catch (Exception e) { e.printStackTrace(); Log.e("Main billing", "Purchase result " + e.getMessage()); Toast.makeText(MainScreen.thiz, "Error during purchase " + e.getMessage(), Toast.LENGTH_LONG).show(); } } // Callback for when purchase from preferences is finished protected static IabHelper.OnIabPurchaseFinishedListener mPreferencePurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { public void onIabPurchaseFinished( IabResult result, Purchase purchase) { showStore = true; purchaseFinished( result, purchase); } }; private static void purchaseFinished(IabResult result, Purchase purchase) { Log.v("Main billing", "Purchase finished: " + result + ", purchase: " + purchase); if (result.isFailure()) { Log.v("Main billing", "Error purchasing: " + result); return; } Log.v("Main billing", "Purchase successful."); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainScreen.getMainContext()); if (purchase.getSku().equals(SKU_HDR)) { Log.v("Main billing", "Purchase HDR."); hdrPurchased = true; Editor prefsEditor = prefs.edit(); prefsEditor.putBoolean("plugin_almalence_hdr", true).commit(); } if (purchase.getSku().equals(SKU_SUPER)) { Log.v("Main billing", "Purchase SUPER."); superPurchased = true; Editor prefsEditor = prefs.edit(); prefsEditor.putBoolean("plugin_almalence_super", true).commit(); } if (purchase.getSku().equals(SKU_PANORAMA)) { Log.v("Main billing", "Purchase Panorama."); panoramaPurchased = true; Editor prefsEditor = prefs.edit(); prefsEditor.putBoolean("plugin_almalence_panorama", true).commit(); } if (purchase.getSku().equals(SKU_UNLOCK_ALL)) { Log.v("Main billing", "Purchase unlock_all_forever."); unlockAllPurchased = true; Editor prefsEditor = prefs.edit(); prefsEditor.putBoolean("unlock_all_forever", true).commit(); } if (purchase.getSku().equals(SKU_UNLOCK_ALL_COUPON)) { Log.v("Main billing", "Purchase unlock_all_forever_coupon."); unlockAllPurchased = true; Editor prefsEditor = prefs.edit(); prefsEditor.putBoolean("unlock_all_forever", true).commit(); } if (purchase.getSku().equals(SKU_MOVING_SEQ)) { Log.v("Main billing", "Purchase plugin_almalence_moving_burst."); multishotsPurchased = true; Editor prefsEditor = prefs.edit(); prefsEditor.putBoolean("plugin_almalence_moving_burst", true).commit(); } if (purchase.getSku().equals(SKU_GROUPSHOT)) { Log.v("Main billing", "Purchase plugin_almalence_moving_burst."); multishotsPurchased = true; Editor prefsEditor = prefs.edit(); prefsEditor.putBoolean("plugin_almalence_moving_burst", true).commit(); } if (purchase.getSku().equals(SKU_SUBSCRIPTION_YEAR)) { Log.v("Main billing", "Purchase year subscription."); unlockAllSubscriptionYear = true; Editor prefsEditor = prefs.edit(); prefsEditor.putBoolean("subscription_unlock_all_year", true).commit(); timeLastSubscriptionCheck = System.currentTimeMillis(); prefs.edit().putLong("timeLastSubscriptionCheck", timeLastSubscriptionCheck).commit(); unlockAllPurchased = true; prefsEditor.putBoolean("unlock_all_forever", true).commit(); } if (purchase.getSku().equals(SKU_SUBSCRIPTION_YEAR_NEW)) { Log.v("Main billing", "Purchase year subscription."); unlockAllSubscriptionYear = true; Editor prefsEditor = prefs.edit(); prefsEditor.putBoolean("subscription_unlock_all_year", true).commit(); timeLastSubscriptionCheck = System.currentTimeMillis(); prefs.edit().putLong("timeLastSubscriptionCheck", timeLastSubscriptionCheck).commit(); unlockAllPurchased = true; prefsEditor.putBoolean("unlock_all_forever", true).commit(); } } public static void launchPurchase(int requestID) { try { thiz.guiManager.showStore(); } catch (Exception e) { e.printStackTrace(); Toast.makeText(thiz, "Error during purchase " + e.getMessage(), Toast.LENGTH_LONG).show(); } } IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { public void onIabPurchaseFinished( IabResult result, Purchase purchase) { guiManager.showStore(); purchaseFinished(result, purchase); } }; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Log.v("Main billing", "onActivityResult(" + requestCode + "," + resultCode + "," + data); // Pass on the activity result to the helper for handling if (!mHelper.handleActivityResult(requestCode, resultCode, data)) { // not handled, so handle it ourselves (here's where you'd // perform any handling of activity results not related to in-app // billing... super.onActivityResult(requestCode, resultCode, data); } else { Log.v("Main billing", "onActivityResult handled by IABUtil."); } } public boolean showPromoRedeemed = false; public boolean showPromoRedeemedJulius = false; // enter promo code to get smth public void enterPromo() { final float density = getResources().getDisplayMetrics().density; LinearLayout ll = new LinearLayout(this); ll.setOrientation(LinearLayout.VERTICAL); ll.setPadding((int) (10 * density), (int) (10 * density), (int) (10 * density), (int) (10 * density)); // rating bar final EditText editText = new EditText(this); editText.setHint(R.string.Pref_Upgrde_PromoCode_Text); editText.setHintTextColor(Color.WHITE); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params.gravity = Gravity.CENTER_HORIZONTAL; params.setMargins(0, 20, 0, 30); editText.setLayoutParams(params); ll.addView(editText); Button b3 = new Button(this); b3.setText(getResources().getString(R.string.Pref_Upgrde_PromoCode_DoneText)); ll.addView(b3); final AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setView(ll); final AlertDialog dialog = builder.create(); b3.setOnClickListener(new OnClickListener() { public void onClick(View v) { String[] sep = MainScreen.summary_SKU_PROMO.split(";"); String promo = editText.getText().toString(); boolean matchPromo = false; // ///////////////////////////////////////////////////// // juliusapp promotion // if (promo.equalsIgnoreCase("promo2015")) // { // SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainScreen.getMainContext()); // panoramaPurchased = true; // objectRemovalBurstPurchased = true; // // Editor prefsEditor = prefs.edit(); // prefsEditor.putBoolean("plugin_almalence_panorama", true); // prefsEditor.putBoolean("plugin_almalence_moving_burst", true); // prefsEditor.commit(); // dialog.dismiss(); // guiManager.hideStore(); // showPromoRedeemedJulius = true; // guiManager.showStore(); // return; // } // ///////////////////////////////////////////////////// for (int i = 0; i < sep.length; i++) { if (promo.equalsIgnoreCase(sep[i])) matchPromo = true; } if (matchPromo) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainScreen.getMainContext()); unlockAllPurchased = true; Editor prefsEditor = prefs.edit(); prefsEditor.putBoolean("unlock_all_forever", true).commit(); dialog.dismiss(); guiManager.hideStore(); showPromoRedeemed = true; guiManager.showStore(); } else { editText.setText(""); editText.setHint(R.string.Pref_Upgrde_PromoCode_IncorrectText); } } }); dialog.show(); } // next methods used to store number of free launches. // using files to store this info // returns number of launches left public static int getLeftLaunches(String modeID) { String dirPath = thiz.getFilesDir().getAbsolutePath() + File.separator + modeID; File projDir = new File(dirPath); if (!projDir.exists()) { projDir.mkdirs(); WriteLaunches(projDir, 6); } int left = ReadLaunches(projDir); return left; } // decrements number of launches left public static void decrementLeftLaunches(String modeID) { String dirPath = thiz.getFilesDir().getAbsolutePath() + File.separator + modeID; File projDir = new File(dirPath); if (!projDir.exists()) { projDir.mkdirs(); WriteLaunches(projDir, 6); } int left = ReadLaunches(projDir); if (left > 0) WriteLaunches(projDir, left - 1); } // writes number of launches left into memory private static void WriteLaunches(File projDir, int left) { FileOutputStream fos = null; try { fos = new FileOutputStream(projDir + "/left"); fos.write(left); fos.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } // reads number of launches left from memory private static int ReadLaunches(File projDir) { int left = 0; FileInputStream fis = null; try { fis = new FileInputStream(projDir + "/left"); left = fis.read(); fis.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return left; } public static boolean checkLaunches(Mode mode) { // if all unlocked if (unlockAllPurchased) return true; // if mode free if (mode.SKU == null) return true; if (mode.SKU.isEmpty()) { int launchesLeft = MainScreen.getLeftLaunches(mode.modeID); if ((1 == launchesLeft) || (3 == launchesLeft)) { // show internal store launchPurchase(100); } return true; } // if current mode unlocked if (mode.SKU.equals("plugin_almalence_super")) { if (superPurchased || !CameraController.isUseSuperMode()) return true; } if (mode.SKU.equals("plugin_almalence_hdr")) { if (hdrPurchased) return true; } if (mode.SKU.equals("plugin_almalence_video")) { if (hdrPurchased) return true; } else if (mode.SKU.equals("plugin_almalence_panorama")) { if (panoramaPurchased) return true; } else if (mode.SKU.equals("plugin_almalence_moving_burst")) { if (multishotsPurchased) return true; } else if (mode.SKU.equals("plugin_almalence_groupshot")) { if (groupShotPurchased) return true; } int launchesLeft = MainScreen.getLeftLaunches(mode.modeID); int id = MainScreen.getAppResources().getIdentifier( (CameraController.isUseCamera2() ? mode.modeNameHAL : mode.modeName), "string", MainScreen.thiz.getPackageName()); String modename = MainScreen.getAppResources().getString(id); if (0 == launchesLeft)// no more launches left { String left = String.format(thiz.getResources().getString(R.string.trial_finished), modename); Toast toast = Toast.makeText(thiz, left, Toast.LENGTH_LONG); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); // show google store with paid version callStoreForUnlocked(MainScreen.thiz); return false; } else if (5 >= launchesLeft) { // show appstore button and say that it cost money String left = String.format(thiz.getResources().getString(R.string.trial_left), modename, launchesLeft); Toast toast = Toast.makeText(thiz, left, Toast.LENGTH_LONG); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); if ((1 == launchesLeft) || (2 == launchesLeft) || (3 == launchesLeft)) // show internal store launchPurchase(100); } return true; } private boolean isInstalled(String packageName) { PackageManager pm = getPackageManager(); boolean installed = false; try { pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES); installed = true; } catch (PackageManager.NameNotFoundException e) { installed = false; } return installed; } private static void showSubscriptionDialog() { final float density = thiz.getResources().getDisplayMetrics().density; LinearLayout ll = new LinearLayout(thiz); ll.setOrientation(LinearLayout.VERTICAL); ll.setPadding((int) (10 * density), (int) (10 * density), (int) (10 * density), (int) (10 * density)); ImageView img = new ImageView(thiz); img.setImageDrawable(ApplicationScreen.getAppResources().getDrawable(R.drawable.store_subscription)); img.setAdjustViewBounds(true); ll.addView(img); TextView tv = new TextView(thiz); tv.setText(MainScreen.getAppResources().getString(R.string.subscriptionText)); tv.setWidth((int) (250 * density)); tv.setPadding((int) (4 * density), 0, (int) (4 * density), (int) (24 * density)); ll.addView(tv); Button bNo = new Button(thiz); bNo.setText(MainScreen.getAppResources().getString(R.string.subscriptionNoText)); ll.addView(bNo); Button bSubscribe = new Button(thiz); bSubscribe.setText(MainScreen.getAppResources().getString(R.string.subscriptionYesText)); ll.addView(bSubscribe); final AlertDialog.Builder builder = new AlertDialog.Builder(thiz); builder.setView(ll); final AlertDialog dialog = builder.create(); bSubscribe.setOnClickListener(new OnClickListener() { public void onClick(View v) { purchasedUnlockAllSubscriptionYear(); dialog.dismiss(); } }); bNo.setOnClickListener(new OnClickListener() { public void onClick(View v) { dialog.dismiss(); } }); dialog.show(); } private boolean isABCUnlockedInstalled(Activity activity) { try { activity.getPackageManager().getInstallerPackageName("com.almalence.opencam_plus"); } catch (IllegalArgumentException e) { return false; } return true; } private static void callStoreForUnlocked(Activity activity) { try { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("market://details?id=com.almalence.opencam_plus")); activity.startActivity(intent); } catch (ActivityNotFoundException e) { return; } } public static boolean isAppturboUnlockable(Context context) { // try // { // List<PackageInfo> packages = context.getPackageManager().getInstalledPackages(0); // for(PackageInfo pi : packages){ // if (pi.packageName.equalsIgnoreCase("com.appturbo.appturboCA2015") // || pi.packageName.equalsIgnoreCase("com.appturbo.appoftheday2015") ){ // return true; // } // } // } // catch (Exception e) // { // e.printStackTrace(); // } return false; } // -+- --> /************************ Billing ************************/ /*******************************************************/ // <!-- -+- // Application rater code public static void callStoreFree(Activity act) { try { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("market://details?id=com.almalence.opencam")); act.startActivity(intent); } catch (ActivityNotFoundException e) { return; } } // -+- --> // installing packages from play store public static void callStoreInstall(Activity act, String id) { try { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("market://details?id=" + id)); act.startActivity(intent); } catch (ActivityNotFoundException e) { return; } } protected void resetOrSaveSettings() { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainScreen.getMainContext()); Editor prefsEditor = prefs.edit(); boolean isSaving = prefs.getBoolean("SaveConfiguration_Mode", true); if (!isSaving) { prefsEditor.putString("defaultModeName", "single"); prefsEditor.commit(); } isSaving = prefs.getBoolean("SaveConfiguration_ImageSize", true); if (!isSaving) { // general settings - image size prefsEditor.putString(sImageSizeRearPref, "-1"); prefsEditor.putString(sImageSizeFrontPref, "-1"); // multishot and night prefsEditor.putString(sImageSizeMultishotBackPref, "-1"); prefsEditor.putString(sImageSizeMultishotFrontPref, "-1"); // panorama prefsEditor.remove(sImageSizePanoramaBackPref); prefsEditor.remove(sImageSizePanoramaFrontPref); // video prefsEditor.putString(sImageSizeVideoBackPref, "-1"); prefsEditor.putString(sImageSizeVideoFrontPref, "-1"); prefsEditor.commit(); } isSaving = prefs.getBoolean("SaveConfiguration_SceneMode", false); if (!isSaving) { prefsEditor.putInt(sSceneModePref, sDefaultValue); prefsEditor.commit(); } isSaving = prefs.getBoolean("SaveConfiguration_FocusMode", true); if (!isSaving) { prefsEditor.putInt(sRearFocusModePref, sDefaultFocusValue); prefsEditor.putInt(sFrontFocusModePref, sDefaultFocusValue); prefsEditor.commit(); } isSaving = prefs.getBoolean("SaveConfiguration_WBMode", false); if (!isSaving) { prefsEditor.putInt(sWBModePref, sDefaultValue); prefsEditor.commit(); } isSaving = prefs.getBoolean("SaveConfiguration_ISOMode", false); if (!isSaving) { prefsEditor.putInt(sISOPref, sDefaultISOValue); prefsEditor.commit(); } isSaving = prefs.getBoolean("SaveConfiguration_FlashMode", true); if (!isSaving) { prefsEditor.putInt(sFlashModePref, sDefaultFlashValue); prefsEditor.commit(); } isSaving = prefs.getBoolean("SaveConfiguration_FrontRearCamera", true); if (!isSaving) { prefsEditor.putInt(sCameraModePref, 0); prefsEditor.commit(); } isSaving = prefs.getBoolean("SaveConfiguration_ExpoCompensation", false); if (!isSaving) { prefsEditor.putInt(MainScreen.sEvPref, 0); prefsEditor.commit(); } isSaving = prefs.getBoolean("SaveConfiguration_DelayedCapture", false); if (!isSaving) { prefsEditor.putInt(MainScreen.sDelayedCapturePref, 0); prefsEditor.putBoolean(MainScreen.sSWCheckedPref, false); prefsEditor.putBoolean(MainScreen.sDelayedFlashPref, false); prefsEditor.putBoolean(MainScreen.sDelayedSoundPref, false); prefsEditor.putInt(MainScreen.sDelayedCaptureIntervalPref, 0); prefsEditor.commit(); } isSaving = prefs.getBoolean("SaveConfiguration_TimelapseCapture", false); if (!isSaving && !prefs.getBoolean(sPhotoTimeLapseIsRunningPref, false)) { prefsEditor.putInt(MainScreen.sPhotoTimeLapseCaptureIntervalPref, 5); prefsEditor.putInt(MainScreen.sPhotoTimeLapseCaptureIntervalMeasurmentPref, 0); prefsEditor.putBoolean(MainScreen.sPhotoTimeLapseIsRunningPref, false); prefsEditor.putBoolean(MainScreen.sPhotoTimeLapseActivePref, false); prefsEditor.commit(); } } @Override public Activity getMainActivity() { return thiz; } public WifiHandler getWifiHandler() { return mWifiHandler; } }