/* * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.car.carlauncher; import android.app.ActivityOptions; import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; import android.util.Log; import android.view.View; import androidx.annotation.NonNull; import androidx.collection.ArraySet; import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentTransaction; import androidx.lifecycle.ViewModelProvider; import com.android.car.carlauncher.homescreen.HomeCardModule; import com.android.car.carlauncher.homescreen.audio.IntentHandler; import com.android.car.carlauncher.homescreen.audio.MediaLaunchHandler; import com.android.car.carlauncher.homescreen.audio.dialer.InCallIntentRouter; import com.android.car.carlauncher.homescreen.audio.media.MediaLaunchRouter; import com.android.car.media.common.source.MediaSource; import java.util.Set; /** * Launcher activity that shows only the control bar fragment. */ public class ControlBarActivity extends FragmentActivity { private static final String TAG = "CarLauncher"; private static final boolean DEBUG = false; private Set mHomeCardModules; private final IntentHandler mIntentHandler = new IntentHandler() { @Override public void handleIntent(Intent intent) { if (intent != null) { ActivityOptions options = ActivityOptions.makeBasic(); startActivity(intent, options.toBundle()); } } }; // Used instead of IntentHandler because media apps may provide a PendingIntent instead private final MediaLaunchHandler mMediaMediaLaunchHandler = new MediaLaunchHandler() { @Override public void handleLaunchMedia(@NonNull MediaSource mediaSource) { if (DEBUG) { Log.d(TAG, "Launching media source " + mediaSource); } mediaSource.launchActivity(ControlBarActivity.this, ActivityOptions.makeBasic()); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getTheme().applyStyle(R.style.CarLauncherActivityThemeOverlay, true); setContentView(R.layout.control_bar_container); initializeCards(); MediaLaunchRouter.getInstance().registerMediaLaunchHandler(mMediaMediaLaunchHandler); InCallIntentRouter.getInstance().registerInCallIntentHandler(mIntentHandler); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); initializeCards(); } private void initializeCards() { if (mHomeCardModules == null) { mHomeCardModules = new ArraySet<>(); for (String providerClassName : getResources().getStringArray( R.array.config_homeCardModuleClasses)) { try { long reflectionStartTime = System.currentTimeMillis(); HomeCardModule cardModule = (HomeCardModule) Class.forName(providerClassName).newInstance(); if (Flags.mediaCardFullscreen()) { if (cardModule.getCardResId() == R.id.top_card) { findViewById(R.id.top_card).setVisibility(View.GONE); } } cardModule.setViewModelProvider(new ViewModelProvider(/* owner= */this)); mHomeCardModules.add(cardModule); if (DEBUG) { long reflectionTime = System.currentTimeMillis() - reflectionStartTime; Log.d(TAG, "Initialization of HomeCardModule class " + providerClassName + " took " + reflectionTime + " ms"); } } catch (IllegalAccessException | InstantiationException | ClassNotFoundException e) { Log.w(TAG, "Unable to create HomeCardProvider class " + providerClassName, e); } } } FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); for (HomeCardModule cardModule : mHomeCardModules) { transaction.replace(cardModule.getCardResId(), cardModule.getCardView().getFragment()); } transaction.commitNow(); } }