/* * Copyright (c) 2012, Codename One and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Codename One designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Codename One through http://www.codenameone.com/ if you * need additional information or have any questions. */ package com.codename1.impl.android; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Canvas; import android.os.Bundle; import android.view.View; import com.codename1.impl.android.AndroidImplementation; import static com.codename1.impl.android.AndroidImplementation.checkForPermission; import com.codename1.ui.Display; import java.util.ArrayList; import java.util.HashMap; /** * This is a utility class for common native usages * * @author Chen */ public class AndroidNativeUtil { private static ArrayList<LifecycleListener> listeners; private static Bundle activationBundle; /** * Allows us to get the bundle that was used to create this activity * @return the bundle instance */ public static Bundle getActivationBundle() { return activationBundle; } /** * Binds a callback to lifecycle events * @param l listener */ public static void addLifecycleListener(LifecycleListener l) { if(listeners == null) { listeners = new ArrayList<LifecycleListener>(); } listeners.add(l); } /** * Releases the callback to lifecycle events * @param l listener */ public static void removeLifecycleListener(LifecycleListener l) { if(listeners == null) { return; } listeners.remove(l); if(listeners.isEmpty()) { listeners = null; } } static void onCreate(Bundle savedInstanceState) { activationBundle = savedInstanceState; if(listeners != null) { for(LifecycleListener l : listeners) { l.onCreate(savedInstanceState); } } } static void onResume() { if(listeners != null) { for(LifecycleListener l : listeners) { l.onResume(); } } } static void onPause() { if(listeners != null) { for(LifecycleListener l : listeners) { l.onPause(); } } } static void onDestroy() { if(listeners != null) { for(LifecycleListener l : listeners) { l.onDestroy(); } } } static void onSaveInstanceState(Bundle b) { if(listeners != null) { for(LifecycleListener l : listeners) { l.onSaveInstanceState(b); } } } static void onLowMemory() { if(listeners != null) { for(LifecycleListener l : listeners) { l.onLowMemory(); } } } /** * Get the main activity */ public static Activity getActivity(){ return AndroidImplementation.getActivity(); } public static Context getContext() { return AndroidImplementation.getContext(); } /** * Start an intent for result */ public static void startActivityForResult(Intent intent, final IntentResultListener listener){ if (getActivity() == null) { throw new RuntimeException("Cannot start activity for result when running in background."); } final CodenameOneActivity act = (CodenameOneActivity) getActivity(); act.setIntentResultListener(new IntentResultListener() { @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { listener.onActivityResult(requestCode, resultCode, data); act.restoreIntentResultListener(); } }); act.startActivityForResult(intent, 2000); } private static HashMap<Class, BitmapViewRenderer> viewRendererMap; public static Bitmap renderViewOnBitmap(final View v, int w, int h) { if(viewRendererMap != null) { BitmapViewRenderer br = viewRendererMap.get(v.getClass()); if(br != null) { return br.renderViewOnBitmap(v, w, h); } } if(w <= 0 || h <= 0) { return null; } final Bitmap nativeBuffer = Bitmap.createBitmap( w, h, Bitmap.Config.ARGB_8888); AndroidImplementation.runOnUiThreadAndBlock(new Runnable() { @Override public void run() { try { Canvas canvas = new Canvas(nativeBuffer); v.draw(canvas); } catch(Throwable t) { t.printStackTrace(); } } }); return nativeBuffer; } public static void registerViewRenderer(Class viewClass, BitmapViewRenderer b) { if(viewRendererMap == null) { viewRendererMap = new HashMap<Class, BitmapViewRenderer>(); } viewRendererMap.put(viewClass, b); } public static interface BitmapViewRenderer { public Bitmap renderViewOnBitmap(View v, int w, int h); } /** * Check for a dangerous permission, if the permission is already granted return true, * otherwise ask the user for the permission. * This method is blocking until a response is returned * * @param permission the Permission to Ask * @param description show a description to the user why this is needed * @return true if granted false otherwise */ public static boolean checkForPermission(String permission, String description){ return AndroidImplementation.checkForPermission(permission, description, false); } }