Preferences からダイアログ出してデータ削除な機能盛り込み

ContentProvider 方面にログな情報を吐き出しているのですが、削除機能を付けて欲しい旨のリクエストがありまして標記な方向で実装を検討してみましたので以下に実装な記録を。

とりあえず

PreferencesActivity から項目タップで何かを kickoff できるのか、というあたりの確認。
以下みたいな仮の設定項目を作っておいて

        <PreferenceScreen
            android:title="履歴消去"
            android:summary="履歴情報を全て削除します"
            android:key="delete_history" />

PreferenceFragment の onCreate で以下な callback を登録で catch できました。

           addPreferencesFromResource(R.xml.hoge_preferences);
            
           Preference customPref = (Preference)findPreference("delete_history");
           customPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {

                @Override
                public boolean onPreferenceClick(Preference arg0) {
                    Toast.makeText(getActivity(), "delete history clicked", Toast.LENGTH_SHORT).show();
                    return false;
                }
                
            });

ここから AlertDialog 出して intentService を kickoff してそこから削除な方向。

方針として

  • AlertDialog 出して確認
  • OK であれば IntentService を kickoff してそちらで削除

というカンジ。Dialog は以下な形で定義。

    public static class MyAlertDialog extends DialogFragment {

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            AlertDialog.Builder Builder = new AlertDialog.Builder(getActivity());
            Builder.setTitle("履歴削除確認");
            Builder.setMessage("履歴データを全て削除してもよろしいですか?");
            Builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    //Toast.makeText(getActivity(), "OK", Toast.LENGTH_SHORT).show();
                    Intent i = new Intent(getActivity(), DeleteHistoryService.class);
                    getActivity().startService(i);
                }
            });
            Builder.setNegativeButton("NG", new DialogInterface.OnClickListener() {
                
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // no implementation
                }
            });
            Builder.setCancelable(true);

            return Builder.create();
        }

        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            getDialog().setCanceledOnTouchOutside(false);
        }
        
    }

onPreferenceClickListener なあたりは以下に修正。

            addPreferencesFromResource(R.xml.pointcard_preferences);
            
            Preference customPref = (Preference)findPreference("delete_history");
            customPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {

                @Override
                public boolean onPreferenceClick(Preference arg0) {
                    FragmentManager manager = getFragmentManager();
                    MyAlertDialog alertDialog = new MyAlertDialog();
                    alertDialog.show(manager, "dialog");
                    
                    return false;
                }
                
            });

で、以下な記述を Manifest に追加して

        <service android:name="jp.shuri.hoge.DeleteHistoryService"></service>

Service の実装が以下なカンジです。

package jp.shuri.hoge;

import jp.shuri.hoge.HogeProvider.Contract;
import android.app.IntentService;
import android.content.Intent;
import android.util.Log;

public class DeleteHistoryService extends IntentService {

    public DeleteHistoryService(String name) {
        super(name);
    }
    
    public DeleteHistoryService() {
        super("DeleteHistoryService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        Log.d("DeleteHistoryService", "delete all History");
        getContentResolver().delete(Contract.Log.contentUri, null, null);
    }

}

IntentService はヤり杉かな、って思いましたが念のため、ということにて。

iOS 方面も

このくらいさくさく実装書ければ良いのですが、いかんせん脳の容量が (ry