1 /* 2 * Copyright (C) 2017 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.dialer.simulator.impl; 18 19 import android.content.Context; 20 import android.content.Intent; 21 import android.provider.VoicemailContract; 22 import android.support.annotation.NonNull; 23 import android.support.annotation.Nullable; 24 import android.support.v7.app.AppCompatActivity; 25 import android.view.ActionProvider; 26 import com.android.dialer.common.concurrent.DialerExecutor.Worker; 27 import com.android.dialer.common.concurrent.DialerExecutorComponent; 28 import com.android.dialer.databasepopulator.BlockedBumberPopulator; 29 import com.android.dialer.databasepopulator.CallLogPopulator; 30 import com.android.dialer.databasepopulator.ContactsPopulator; 31 import com.android.dialer.databasepopulator.VoicemailPopulator; 32 import com.android.dialer.enrichedcall.simulator.EnrichedCallSimulatorActivity; 33 import com.android.dialer.persistentlog.PersistentLogger; 34 import com.android.dialer.preferredsim.PreferredSimFallbackContract; 35 import com.android.dialer.simulator.SimulatorComponent; 36 37 /** Implements the top level simulator menu. */ 38 final class SimulatorMainMenu { 39 40 static ActionProvider getActionProvider(@NonNull AppCompatActivity activity) { 41 SimulatorSubMenu simulatorSubMenu = new SimulatorSubMenu(activity.getApplicationContext()); 42 simulatorSubMenu 43 .addItem("Voice call", SimulatorVoiceCall.getActionProvider(activity)) 44 .addItem("Rtt call", SimulatorRttCall.getActionProvider(activity.getApplicationContext())) 45 .addItem( 46 "IMS video", SimulatorVideoCall.getActionProvider(activity.getApplicationContext())) 47 .addItem( 48 "Notifications", 49 SimulatorNotifications.getActionProvider(activity.getApplicationContext())) 50 .addItem("Populate database", () -> populateDatabase(activity.getApplicationContext())) 51 .addItem("Populate voicemail", () -> populateVoicemail(activity.getApplicationContext())) 52 .addItem( 53 "Fast populate database", () -> fastPopulateDatabase(activity.getApplicationContext())) 54 .addItem( 55 "Fast populate voicemail database", 56 () -> populateVoicemailFast(activity.getApplicationContext())) 57 .addItem("Clean database", () -> cleanDatabase(activity.getApplicationContext())) 58 .addItem("clear preferred SIM", () -> clearPreferredSim(activity.getApplicationContext())) 59 .addItem("Sync voicemail", () -> syncVoicemail(activity.getApplicationContext())) 60 .addItem("Share persistent log", () -> sharePersistentLog(activity.getApplicationContext())) 61 .addItem( 62 "Enriched call simulator", 63 () -> 64 activity.startActivity( 65 EnrichedCallSimulatorActivity.newIntent(activity.getApplicationContext()))) 66 .addItem( 67 "Enable simulator mode", 68 () -> { 69 SimulatorComponent.get(activity.getApplicationContext()) 70 .getSimulator() 71 .enableSimulatorMode(); 72 SimulatorSimCallManager.register(activity.getApplicationContext()); 73 }) 74 .addItem( 75 "Disable simulator mode", 76 () -> { 77 SimulatorComponent.get(activity.getApplicationContext()) 78 .getSimulator() 79 .disableSimulatorMode(); 80 SimulatorSimCallManager.unregister(activity.getApplicationContext()); 81 }); 82 return simulatorSubMenu; 83 } 84 85 private static void populateDatabase(@NonNull Context context) { 86 DialerExecutorComponent.get(context) 87 .dialerExecutorFactory() 88 .createNonUiTaskBuilder(new PopulateDatabaseWorker()) 89 .build() 90 .executeSerial(new PopulateDatabaseWorkerInput(context, false)); 91 } 92 93 private static void populateVoicemail(@NonNull Context context) { 94 DialerExecutorComponent.get(context) 95 .dialerExecutorFactory() 96 .createNonUiTaskBuilder(new PopulateVoicemailWorker()) 97 .build() 98 .executeSerial(new PopulateDatabaseWorkerInput(context, false)); 99 } 100 101 private static void populateVoicemailFast(@NonNull Context context) { 102 DialerExecutorComponent.get(context) 103 .dialerExecutorFactory() 104 .createNonUiTaskBuilder(new PopulateVoicemailWorker()) 105 .build() 106 .executeSerial(new PopulateDatabaseWorkerInput(context, true)); 107 } 108 109 private static class PopulateVoicemailWorker 110 implements Worker<PopulateDatabaseWorkerInput, Void> { 111 @Nullable 112 @Override 113 public Void doInBackground(PopulateDatabaseWorkerInput input) { 114 VoicemailPopulator.populateVoicemail(input.context, input.fastMode); 115 return null; 116 } 117 } 118 119 private static void fastPopulateDatabase(@NonNull Context context) { 120 DialerExecutorComponent.get(context) 121 .dialerExecutorFactory() 122 .createNonUiTaskBuilder(new PopulateDatabaseWorker()) 123 .build() 124 .executeSerial(new PopulateDatabaseWorkerInput(context, true)); 125 } 126 127 private static void cleanDatabase(@NonNull Context context) { 128 DialerExecutorComponent.get(context) 129 .dialerExecutorFactory() 130 .createNonUiTaskBuilder(new CleanDatabaseWorker()) 131 .build() 132 .executeSerial(context); 133 } 134 135 private static void clearPreferredSim(Context context) { 136 DialerExecutorComponent.get(context) 137 .dialerExecutorFactory() 138 .createNonUiTaskBuilder(new ClearPreferredSimWorker()) 139 .build() 140 .executeSerial(context); 141 } 142 143 private static void syncVoicemail(@NonNull Context context) { 144 Intent intent = new Intent(VoicemailContract.ACTION_SYNC_VOICEMAIL); 145 context.sendBroadcast(intent); 146 } 147 148 private static void sharePersistentLog(@NonNull Context context) { 149 DialerExecutorComponent.get(context) 150 .dialerExecutorFactory() 151 .createNonUiTaskBuilder(new ShareLogWorker()) 152 .onSuccess( 153 (String log) -> { 154 Intent intent = new Intent(Intent.ACTION_SEND); 155 intent.setType("text/plain"); 156 intent.putExtra(Intent.EXTRA_TEXT, log); 157 if (intent.resolveActivity(context.getPackageManager()) != null) { 158 context.startActivity(intent); 159 } 160 }) 161 .build() 162 .executeSerial(null); 163 } 164 165 private SimulatorMainMenu() {} 166 167 private static class PopulateDatabaseWorker implements Worker<PopulateDatabaseWorkerInput, Void> { 168 @Nullable 169 @Override 170 public Void doInBackground(PopulateDatabaseWorkerInput input) { 171 ContactsPopulator.populateContacts(input.context, input.fastMode); 172 CallLogPopulator.populateCallLog(input.context, false, input.fastMode); 173 VoicemailPopulator.populateVoicemail(input.context, input.fastMode); 174 return null; 175 } 176 } 177 178 private static class CleanDatabaseWorker implements Worker<Context, Void> { 179 @Nullable 180 @Override 181 public Void doInBackground(Context context) { 182 ContactsPopulator.deleteAllContacts(context); 183 CallLogPopulator.deleteAllCallLog(context); 184 VoicemailPopulator.deleteAllVoicemail(context); 185 BlockedBumberPopulator.deleteBlockedNumbers(context); 186 return null; 187 } 188 } 189 190 private static class ClearPreferredSimWorker implements Worker<Context, Void> { 191 @Nullable 192 @Override 193 public Void doInBackground(Context context) { 194 context.getContentResolver().delete(PreferredSimFallbackContract.CONTENT_URI, null, null); 195 return null; 196 } 197 } 198 199 private static class ShareLogWorker implements Worker<Void, String> { 200 @Nullable 201 @Override 202 public String doInBackground(Void unused) { 203 return PersistentLogger.dumpLogToString(); 204 } 205 } 206 207 private static class PopulateDatabaseWorkerInput { 208 Context context; 209 boolean fastMode; 210 211 PopulateDatabaseWorkerInput(Context context, boolean fastMode) { 212 this.context = context; 213 this.fastMode = fastMode; 214 } 215 } 216 } 217