blob: 5a624890a40cbe4eab0d504f6060f77899ff1bbb [file] [log] [blame]
/*
* Copyright (C) 2019-2023 The LineageOS 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.dialer.helplines;
import static android.graphics.Paint.UNDERLINE_TEXT_FLAG;
import android.app.ActionBar;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.telephony.SubscriptionManager;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.webkit.CookieManager;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.android.dialer.R;
import com.android.dialer.app.calllog.IntentProvider;
import com.android.dialer.helplines.utils.HelplineUtils;
import org.lineageos.lib.phone.spn.Item;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class HelplineActivity extends AppCompatActivity {
public static final String SHARED_PREFERENCES_KEY = "com.android.dialer.prefs";
private static final String KEY_FIRST_LAUNCH = "pref_first_launch";
private RecyclerView mRecyclerView;
private LinearLayout mLoadingView;
private LinearLayout mEmptyView;
private ProgressBar mProgressBar;
private HelplineAdapter mAdapter;
@Override
protected void onCreate(@Nullable Bundle savedInstance) {
super.onCreate(savedInstance);
ActionBar actionBar = getActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
setContentView(R.layout.activity_helplines);
mRecyclerView = findViewById(R.id.helplines_list);
mLoadingView = findViewById(R.id.helplines_loading);
mEmptyView = findViewById(R.id.empty_view);
mProgressBar = findViewById(R.id.helplines_progress_bar);
mAdapter = new HelplineAdapter(getResources(), mListener);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.setAdapter(mAdapter);
showUi();
}
@Override
protected void onPause() {
super.onPause();
finish();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.menu_helplines, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
finish();
return true;
} else if (id == R.id.menu_helpline_help) {
showHelp(true);
return true;
}
return super.onOptionsItemSelected(item);
}
private void showUi() {
mLoadingView.setVisibility(View.VISIBLE);
showHelp(false);
SubscriptionManager subManager = getSystemService(SubscriptionManager.class);
new LoadHelplinesTask(getResources(), subManager, mCallback).execute();
}
private void showHelp(boolean forceShow) {
SharedPreferences preferenceManager = getPrefs();
if (!forceShow && preferenceManager.getBoolean(KEY_FIRST_LAUNCH, false)) {
return;
}
preferenceManager.edit()
.putBoolean(KEY_FIRST_LAUNCH, true)
.apply();
new AlertDialog.Builder(this)
.setTitle(R.string.helplines_help_title)
.setMessage(R.string.helplines_help_message)
.setPositiveButton(android.R.string.ok, null)
.setNeutralButton(R.string.helpline_button_more, (dialog, which) -> showMoreInfo())
.show();
}
private void showMoreInfo() {
new AlertDialog.Builder(this)
.setMessage(getResources().getString(R.string.helplines_help_more_message,
getResources().getString(R.string.helplines_contact_url)))
.setPositiveButton(android.R.string.ok, null)
.show();
}
public SharedPreferences getPrefs() {
return this.getSharedPreferences(SHARED_PREFERENCES_KEY,
Context.MODE_PRIVATE);
}
private final LoadHelplinesTask.Callback mCallback = new LoadHelplinesTask.Callback () {
@Override
public void onLoadListProgress(int progress) {
mProgressBar.setProgress(progress);
}
@Override
public void onLoadCompleted(List<HelplineItem> result) {
mLoadingView.setVisibility(View.GONE);
if (result.size() == 0) {
mEmptyView.setVisibility(View.VISIBLE);
} else {
mRecyclerView.setVisibility(View.VISIBLE);
}
mAdapter.update(result);
}
};
private final HelplineAdapter.Listener mListener = new HelplineAdapter.Listener() {
private AlertDialog mDialog;
@Override
public void initiateCall(@NonNull String number) {
IntentProvider provider = IntentProvider.getReturnCallIntentProvider(number);
Intent intent = provider.getClickIntent(HelplineActivity.this);
// Start the call and finish this activity - we don't want to leave traces of the call
startActivity(intent);
finish();
}
@Override
public void onItemClicked(@NonNull HelplineItem helplineItem) {
LayoutInflater inflater = LayoutInflater.from(HelplineActivity.this);
final View dialogView = inflater.inflate(R.layout.dialog_helpline_details, null);
Item item = helplineItem.getItem();
fillOrHideDialogRow(helplineItem.getName(), dialogView, R.id.name_title, R.id.name);
fillOrHideDialogRow(item.getOrganization(), dialogView, R.id.org_title, R.id.org);
fillOrHideDialogRow(HelplineUtils.getCategories(getResources(), helplineItem),
dialogView, R.id.categories_title, R.id.categories);
fillOrHideDialogRow(item.getNumber(), dialogView, R.id.number_title, R.id.number);
fillOrHideDialogRow(item.getWebsite(), dialogView, R.id.website_title, R.id.website,
true);
mDialog = new AlertDialog.Builder(HelplineActivity.this)
.setView(dialogView)
.setPositiveButton(android.R.string.ok, null)
.show();
}
private void fillOrHideDialogRow(String content, View dialog, int headerViewId,
int contentViewId) {
fillOrHideDialogRow(content, dialog, headerViewId, contentViewId, false);
}
private void fillOrHideDialogRow(String content, View dialogView, int headerViewId,
int contentViewId, boolean isUrl) {
if (dialogView == null) {
return;
}
TextView headerView = dialogView.findViewById(headerViewId);
TextView contentView = dialogView.findViewById(contentViewId);
if (headerView == null || contentView == null) {
return;
}
if (TextUtils.isEmpty(content)) {
headerView.setVisibility(View.GONE);
contentView.setVisibility(View.GONE);
return;
}
contentView.setText(content);
if (isUrl) {
contentView.setPaintFlags(contentView.getPaintFlags() | UNDERLINE_TEXT_FLAG);
LayoutInflater inflater = HelplineActivity.this.getLayoutInflater();
contentView.setOnClickListener(v -> {
AlertDialog.Builder dialogBuilder =
new AlertDialog.Builder(HelplineActivity.this);
View webviewDlgView = inflater.inflate(R.layout.dialog_webview, null);
dialogBuilder.setView(webviewDlgView);
LinearLayout loadingLayout = webviewDlgView.findViewById(R.id.webview_loading);
// Disable cookies
CookieManager.getInstance().setAcceptCookie(false);
// Setup WebView
WebView webView = webviewDlgView.findViewById(R.id.webview);
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view,
WebResourceRequest request) {
return false;
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
loadingLayout.setVisibility(ProgressBar.INVISIBLE);
webView.setVisibility(View.VISIBLE);
}
});
// Override headers to disable cache and add "Do not track"
Map<String, String> headers = new HashMap<>(3);
headers.put("Pragma", "no-cache");
headers.put("Cache-Control", "no-cache");
headers.put("DNT", "1");
// Start loading the URL
webView.loadUrl(content, headers);
// Clear any WebView history
dialogBuilder.setPositiveButton(android.R.string.ok, (dlg, which) -> {
webView.clearHistory();
dlg.dismiss();
});
dialogBuilder.setOnDismissListener(dialog -> webView.clearHistory());
dialogBuilder.show();
// dismiss the dialog, we show a new one already
mDialog.dismiss();
});
}
}
};
}