package com.ichi2.compat; import android.annotation.TargetApi; import android.appwidget.AppWidgetManager; import android.content.ComponentName; import android.content.Context; import android.content.res.Configuration; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; import android.support.customtabs.CustomTabsIntent; import android.support.v4.content.ContextCompat; import android.support.v4.content.FileProvider; import android.text.Html; import android.util.TypedValue; import android.widget.RemoteViews; import com.ichi2.anki.AnkiActivity; import com.ichi2.anki.R; import com.ichi2.compat.customtabs.CustomTabActivityHelper; import com.ichi2.compat.customtabs.CustomTabsFallback; import com.ichi2.compat.customtabs.CustomTabsHelper; import java.io.File; import io.requery.android.database.sqlite.SQLiteDatabase; /** Implementation of {@link Compat} for SDK level 16 */ @TargetApi(16) public class CompatV16 extends CompatV15 implements Compat { @Override public void disableDatabaseWriteAheadLogging(SQLiteDatabase db) { db.disableWriteAheadLogging(); } @Override public String detagged(String txt) { return Html.escapeHtml(txt); } /* * Update dimensions of widget from V16 on (elder versions do not support widget measuring) */ @Override public void updateWidgetDimensions(Context context, RemoteViews updateViews, Class<?> cls) { AppWidgetManager manager = AppWidgetManager.getInstance(context); int[] ids = manager.getAppWidgetIds(new ComponentName(context, cls)); for (int id : ids) { final float scale = context.getResources().getDisplayMetrics().density; Bundle options = manager.getAppWidgetOptions(id); float width, height; if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { width = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH); height = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT); } else { width = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH); height = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT); } int horizontal, vertical; float text; if ((width / height) > 0.8) { horizontal = (int) (((width - (height * 0.8))/2 + 4) * scale + 0.5f); vertical = (int) (4 * scale + 0.5f); text = (float)(Math.sqrt(height * 0.8 / width) * 18); } else { vertical = (int) (((height - (width * 1.25))/2 + 4) * scale + 0.5f); horizontal = (int) (4 * scale + 0.5f); text = (float)(Math.sqrt(width * 1.25 / height) * 18); } updateViews.setTextViewTextSize(R.id.widget_due, TypedValue.COMPLEX_UNIT_SP, text); updateViews.setTextViewTextSize(R.id.widget_eta, TypedValue.COMPLEX_UNIT_SP, text); updateViews.setViewPadding(R.id.ankidroid_widget_text_layout, horizontal, vertical, horizontal, vertical); } } @Override public void openUrl(AnkiActivity activity, Uri uri) { CustomTabActivityHelper helper = activity.getCustomTabActivityHelper(); CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(helper.getSession()); builder.setToolbarColor(ContextCompat.getColor(activity, R.color.material_light_blue_500)).setShowTitle(true); builder.setStartAnimations(activity, R.anim.slide_right_in, R.anim.slide_left_out); builder.setExitAnimations(activity, R.anim.slide_left_in, R.anim.slide_right_out); builder.setCloseButtonIcon(BitmapFactory.decodeResource(activity.getResources(), R.drawable.ic_arrow_back_white_24dp)); CustomTabsIntent customTabsIntent = builder.build(); CustomTabsHelper.addKeepAliveExtra(activity, customTabsIntent.intent); CustomTabActivityHelper.openCustomTab(activity, customTabsIntent, uri, new CustomTabsFallback()); } @Override public boolean deleteDatabase(File db) { return SQLiteDatabase.deleteDatabase(db); } @Override public Uri getExportUri(Context context, File file) { // Use FileProvider for exporting (this requires Jellybean for reliable sending via migrateExtraStreamtoClipData()) return FileProvider.getUriForFile(context, "com.ichi2.anki.apkgfileprovider", file); } }