/* DevicePluginInfoFragment.java Copyright (c) 2015 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.manager.setting; import android.app.Dialog; import android.app.DialogFragment; import android.app.Fragment; import android.app.ProgressDialog; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import org.deviceconnect.android.localoauth.DevicePluginXmlProfile; import org.deviceconnect.android.localoauth.DevicePluginXmlProfileLocale; import org.deviceconnect.android.localoauth.DevicePluginXmlUtil; import org.deviceconnect.android.manager.DConnectApplication; import org.deviceconnect.android.manager.DevicePlugin; import org.deviceconnect.android.manager.DevicePluginManager; import org.deviceconnect.android.manager.R; import org.deviceconnect.android.profile.SystemProfile; import org.deviceconnect.message.intent.message.IntentDConnectMessage; import java.util.List; import java.util.Locale; import java.util.Map; /** * Device plug-in information fragment. * * @author NTT DOCOMO, INC. */ public class DevicePluginInfoFragment extends Fragment { /** デバイスプラグインをアンインストールする際のリクエストコード. */ private static final int REQUEST_CODE = 101; /** デバイスプラグインのパッケージ名. */ private String mPackageName; /** デバイスプラグインのプラグインID. */ private String mPluginId; @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_deviceplugin_info, container, false); mPluginId = getArguments().getString(DevicePluginInfoActivity.PLUGIN_ID); if (mPluginId == null) { getActivity().finish(); return view; } String name = null; Drawable icon = null; String versionName = null; DConnectApplication apps = (DConnectApplication) getActivity().getApplication(); DevicePluginManager manager = apps.getDevicePluginManager(); for (DevicePlugin plugin : manager.getDevicePlugins()) { if (mPluginId.equals(plugin.getPluginId())) { mPackageName = plugin.getPackageName(); name = plugin.getDeviceName(); icon = plugin.getPluginIcon(); versionName = plugin.getVersionName(); break; } } // 指定されたプラグインIDのパッケージが見つからない場合は終了 if (mPackageName == null) { getActivity().finish(); return view; } TextView nameView = (TextView) view.findViewById(R.id.plugin_package_name); nameView.setText(name); if (icon != null) { ImageView iconView = (ImageView) view.findViewById(R.id.plugin_icon); iconView.setImageDrawable(icon); } TextView versionView = (TextView) view.findViewById(R.id.plugin_version); versionView.setText(getString(R.string.activity_deviceplugin_info_version) + versionName); Button settingBtn = (Button) view.findViewById(R.id.plugin_settings_btn); settingBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View v) { openSettings(); } }); Button deleteBtn = (Button) view.findViewById(R.id.plugin_delete_btn); deleteBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View v) { openUninstall(); } }); deleteBtn.setEnabled(!mPackageName.equals(getActivity().getPackageName())); Button restartBtn = (Button) view.findViewById(R.id.plugin_restart_btn); restartBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View v) { restartDevicePlugin(); } }); LinearLayout mainLayout = (LinearLayout) view.findViewById(R.id.plugin_support_profiles); Map<String, DevicePluginXmlProfile> profiles = getSupportedProfiles(); if (profiles != null) { String locale = Locale.getDefault().getLanguage(); for (String key : profiles.keySet()) { String profileName = key; DevicePluginXmlProfile p = profiles.get(key); if (p != null) { Map<String, DevicePluginXmlProfileLocale> locales = p.getXmlProfileLocales(); if (locales != null) { DevicePluginXmlProfileLocale xmlLocale = locales.get(locale); if (xmlLocale != null) { profileName = xmlLocale.getName(); } } } TextView tv = new TextView(getActivity()); tv.setText(" ・ " + profileName); mainLayout.addView(tv); } } return view; } @Override public boolean onOptionsItemSelected(final MenuItem item) { if (android.R.id.home == item.getItemId()) { getActivity().finish(); return true; } return super.onOptionsItemSelected(item); } @Override public void onActivityResult(final int requestCode, final int resultCode, final Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE) { if (!existApplicationFromPackageName(mPackageName)) { getActivity().finish(); } } } /** * Get supported profiles. * @return profiles */ private Map<String, DevicePluginXmlProfile> getSupportedProfiles() { return DevicePluginXmlUtil.getSupportProfiles(getActivity(), mPackageName); } /** * Open device plug-in's settings. */ private void openSettings() { if (mPackageName == null || mPluginId == null) { return; } DConnectApplication app = (DConnectApplication) getActivity().getApplication(); List<DevicePlugin> plugins = app.getDevicePluginManager().getDevicePlugins(); for (DevicePlugin plugin : plugins) { if (mPackageName.equals(plugin.getPackageName()) && mPluginId.equals(plugin.getPluginId())) { Intent request = new Intent(); request.setComponent(plugin.getComponentName()); request.setAction(IntentDConnectMessage.ACTION_PUT); SystemProfile.setApi(request, "gotapi"); SystemProfile.setProfile(request, SystemProfile.PROFILE_NAME); SystemProfile.setInterface(request, SystemProfile.INTERFACE_DEVICE); SystemProfile.setAttribute(request, SystemProfile.ATTRIBUTE_WAKEUP); request.putExtra("pluginId", plugin.getPluginId()); getActivity().sendBroadcast(request); break; } } } /** * Open uninstall dialog. */ private void openUninstall() { if (mPackageName == null) { return; } Uri uri = Uri.fromParts("package", mPackageName, null); Intent intent = new Intent(Intent.ACTION_DELETE, uri); startActivityForResult(intent, REQUEST_CODE); } /** * Restart device plug-in. */ private void restartDevicePlugin() { AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() { private StartingDialogFragment mDialog; @Override protected void onPreExecute() { if (getActivity() != null) { mDialog = new StartingDialogFragment(); mDialog.show(getFragmentManager(), "dialog"); } } @Override protected Void doInBackground(final Void... params) { DConnectApplication app = (DConnectApplication) getActivity().getApplication(); List<DevicePlugin> plugins = app.getDevicePluginManager().getDevicePlugins(); for (DevicePlugin plugin : plugins) { if (plugin.getPackageName().equals(mPackageName) && plugin.getStartServiceClassName() != null && plugin.getPluginId() != null) { restartDevicePlugin(plugin); break; } } return null; } @Override protected void onPostExecute(final Void o) { if (mDialog != null) { mDialog.dismiss(); } } }; task.execute(); } /** * Start a device plugin. * * @param plugin device plugin to be started */ private void restartDevicePlugin(final DevicePlugin plugin) { Intent request = new Intent(); request.setComponent(plugin.getComponentName()); request.setAction(IntentDConnectMessage.ACTION_DEVICEPLUGIN_RESET); request.putExtra("pluginId", plugin.getPluginId()); getActivity().sendBroadcast(request); } /** * Tests whether packageName exists in application list. * * @param packageName package name * @return true if packageName exists, false otherwise */ private boolean existApplicationFromPackageName(final String packageName) { if (packageName == null) { return false; } final PackageManager pm = getActivity().getPackageManager(); final int flags = PackageManager.GET_UNINSTALLED_PACKAGES | PackageManager.GET_DISABLED_COMPONENTS; final List<ApplicationInfo> installedAppList = pm.getInstalledApplications(flags); for (ApplicationInfo app : installedAppList) { if (app.packageName.equals(packageName)) { return true; } } return false; } /** * Show a dialog of restart a device plugin. */ public static class StartingDialogFragment extends DialogFragment { @Override public Dialog onCreateDialog(final Bundle savedInstanceState) { String title = getString(R.string.activity_settings_restart_device_plugin_title); String msg = getString(R.string.activity_settings_restart_device_plugin_message); ProgressDialog progressDialog = new ProgressDialog(getActivity()); progressDialog.setTitle(title); progressDialog.setMessage(msg); progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); setCancelable(false); return progressDialog; } @Override public void onPause() { dismiss(); super.onPause(); } } }