Java tutorial
/* * Copyright (C) 2012 ParanoidAndroid Project * * Licensed under the GNU GPLv2 license * * The text of the license can be found in the LICENSE file * or at https://www.gnu.org/licenses/gpl-2.0.txt */ package com.paranoid.ParanoidWallpapers; import java.io.IOException; import java.lang.reflect.Method; import java.util.ArrayList; import android.annotation.SuppressLint; import android.app.AlertDialog; import android.app.ProgressDialog; import android.app.WallpaperManager; import android.content.Context; import android.content.DialogInterface; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorFilter; import android.graphics.LightingColorFilter; import android.graphics.Paint; import android.graphics.PorterDuff.Mode; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.SimpleOnPageChangeListener; import android.view.LayoutInflater; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import com.actionbarsherlock.app.SherlockFragment; import com.actionbarsherlock.app.SherlockFragmentActivity; @SuppressLint("ParserError") public class Wallpaper extends SherlockFragmentActivity { /** * Menu item used for "Apply" button on actionbar. */ private static final int MENU_APPLY = Menu.FIRST; /** * The {@link android.support.v4.view.PagerAdapter} that will provide fragments for each of the * sections. We use a {@link android.support.v4.app.FragmentPagerAdapter} derivative, which will * keep every loaded fragment in memory. If this becomes too memory intensive, it may be best * to switch to a {@link android.support.v4.app.FragmentStatePagerAdapter}. */ SectionsPagerAdapter mSectionsPagerAdapter; /** * The {@link ViewPager} that will host the section contents. */ ViewPager mViewPager; /** * The {@link WallpaperManager} used to set wallpaper. */ WallpaperManager mWallpaperManager; /** * The {@link Integer} that stores current fragment selected. */ int mCurrentFragment; /** * The {@link ArrayList} that will host the wallpapers resource ID's. */ ArrayList<Integer> mWallpapers = new ArrayList<Integer>(); /** * The {@link String[]} that will store wallpaper name. */ String[] mWallpaperInfo; /** * The {@link Context} to be used by the app. */ Context mContext; /** * The {@link Boolean} that stores if current item is customizable. */ boolean mCustomizable = true; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Create the adapter that will return a fragment for each of the three primary sections // of the app. mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); mContext = this; // Set up the ViewPager with the sections adapter. mViewPager = (ViewPager) findViewById(R.id.pager); mViewPager.setAdapter(mSectionsPagerAdapter); mViewPager.setOnPageChangeListener(new SimpleOnPageChangeListener() { public void onPageSelected(int position) { mCurrentFragment = position; // Check if item is customizable mCustomizable = (mCurrentFragment == 0); try { Method method = Wallpaper.class.getMethod("invalidateOptionsMenu", new Class[] {}); method.invoke(Wallpaper.this); } catch (Exception e) { } } }); mWallpapers.clear(); final Resources resources = getResources(); final String packageName = getPackageName(); fetchWallpapers(resources, packageName, R.array.wallpapers); mWallpaperInfo = resources.getStringArray(R.array.info); mWallpaperManager = WallpaperManager.getInstance(mContext); mSectionsPagerAdapter.notifyDataSetChanged(); } /** * A {@link FragmentPagerAdapter} that returns a fragment corresponding to one of the primary * sections of the app. */ public class SectionsPagerAdapter extends FragmentPagerAdapter { private WallpaperFragment mCurrent; public SectionsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int i) { Fragment fragment = new WallpaperFragment(); Bundle args = new Bundle(); args.putInt(WallpaperFragment.ARG_SECTION_NUMBER, i); fragment.setArguments(args); mCurrent = (WallpaperFragment) fragment; return fragment; } public WallpaperFragment getCurrentFragment() { return mCurrent; } @Override public int getCount() { return mWallpapers.size(); } @Override public CharSequence getPageTitle(int position) { return mWallpaperInfo[position]; } } @SuppressLint("ValidFragment") public class WallpaperFragment extends SherlockFragment { public static final String ARG_SECTION_NUMBER = "section_number"; @SuppressWarnings("deprecation") @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Bundle args = getArguments(); LinearLayout holder = new LinearLayout(mContext); holder.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT)); ImageView imageView = new ImageView(mContext); imageView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); imageView.setImageResource(mWallpapers.get(args.getInt(ARG_SECTION_NUMBER))); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); holder.addView(imageView); return holder; } } private void fetchWallpapers(Resources resources, String packageName, int list) { final String[] extras = resources.getStringArray(list); for (String extra : extras) { int res = resources.getIdentifier(extra, "drawable", packageName); if (res != 0) { mWallpapers.add(res); } } } private class WallpaperLoader extends AsyncTask<Integer, Void, Boolean> { ProgressDialog mDialog; Bitmap mBitmap; public void setBitmap(Bitmap bitmap) { mBitmap = bitmap; } @Override protected Boolean doInBackground(Integer... params) { try { try { mWallpaperManager.setBitmap(mBitmap); } catch (IOException e) { // If we crash, we will probably have a null bitmap // return before recycling to avoid exception throw new NullPointerException(); } // Help GC mBitmap.recycle(); return true; } catch (OutOfMemoryError e) { return false; } catch (NullPointerException e) { return false; } } @Override protected void onPostExecute(Boolean success) { mDialog.dismiss(); finish(); } @Override protected void onPreExecute() { mDialog = ProgressDialog.show(mContext, null, getString(R.string.applying)); } } @Override public boolean onPrepareOptionsMenu(Menu menu) { return super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { final WallpaperLoader loader = new WallpaperLoader(); switch (item.getItemId()) { case MENU_APPLY: if (mCustomizable) { final CharSequence[] items = getResources().getStringArray(R.array.customize_colors); int resId = mWallpapers.get(mCurrentFragment); Drawable d = mContext.getResources().getDrawable(resId); final Bitmap stockBitmap = ((BitmapDrawable) d).getBitmap(); AlertDialog.Builder builder = new AlertDialog.Builder(mContext); builder.setTitle(getString(R.string.pick_color)); builder.setItems(items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int item) { int color = Color.BLACK; boolean setColor = true; switch (item) { case 0: color = Color.RED; break; case 1: color = Color.GREEN; break; case 2: color = Color.BLUE; break; case 3: setColor = false; break; } loader.setBitmap(setColor ? getColoredBitmap(stockBitmap, color) : stockBitmap); loader.execute(); } }); AlertDialog alert = builder.create(); alert.setCancelable(false); alert.show(); } else { Bitmap bitmap = BitmapFactory.decodeResource(getResources(), mWallpapers.get(mCurrentFragment)); loader.setBitmap(bitmap); loader.execute(); } break; } return super.onOptionsItemSelected(item); } private Bitmap getColoredBitmap(Bitmap src, int color) { int width = src.getWidth(); int height = src.getHeight(); Bitmap dest = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); Canvas canvas = new Canvas(dest); Paint paint = new Paint(); try { Mode m = (Mode) Mode.class.getField("OVERLAY").get(null); paint.setColorFilter(new PorterDuffColorFilter(color, m)); } catch (Exception e) { paint = new Paint(); ColorFilter filter = new LightingColorFilter(color, 1); paint.setColorFilter(filter); } canvas.drawBitmap(src, 0, 0, paint); return dest; } @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(Menu.NONE, MENU_APPLY, 0, R.string.action_apply).setIcon(R.drawable.ic_menu_set_as) .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT); return super.onCreateOptionsMenu(menu); } }