From 680d47cb138a22ad111f59468a48dcacb31db5b5 Mon Sep 17 00:00:00 2001 From: yuta Date: Sun, 20 Nov 2011 10:20:54 +0900 Subject: [PATCH] =?utf8?q?=E4=B8=80=E9=83=A8=E5=8B=95=E4=BD=9C=E3=81=AE?= =?utf8?q?=E6=94=B9=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../callconfirm/activity/confirm/CallConfirm.java | 22 +- .../activity/confirm/ConfirmDialog.java | 26 ++- .../activity/confirm/ConfirmOption.java | 6 +- .../activity/confirm/ConfirmScreen.java | 18 +- .../activity/confirm/{ => base}/BaseConfirm.java | 258 ++++++++++++++------- .../ofnhwx/callconfirm/utility/Param.java | 8 +- 6 files changed, 242 insertions(+), 96 deletions(-) rename src/jp/gr/java_conf/ofnhwx/callconfirm/activity/confirm/{ => base}/BaseConfirm.java (61%) diff --git a/src/jp/gr/java_conf/ofnhwx/callconfirm/activity/confirm/CallConfirm.java b/src/jp/gr/java_conf/ofnhwx/callconfirm/activity/confirm/CallConfirm.java index ee81054..10e98b1 100755 --- a/src/jp/gr/java_conf/ofnhwx/callconfirm/activity/confirm/CallConfirm.java +++ b/src/jp/gr/java_conf/ofnhwx/callconfirm/activity/confirm/CallConfirm.java @@ -1,6 +1,8 @@ package jp.gr.java_conf.ofnhwx.callconfirm.activity.confirm; import jp.gr.java_conf.ofnhwx.callconfirm.R; +import jp.gr.java_conf.ofnhwx.callconfirm.activity.confirm.ConfirmOption.ConfirmOptionCallback; +import jp.gr.java_conf.ofnhwx.callconfirm.activity.confirm.base.BaseConfirm; import jp.gr.java_conf.ofnhwx.callconfirm.activity.list.BaseActivity; import jp.gr.java_conf.ofnhwx.callconfirm.utility.Param; import jp.gr.java_conf.ofnhwx.olib.ErrorReporter; @@ -15,6 +17,8 @@ import android.text.TextUtils; import android.view.Display; import android.view.Gravity; import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; import android.widget.FrameLayout; import android.widget.FrameLayout.LayoutParams; import android.widget.Toast; @@ -28,11 +32,16 @@ public class CallConfirm extends FragmentActivity { private class CallConfirmInternal extends BaseConfirm { public CallConfirmInternal(Context context, String number, String scheme) { - super(context, number, scheme, R.layout.callconfirm); + super(context, number, scheme); } @Override - public void onCreateViews() { + public View onCreateView(LayoutInflater inflater) { + return inflater.inflate(R.layout.callconfirm, null, false); + } + + @Override + public void onMappingViews() { frameView = findViewById(R.id.callconfirm_frame ); mainView = findViewById(R.id.callconfirm_main ); titleView = findViewById(R.id.callconfirm_title ); @@ -46,6 +55,11 @@ public class CallConfirm extends FragmentActivity { } @Override + public boolean showOptionMenu(ConfirmOptionCallback callback) { + return false; + } + + @Override public void doFinish() { finish(); } @@ -86,7 +100,7 @@ public class CallConfirm extends FragmentActivity { int height = LayoutParams.FILL_PARENT; LayoutParams params = new LayoutParams(width, height); params.gravity = Gravity.CENTER; - layout.addView(c.rootView, params); + layout.addView(c.getView(), params); } } @@ -100,7 +114,7 @@ public class CallConfirm extends FragmentActivity { @Override public boolean dispatchKeyEvent(KeyEvent event) { - return c.onKey(c.rootView, event.getKeyCode(), event); + return c.onKey(c.getView(), event.getKeyCode(), event); } public static final void show(Context context, String number, String uri) { diff --git a/src/jp/gr/java_conf/ofnhwx/callconfirm/activity/confirm/ConfirmDialog.java b/src/jp/gr/java_conf/ofnhwx/callconfirm/activity/confirm/ConfirmDialog.java index 08ad545..f8f5f0d 100755 --- a/src/jp/gr/java_conf/ofnhwx/callconfirm/activity/confirm/ConfirmDialog.java +++ b/src/jp/gr/java_conf/ofnhwx/callconfirm/activity/confirm/ConfirmDialog.java @@ -1,6 +1,8 @@ package jp.gr.java_conf.ofnhwx.callconfirm.activity.confirm; import jp.gr.java_conf.ofnhwx.callconfirm.R; +import jp.gr.java_conf.ofnhwx.callconfirm.activity.confirm.ConfirmOption.ConfirmOptionCallback; +import jp.gr.java_conf.ofnhwx.callconfirm.activity.confirm.base.BaseConfirm; import jp.gr.java_conf.ofnhwx.callconfirm.utility.Param; import android.app.AlertDialog; import android.app.Dialog; @@ -12,6 +14,8 @@ import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.support.v4.app.FragmentActivity; import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; /** * 確認の表示にダイアログを使う. @@ -22,11 +26,16 @@ public class ConfirmDialog extends DialogFragment implements OnKeyListener, OnCl private class ConfirmDialogInternal extends BaseConfirm { public ConfirmDialogInternal(Context context, String number, String scheme) { - super(context, number, scheme, R.layout.callconfirm_dialog); + super(context, number, scheme); } @Override - public void onCreateViews() { + public View onCreateView(LayoutInflater inflater) { + return inflater.inflate(R.layout.callconfirm_dialog, null, false); + } + + @Override + public void onMappingViews() { frameView = findViewById(R.id.callconfirm_frame ); mainView = findViewById(R.id.callconfirm_main ); progress = findViewById(R.id.callconfirm_progress); @@ -36,6 +45,11 @@ public class ConfirmDialog extends DialogFragment implements OnKeyListener, OnCl } @Override + public boolean showOptionMenu(ConfirmOptionCallback callback) { + return false; + } + + @Override public void doFinish() { getActivity().finish(); dismiss(); @@ -47,11 +61,15 @@ public class ConfirmDialog extends DialogFragment implements OnKeyListener, OnCl @Override public Dialog onCreateDialog(Bundle savedInstanceState) { + // Bundle args = getArguments(); - d = new ConfirmDialogInternal(getActivity(), args.getString(Param.NUMBER), args.getString(Param.SCHEME)); + String number = args.getString(Param.NUMBER); + String scheme = args.getString(Param.SCHEME); + d = new ConfirmDialogInternal(getActivity(), number, scheme); + // AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.callconfirm_title); - builder.setView(d.rootView); + builder.setView(d.getView()); builder.setOnKeyListener(this); builder.setPositiveButton(R.string.callconfirm_positive, this); builder.setNegativeButton(R.string.callconfirm_negative, this); diff --git a/src/jp/gr/java_conf/ofnhwx/callconfirm/activity/confirm/ConfirmOption.java b/src/jp/gr/java_conf/ofnhwx/callconfirm/activity/confirm/ConfirmOption.java index ac7df3e..0914d1e 100755 --- a/src/jp/gr/java_conf/ofnhwx/callconfirm/activity/confirm/ConfirmOption.java +++ b/src/jp/gr/java_conf/ofnhwx/callconfirm/activity/confirm/ConfirmOption.java @@ -39,7 +39,7 @@ public class ConfirmOption implements OnCheckedChangeListener, OnItemClickListen * @param option true:頭の0は取るべき * @param cancel */ - public void confirmOptionCallback(String prefix, String suffix, boolean option, boolean cancel); + public void onOptionCallback(String prefix, String suffix, boolean option, boolean cancel); } private ConfirmOptionCallback parent; @@ -98,7 +98,7 @@ public class ConfirmOption implements OnCheckedChangeListener, OnItemClickListen suffix = c.getString(c.getColumnIndex(EditNumber.List.SUFFIX)); option = c.getLong(c.getColumnIndex(EditNumber.List.OPTION)) == 1; } - parent.confirmOptionCallback(prefix, suffix, option, false); + parent.onOptionCallback(prefix, suffix, option, false); close(); } @@ -109,7 +109,7 @@ public class ConfirmOption implements OnCheckedChangeListener, OnItemClickListen switch (keyCode) { case KeyEvent.KEYCODE_BACK: case KeyEvent.KEYCODE_MENU: - parent.confirmOptionCallback(null, null, false, true); + parent.onOptionCallback(null, null, false, true); close(); return true; } diff --git a/src/jp/gr/java_conf/ofnhwx/callconfirm/activity/confirm/ConfirmScreen.java b/src/jp/gr/java_conf/ofnhwx/callconfirm/activity/confirm/ConfirmScreen.java index 7f84568..c02b9c2 100755 --- a/src/jp/gr/java_conf/ofnhwx/callconfirm/activity/confirm/ConfirmScreen.java +++ b/src/jp/gr/java_conf/ofnhwx/callconfirm/activity/confirm/ConfirmScreen.java @@ -1,12 +1,16 @@ package jp.gr.java_conf.ofnhwx.callconfirm.activity.confirm; import jp.gr.java_conf.ofnhwx.callconfirm.R; +import jp.gr.java_conf.ofnhwx.callconfirm.activity.confirm.ConfirmOption.ConfirmOptionCallback; +import jp.gr.java_conf.ofnhwx.callconfirm.activity.confirm.base.BaseConfirm; import android.app.Activity; import android.app.Service; import android.content.Context; import android.graphics.PixelFormat; import android.view.Display; import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; import android.view.WindowManager; import android.view.WindowManager.LayoutParams; @@ -27,12 +31,17 @@ public class ConfirmScreen extends BaseConfirm { } private ConfirmScreen(Context context, String number, String scheme) { - super(context, number, scheme, R.layout.callconfirm); + super(context, number, scheme); wm = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); } @Override - public void onCreateViews() { + public View onCreateView(LayoutInflater inflater) { + return inflater.inflate(R.layout.callconfirm, null, false); + } + + @Override + public void onMappingViews() { frameView = findViewById(R.id.callconfirm_frame ); mainView = findViewById(R.id.callconfirm_main ); titleView = findViewById(R.id.callconfirm_title ); @@ -46,6 +55,11 @@ public class ConfirmScreen extends BaseConfirm { } @Override + public boolean showOptionMenu(ConfirmOptionCallback callback) { + return false; + } + + @Override public void doFinish() { wm.removeViewImmediate(rootView); if (context instanceof Service) { diff --git a/src/jp/gr/java_conf/ofnhwx/callconfirm/activity/confirm/BaseConfirm.java b/src/jp/gr/java_conf/ofnhwx/callconfirm/activity/confirm/base/BaseConfirm.java similarity index 61% rename from src/jp/gr/java_conf/ofnhwx/callconfirm/activity/confirm/BaseConfirm.java rename to src/jp/gr/java_conf/ofnhwx/callconfirm/activity/confirm/base/BaseConfirm.java index dd39db6..4776e0b 100755 --- a/src/jp/gr/java_conf/ofnhwx/callconfirm/activity/confirm/BaseConfirm.java +++ b/src/jp/gr/java_conf/ofnhwx/callconfirm/activity/confirm/base/BaseConfirm.java @@ -1,6 +1,9 @@ -package jp.gr.java_conf.ofnhwx.callconfirm.activity.confirm; +package jp.gr.java_conf.ofnhwx.callconfirm.activity.confirm.base; + +import java.util.EnumSet; import jp.gr.java_conf.ofnhwx.callconfirm.R; +import jp.gr.java_conf.ofnhwx.callconfirm.activity.confirm.ConfirmOption; import jp.gr.java_conf.ofnhwx.callconfirm.activity.confirm.ConfirmOption.ConfirmOptionCallback; import jp.gr.java_conf.ofnhwx.callconfirm.receiver.OutgoingCallReceiver; import jp.gr.java_conf.ofnhwx.callconfirm.utility.Param; @@ -36,6 +39,15 @@ public abstract class BaseConfirm implements OnClickListener, OnKeyListener, ConfirmOptionCallback, GetContactCallback, GetPhotoCallback { + // 状態の管理 + private static enum State { + HAS_TITLE, + HAS_BUTTONS, + FINISHING, + OPTION_MODE + } + private EnumSet state = EnumSet.noneOf(State.class); + // protected Context context; @@ -68,15 +80,36 @@ public abstract class BaseConfirm private GetContactTask getContactTask; private GetPhotoTask getPhotoTask ; - // 状態の管理 - private boolean optionMode = false; - private boolean isFinishing = false; - /** * ビューの作成を行う. + * @param inflater + */ + public abstract View onCreateView(LayoutInflater inflater); + + /** + * ビューの割当てを行う. + * * @see #findViewById(int) */ - public abstract void onCreateViews(); + public abstract void onMappingViews(); + + /** + * オプションメニューを表示する. + * @param callback + * @return + */ + public abstract boolean showOptionMenu(ConfirmOptionCallback callback); /** * 終了処理を行う. @@ -90,36 +123,49 @@ public abstract class BaseConfirm * @param context コンテキスト * @param number 電話番号 * @param scheme スキーマ - * @param layoutId 生成する{@link View}のレイアウトID */ - public BaseConfirm(Context context, String number, String scheme, int layoutId) { + public BaseConfirm(Context context, String number, String scheme) { this.context = context; this.number = number; this.scheme = scheme; this.photoSize = Param.getMyPictureSize(context); - // + // ビューの作成 LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - rootView = (LinearLayout)inflater.inflate(layoutId, null, false); - onCreateViews(); + rootView = (LinearLayout)onCreateView(inflater); + // ビューの割当 + onMappingViews(); + if (frameView == null || mainView == null || + progress == null || photoView == null || + nameView == null || numberView == null) { + throw new IllegalStateException(); + } + if (titleView != null && lineView != null) { + state.add(State.HAS_TITLE); + } + if (positive != null && negative != null) { + state.add(State.HAS_BUTTONS); + } + // ビューの設定 customizeViews(); } /** - * コンストラクタで指定したlayoutIdで生成した{@link View}から、idで検索する. - * @param id 検索する{@link View}のid - * @return {@link View}を継承したクラスのインスタンス + * ビューの取得. + * @return */ - @SuppressWarnings("unchecked") - protected T findViewById(int id) { - return (T)rootView.findViewById(id); + public View getView() { + return rootView; } - protected void displayViews() { + /** + * ビューの表示開始. + */ + public void displayViews() { if (NumberType.get(number) == NumberType.NORMAL) { getContactTask = new GetContactTask(context, number, this); getContactTask.execute(); } else { - if (positive != null) { + if (state.contains(State.HAS_BUTTONS)) { positive.setEnabled(false); } displayPhoto(); @@ -128,20 +174,26 @@ public abstract class BaseConfirm displayNumber(); } + /** + * ボタン押下時のイベント. + */ public void onClick(View v) { - if (optionMode) { + if (state.contains(State.OPTION_MODE)) { return; } action(v.getId() == R.id.positive); } + /** + * キー入力時のイベント. + */ public boolean onKey(View v, int keyCode, KeyEvent event) { + if (state.contains(State.OPTION_MODE)) { + return false; + } if (event.getAction() != KeyEvent.ACTION_UP) { return true; } - if (optionMode) { - return false; - } switch (keyCode) { case KeyEvent.KEYCODE_VOLUME_UP: if (index < contactInfo.getCount() - 1) { @@ -166,14 +218,19 @@ public abstract class BaseConfirm case KeyEvent.KEYCODE_MENU: if (NumberType.get(number) == NumberType.NORMAL) { setOptionMode(true); - ConfirmOption.show(context, frameView, number, this); + if (!showOptionMenu(this)) { + ConfirmOption.show(context, frameView, number, this); + } } return true; } return false; } - public void confirmOptionCallback(String prefix, String suffix, boolean option, boolean cancel) { + /** + * オプションメニューでの設定を受取って反映する. + */ + public void onOptionCallback(String prefix, String suffix, boolean option, boolean cancel) { setOptionMode(false); if (cancel) { return; @@ -184,12 +241,18 @@ public abstract class BaseConfirm displayNumber(); } + /** + * コンタクトの情報を受取って表示する. + */ public void onGetContactCallback(ContactInfo info) { contactInfo = info; displayName(); displayPhoto(); } + /** + * コンタクトの写真を受取って表示する. + */ public void onGetPhotoCallback(Bitmap photo) { if (photo == null) { photoView.setImageBitmap(OBitmap.decodeResource(context, R.drawable.contact_unknown, photoSize, true)); @@ -198,6 +261,19 @@ public abstract class BaseConfirm } } + /** + * {@link #onCreateView(LayoutInflater)}で生成した{@link View}から、idで検索する. + * @param id 検索する{@link View}のid + * @return {@link View}を継承したクラスのインスタンス + */ + @SuppressWarnings("unchecked") + protected T findViewById(int id) { + return (T)rootView.findViewById(id); + } + + /** + * 画面に名前を表示する. + */ private void displayName() { if (contactInfo == null) { nameView.setText(R.string.callconfirm_unknown); @@ -211,6 +287,9 @@ public abstract class BaseConfirm } } + /** + * 画面に番号を表示する. + */ private void displayNumber() { switch (NumberType.get(number)) { case UNKNOWN: @@ -236,9 +315,12 @@ public abstract class BaseConfirm } } + /** + * 画面に写真を表示する. + */ private void displayPhoto() { if (contactInfo == null) { - photoView.setImageBitmap(OBitmap.decodeResource(context, R.drawable.contact_unknown, photoSize, true)); + onGetPhotoCallback(null); } else { cancelTask(getPhotoTask); getPhotoTask = new GetPhotoTask(contactInfo, index, this); @@ -246,64 +328,96 @@ public abstract class BaseConfirm } } + /** + * すべての非同期タスクをキャンセルする. + */ private void cancelTasks() { cancelTask(getContactTask); cancelTask(getPhotoTask); } + /** + * 非同期タスクをキャンセルする. + * @param task キャンセルするタスク + */ private > void cancelTask(T task) { if (task != null && !task.isCancelled()) { task.cancel(true); } } - private synchronized void action(boolean positive) { - if (isFinishing) { - return; - } else { - isFinishing = true; + /** + * ボタン押下時のイベント. + * @param positive trueの場合、電話の発信を行う + */ + private void action(boolean positive) { + synchronized (state) { + if (state.contains(State.FINISHING)) { + return; + } else { + state.add(State.FINISHING); + } } if (positive) { - call(); + StringBuilder sb = new StringBuilder(); + if (prefix != null) { + sb.append(prefix); + } + if (option && number.startsWith("0")) { + sb.append(number.substring(1)); + } else { + sb.append(number); + } + if (suffix != null) { + sb.append(suffix); + } + OutgoingCallReceiver.setStateConfirmed(context, sb.toString()); + OPhone.call(context, scheme, sb.toString()); } cancelTasks(); doFinish(); } - private void call() { - StringBuilder sb = new StringBuilder(); - if (prefix != null) { - sb.append(prefix); - } - if (option && number.startsWith("0")) { - sb.append(number.substring(1)); - } else { - sb.append(number); - } - if (suffix != null) { - sb.append(suffix); - } - OutgoingCallReceiver.setStateConfirmed(context, sb.toString()); - OPhone.call(context, scheme, sb.toString()); - } - + /** + * オプションモードの切替え. + * @param mode + */ private void setOptionMode(boolean mode) { - optionMode = mode; - if (positive != null) { - positive.setFocusable(!optionMode); - negative.setFocusable(!optionMode); - negative.setFocusableInTouchMode(!optionMode); + synchronized (state) { + if (mode) { + state.add(State.OPTION_MODE); + } else { + state.remove(State.OPTION_MODE); + } + } + if (state.contains(State.HAS_BUTTONS)) { + positive.setFocusable(!mode); + negative.setFocusable(!mode); + negative.setFocusableInTouchMode(!mode); } } + /** + * 各ビューの設定. + */ private void customizeViews() { - // パラメータの取得 - int color1 = Param.getMyTitleColor(context); - int color2 = Param.getMyTextColor (context); - float size1 = Param.getMyTitleSize(context); - float size2 = Param.getMyTextSize (context); - // テーマの設定 - if (lineView != null) { + // 写真の既定値 + progress.setLayoutParams(new FrameLayout.LayoutParams(photoSize, photoSize)); + photoView.setImageBitmap(OBitmap.decodeResource(context, R.drawable.contact_noimage, photoSize)); + // 名前, 番号の設定 + int color = Param.getMyTextColor(context); + int size = Param.getMyTextSize (context); + nameView.setTextSize (size ); + nameView.setTextColor(color); + numberView.setTextSize (size ); + numberView.setTextColor(color); + // タイトルあり + if (state.contains(State.HAS_TITLE)) { + // タイトルの設定 + titleView.setText(R.string.callconfirm_title); + titleView.setTextSize (Param.getMyTitleSize (context)); + titleView.setTextColor(Param.getMyTitleColor(context)); + // テーマの設定 switch (Param.getMyTheme(context)) { case Param.THEMA_WHITE: mainView.setBackgroundResource(R.drawable.background_white); @@ -320,28 +434,14 @@ public abstract class BaseConfirm } lineView.setImageResource(android.R.drawable.divider_horizontal_dark); } - // 写真の既定値 - progress.setLayoutParams(new FrameLayout.LayoutParams(photoSize, photoSize)); - photoView.setImageBitmap(OBitmap.decodeResource(context, R.drawable.contact_noimage, photoSize)); - // タイトル・名前・番号の設定 - if (titleView != null) { - titleView.setText(R.string.callconfirm_title); - titleView.setTextSize (size1); - titleView.setTextColor(color1); - } - nameView.setTextSize (size2); - nameView.setTextColor(color2); - numberView.setTextSize (size2); - numberView.setTextColor(color2); - // イベントの設定 - if (positive != null) { + // ボタンあり + if (state.contains(State.HAS_BUTTONS)) { + // イベントの設定 positive.setOnClickListener(this); negative.setOnClickListener(this); positive.setOnKeyListener(this); negative.setOnKeyListener(this); - } - // フォーカスの設定 - if (positive != null) { + // フォーカスの設定 positive.setFocusable(true); negative.setFocusable(true); negative.setFocusableInTouchMode(true); diff --git a/src/jp/gr/java_conf/ofnhwx/callconfirm/utility/Param.java b/src/jp/gr/java_conf/ofnhwx/callconfirm/utility/Param.java index 0b0f058..13b02c2 100755 --- a/src/jp/gr/java_conf/ofnhwx/callconfirm/utility/Param.java +++ b/src/jp/gr/java_conf/ofnhwx/callconfirm/utility/Param.java @@ -61,18 +61,18 @@ public abstract class Param { return (int)(size * getDensity(context)); } - public static final float getMyTitleSize(Context context) { + public static final int getMyTitleSize(Context context) { float size = getFloat(context, R.string.key_title_size, DEFAULT_TITLE_SIZE); - return size * getScaledDensity(context); + return (int)(size * getScaledDensity(context)); } public static final int getMyTitleColor(Context context) { return COLORS[getInteger(context, R.string.key_title_color, 0)]; } - public static final float getMyTextSize(Context context) { + public static final int getMyTextSize(Context context) { final float size = getFloat(context, R.string.key_text_size, DEFAULT_TEXT_SIZE); - return size * getScaledDensity(context); + return (int)(size * getScaledDensity(context)); } public static final int getMyTextColor(Context context) { -- 2.11.4.GIT