VK Stream

We’ve created the new Android and iPhone applications for Russian vk.com social network.
If you understand Russian language – you can try:)

http://vkstream.me

https://play.google.com/store/apps/details?id=com.amberfog.reader

vkstream

enjoy!

//DL

Share

Encrypted SQLite

If you keep sensitive data in your Android application SQLite database – you probably want to keep in save and encrypted. Here is SQLCipher for Android to help you with it.

SQLCipher is an open source library that provides transparent, secure 256-bit AES encryption of SQLite database files.

One small problem – your APK size will increase for another… 3Mb:)

//DL

Share

Wanna Key Lime Pie?

:)

source

Share

Android UI components and libraries

Nice collections of Android UI components and libraries!

http://www.theultimateandroidlibrary.com/
http://www.androidviews.net/

//DL

Share

Presentations from Omsk, Moscow and Voronezh DevFest 2012

Android: Quick Dive
Android: Make Your App Social

Omsk G+ event
Moscow G+ event
Voronezh G+ event

enjoy
//DL

Share

Concurrency in Android

All you want to know about concurrency in Android in Blake Meike presentation from OSCON 2012
https://github.com/bmeike/OSCON/blob/master/Concurrency.odp

UDP: one more good presentation http://www.slideshare.net/andersgoransson/efficient-android-threading

//DL

Share

DEBUG variable in Eclipse

In case you missed cool feature of ADT v.17

“Added a feature that allows you to run some code only in debug mode. Builds now generate a class called BuildConfig containing a DEBUG constant that is automatically set according to your build type. You can check the (BuildConfig.DEBUG) constant in your code to run debug-only functions such as outputting debug logs.”

Can help a lot:) Everybody forgets to disable debug in release at least one time in life.

//DL

Share

Dashboard is dead:)

Not sure this is most convenient way to navigate on Android. But more and more applications are using “side navigation” pattern for their UI.

Nice article about  this: http://www.androiduipatterns.com/2012/06/emerging-ui-pattern-side-navigation.html

have fun!

Update: some interesting articles about implementation
http://android.cyrilmottier.com/?p=658
http://android.cyrilmottier.com/?p=701
http://android.cyrilmottier.com/?p=717

//DL

Share

EURO 2012: Fun with Boar Foreteller

We’ve created fun Android application that makes prediction for EURO 2012 games:)

You can make your guess about match result and compare it to Ukrainian Boar Foreteller. Share your prediction with friends (Twitter, Facebook, vk.com).

Check it out! Have fun!

https://play.google.com/store/apps/details?id=com.amberfog.boar

//DL

Share

Honeycomb GMail animation mystery

There are a lot of questions on the Internet like these:

http://stackoverflow.com/questions/4817900/android-fragments-and-animation
http://stackoverflow.com/questions/5327636/animating-fragments-and-the-back-stack

GMail Honeycomb Android slide animation

If you are looking for a sample code – this post is for you.

Everybody wants to implement slide-in/slide-out animations like in GMail Tablet client. They try to use fragment animations (setCustomAnimations for FragmentTransaction). But if you take a deep look into GMail client implementation – they use LinearLayout and ObjectAnimator.

The code is quite simple – you just change left margin of the root view + change width of the right view.

package com.fragment.test;

import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.animation.TimeInterpolator;
import android.app.Activity;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.DecelerateInterpolator;

public class FragmentAnimationTestActivity extends Activity implements Fragment2.FragmentResultListener {

    private static final TimeInterpolator sCollapseInterpolator = new DecelerateInterpolator(2.5F);

    private View mPanel1;
    private View mPanel2;
    private View mLayout;

    boolean isCollapsed;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mLayout = findViewById(R.id.l1);
        mPanel1 = findViewById(R.id.fragment1);
        mPanel2 = findViewById(R.id.fragment2);
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.replace(R.id.fragment1, Fragment1.newInstance(), "f1");
        ft.replace(R.id.fragment2, Fragment2.newInstance(this), "f2");
        ft.commit();
    }

    public int getPanelLeft() {
        return ((ViewGroup.MarginLayoutParams) mLayout.getLayoutParams()).leftMargin;
    }

    public void setPanelLeft(int paramInt) {
        ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) mLayout.getLayoutParams();
        lp.leftMargin = paramInt;
        mLayout.setLayoutParams(lp);
    }

    public int getPanel2W() {
        return ((ViewGroup.MarginLayoutParams) mPanel2.getLayoutParams()).width;
    }

    public void setPanel2W(int paramInt) {
        ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) mPanel2.getLayoutParams();
        lp.width = paramInt;
        mPanel2.setLayoutParams(lp);
    }

    @Override
    public void onBtnClick() {
        if (isCollapsed) {
            PropertyValuesHolder[] arrayOfPropertyValuesHolder = new PropertyValuesHolder[2];
            arrayOfPropertyValuesHolder[0] = PropertyValuesHolder.ofInt("PanelLeft", -300, 0);
            arrayOfPropertyValuesHolder[1] = PropertyValuesHolder.ofInt("Panel2W", 1280, 980);
            ObjectAnimator localObjectAnimator = ObjectAnimator.ofPropertyValuesHolder(this,
                    arrayOfPropertyValuesHolder).setDuration(400);
            localObjectAnimator.setInterpolator(sCollapseInterpolator);
            localObjectAnimator.start();
        } else {
            PropertyValuesHolder[] arrayOfPropertyValuesHolder = new PropertyValuesHolder[2];
            arrayOfPropertyValuesHolder[0] = PropertyValuesHolder.ofInt("PanelLeft", 0, -300);
            arrayOfPropertyValuesHolder[1] = PropertyValuesHolder.ofInt("Panel2W", 980, 1280);
            ObjectAnimator localObjectAnimator = ObjectAnimator.ofPropertyValuesHolder(this,
                    arrayOfPropertyValuesHolder).setDuration(400);
            localObjectAnimator.setInterpolator(sCollapseInterpolator);
            localObjectAnimator.start();
        }
        isCollapsed = !isCollapsed;
    }

}

Of course, you can calculate all values dynamically. This is just a quick ugly sample. Full source code is available here.

Happy tabletting! :)

//DL

Share
←Older