1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.messaging.ui.debug; 18 19 import android.app.AlertDialog; 20 import android.app.Dialog; 21 import android.app.DialogFragment; 22 import android.content.Context; 23 import android.content.Intent; 24 import android.content.res.Resources; 25 import android.net.Uri; 26 import android.os.Bundle; 27 import android.os.Environment; 28 import android.telephony.SmsMessage; 29 import android.view.LayoutInflater; 30 import android.view.View; 31 import android.view.View.OnClickListener; 32 import android.view.ViewGroup; 33 import android.widget.ArrayAdapter; 34 import android.widget.ListView; 35 import android.widget.TextView; 36 37 import com.android.messaging.R; 38 import com.android.messaging.datamodel.action.ReceiveMmsMessageAction; 39 import com.android.messaging.datamodel.data.ParticipantData; 40 import com.android.messaging.receiver.SmsReceiver; 41 import com.android.messaging.sms.MmsUtils; 42 import com.android.messaging.util.DebugUtils; 43 import com.android.messaging.util.LogUtil; 44 45 /** 46 * Class that displays UI for choosing SMS/MMS dump files for debugging 47 */ 48 public class DebugSmsMmsFromDumpFileDialogFragment extends DialogFragment { 49 public static final String APPLICATION_OCTET_STREAM = "application/octet-stream"; 50 public static final String KEY_DUMP_FILES = "dump_files"; 51 public static final String KEY_ACTION = "action"; 52 53 public static final String ACTION_LOAD = "load"; 54 public static final String ACTION_EMAIL = "email"; 55 56 private String[] mDumpFiles; 57 private String mAction; 58 newInstance(final String[] dumpFiles, final String action)59 public static DebugSmsMmsFromDumpFileDialogFragment newInstance(final String[] dumpFiles, 60 final String action) { 61 final DebugSmsMmsFromDumpFileDialogFragment frag = 62 new DebugSmsMmsFromDumpFileDialogFragment(); 63 final Bundle args = new Bundle(); 64 args.putSerializable(KEY_DUMP_FILES, dumpFiles); 65 args.putString(KEY_ACTION, action); 66 frag.setArguments(args); 67 return frag; 68 } 69 70 @Override onCreateDialog(final Bundle savedInstanceState)71 public Dialog onCreateDialog(final Bundle savedInstanceState) { 72 final Bundle args = getArguments(); 73 mDumpFiles = (String[]) args.getSerializable(KEY_DUMP_FILES); 74 mAction = args.getString(KEY_ACTION); 75 76 final LayoutInflater inflater = getActivity().getLayoutInflater(); 77 final View layout = inflater.inflate( 78 R.layout.debug_sms_mms_from_dump_file_dialog, null/*root*/); 79 final ListView list = (ListView) layout.findViewById(R.id.dump_file_list); 80 list.setAdapter(new DumpFileListAdapter(getActivity(), mDumpFiles)); 81 final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 82 final Resources resources = getResources(); 83 if (ACTION_LOAD.equals(mAction)) { 84 builder.setTitle(resources.getString( 85 R.string.load_sms_mms_from_dump_file_dialog_title)); 86 } else if (ACTION_EMAIL.equals(mAction)) { 87 builder.setTitle(resources.getString( 88 R.string.email_sms_mms_from_dump_file_dialog_title)); 89 } 90 builder.setView(layout); 91 return builder.create(); 92 } 93 94 private class DumpFileListAdapter extends ArrayAdapter<String> { DumpFileListAdapter(final Context context, final String[] dumpFiles)95 public DumpFileListAdapter(final Context context, final String[] dumpFiles) { 96 super(context, R.layout.sms_mms_dump_file_list_item, dumpFiles); 97 } 98 99 @Override getView(final int position, final View view, final ViewGroup parent)100 public View getView(final int position, final View view, final ViewGroup parent) { 101 TextView actionItemView; 102 if (view == null || !(view instanceof TextView)) { 103 final LayoutInflater inflater = LayoutInflater.from(getContext()); 104 actionItemView = (TextView) inflater.inflate( 105 R.layout.sms_mms_dump_file_list_item, parent, false); 106 } else { 107 actionItemView = (TextView) view; 108 } 109 110 final String file = getItem(position); 111 actionItemView.setText(file); 112 actionItemView.setOnClickListener(new OnClickListener() { 113 @Override 114 public void onClick(final View view) { 115 dismiss(); 116 if (ACTION_LOAD.equals(mAction)) { 117 receiveFromDumpFile(file); 118 } else if (ACTION_EMAIL.equals(mAction)) { 119 emailDumpFile(file); 120 } 121 } 122 }); 123 return actionItemView; 124 } 125 } 126 127 /** 128 * Load MMS/SMS from the dump file 129 */ receiveFromDumpFile(final String dumpFileName)130 private void receiveFromDumpFile(final String dumpFileName) { 131 if (dumpFileName.startsWith(MmsUtils.SMS_DUMP_PREFIX)) { 132 final SmsMessage[] messages = DebugUtils.retreiveSmsFromDumpFile(dumpFileName); 133 if (messages != null) { 134 SmsReceiver.deliverSmsMessages(getActivity(), ParticipantData.DEFAULT_SELF_SUB_ID, 135 0, messages); 136 } else { 137 LogUtil.e(LogUtil.BUGLE_TAG, 138 "receiveFromDumpFile: invalid sms dump file " + dumpFileName); 139 } 140 } else if (dumpFileName.startsWith(MmsUtils.MMS_DUMP_PREFIX)) { 141 final byte[] data = MmsUtils.createDebugNotificationInd(dumpFileName); 142 if (data != null) { 143 final ReceiveMmsMessageAction action = new ReceiveMmsMessageAction( 144 ParticipantData.DEFAULT_SELF_SUB_ID, data); 145 action.start(); 146 } else { 147 LogUtil.e(LogUtil.BUGLE_TAG, 148 "receiveFromDumpFile: invalid mms dump file " + dumpFileName); 149 } 150 } else { 151 LogUtil.e(LogUtil.BUGLE_TAG, 152 "receiveFromDumpFile: invalid dump file name " + dumpFileName); 153 } 154 } 155 156 /** 157 * Launch email app to send the dump file 158 */ emailDumpFile(final String file)159 private void emailDumpFile(final String file) { 160 final Resources resources = getResources(); 161 final String fileLocation = "file://" 162 + Environment.getExternalStorageDirectory() + "/" + file; 163 final Intent sharingIntent = new Intent(Intent.ACTION_SEND); 164 sharingIntent.setType(APPLICATION_OCTET_STREAM); 165 sharingIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(fileLocation)); 166 sharingIntent.putExtra(Intent.EXTRA_SUBJECT, 167 resources.getString(R.string.email_sms_mms_dump_file_subject)); 168 getActivity().startActivity(Intent.createChooser(sharingIntent, 169 resources.getString(R.string.email_sms_mms_dump_file_chooser_title))); 170 } 171 } 172