Android Open Source - android-note-widget Config Activity






From Project

Back to project page android-note-widget.

License

The source code is released under:

Apache License

If you think the Android project android-note-widget listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.demondevelopers.notewidget;
//  www.j  av  a2s  . co  m
import android.animation.Animator;
import android.animation.Animator.AnimatorListener;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.annotation.TargetApi;
import android.app.Activity;
import android.appwidget.AppWidgetManager;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.TransitionDrawable;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.EditText;
import android.widget.RemoteViews;


/*
 * Note: Intent sourceBounds for widget clicks set as of Android 2.1_r1
 * https://github.com/android/platform_frameworks_base/commit/7597065d6b0877ffc460b443fdb1595965ccd7b2 
 * 
 */
public class ConfigActivity extends Activity
{
  private static final String TAG = ConfigActivity.class.getSimpleName();
  
  private int      mAppWidgetId;
  private EditText mNoteText;
  
  private int mTransitionTime;
  private TransitionDrawable mWindowDrawable;
  
  
  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
    overridePendingTransition(0, 0);
    super.onCreate(savedInstanceState);
    
    mAppWidgetId = getIntent().getIntExtra(
      AppWidgetManager.EXTRA_APPWIDGET_ID,
      AppWidgetManager.INVALID_APPWIDGET_ID);
    
    if(mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID){
      Log.e(TAG, "Bad AppWidgetId");
      finish();
      return;
    }
    
    setContentView(R.layout.appwidget_config);
    
    setResult(RESULT_CANCELED);
    
    mTransitionTime = getResources().getInteger(android.R.integer.config_mediumAnimTime);
    
    mNoteText = (EditText)findViewById(R.id.note_text);
    
    if(savedInstanceState == null){
      NoteWidgetService.applyNoteViewAttrs(this, mNoteText, 
        NoteStorage.getNote(this, mAppWidgetId));
    }
    
    if(!animateBoundsIfPossible()){
      //mNoteText.setVisibility(View.VISIBLE);
    }
  }
  
  @TargetApi(Build.VERSION_CODES.HONEYCOMB)
  private boolean animateBoundsIfPossible()
  {
    Rect sourceBounds = getIntent().getSourceBounds();
    if(sourceBounds != null && !sourceBounds.isEmpty()){
      if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
        AnimateChangeBounds changeBounds = AnimateChangeBounds.startFromScreen(mNoteText, sourceBounds);
        changeBounds.setAnimatorListener(new AnimatorListenerAdapter()
        {
          @Override
          public void onAnimationStart(Animator animation)
          {
            blankAppWidget(mAppWidgetId);
          }
        });
        mWindowDrawable = new TransitionDrawable(new Drawable[] {
          new ColorDrawable(Color.TRANSPARENT),
          new ColorDrawable(getResources().getColor(R.color.note_list_bg))
        });
        getWindow().setBackgroundDrawable(mWindowDrawable);
        mWindowDrawable.setCrossFadeEnabled(true);
        mWindowDrawable.startTransition(mTransitionTime);
        return true;
      }
    }
    return false;
  }
  
  @TargetApi(Build.VERSION_CODES.HONEYCOMB)
  private boolean animateClosed()
  {
    Rect sourceBounds = getIntent().getSourceBounds();
    if(sourceBounds != null && !sourceBounds.isEmpty()){
      if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
        AnimateChangeBounds changeBounds = AnimateChangeBounds.endAtScreen(mNoteText, sourceBounds);
        changeBounds.setAnimatorListener(new AnimatorListenerAdapter(){
          @Override
          public void onAnimationEnd(Animator animation)
          {
            NoteWidgetService.forceWidgetUpdate(ConfigActivity.this, mAppWidgetId);
            setResultAndFinish();
          }
        });
        if(mWindowDrawable != null){
          mWindowDrawable.reverseTransition(mTransitionTime);
        }
        return true;
      }
    }
    return false;
  }
  
  @Override
  public void finish()
  {
    NoteStorage.putNote(this, mAppWidgetId, mNoteText.getText().toString());
    if(!animateClosed()){
      NoteWidgetService.forceWidgetUpdate(this, mAppWidgetId);
      setResultAndFinish();
    }
  }
  
  private void setResultAndFinish()
  {
    setResult(RESULT_OK, new Intent().putExtra(
      AppWidgetManager.EXTRA_APPWIDGET_ID, 
      mAppWidgetId));
    super.finish();
    overridePendingTransition(0, 0);
  }
  
  private void blankAppWidget(int appWidgetId)
  {
    RemoteViews views = new RemoteViews(getPackageName(), R.layout.appwidget_note);
    views.setImageViewBitmap(R.id.appwidget_note, null);
    AppWidgetManager.getInstance(this).updateAppWidget(appWidgetId, views);
  }
  
  
  @TargetApi(Build.VERSION_CODES.HONEYCOMB)
  public static class AnimateChangeBounds
  {
    private final ViewGroup  mParent;
    private final View       mView;
    private final Mode       mMode;
    
    private Rect             mStart;
    private Rect             mEnd;
    private ObjectAnimator   mObjectAnimator;
    
    private AnimatorListener mAnimatorListener;
    private long             mDuration;
    
    private boolean mCancelled = false;
    
    
    public static AnimateChangeBounds startFromScreen(View view, Rect start)
    {
      return new AnimateChangeBounds(view, new Rect(start), Mode.START_ABS);
    }
    
    public static AnimateChangeBounds endAtScreen(View view, Rect end)
    {
      return new AnimateChangeBounds(view, new Rect(end), Mode.END_ABS);
    }
    
    private AnimateChangeBounds(View view, Rect rect, Mode mode)
    {
      mParent = (ViewGroup)view.getParent();
      mView = view;
      mMode = mode;
      
      switch(mode){
        case START_ABS:
        case START_REL: mStart = rect; break;
        case END_ABS:
        case END_REL:   mEnd   = rect; break;
      }
      
      mDuration = view.getContext().getResources().getInteger(android.R.integer.config_longAnimTime);
      
      mParent.getViewTreeObserver().addOnPreDrawListener(mPreDrawListener);
    }
    
    public void setAnimatorListener(AnimatorListener listener)
    {
      mAnimatorListener = listener;
      if(mObjectAnimator != null){
        mObjectAnimator.removeAllListeners();
        mObjectAnimator.addListener(listener);
      }
    }
    
    public void setDuration(long duration)
    {
      mDuration = duration;
      if(mObjectAnimator != null){
        mObjectAnimator.setDuration(duration);
      }
    }
    
    public void cancel()
    {
      mCancelled = true;
      if(mObjectAnimator != null){
        mObjectAnimator.cancel();
      }
    }
    
    private ViewTreeObserver.OnPreDrawListener mPreDrawListener = new ViewTreeObserver.OnPreDrawListener()
    {
      @Override
      public boolean onPreDraw()
      {
        mParent.getViewTreeObserver().removeOnPreDrawListener(mPreDrawListener);
        
        // Convert given rect coordinates to relative
        if(mMode == Mode.START_ABS || mMode == Mode.END_ABS){
          final int[] location = new int[2]; 
          ViewGroup parent = (ViewGroup)mView.getParent();
          parent.getLocationOnScreen(location);
          
          if(mMode == Mode.START_ABS){
            mStart.offset(-location[0], -location[1]);
          }else{
            mEnd.offset(-location[0], -location[1]);
          }
        }
        
        Rect viewRect = new Rect(
          mView.getLeft(),  mView.getTop(),
          mView.getRight(), mView.getBottom()
        );
        
        switch(mMode){
          case START_ABS:
          case START_REL: mEnd   = viewRect; break;
          case END_ABS:
          case END_REL:   mStart = viewRect; break;
        }
        
        if(mCancelled){
          return true;
        }
        
        mObjectAnimator = ObjectAnimator.ofPropertyValuesHolder(mView, 
          PropertyValuesHolder.ofInt("left",   mStart.left,   mEnd.left),
          PropertyValuesHolder.ofInt("top",    mStart.top,    mEnd.top),
          PropertyValuesHolder.ofInt("right",  mStart.right,  mEnd.right),
          PropertyValuesHolder.ofInt("bottom", mStart.bottom, mEnd.bottom));
        
        setAnimatorListener(mAnimatorListener);
        
        mObjectAnimator.setDuration(mDuration);
        mObjectAnimator.start();
        
        return false;
      }
    };
    
    private enum Mode {
      START_ABS, END_ABS, START_REL, END_REL;
    }
  }
}




Java Source Code List

com.demondevelopers.notewidget.AppWidgetService.java
com.demondevelopers.notewidget.ConfigActivity.java
com.demondevelopers.notewidget.MainActivity.java
com.demondevelopers.notewidget.NoteStorage.java
com.demondevelopers.notewidget.NoteWidgetService.java