Mobile Dev/Android2020. 11. 26. 00:11

I have used the MaterialDatePicker in my project, so I made a simple custom builder for the MaterialDatePicker. It can set a constraint of date range, theme and title text. 

MaterialDatePicker를 프로젝느에서 사용한 일이 있어서 간단하게 Builder를 만들어 봤다. 날짜 범위 제한을 설정할 수 있다. 물론 간단하게 테마와 타이틀 설정도 추가 함.

 

 

public class MaterialDatePickerBuilder {

    private MaterialDatePicker.Builder builder;

    /**
     * constractor
     */ 
    public MaterialDatePickerBuilder() {

        builder = MaterialDatePicker.Builder.dateRangePicker();
    }


    /**
     * set date range of constraints
     *
     * @param startDate start date
     * @param endDate end date
     * @return builder
     */
    public MaterialDatePickerBuilder setConstraintsDateRange(Date startDate, Date endDate) {

        long minDate = startDate.getTime();
        long maxDate = endDate.getTime();
        CalendarConstraints.Builder constraintsBuilderRange = new CalendarConstraints.Builder();
        constraintsBuilderRange.setStart(minDate);
        constraintsBuilderRange.setEnd(maxDate);
        constraintsBuilderRange.setValidator(new DateRangeValidator(minDate, maxDate));

        builder.setCalendarConstraints(constraintsBuilderRange.build());
        return this;
    }


    /**
     * set title text
     *
     * @param titleText title text
     * @return builder
     */
    public MaterialDatePickerBuilder setTitleText(String titleText) {

        builder.setTitleText(titleText);
        return this;
    }

 

    /**
     * set theme
     *
     * @param themeResId theme resource id
     * @return builder
     */
    public MaterialDatePickerBuilder setTheme(@StyleRes int themeResId) {

        builder.setTheme(themeResId);
        return this;
    }


    /**
     * show MaterialDatePicker
     *
     * @param manager fragment manager
     * @param tag tag
     * @return MaterialDatePicker
     */
    public MaterialDatePicker showMaterialDatePicker(@NonNull FragmentManager manager, @Nullable String tag) {

        MaterialDatePicker picker = builder.build();
        picker.show(manager, tag);
        return picker;
    }


    /**
     * show MaterialDatePicker
     *
     * @param manager fragment manager
     * @param tag tag
     * @param onPositiveButtonClickListener onPositiveButtonClickListener
     * @param onNegativeButtonClickListener onNegativeButtonClickListener
     * @return MaterialDatePicker
     */
    public MaterialDatePicker showMaterialDatePicker(@NonNull FragmentManager manager, @Nullable String tag,
            MaterialPickerOnPositiveButtonClickListener onPositiveButtonClickListener,
            View.OnClickListener onNegativeButtonClickListener) {

        MaterialDatePicker picker = builder.build();
        picker.addOnPositiveButtonClickListener(onPositiveButtonClickListener);
        picker.addOnNegativeButtonClickListener(onNegativeButtonClickListener);
        picker.show(manager, tag);
        return picker;
    }


}

 

public class DateRangeValidator implements CalendarConstraints.DateValidator {

    private long minDate, maxDate;

    public DateRangeValidator(long minDate, long maxDate) {
        this.minDate = minDate;
        this.maxDate = maxDate;
    }

    public DateRangeValidator(Parcel parcel) {
        minDate = parcel.readLong();
        maxDate = parcel.readLong();
    }

    @Override
    public boolean isValid(long date) {
        return !(minDate > date || maxDate < date);
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeLong(minDate);
        dest.writeLong(maxDate);
    }

    public static final Parcelable.Creator<DateRangeValidator> CREATOR = new Parcelable.Creator<DateRangeValidator>() {

        @Override
        public DateRangeValidator createFromParcel(Parcel parcel) {
            return new DateRangeValidator(parcel);
        }

        @Override
        public DateRangeValidator[] newArray(int size) {
            return new DateRangeValidator[size];
        }
    };

}

 

Usage example

new MaterialDatePickerBuilder().setConstraintsDateRange(DateUtil.setTime(DateUtil.addDate(-91), 0, 0, 0, 0),
        DateUtil.setTime(DateUtil.addDate(-1), 23, 59, 59, 999))
    .setTitleText(ResourceGetter.getString(getOwnerActivity(), R.string.str_select_date_range))
    .setTheme(R.style.styleDatePicker)
    .showMaterialDatePicker(getOwnerActivity().getSupportFragmentManager(),

        ResourceGetter.getString(getOwnerActivity(), R.string.str_select_date_range),

        new MaterialPickerOnPositiveButtonClickListener<Pair<Long, Long>>() {
            @Override
            public void onPositiveButtonClick(Pair<Long, Long> selection) {
                searchDateStart = new Date(selection.first);
                searchDateEnd = new Date(selection.second);
            }
        }, null);

Posted by as.wind.914
Mobile Dev/Android2011. 11. 29. 02:38
안드로이드에서 설치 된 패키지의 상태를 조회하는 코드

PackageManager pm = getPackageManager();

Method getPackageSizeInfo = pm.getClass().getMethod(
   
"getPackageSizeInfo", String.class, IPackageStatsObserver.class);

getPackageSizeInfo
.invoke(pm, "com.android.mms", new IPackageStatsObserver.Stub() {

       
@Override
       
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
           
throws RemoteException {

           
Log.i(TAG, "codeSize: " + pStats.codeSize); // 사이즈
       
}
   
});
Posted by as.wind.914
Mobile Dev/Android2011. 8. 12. 01:09
내/외장에 저장 된 이미지 파일(PNG or JPEG ...)을 Bitmap으로 읽어 들이는 간단한 코드이다.
이미지 파일을 읽을 때 너무 큰 이미지는 OutOfMemory가 발생한다. 그래서 폰의 화면 해상도에 가장 근접하게 리스케일을 하여 읽어들이게 했다.
코드는 아주 간단하다.

/**

  * 지정한 패스의 파일을 읽어서 Bitmap 리턴 (화면사이즈에 최다한 맞춰서 리스케일한다.)

  *

  * @param context

  *            application context

  * @param imgFilePath

  *            bitmap file path

  * @return Bitmap

  * @throws IOException

  */

public static Bitmap loadBackgroundBitmap(Context context,

        String imgFilePath) throws Exception, OutOfMemoryError { 

    if (!FileUtil.exists(imgFilePath)) {

        throw new FileNotFoundException("background-image file not found : " + imgFilePath);

    }


    // 폰의 화면 사이즈를 구한다.
    Display display = ((WindowManager) context

            .getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();

    int displayWidth = display.getWidth();

    int displayHeight = display.getHeight();

 

    // 읽어들일 이미지의 사이즈를 구한다.

    BitmapFactory.Options options = new BitmapFactory.Options();

    options.inPreferredConfig = Config.RGB_565;

    options.inJustDecodeBounds = true;

    BitmapFactory.decodeFile(imgFilePath, options);

 
    // 화면 사이즈에 가장 근접하는 이미지의 리스케일 사이즈를 구한다.
    // 리스케일의 사이즈는 짝수로 지정한다. (이미지 손실을 최소화하기 위함.) 

    float widthScale = options.outWidth / displayWidth;

    float heightScale = options.outHeight / displayHeight;

    float scale = widthScale > heightScale ? widthScale : heightScale;

            

    if(scale >= 8) {

        options.inSampleSize = 8;

    } else if(scale >= 6) {

        options.inSampleSize = 6;

    } else if(scale >= 4) {

        options.inSampleSize = 4;

    } else if(scale >= 2) {

        options.inSampleSize = 2;

    } else {

        options.inSampleSize = 1;

    }

    options.inJustDecodeBounds = false;

 

    return BitmapFactory.decodeFile(imgFilePath, options);

}

Posted by as.wind.914